Change the header to SO
[so.git] / asdc-controller / src / test / java / org / openecomp / mso / asdc / client / tests / ASDCControllerTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.openecomp.mso.asdc.client.tests;
22
23
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;
37
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;
44
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;
64
65
66
67 /**
68  * THis class tests the ASDC Controller by using the ASDC Mock CLient
69  *
70  *
71  */
72 public class ASDCControllerTest {
73
74         private static MsoPropertiesFactory msoPropertiesFactory = new MsoPropertiesFactory();
75
76         private static String heatExample;
77         private static String heatExampleMD5HashBase64;
78
79         private static INotificationData iNotif;
80
81         private static IDistributionClientDownloadResult downloadResult;
82         private static IDistributionClientDownloadResult downloadCorruptedResult;
83
84         private static IDistributionClientResult successfulClientInitResult;
85         private static IDistributionClientResult unsuccessfulClientInitResult;
86
87         private static IArtifactInfo artifactInfo1;
88
89         private static IResourceInstance resource1;
90
91         private static VfResourceInstaller vnfInstaller;
92         
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);
98
99         @BeforeClass
100         public static final void prepareMockNotification() throws MsoPropertiesException, IOException, URISyntaxException, NoSuchAlgorithmException, ArtifactInstallerException  {
101
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);
106
107                 iNotif= Mockito.mock(INotificationData.class);
108
109                 // Create fake ArtifactInfo
110                 artifactInfo1 = Mockito.mock(IArtifactInfo.class);
111                 Mockito.when(artifactInfo1.getArtifactChecksum()).thenReturn(ASDCControllerTest.heatExampleMD5HashBase64);
112
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");
118
119                 // Now provision the NotificationData mock
120                 List<IArtifactInfo> listArtifact = new ArrayList<IArtifactInfo>();
121                 listArtifact.add(artifactInfo1);
122
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);
128
129         List<IResourceInstance> resources = new ArrayList<> ();
130         resources.add (resource1);
131
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");
137
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");
142
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");
147
148                 vnfInstaller = Mockito.mock(VfResourceInstaller.class);
149                 
150                 // Mock now the ASDC distribution client behavior
151                 successfulClientInitResult = Mockito.mock(IDistributionClientResult.class);
152                 Mockito.when(successfulClientInitResult.getDistributionActionResult ()).thenReturn(DistributionActionResultEnum.SUCCESS);
153
154                 unsuccessfulClientInitResult = Mockito.mock(IDistributionClientResult.class);
155                 Mockito.when(unsuccessfulClientInitResult.getDistributionActionResult ()).thenReturn(DistributionActionResultEnum.GENERAL_ERROR);
156
157         }
158         
159         @Before
160         public final void initBeforeEachTest() throws MsoPropertiesException {
161                 // load the config
162                 msoPropertiesFactory.removeAllMsoProperties();
163                 msoPropertiesFactory.initializeMsoProperties(ASDCConfiguration.MSO_PROP_ASDC, ASDC_PROP);
164         }
165
166         @AfterClass
167         public static final void kill () throws MsoPropertiesException {
168
169                 msoPropertiesFactory.removeMsoProperties(ASDCConfiguration.MSO_PROP_ASDC);
170
171         }
172
173         @Test
174         public final void testTheInitWithASDCStub() throws ASDCControllerException, ASDCParametersException, IOException {
175
176                 ASDCController asdcController = new ASDCController("asdc-controller1",new DistributionClientStubImpl());
177                 asdcController.initASDC();
178                 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
179                 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
180         }
181
182         @Test
183         public final void testTheNotificationWithASDCStub() throws ASDCControllerException, ASDCParametersException, IOException {
184
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);
189
190                 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
191                 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
192
193         }
194
195         @Test
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
200
201                 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
202                 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
203
204                 try {
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()));
209                 }
210
211                 // No changes expected on the controller state
212                 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
213                 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
214         }
215
216         @Test
217         public final void testInitCrashWithMockitoClient() throws ASDCParametersException, IOException {
218
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);
225
226                 ASDCController asdcController = new ASDCController("asdc-controller1",distributionClient,vnfInstaller);
227
228                 // This should return an exception
229                 try {
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()));
234                 }
235
236                 assertTrue(asdcController.getControllerStatus() == ASDCControllerStatus.STOPPED);
237                 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
238
239                 // Second case for start method
240
241                 Mockito.when(distributionClient.init(any(ASDCConfiguration.class),any(INotificationCallback.class))).thenReturn(successfulClientInitResult);
242                 Mockito.when(distributionClient.start()).thenReturn(unsuccessfulClientInitResult);
243
244                 // This should return an exception
245                 try {
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()));
250                 }
251
252                 assertTrue(asdcController.getControllerStatus() == ASDCControllerStatus.STOPPED);
253                 assertTrue(asdcController.getNbOfNotificationsOngoing()== 0);
254         }
255
256         @Test
257         public final void testTheStop() throws ASDCControllerException, ASDCParametersException, IOException {
258
259                 ASDCController asdcController = new ASDCController("asdc-controller1",new DistributionClientStubImpl(),vnfInstaller);
260
261                 asdcController.closeASDC();
262                 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.STOPPED);
263
264
265                 asdcController = new ASDCController("asdc-controller1",new DistributionClientStubImpl(),vnfInstaller);
266                 asdcController.initASDC();
267                 asdcController.closeASDC();
268                 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.STOPPED);
269         }
270
271         @Test
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);
278
279
280                 ASDCController asdcController = new ASDCController("asdc-controller1",distributionClient,vnfInstaller);
281
282                 // it should not raise any exception even if controller is not yet initialized
283                 asdcController.updateConfigIfNeeded();
284
285                 asdcController.initASDC();
286                 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
287                 assertFalse(asdcController.updateConfigIfNeeded());
288
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);
294
295
296                 msoPropertiesFactory.changeMsoPropertiesFilePath(ASDCConfiguration.MSO_PROP_ASDC, ASDC_PROP);
297                 msoPropertiesFactory.reloadMsoProperties();
298         }
299
300         @Test
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);
307
308                 ASDCController asdcController = new ASDCController("asdc-controller1",distributionClient,vnfInstaller);
309
310                 // it should not raise any exception even if controller is not yet initialized
311                 asdcController.updateConfigIfNeeded();
312
313                 asdcController.initASDC();
314                 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
315                 assertFalse(asdcController.updateConfigIfNeeded());
316
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);
322
323
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
327                 try {
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()));
332                 }
333
334                 // Try it a second time to see if we still see the changes
335                 try {
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()));
340                 }
341
342                 // Revert to Idle by reflection
343                 controllerStatus.set(asdcController,ASDCControllerStatus.IDLE);
344                 controllerStatus.setAccessible(false);
345
346                 // This should work now, controller should be restarted
347                 assertTrue(asdcController.updateConfigIfNeeded());
348                 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
349
350                 msoPropertiesFactory.changeMsoPropertiesFilePath(ASDCConfiguration.MSO_PROP_ASDC, ASDC_PROP);
351                 msoPropertiesFactory.reloadMsoProperties();
352         }
353
354
355         @Test
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);
362
363
364                 ASDCController asdcController = new ASDCController("asdc-controller1",distributionClient,vnfInstaller);
365
366                 // it should not raise any exception even if controller is not yet initialized
367                 asdcController.updateConfigIfNeeded();
368
369                 asdcController.initASDC();
370                 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.IDLE);
371                 assertFalse(asdcController.updateConfigIfNeeded());
372
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
376                 try {
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()));
381                 }
382
383                 // This should stop the controller, as it can't work with a bad config file
384                 assertTrue(asdcController.getControllerStatus()== ASDCControllerStatus.STOPPED);
385
386
387                 msoPropertiesFactory.changeMsoPropertiesFilePath(ASDCConfiguration.MSO_PROP_ASDC, ASDC_PROP);
388                 msoPropertiesFactory.reloadMsoProperties();
389         }
390
391         @Test
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);
398
399                 
400                 ASDCController asdcController = new ASDCController("asdc-controller1",distributionClient,vnfInstaller);
401                 
402                 assertTrue("Unknown".equals(asdcController.getAddress()));
403                 assertTrue("Unknown".equals(asdcController.getEnvironment()));
404                 
405                 asdcController.initASDC();
406                 
407                 assertTrue("hostname".equals(asdcController.getAddress()));
408                 assertTrue("environmentName".equals(asdcController.getEnvironment()));
409                 
410         }
411
412 }