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