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