b9d44603a0410411aacec6e5a7273716b8c910c7
[vfc/nfvo/driver/vnfm/svnfm.git] /
1 /*
2  * Copyright 2016-2017, Nokia Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.vfc;
17
18 import com.google.common.collect.Lists;
19 import com.google.gson.Gson;
20 import com.google.gson.JsonObject;
21 import com.nokia.cbam.lcm.v32.model.*;
22 import com.nokia.cbam.lcm.v32.model.VnfInfo;
23 import io.reactivex.Observable;
24 import java.nio.file.Paths;
25 import java.util.ArrayList;
26 import java.util.Iterator;
27 import java.util.List;
28 import org.junit.Before;
29 import org.junit.Test;
30 import org.mockito.ArgumentCaptor;
31 import org.mockito.InjectMocks;
32 import org.mockito.Mock;
33 import org.mockito.Mockito;
34 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CatalogManager;
35 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.LifecycleManager;
36 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.TestBase;
37 import org.onap.vnfmdriver.model.*;
38 import org.onap.vnfmdriver.model.ScaleDirection;
39
40 import static java.nio.file.Files.readAllBytes;
41
42 import static junit.framework.TestCase.*;
43 import static org.mockito.Mockito.*;
44 import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CbamRestApiProvider.NOKIA_LCM_API_VERSION;
45 import static org.springframework.test.util.ReflectionTestUtils.setField;
46
47 public class TestVfcGrantManager extends TestBase {
48
49     private ArgumentCaptor<GrantVNFRequest> grantRequest = ArgumentCaptor.forClass(GrantVNFRequest.class);
50     private GrantVNFResponseVim vim = new GrantVNFResponseVim();
51     private GrantVNFResponse grantResponse = new GrantVNFResponse();
52     @Mock
53     private CatalogManager cbamCatalogManager;
54     @InjectMocks
55     private VfcGrantManager vfcGrantManager;
56
57     @Before
58     public void initMocks() throws Exception {
59         setField(VfcGrantManager.class, "logger", logger);
60         when(nsLcmApi.grantvnf(grantRequest.capture())).thenReturn(buildObservable(grantResponse));
61         grantResponse.setVim(vim);
62     }
63
64     /**
65      * test grant request for instantiation
66      */
67     @Test
68     public void testGrantDuringInstantiation() throws Exception {
69         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
70         //when
71         vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
72         //verify
73         assertEquals(1, grantRequest.getAllValues().size());
74         GrantVNFRequest request = grantRequest.getValue();
75         assertVduInGrant(request.getAddResource(), "vdu1", 1);
76         assertVduInGrant(request.getAddResource(), "vdu2", 2);
77         assertEquals(0, request.getRemoveResource().size());
78         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.INSTANTIATE);
79     }
80
81     /**
82      * test failure logging & propagation during grant request for instantiation
83      */
84     @Test
85     public void testFailureDuringGrantPreparation() throws Exception {
86         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
87         //when
88         try {
89             vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "missingLevel", cbamVnfdContent, JOB_ID);
90             //verify
91             fail();
92         } catch (RuntimeException e) {
93             verify(logger).error(Mockito.eq("Unable to prepare grant request for instantiation"), Mockito.any(RuntimeException.class));
94             verifyNoMoreInteractions(nsLcmApi);
95         }
96     }
97
98     /**
99      * test grant request for instantiation
100      */
101     @Test
102     public void testFailureDuringGrantRequest() throws Exception {
103         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
104         RuntimeException expectedException = new RuntimeException("a");
105         when(nsLcmApi.grantvnf(Mockito.any())).thenThrow(expectedException);
106         ArgumentCaptor<String> logCaptor = ArgumentCaptor.forClass(String.class);
107         Mockito.doNothing().when(logger).error(logCaptor.capture(), Mockito.eq(expectedException));
108         //when
109         try {
110             vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
111             //verify
112             fail();
113         } catch (RuntimeException e) {
114             assertTrue(logCaptor.getValue().contains("Unable to request grant with "));
115         }
116     }
117
118     /**
119      * No grant is requested for termination if the the VNF is not instantiated
120      */
121     @Test
122     public void testNoGrantIsRequestedIfNotInstantiated() {
123         VnfInfo vnf = new VnfInfo();
124         vnf.setId(VNF_ID);
125         vnf.setInstantiationState(InstantiationState.NOT_INSTANTIATED);
126         //when
127         vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
128         //verify
129         verifyNoMoreInteractions(nsLcmApi);
130     }
131
132     /**
133      * grant is requested for termination if the the VNF is instantiated
134      */
135     @Test
136     public void testGrantIsRequestedIfInstantiated() {
137         VnfInfo vnf = new VnfInfo();
138         vnf.setId(VNF_ID);
139         vnf.setInstantiationState(InstantiationState.INSTANTIATED);
140         InstantiatedVnfInfo instantiatedVnfInfo = new InstantiatedVnfInfo();
141         VnfcResourceInfo vnfc = new VnfcResourceInfo();
142         vnfc.setId("vnfcId1");
143         vnfc.setVduId("vdu1");
144         instantiatedVnfInfo.setVnfcResourceInfo(new ArrayList<>());
145         instantiatedVnfInfo.getVnfcResourceInfo().add(vnfc);
146         vnf.setInstantiatedVnfInfo(instantiatedVnfInfo);
147         VnfProperty prop = new VnfProperty();
148         prop.setName(LifecycleManager.ONAP_CSAR_ID);
149         prop.setValue(ONAP_CSAR_ID);
150         vnf.setVnfConfigurableProperties(new ArrayList<>());
151         vnf.getVnfConfigurableProperties().add(prop);
152         //when
153         vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
154         //verify
155         assertEquals(1, grantRequest.getAllValues().size());
156         GrantVNFRequest request = grantRequest.getValue();
157         assertVduInGrant(request.getRemoveResource(), "vdu1", 1);
158         assertVduInGrant(request.getRemoveResource(), "vdu2", 0);
159         assertEquals(0, request.getAddResource().size());
160         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.TERMINAL);
161     }
162
163     /**
164      * grant is requested for termination if the the VNF is instantiated even if has no VNFCs
165      */
166     @Test
167     public void testGrantIsRequestedIfInstantiatedWithNoVnfcs() {
168         VnfInfo vnf = new VnfInfo();
169         vnf.setId(VNF_ID);
170         vnf.setInstantiationState(InstantiationState.INSTANTIATED);
171         InstantiatedVnfInfo instantiatedVnfInfo = new InstantiatedVnfInfo();
172         vnf.setInstantiatedVnfInfo(instantiatedVnfInfo);
173         VnfProperty prop = new VnfProperty();
174         prop.setName(LifecycleManager.ONAP_CSAR_ID);
175         prop.setValue(ONAP_CSAR_ID);
176         vnf.setVnfConfigurableProperties(new ArrayList<>());
177         vnf.getVnfConfigurableProperties().add(prop);
178         //when
179         vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
180         //verify
181         assertEquals(1, grantRequest.getAllValues().size());
182         GrantVNFRequest request = grantRequest.getValue();
183         assertVduInGrant(request.getRemoveResource(), "vdu1", 0);
184         assertVduInGrant(request.getRemoveResource(), "vdu2", 0);
185         assertEquals(0, request.getAddResource().size());
186         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.TERMINAL);
187     }
188
189     /**
190      * test failure logging & propagation during grant request for instantiation
191      */
192     @Test
193     public void testFailureDuringTerminationGrantPreparation() throws Exception {
194         VnfInfo vnf = new VnfInfo();
195         vnf.setId(VNF_ID);
196         vnf.setInstantiatedVnfInfo(null);
197         vnf.setInstantiationState(InstantiationState.INSTANTIATED);
198         //when
199         try {
200             vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
201             //verify
202             fail();
203         } catch (RuntimeException e) {
204             verify(logger).error(Mockito.eq("Unable to prepare grant request for termination"), Mockito.any(RuntimeException.class));
205             verifyNoMoreInteractions(nsLcmApi);
206         }
207     }
208
209     /**
210      * failure is to request grant is logged
211      */
212     @Test
213     public void testFailureToRequestGrantIsLogged() throws Exception {
214         VnfInfo vnf = new VnfInfo();
215         vnf.setId(VNF_ID);
216         vnf.setInstantiationState(InstantiationState.INSTANTIATED);
217         InstantiatedVnfInfo instantiatedVnfInfo = new InstantiatedVnfInfo();
218         VnfcResourceInfo vnfc = new VnfcResourceInfo();
219         vnfc.setId("vnfcId1");
220         vnfc.setVduId("vdu1");
221         instantiatedVnfInfo.setVnfcResourceInfo(new ArrayList<>());
222         instantiatedVnfInfo.getVnfcResourceInfo().add(vnfc);
223         vnf.setInstantiatedVnfInfo(instantiatedVnfInfo);
224         VnfProperty prop = new VnfProperty();
225         prop.setName(LifecycleManager.ONAP_CSAR_ID);
226         prop.setValue(ONAP_CSAR_ID);
227         vnf.setVnfConfigurableProperties(new ArrayList<>());
228         vnf.getVnfConfigurableProperties().add(prop);
229         RuntimeException expectedException = new RuntimeException();
230         when(nsLcmApi.grantvnf(Mockito.any())).thenThrow(expectedException);
231         ArgumentCaptor<String> logCaptor = ArgumentCaptor.forClass(String.class);
232         Mockito.doNothing().when(logger).error(logCaptor.capture(), Mockito.eq(expectedException));
233         //when
234         try {
235             vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
236             //verify
237             fail();
238         } catch (RuntimeException e) {
239             String value = logCaptor.getValue();
240             assertTrue(value.contains("Unable to request grant with "));
241         }
242     }
243
244     /**
245      * failure is to request grant is logged
246      */
247     @Test
248     public void testFailureToRequestGrantForScaleIsLogged() throws Exception {
249         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
250         VnfScaleRequest scaleRequest = new VnfScaleRequest();
251         scaleRequest.setType(ScaleDirection.OUT);
252         scaleRequest.setAspectId("aspect1");
253         scaleRequest.setNumberOfSteps("2");
254         RuntimeException expectedException = new RuntimeException();
255         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenThrow(expectedException);
256         //when
257         try {
258             vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
259             //verify
260             fail();
261         } catch (RuntimeException e) {
262             verify(logger).error(Mockito.eq("Unable to query VNF myVnfId"), Mockito.eq(expectedException));
263             assertEquals(e.getCause(), expectedException);
264         }
265     }
266
267     /**
268      * test grant request for scale out
269      */
270     @Test
271     public void testGrantDuringScaleOut() throws Exception {
272         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
273         VnfScaleRequest scaleRequest = new VnfScaleRequest();
274         scaleRequest.setType(ScaleDirection.OUT);
275         scaleRequest.setAspectId("aspect1");
276         scaleRequest.setNumberOfSteps("2");
277         VnfInfo vnf = new VnfInfo();
278         Observable<VnfInfo> vnfInfoObservable = buildObservable(vnf);
279         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(vnfInfoObservable);
280         vnf.setVnfdId(CBAM_VNFD_ID);
281         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
282         //when
283         vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
284         //verify
285         assertEquals(1, grantRequest.getAllValues().size());
286         GrantVNFRequest request = grantRequest.getValue();
287         assertVduInGrant(request.getAddResource(), "vdu1", 4);
288         assertVduInGrant(request.getAddResource(), "vdu2", 2);
289         assertEquals(0, request.getRemoveResource().size());
290         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEOUT);
291     }
292
293     /**
294      * test grant request for scale out without VDUs
295      */
296     @Test
297     public void testGrantDuringScaleOutWithoutVdus() throws Exception {
298         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
299         VnfScaleRequest scaleRequest = new VnfScaleRequest();
300         scaleRequest.setType(ScaleDirection.OUT);
301         scaleRequest.setAspectId("aspectWithOutVdu");
302         scaleRequest.setNumberOfSteps("2");
303         VnfInfo vnf = new VnfInfo();
304         Observable<VnfInfo> vnfInfoObservable = buildObservable(vnf);
305         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(vnfInfoObservable);
306         vnf.setVnfdId(CBAM_VNFD_ID);
307         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
308         //when
309         vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
310         //verify
311         assertEquals(1, grantRequest.getAllValues().size());
312         GrantVNFRequest request = grantRequest.getValue();
313         assertVduInGrant(request.getAddResource(), "vdu1", 0);
314         assertVduInGrant(request.getAddResource(), "vdu2", 0);
315         assertEquals(0, request.getRemoveResource().size());
316         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEOUT);
317     }
318
319     /**
320      * test grant request for scale out without resources
321      */
322     @Test
323     public void testGrantDuringScaleOutForEmptyAspect() throws Exception {
324         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
325         VnfScaleRequest scaleRequest = new VnfScaleRequest();
326         scaleRequest.setType(ScaleDirection.OUT);
327         scaleRequest.setAspectId("emptyAspect");
328         scaleRequest.setNumberOfSteps("2");
329         VnfInfo vnf = new VnfInfo();
330         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnf));
331         vnf.setVnfdId(CBAM_VNFD_ID);
332         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
333         //when
334         try {
335             vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
336             fail();
337         } catch (Exception e) {
338             assertEquals("Missing child emptyAspect", e.getMessage());
339         }
340     }
341
342     /**
343      * test grant request for scale in
344      */
345     @Test
346     public void testGrantDuringScaleIn() throws Exception {
347         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
348         VnfScaleRequest scaleRequest = new VnfScaleRequest();
349         scaleRequest.setType(ScaleDirection.IN);
350         scaleRequest.setAspectId("aspect1");
351         scaleRequest.setNumberOfSteps("2");
352         VnfInfo vnf = new VnfInfo();
353         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnf));
354         vnf.setVnfdId(CBAM_VNFD_ID);
355         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
356         //when
357         vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
358         //verify
359         assertEquals(1, grantRequest.getAllValues().size());
360         GrantVNFRequest request = grantRequest.getValue();
361         assertVduInGrant(request.getRemoveResource(), "vdu1", 4);
362         assertVduInGrant(request.getRemoveResource(), "vdu2", 2);
363         assertEquals(0, request.getAddResource().size());
364         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEIN);
365     }
366
367     /**
368      * test grant request for healing
369      */
370     @Test
371     public void testGrantDuringHealing() throws Exception {
372         //when
373         VnfHealRequest healRequest = new VnfHealRequest();
374         VnfHealRequestAffectedvm affectedVm = new VnfHealRequestAffectedvm();
375         affectedVm.setVduid("vdu1");
376         healRequest.setAffectedvm(affectedVm);
377         vfcGrantManager.requestGrantForHeal(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, healRequest, JOB_ID);
378         //verify
379         assertEquals(1, grantRequest.getAllValues().size());
380         GrantVNFRequest request = grantRequest.getValue();
381         assertVduInGrant(request.getAddResource(), "vdu1", 1);
382         assertVduInGrant(request.getRemoveResource(), "vdu1", 1);
383         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.HEAL);
384     }
385
386     @Test
387     public void testPOJO() {
388         VfcGrantManager.AdditionalGrantParams additionalGrantParams = new VfcGrantManager.AdditionalGrantParams(VNFM_ID, VIM_ID);
389         assertEquals(VNFM_ID, additionalGrantParams.getVnfmId());
390         assertEquals(VIM_ID, additionalGrantParams.getVimId());
391     }
392
393     private void assertBasicGrantAttributes(GrantVNFRequest request, org.onap.vnfmdriver.model.OperationType type) {
394         assertEquals(JOB_ID, request.getJobId());
395         assertEquals(type, request.getLifecycleOperation());
396         assertEquals(ONAP_CSAR_ID, request.getVnfDescriptorId());
397         assertEquals(VNF_ID, request.getVnfInstanceId());
398         JsonObject additionalParams = new Gson().toJsonTree(request.getAdditionalParam()).getAsJsonObject();
399         assertEquals(VIM_ID, additionalParams.get("vimId").getAsString());
400         assertEquals(VNFM_ID, additionalParams.get("vnfmId").getAsString());
401     }
402
403     private void assertVduInGrant(List<ResourceChange> changes, String vduName, int count) {
404         ArrayList<ResourceChange> clonedChanges = Lists.newArrayList(changes);
405         for (int i = 0; i < count + 1; i++) {
406             Iterator<ResourceChange> iter = clonedChanges.iterator();
407             boolean found = false;
408             while (iter.hasNext()) {
409                 ResourceChange change = iter.next();
410                 if (change.getVdu().equals(vduName)) {
411                     iter.remove();
412                     found = true;
413                     break;
414                 }
415             }
416             if (i >= count) {
417                 assertFalse(found);
418             } else {
419                 assertTrue(found);
420             }
421         }
422     }
423
424 }