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 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;
39 import static java.nio.file.Files.readAllBytes;
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;
46 public class TestVfcGrantManager extends TestBase {
48 private ArgumentCaptor<GrantVNFRequest> grantRequest = ArgumentCaptor.forClass(GrantVNFRequest.class);
49 private GrantVNFResponseVim vim = new GrantVNFResponseVim();
50 private GrantVNFResponse grantResponse = new GrantVNFResponse();
52 private CatalogManagerForVfc cbamCatalogManager;
53 private VfcGrantManager vfcGrantManager;
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);
64 * test grant request for instantiation
67 public void testGrantDuringInstantiation() throws Exception {
68 String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
70 vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
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);
81 * test failure logging & propagation during grant request for instantiation
84 public void testFailureDuringGrantPreparation() throws Exception {
85 String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
88 vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "missingLevel", cbamVnfdContent, JOB_ID);
91 } catch (RuntimeException e) {
92 verify(logger).error(Mockito.eq("Unable to prepare grant request for instantiation"), Mockito.any(RuntimeException.class));
93 verifyNoMoreInteractions(nsLcmApi);
98 * test grant request for instantiation
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));
109 vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
112 } catch (RuntimeException e) {
113 assertTrue(logCaptor.getValue().contains("Unable to request grant with "));
118 * No grant is requested for termination if the the VNF is not instantiated
121 public void testNoGrantIsRequestedIfNotInstantiated() {
122 VnfInfo vnf = new VnfInfo();
124 vnf.setInstantiationState(InstantiationState.NOT_INSTANTIATED);
126 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
128 verifyNoMoreInteractions(nsLcmApi);
132 * grant is requested for termination if the the VNF is instantiated
135 public void testGrantIsRequestedIfInstantiated() {
136 VnfInfo vnf = new VnfInfo();
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);
152 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
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);
163 * grant is requested for termination if the the VNF is instantiated even if has no VNFCs
166 public void testGrantIsRequestedIfInstantiatedWithNoVnfcs() {
167 VnfInfo vnf = new VnfInfo();
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);
178 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
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);
189 * test failure logging & propagation during grant request for instantiation
192 public void testFailureDuringTerminationGrantPreparation() throws Exception {
193 VnfInfo vnf = new VnfInfo();
195 vnf.setInstantiatedVnfInfo(null);
196 vnf.setInstantiationState(InstantiationState.INSTANTIATED);
199 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
202 } catch (RuntimeException e) {
203 verify(logger).error(Mockito.eq("Unable to prepare grant request for termination"), Mockito.any(RuntimeException.class));
204 verifyNoMoreInteractions(nsLcmApi);
209 * failure is to request grant is logged
212 public void testFailureToRequestGrantIsLogged() throws Exception {
213 VnfInfo vnf = new VnfInfo();
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));
234 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
237 } catch (RuntimeException e) {
238 String value = logCaptor.getValue();
239 assertTrue(value.contains("Unable to request grant with "));
244 * failure is to request grant is logged
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);
257 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
260 } catch (RuntimeException e) {
261 verify(logger).error(Mockito.eq("Unable to query VNF myVnfId"), Mockito.eq(expectedException));
262 assertEquals(e.getCause(), expectedException);
267 * test grant request for scale out
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);
282 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
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);
293 * test grant request for scale out without VDUs
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);
308 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
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);
319 * test grant request for scale out without resources
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);
334 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
336 } catch (Exception e) {
337 assertEquals("Missing child emptyAspect", e.getMessage());
342 * test grant request for scale in
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);
356 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
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);
367 * test grant request for healing
370 public void testGrantDuringHealing() throws Exception {
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);
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);
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());
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());
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)) {