53e8f8d75c964e254353f24e4dab39087044a259
[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 io.reactivex.Observable;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.mockito.ArgumentCaptor;
27 import org.mockito.InjectMocks;
28 import org.mockito.Mock;
29 import org.mockito.Mockito;
30 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CatalogManager;
31 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.LifecycleManager;
32 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.TestBase;
33 import org.onap.vnfmdriver.model.*;
34 import org.onap.vnfmdriver.model.ScaleDirection;
35 import retrofit2.Call;
36
37 import java.nio.file.Paths;
38 import java.util.ArrayList;
39 import java.util.Iterator;
40 import java.util.List;
41
42 import static java.nio.file.Files.readAllBytes;
43 import static junit.framework.TestCase.*;
44 import static org.mockito.Mockito.*;
45 import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CbamRestApiProvider.NOKIA_LCM_API_VERSION;
46 import static org.springframework.test.util.ReflectionTestUtils.setField;
47
48 public class TestVfcGrantManager extends TestBase {
49
50     private ArgumentCaptor<GrantVNFRequest> grantRequest = ArgumentCaptor.forClass(GrantVNFRequest.class);
51     private GrantVNFResponseVim vim = new GrantVNFResponseVim();
52     private GrantVNFResponse grantResponse = new GrantVNFResponse();
53     @Mock
54     private CatalogManager cbamCatalogManager;
55     @InjectMocks
56     private VfcGrantManager vfcGrantManager;
57
58     @Before
59     public void initMocks() throws Exception {
60         setField(VfcGrantManager.class, "logger", logger);
61         Call<GrantVNFResponse> grantVNFResponseCall = buildCall(grantResponse);
62         when(nsLcmApi.grantvnf(grantRequest.capture())).thenReturn(grantVNFResponseCall);
63         grantResponse.setVim(vim);
64     }
65
66     /**
67      * test grant request for instantiation
68      */
69     @Test
70     public void testGrantDuringInstantiation() throws Exception {
71         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
72         //when
73         vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
74         //verify
75         assertEquals(1, grantRequest.getAllValues().size());
76         GrantVNFRequest request = grantRequest.getValue();
77         assertVduInGrant(request.getAddResource(), "vdu1", 1);
78         assertVduInGrant(request.getAddResource(), "vdu2", 2);
79         assertEquals(0, request.getRemoveResource().size());
80         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.INSTANTIATE);
81     }
82
83     /**
84      * test failure logging & propagation during grant request for instantiation
85      */
86     @Test
87     public void testFailureDuringGrantPreparation() throws Exception {
88         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
89         //when
90         try {
91             vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "missingLevel", cbamVnfdContent, JOB_ID);
92             //verify
93             fail();
94         } catch (RuntimeException e) {
95             verify(logger).error(Mockito.eq("Unable to prepare grant request for instantiation"), Mockito.any(RuntimeException.class));
96             verifyNoMoreInteractions(nsLcmApi);
97         }
98     }
99
100     /**
101      * test grant request for instantiation
102      */
103     @Test
104     public void testFailureDuringGrantRequest() throws Exception {
105         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
106         RuntimeException expectedException = new RuntimeException("a");
107         when(nsLcmApi.grantvnf(Mockito.any())).thenThrow(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             verify(logger).error("Unable to request grant", expectedException);
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         //when
232         try {
233             vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
234             //verify
235             fail();
236         } catch (RuntimeException e) {
237             verify(logger).error(Mockito.eq("Unable to request grant"), Mockito.eq(expectedException));
238         }
239     }
240
241     /**
242      * failure is to request grant is logged
243      */
244     @Test
245     public void testFailureToRequestGrantForScaleIsLogged() throws Exception {
246         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
247         VnfScaleRequest scaleRequest = new VnfScaleRequest();
248         scaleRequest.setType(ScaleDirection.OUT);
249         scaleRequest.setAspectId("aspect1");
250         scaleRequest.setNumberOfSteps("2");
251         RuntimeException expectedException = new RuntimeException();
252         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenThrow(expectedException);
253         //when
254         try {
255             vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
256             //verify
257             fail();
258         } catch (RuntimeException e) {
259             verify(logger).error(Mockito.eq("Unable to query VNF myVnfId"), Mockito.eq(expectedException));
260             assertEquals(e.getCause(), expectedException);
261         }
262     }
263
264     /**
265      * test grant request for scale out
266      */
267     @Test
268     public void testGrantDuringScaleOut() throws Exception {
269         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
270         VnfScaleRequest scaleRequest = new VnfScaleRequest();
271         scaleRequest.setType(ScaleDirection.OUT);
272         scaleRequest.setAspectId("aspect1");
273         scaleRequest.setNumberOfSteps("2");
274         VnfInfo vnf = new VnfInfo();
275         Observable<VnfInfo> vnfInfoObservable = buildObservable(vnf);
276         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(vnfInfoObservable);
277         vnf.setVnfdId(CBAM_VNFD_ID);
278         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
279         //when
280         vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
281         //verify
282         assertEquals(1, grantRequest.getAllValues().size());
283         GrantVNFRequest request = grantRequest.getValue();
284         assertVduInGrant(request.getAddResource(), "vdu1", 4);
285         assertVduInGrant(request.getAddResource(), "vdu2", 2);
286         assertEquals(0, request.getRemoveResource().size());
287         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEOUT);
288     }
289
290     /**
291      * test grant request for scale out without VDUs
292      */
293     @Test
294     public void testGrantDuringScaleOutWithoutVdus() throws Exception {
295         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
296         VnfScaleRequest scaleRequest = new VnfScaleRequest();
297         scaleRequest.setType(ScaleDirection.OUT);
298         scaleRequest.setAspectId("aspectWithOutVdu");
299         scaleRequest.setNumberOfSteps("2");
300         VnfInfo vnf = new VnfInfo();
301         Observable<VnfInfo> vnfInfoObservable = buildObservable(vnf);
302         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(vnfInfoObservable);
303         vnf.setVnfdId(CBAM_VNFD_ID);
304         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
305         //when
306         vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
307         //verify
308         assertEquals(1, grantRequest.getAllValues().size());
309         GrantVNFRequest request = grantRequest.getValue();
310         assertVduInGrant(request.getAddResource(), "vdu1", 0);
311         assertVduInGrant(request.getAddResource(), "vdu2", 0);
312         assertEquals(0, request.getRemoveResource().size());
313         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEOUT);
314     }
315
316     /**
317      * test grant request for scale out without resources
318      */
319     @Test
320     public void testGrantDuringScaleOutForEmptyAspect() throws Exception {
321         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
322         VnfScaleRequest scaleRequest = new VnfScaleRequest();
323         scaleRequest.setType(ScaleDirection.OUT);
324         scaleRequest.setAspectId("emptyAspect");
325         scaleRequest.setNumberOfSteps("2");
326         VnfInfo vnf = new VnfInfo();
327         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnf));
328         vnf.setVnfdId(CBAM_VNFD_ID);
329         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
330         //when
331         try {
332             vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
333             fail();
334         } catch (Exception e) {
335             assertEquals("Missing child emptyAspect", e.getMessage());
336         }
337     }
338
339     /**
340      * test grant request for scale in
341      */
342     @Test
343     public void testGrantDuringScaleIn() throws Exception {
344         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
345         VnfScaleRequest scaleRequest = new VnfScaleRequest();
346         scaleRequest.setType(ScaleDirection.IN);
347         scaleRequest.setAspectId("aspect1");
348         scaleRequest.setNumberOfSteps("2");
349         VnfInfo vnf = new VnfInfo();
350         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnf));
351         vnf.setVnfdId(CBAM_VNFD_ID);
352         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
353         //when
354         vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
355         //verify
356         assertEquals(1, grantRequest.getAllValues().size());
357         GrantVNFRequest request = grantRequest.getValue();
358         assertVduInGrant(request.getRemoveResource(), "vdu1", 4);
359         assertVduInGrant(request.getRemoveResource(), "vdu2", 2);
360         assertEquals(0, request.getAddResource().size());
361         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEIN);
362     }
363
364     /**
365      * test grant request for healing
366      */
367     @Test
368     public void testGrantDuringHealing() throws Exception {
369         //when
370         VnfHealRequest healRequest = new VnfHealRequest();
371         VnfHealRequestAffectedvm affectedVm = new VnfHealRequestAffectedvm();
372         affectedVm.setVduid("vdu1");
373         healRequest.setAffectedvm(affectedVm);
374         vfcGrantManager.requestGrantForHeal(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, healRequest, JOB_ID);
375         //verify
376         assertEquals(1, grantRequest.getAllValues().size());
377         GrantVNFRequest request = grantRequest.getValue();
378         assertVduInGrant(request.getAddResource(), "vdu1", 1);
379         assertVduInGrant(request.getRemoveResource(), "vdu1", 1);
380         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.HEAL);
381     }
382
383     @Test
384     public void testPOJO() {
385         VfcGrantManager.AdditionalGrantParams additionalGrantParams = new VfcGrantManager.AdditionalGrantParams(VNFM_ID, VIM_ID);
386         assertEquals(VNFM_ID, additionalGrantParams.getVnfmId());
387         assertEquals(VIM_ID, additionalGrantParams.getVimId());
388     }
389
390     private void assertBasicGrantAttributes(GrantVNFRequest request, org.onap.vnfmdriver.model.OperationType type) {
391         assertEquals(JOB_ID, request.getJobId());
392         assertEquals(type, request.getLifecycleOperation());
393         assertEquals(ONAP_CSAR_ID, request.getVnfDescriptorId());
394         assertEquals(VNF_ID, request.getVnfInstanceId());
395         JsonObject additionalParams = new Gson().toJsonTree(request.getAdditionalParam()).getAsJsonObject();
396         assertEquals(VIM_ID, additionalParams.get("vimId").getAsString());
397         assertEquals(VNFM_ID, additionalParams.get("vnfmId").getAsString());
398     }
399
400     private void assertVduInGrant(List<ResourceChange> changes, String vduName, int count) {
401         ArrayList<ResourceChange> clonedChanges = Lists.newArrayList(changes);
402         for (int i = 0; i < count + 1; i++) {
403             Iterator<ResourceChange> iter = clonedChanges.iterator();
404             boolean found = false;
405             while (iter.hasNext()) {
406                 ResourceChange change = iter.next();
407                 if (change.getVdu().equals(vduName)) {
408                     iter.remove();
409                     found = true;
410                     break;
411                 }
412             }
413             if (i >= count) {
414                 assertFalse(found);
415             } else {
416                 assertTrue(found);
417             }
418         }
419     }
420
421 }