2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.mso.asdc.client.tests;
24 import static org.junit.Assert.assertFalse;
25 import static org.junit.Assert.assertTrue;
26 import static org.junit.Assert.fail;
27 import static org.mockito.Matchers.any;
28 import java.io.IOException;
29 import java.lang.reflect.Field;
30 import java.net.URISyntaxException;
31 import java.nio.file.Files;
32 import java.nio.file.Paths;
33 import java.security.MessageDigest;
34 import java.security.NoSuchAlgorithmException;
35 import java.util.ArrayList;
36 import java.util.List;
38 import org.apache.commons.codec.binary.Base64;
39 import org.junit.AfterClass;
40 import org.junit.Before;
41 import org.junit.BeforeClass;
42 import org.junit.Test;
43 import org.mockito.Mockito;
45 import org.openecomp.sdc.api.IDistributionClient;
46 import org.openecomp.sdc.api.consumer.INotificationCallback;
47 import org.openecomp.sdc.api.notification.IArtifactInfo;
48 import org.openecomp.sdc.api.notification.INotificationData;
49 import org.openecomp.sdc.api.notification.IResourceInstance;
50 import org.openecomp.sdc.api.results.IDistributionClientDownloadResult;
51 import org.openecomp.sdc.api.results.IDistributionClientResult;
52 import org.openecomp.sdc.impl.mock.DistributionClientStubImpl;
53 import org.openecomp.sdc.utils.DistributionActionResultEnum;
54 import org.openecomp.mso.asdc.client.ASDCConfiguration;
55 import org.openecomp.mso.asdc.client.ASDCController;
56 import org.openecomp.mso.asdc.client.ASDCControllerStatus;
57 import org.openecomp.mso.asdc.client.exceptions.ASDCControllerException;
58 import org.openecomp.mso.asdc.client.exceptions.ASDCParametersException;
59 import org.openecomp.mso.asdc.client.exceptions.ArtifactInstallerException;
60 import org.openecomp.mso.asdc.installer.heat.VfResourceInstaller;
61 import org.openecomp.mso.properties.MsoJavaProperties;
62 import org.openecomp.mso.properties.MsoPropertiesException;
63 import org.openecomp.mso.properties.MsoPropertiesFactory;
68 * THis class tests the ASDC Controller by using the ASDC Mock CLient
72 public class ASDCControllerTest {
74 private static MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory();
76 private static String heatExample;
77 private static String heatExampleMD5HashBase64;
79 private static INotificationData iNotif;
81 private static IDistributionClientDownloadResult downloadResult;
82 private static IDistributionClientDownloadResult downloadCorruptedResult;
84 private static IDistributionClientResult successfulClientInitResult;
85 private static IDistributionClientResult unsuccessfulClientInitResult;
87 private static IArtifactInfo artifactInfo1;
89 private static IResourceInstance resource1;
91 private static VfResourceInstaller vnfInstaller;
93 public static final String ASDC_PROP = MsoJavaProperties.class.getClassLoader().getResource("mso.json").toString().substring(5);
94 public static final String ASDC_PROP2 = MsoJavaProperties.class.getClassLoader().getResource("mso2.json").toString().substring(5);
95 public static final String ASDC_PROP3 = MsoJavaProperties.class.getClassLoader().getResource("mso3.json").toString().substring(5);
96 public static final String ASDC_PROP_BAD = MsoJavaProperties.class.getClassLoader().getResource("mso-bad.json").toString().substring(5);
97 public static final String ASDC_PROP_WITH_NULL = MsoJavaProperties.class.getClassLoader().getResource("mso-with-NULL.json").toString().substring(5);
100 public static final void prepareMockNotification() throws MsoPropertiesException, IOException, URISyntaxException, NoSuchAlgorithmException, ArtifactInstallerException {
102 heatExample = new String(Files.readAllBytes(Paths.get(ASDCControllerTest.class.getClassLoader().getResource("resource-examples/autoscaling.yaml").toURI())));
103 MessageDigest md = MessageDigest.getInstance("MD5");
104 byte[] md5Hash = md.digest(heatExample.getBytes());
105 heatExampleMD5HashBase64 = Base64.encodeBase64String(md5Hash);
107 iNotif= Mockito.mock(INotificationData.class);
109 // Create fake ArtifactInfo
110 artifactInfo1 = Mockito.mock(IArtifactInfo.class);
111 Mockito.when(artifactInfo1.getArtifactChecksum()).thenReturn(ASDCControllerTest.heatExampleMD5HashBase64);
113 Mockito.when(artifactInfo1.getArtifactName()).thenReturn("artifact1");
114 Mockito.when(artifactInfo1.getArtifactType()).thenReturn(ASDCConfiguration.HEAT);
115 Mockito.when(artifactInfo1.getArtifactURL()).thenReturn("https://localhost:8080/v1/catalog/services/srv1/2.0/resources/aaa/1.0/artifacts/aaa.yml");
116 Mockito.when(artifactInfo1.getArtifactUUID()).thenReturn("UUID1");
117 Mockito.when(artifactInfo1.getArtifactDescription()).thenReturn("testos artifact1");
119 // Now provision the NotificationData mock
120 List<IArtifactInfo> listArtifact = new ArrayList<IArtifactInfo>();
121 listArtifact.add(artifactInfo1);
123 // Create fake resource Instance
124 resource1 = Mockito.mock (IResourceInstance.class);
125 Mockito.when (resource1.getResourceType ()).thenReturn ("VF");
126 Mockito.when (resource1.getResourceName ()).thenReturn ("resourceName");
127 Mockito.when (resource1.getArtifacts ()).thenReturn (listArtifact);
129 List<IResourceInstance> resources = new ArrayList<> ();
130 resources.add (resource1);
132 Mockito.when(iNotif.getResources()).thenReturn(resources);
133 Mockito.when(iNotif.getDistributionID()).thenReturn("distributionID1");
134 Mockito.when(iNotif.getServiceName()).thenReturn("serviceName1");
135 Mockito.when(iNotif.getServiceUUID()).thenReturn("serviceNameUUID1");
136 Mockito.when(iNotif.getServiceVersion()).thenReturn("1.0");
138 downloadResult = Mockito.mock(IDistributionClientDownloadResult.class);
139 Mockito.when(downloadResult.getArtifactPayload()).thenReturn(heatExample.getBytes());
140 Mockito.when(downloadResult.getDistributionActionResult()).thenReturn(DistributionActionResultEnum.SUCCESS);
141 Mockito.when(downloadResult.getDistributionMessageResult()).thenReturn("Success");
143 downloadCorruptedResult = Mockito.mock(IDistributionClientDownloadResult.class);
144 Mockito.when(downloadCorruptedResult.getArtifactPayload()).thenReturn((heatExample+"badone").getBytes());
145 Mockito.when(downloadCorruptedResult.getDistributionActionResult()).thenReturn(DistributionActionResultEnum.SUCCESS);
146 Mockito.when(downloadCorruptedResult.getDistributionMessageResult()).thenReturn("Success");
148 vnfInstaller = Mockito.mock(VfResourceInstaller.class);
150 // Mock now the ASDC distribution client behavior
151 successfulClientInitResult = Mockito.mock(IDistributionClientResult.class);
152 Mockito.when(successfulClientInitResult.getDistributionActionResult ()).thenReturn(DistributionActionResultEnum.SUCCESS);
154 unsuccessfulClientInitResult = Mockito.mock(IDistributionClientResult.class);
155 Mockito.when(unsuccessfulClientInitResult.getDistributionActionResult ()).thenReturn(DistributionActionResultEnum.GENERAL_ERROR);
160 public final void initBeforeEachTest() throws MsoPropertiesException {
162 msoPropertiesFactory.removeAllMsoProperties();
163 msoPropertiesFactory.initializeMsoProperties(ASDCConfiguration.MSO_PROP_ASDC, ASDC_PROP);
167 public static final void kill () throws MsoPropertiesException {
169 msoPropertiesFactory.removeMsoProperties(ASDCConfiguration.MSO_PROP_ASDC);
174 public final void testTheInitWithASDCStub() throws ASDCControllerException, ASDCParametersException, IOException {
176 ASDCController asdcController = new ASDCController("asdc-controller1",new DistributionClientStubImpl());
177 asdcController.initASDC();
178 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
179 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
183 public final void testTheNotificationWithASDCStub() throws ASDCControllerException, ASDCParametersException, IOException {
185 ASDCController asdcController = new ASDCController("asdc-controller1",new DistributionClientStubImpl(),vnfInstaller);
186 asdcController.initASDC();
187 // try to send a notif, this should fail internally, we just want to ensure that in case of crash, controller status goes to IDLE
188 asdcController.treatNotification(iNotif);
190 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
191 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
196 public final void testASecondInit() throws ASDCControllerException, ASDCParametersException, IOException {
197 ASDCController asdcController = new ASDCController("asdc-controller1",new DistributionClientStubImpl(),vnfInstaller);
198 asdcController.initASDC();
199 // try to send a notif, this should fail internally, we just want to ensure that in case of crash, controller status goes to IDLE
201 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
202 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
205 asdcController.initASDC();
206 fail("ASDCControllerException should have been raised for the init");
207 } catch (ASDCControllerException e) {
208 assertTrue("The controller is already initialized, call the closeASDC method first".equals(e.getMessage()));
211 // No changes expected on the controller state
212 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
213 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
217 public final void testInitCrashWithMockitoClient() throws ASDCParametersException, IOException {
219 IDistributionClient distributionClient;
220 // First case for init method
221 distributionClient = Mockito.mock(IDistributionClient.class);
222 Mockito.when(distributionClient.download(artifactInfo1)).thenThrow(new RuntimeException("ASDC Client not initialized"));
223 Mockito.when(distributionClient.init(any(ASDCConfiguration.class),any(INotificationCallback.class))).thenReturn(unsuccessfulClientInitResult);
224 Mockito.when(distributionClient.start()).thenReturn(unsuccessfulClientInitResult);
226 ASDCController asdcController = new ASDCController("asdc-controller1",distributionClient,vnfInstaller);
228 // This should return an exception
230 asdcController.initASDC();
231 fail("ASDCControllerException should have been raised for the init");
232 } catch (ASDCControllerException e) {
233 assertTrue("Initialization of the ASDC Controller failed with reason: null".equals(e.getMessage()));
236 assertTrue(asdcController.getControllerStatus() == ASDCControllerStatus.STOPPED);
237 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
239 // Second case for start method
241 Mockito.when(distributionClient.init(any(ASDCConfiguration.class),any(INotificationCallback.class))).thenReturn(successfulClientInitResult);
242 Mockito.when(distributionClient.start()).thenReturn(unsuccessfulClientInitResult);
244 // This should return an exception
246 asdcController.initASDC();
247 fail("ASDCControllerException should have been raised for the init");
248 } catch (ASDCControllerException e) {
249 assertTrue("Startup of the ASDC Controller failed with reason: null".equals(e.getMessage()));
252 assertTrue(asdcController.getControllerStatus() == ASDCControllerStatus.STOPPED);
253 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
257 public final void testTheStop() throws ASDCControllerException, ASDCParametersException, IOException {
259 ASDCController asdcController = new ASDCController("asdc-controller1",new DistributionClientStubImpl(),vnfInstaller);
261 asdcController.closeASDC();
262 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.STOPPED);
265 asdcController = new ASDCController("asdc-controller1",new DistributionClientStubImpl(),vnfInstaller);
266 asdcController.initASDC();
267 asdcController.closeASDC();
268 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.STOPPED);
272 public final void testConfigRefresh () throws ASDCParametersException, ASDCControllerException, IOException, MsoPropertiesException {
273 IDistributionClient distributionClient;
274 distributionClient = Mockito.mock(IDistributionClient.class);
275 Mockito.when(distributionClient.download(artifactInfo1)).thenReturn(downloadResult);
276 Mockito.when(distributionClient.init(any(ASDCConfiguration.class),any(INotificationCallback.class))).thenReturn(successfulClientInitResult);
277 Mockito.when(distributionClient.start()).thenReturn(successfulClientInitResult);
280 ASDCController asdcController = new ASDCController("asdc-controller1",distributionClient,vnfInstaller);
282 // it should not raise any exception even if controller is not yet initialized
283 asdcController.updateConfigIfNeeded();
285 asdcController.initASDC();
286 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
287 assertFalse(asdcController.updateConfigIfNeeded());
289 msoPropertiesFactory.changeMsoPropertiesFilePath(ASDCConfiguration.MSO_PROP_ASDC, ASDC_PROP3);
290 msoPropertiesFactory.reloadMsoProperties();
291 // It should fail if it tries to refresh the config as the init will now fail
292 assertTrue(asdcController.updateConfigIfNeeded());
293 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
296 msoPropertiesFactory.changeMsoPropertiesFilePath(ASDCConfiguration.MSO_PROP_ASDC, ASDC_PROP);
297 msoPropertiesFactory.reloadMsoProperties();
301 public final void testConfigRefreshWhenBusy () throws IOException, MsoPropertiesException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, ASDCParametersException, ASDCControllerException {
302 IDistributionClient distributionClient;
303 distributionClient = Mockito.mock(IDistributionClient.class);
304 Mockito.when(distributionClient.download(artifactInfo1)).thenReturn(downloadResult);
305 Mockito.when(distributionClient.init(any(ASDCConfiguration.class),any(INotificationCallback.class))).thenReturn(successfulClientInitResult);
306 Mockito.when(distributionClient.start()).thenReturn(successfulClientInitResult);
308 ASDCController asdcController = new ASDCController("asdc-controller1",distributionClient,vnfInstaller);
310 // it should not raise any exception even if controller is not yet initialized
311 asdcController.updateConfigIfNeeded();
313 asdcController.initASDC();
314 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
315 assertFalse(asdcController.updateConfigIfNeeded());
317 // Simulate a BUSY case by reflection
318 Field controllerStatus;
319 controllerStatus = ASDCController.class.getDeclaredField("controllerStatus");
320 controllerStatus.setAccessible(true);
321 controllerStatus.set(asdcController,ASDCControllerStatus.BUSY);
324 msoPropertiesFactory.changeMsoPropertiesFilePath(ASDCConfiguration.MSO_PROP_ASDC, ASDC_PROP3);
325 msoPropertiesFactory.reloadMsoProperties();
326 // It should fail if it tries to refresh the config as the init will now fail
328 asdcController.updateConfigIfNeeded();
329 fail ("ASDCControllerException should have been raised");
330 } catch (ASDCControllerException e) {
331 assertTrue("Cannot close the ASDC controller as it's currently in BUSY state".equals(e.getMessage()));
334 // Try it a second time to see if we still see the changes
336 asdcController.updateConfigIfNeeded();
337 fail ("ASDCControllerException should have been raised");
338 } catch (ASDCControllerException e) {
339 assertTrue("Cannot close the ASDC controller as it's currently in BUSY state".equals(e.getMessage()));
342 // Revert to Idle by reflection
343 controllerStatus.set(asdcController,ASDCControllerStatus.IDLE);
344 controllerStatus.setAccessible(false);
346 // This should work now, controller should be restarted
347 assertTrue(asdcController.updateConfigIfNeeded());
348 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
350 msoPropertiesFactory.changeMsoPropertiesFilePath(ASDCConfiguration.MSO_PROP_ASDC, ASDC_PROP);
351 msoPropertiesFactory.reloadMsoProperties();
356 public final void testBadConfigRefresh () throws ASDCParametersException, ASDCControllerException, IOException, MsoPropertiesException {
357 IDistributionClient distributionClient;
358 distributionClient = Mockito.mock(IDistributionClient.class);
359 Mockito.when(distributionClient.download(artifactInfo1)).thenReturn(downloadResult);
360 Mockito.when(distributionClient.init(any(ASDCConfiguration.class),any(INotificationCallback.class))).thenReturn(successfulClientInitResult);
361 Mockito.when(distributionClient.start()).thenReturn(successfulClientInitResult);
364 ASDCController asdcController = new ASDCController("asdc-controller1",distributionClient,vnfInstaller);
366 // it should not raise any exception even if controller is not yet initialized
367 asdcController.updateConfigIfNeeded();
369 asdcController.initASDC();
370 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
371 assertFalse(asdcController.updateConfigIfNeeded());
373 msoPropertiesFactory.changeMsoPropertiesFilePath(ASDCConfiguration.MSO_PROP_ASDC, ASDC_PROP_BAD);
374 msoPropertiesFactory.reloadMsoProperties();
375 // It should fail if it tries to refresh the config as the init will now fail
377 asdcController.updateConfigIfNeeded();
378 fail ("ASDCParametersException should have been raised");
379 } catch (ASDCParametersException ep) {
380 assertTrue("consumerGroup parameter cannot be found in config mso.properties".equals(ep.getMessage()));
383 // This should stop the controller, as it can't work with a bad config file
384 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.STOPPED);
387 msoPropertiesFactory.changeMsoPropertiesFilePath(ASDCConfiguration.MSO_PROP_ASDC, ASDC_PROP);
388 msoPropertiesFactory.reloadMsoProperties();
392 public final void testConfigAccess () throws ASDCControllerException, ASDCParametersException, IOException {
393 IDistributionClient distributionClient;
394 distributionClient = Mockito.mock(IDistributionClient.class);
395 Mockito.when(distributionClient.download(artifactInfo1)).thenReturn(downloadResult);
396 Mockito.when(distributionClient.init(any(ASDCConfiguration.class),any(INotificationCallback.class))).thenReturn(successfulClientInitResult);
397 Mockito.when(distributionClient.start()).thenReturn(successfulClientInitResult);
400 ASDCController asdcController = new ASDCController("asdc-controller1",distributionClient,vnfInstaller);
402 assertTrue("Unknown".equals(asdcController.getAddress()));
403 assertTrue("Unknown".equals(asdcController.getEnvironment()));
405 asdcController.initASDC();
407 assertTrue("hostname".equals(asdcController.getAddress()));
408 assertTrue("environmentName".equals(asdcController.getEnvironment()));