2 * Copyright 2016-2017, Nokia Corporation
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.vfc;
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;
36 import java.nio.file.Paths;
37 import java.util.ArrayList;
38 import java.util.Iterator;
39 import java.util.List;
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;
47 public class TestVfcGrantManager extends TestBase {
49 private ArgumentCaptor<GrantVNFRequest> grantRequest = ArgumentCaptor.forClass(GrantVNFRequest.class);
50 private GrantVNFResponseVim vim = new GrantVNFResponseVim();
51 private GrantVNFResponse grantResponse = new GrantVNFResponse();
53 private CatalogManager cbamCatalogManager;
55 private VfcGrantManager vfcGrantManager;
58 public void initMocks() throws Exception {
59 setField(VfcGrantManager.class, "logger", logger);
60 when(nsLcmApi.grantvnf(grantRequest.capture())).thenReturn(grantResponse);
61 grantResponse.setVim(vim);
65 * test grant request for instantiation
68 public void testGrantDuringInstantiation() throws Exception {
69 String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
71 vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
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);
82 * test failure logging & propagation during grant request for instantiation
85 public void testFailureDuringGrantPreparation() throws Exception {
86 String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
89 vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "missingLevel", cbamVnfdContent, JOB_ID);
92 } catch (RuntimeException e) {
93 verify(logger).error(Mockito.eq("Unable to prepare grant request for instantiation"), Mockito.any(RuntimeException.class));
94 verifyNoMoreInteractions(nsLcmApi);
99 * test grant request for instantiation
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);
108 vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
111 } catch (RuntimeException e) {
112 verify(logger).error("Unable to request grant", expectedException);
117 * No grant is requested for termination if the the VNF is not instantiated
120 public void testNoGrantIsRequestedIfNotInstantiated() {
121 VnfInfo vnf = new VnfInfo();
123 vnf.setInstantiationState(InstantiationState.NOT_INSTANTIATED);
125 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
127 verifyNoMoreInteractions(nsLcmApi);
131 * grant is requested for termination if the the VNF is instantiated
134 public void testGrantIsRequestedIfInstantiated() {
135 VnfInfo vnf = new VnfInfo();
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);
151 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
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);
162 * grant is requested for termination if the the VNF is instantiated even if has no VNFCs
165 public void testGrantIsRequestedIfInstantiatedWithNoVnfcs() {
166 VnfInfo vnf = new VnfInfo();
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);
177 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
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);
188 * test failure logging & propagation during grant request for instantiation
191 public void testFailureDuringTerminationGrantPreparation() throws Exception {
192 VnfInfo vnf = new VnfInfo();
194 vnf.setInstantiatedVnfInfo(null);
195 vnf.setInstantiationState(InstantiationState.INSTANTIATED);
198 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
201 } catch (RuntimeException e) {
202 verify(logger).error(Mockito.eq("Unable to prepare grant request for termination"), Mockito.any(RuntimeException.class));
203 verifyNoMoreInteractions(nsLcmApi);
208 * failure is to request grant is logged
211 public void testFailureToRequestGrantIsLogged() throws Exception {
212 VnfInfo vnf = new VnfInfo();
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);
231 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
234 } catch (RuntimeException e) {
235 verify(logger).error(Mockito.eq("Unable to request grant"), Mockito.eq(expectedException));
240 * failure is to request grant is logged
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);
253 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
256 } catch (RuntimeException e) {
257 verify(logger).error(Mockito.eq("Unable to query VNF myVnfId"), Mockito.eq(expectedException));
258 assertEquals(e.getCause(), expectedException);
263 * test grant request for scale out
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);
277 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
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);
288 * test grant request for scale out without VDUs
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);
302 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
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);
313 * test grant request for scale out without resources
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);
328 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
330 } catch (Exception e) {
331 assertEquals("Missing child emptyAspect", e.getMessage());
336 * test grant request for scale in
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);
350 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
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);
361 * test grant request for healing
364 public void testGrantDuringHealing() throws Exception {
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);
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);
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());
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());
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)) {