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.InjectMocks;
32 import org.mockito.Mock;
33 import org.mockito.Mockito;
34 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CatalogManager;
35 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.LifecycleManager;
36 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.TestBase;
37 import org.onap.vnfmdriver.model.*;
38 import org.onap.vnfmdriver.model.ScaleDirection;
40 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(buildObservable(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 RuntimeException expectedException = new RuntimeException("a");
105 when(nsLcmApi.grantvnf(Mockito.any())).thenThrow(expectedException);
106 ArgumentCaptor<String> logCaptor = ArgumentCaptor.forClass(String.class);
107 Mockito.doNothing().when(logger).error(logCaptor.capture(), Mockito.eq(expectedException));
110 vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
113 } catch (RuntimeException e) {
114 assertTrue(logCaptor.getValue().contains("Unable to request grant with "));
119 * No grant is requested for termination if the the VNF is not instantiated
122 public void testNoGrantIsRequestedIfNotInstantiated() {
123 VnfInfo vnf = new VnfInfo();
125 vnf.setInstantiationState(InstantiationState.NOT_INSTANTIATED);
127 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
129 verifyNoMoreInteractions(nsLcmApi);
133 * grant is requested for termination if the the VNF is instantiated
136 public void testGrantIsRequestedIfInstantiated() {
137 VnfInfo vnf = new VnfInfo();
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);
153 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
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);
164 * grant is requested for termination if the the VNF is instantiated even if has no VNFCs
167 public void testGrantIsRequestedIfInstantiatedWithNoVnfcs() {
168 VnfInfo vnf = new VnfInfo();
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);
179 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
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);
190 * test failure logging & propagation during grant request for instantiation
193 public void testFailureDuringTerminationGrantPreparation() throws Exception {
194 VnfInfo vnf = new VnfInfo();
196 vnf.setInstantiatedVnfInfo(null);
197 vnf.setInstantiationState(InstantiationState.INSTANTIATED);
200 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
203 } catch (RuntimeException e) {
204 verify(logger).error(Mockito.eq("Unable to prepare grant request for termination"), Mockito.any(RuntimeException.class));
205 verifyNoMoreInteractions(nsLcmApi);
210 * failure is to request grant is logged
213 public void testFailureToRequestGrantIsLogged() throws Exception {
214 VnfInfo vnf = new VnfInfo();
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 ArgumentCaptor<String> logCaptor = ArgumentCaptor.forClass(String.class);
232 Mockito.doNothing().when(logger).error(logCaptor.capture(), Mockito.eq(expectedException));
235 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
238 } catch (RuntimeException e) {
239 String value = logCaptor.getValue();
240 assertTrue(value.contains("Unable to request grant with "));
245 * failure is to request grant is logged
248 public void testFailureToRequestGrantForScaleIsLogged() throws Exception {
249 String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
250 VnfScaleRequest scaleRequest = new VnfScaleRequest();
251 scaleRequest.setType(ScaleDirection.OUT);
252 scaleRequest.setAspectId("aspect1");
253 scaleRequest.setNumberOfSteps("2");
254 RuntimeException expectedException = new RuntimeException();
255 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenThrow(expectedException);
258 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
261 } catch (RuntimeException e) {
262 verify(logger).error(Mockito.eq("Unable to query VNF myVnfId"), Mockito.eq(expectedException));
263 assertEquals(e.getCause(), expectedException);
268 * test grant request for scale out
271 public void testGrantDuringScaleOut() throws Exception {
272 String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
273 VnfScaleRequest scaleRequest = new VnfScaleRequest();
274 scaleRequest.setType(ScaleDirection.OUT);
275 scaleRequest.setAspectId("aspect1");
276 scaleRequest.setNumberOfSteps("2");
277 VnfInfo vnf = new VnfInfo();
278 Observable<VnfInfo> vnfInfoObservable = buildObservable(vnf);
279 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(vnfInfoObservable);
280 vnf.setVnfdId(CBAM_VNFD_ID);
281 when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
283 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
285 assertEquals(1, grantRequest.getAllValues().size());
286 GrantVNFRequest request = grantRequest.getValue();
287 assertVduInGrant(request.getAddResource(), "vdu1", 4);
288 assertVduInGrant(request.getAddResource(), "vdu2", 2);
289 assertEquals(0, request.getRemoveResource().size());
290 assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEOUT);
294 * test grant request for scale out without VDUs
297 public void testGrantDuringScaleOutWithoutVdus() throws Exception {
298 String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
299 VnfScaleRequest scaleRequest = new VnfScaleRequest();
300 scaleRequest.setType(ScaleDirection.OUT);
301 scaleRequest.setAspectId("aspectWithOutVdu");
302 scaleRequest.setNumberOfSteps("2");
303 VnfInfo vnf = new VnfInfo();
304 Observable<VnfInfo> vnfInfoObservable = buildObservable(vnf);
305 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(vnfInfoObservable);
306 vnf.setVnfdId(CBAM_VNFD_ID);
307 when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
309 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
311 assertEquals(1, grantRequest.getAllValues().size());
312 GrantVNFRequest request = grantRequest.getValue();
313 assertVduInGrant(request.getAddResource(), "vdu1", 0);
314 assertVduInGrant(request.getAddResource(), "vdu2", 0);
315 assertEquals(0, request.getRemoveResource().size());
316 assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEOUT);
320 * test grant request for scale out without resources
323 public void testGrantDuringScaleOutForEmptyAspect() throws Exception {
324 String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
325 VnfScaleRequest scaleRequest = new VnfScaleRequest();
326 scaleRequest.setType(ScaleDirection.OUT);
327 scaleRequest.setAspectId("emptyAspect");
328 scaleRequest.setNumberOfSteps("2");
329 VnfInfo vnf = new VnfInfo();
330 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnf));
331 vnf.setVnfdId(CBAM_VNFD_ID);
332 when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
335 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
337 } catch (Exception e) {
338 assertEquals("Missing child emptyAspect", e.getMessage());
343 * test grant request for scale in
346 public void testGrantDuringScaleIn() throws Exception {
347 String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
348 VnfScaleRequest scaleRequest = new VnfScaleRequest();
349 scaleRequest.setType(ScaleDirection.IN);
350 scaleRequest.setAspectId("aspect1");
351 scaleRequest.setNumberOfSteps("2");
352 VnfInfo vnf = new VnfInfo();
353 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnf));
354 vnf.setVnfdId(CBAM_VNFD_ID);
355 when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
357 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
359 assertEquals(1, grantRequest.getAllValues().size());
360 GrantVNFRequest request = grantRequest.getValue();
361 assertVduInGrant(request.getRemoveResource(), "vdu1", 4);
362 assertVduInGrant(request.getRemoveResource(), "vdu2", 2);
363 assertEquals(0, request.getAddResource().size());
364 assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEIN);
368 * test grant request for healing
371 public void testGrantDuringHealing() throws Exception {
373 VnfHealRequest healRequest = new VnfHealRequest();
374 VnfHealRequestAffectedvm affectedVm = new VnfHealRequestAffectedvm();
375 affectedVm.setVduid("vdu1");
376 healRequest.setAffectedvm(affectedVm);
377 vfcGrantManager.requestGrantForHeal(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, healRequest, JOB_ID);
379 assertEquals(1, grantRequest.getAllValues().size());
380 GrantVNFRequest request = grantRequest.getValue();
381 assertVduInGrant(request.getAddResource(), "vdu1", 1);
382 assertVduInGrant(request.getRemoveResource(), "vdu1", 1);
383 assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.HEAL);
387 public void testPOJO() {
388 VfcGrantManager.AdditionalGrantParams additionalGrantParams = new VfcGrantManager.AdditionalGrantParams(VNFM_ID, VIM_ID);
389 assertEquals(VNFM_ID, additionalGrantParams.getVnfmId());
390 assertEquals(VIM_ID, additionalGrantParams.getVimId());
393 private void assertBasicGrantAttributes(GrantVNFRequest request, org.onap.vnfmdriver.model.OperationType type) {
394 assertEquals(JOB_ID, request.getJobId());
395 assertEquals(type, request.getLifecycleOperation());
396 assertEquals(ONAP_CSAR_ID, request.getVnfDescriptorId());
397 assertEquals(VNF_ID, request.getVnfInstanceId());
398 JsonObject additionalParams = new Gson().toJsonTree(request.getAdditionalParam()).getAsJsonObject();
399 assertEquals(VIM_ID, additionalParams.get("vimId").getAsString());
400 assertEquals(VNFM_ID, additionalParams.get("vnfmId").getAsString());
403 private void assertVduInGrant(List<ResourceChange> changes, String vduName, int count) {
404 ArrayList<ResourceChange> clonedChanges = Lists.newArrayList(changes);
405 for (int i = 0; i < count + 1; i++) {
406 Iterator<ResourceChange> iter = clonedChanges.iterator();
407 boolean found = false;
408 while (iter.hasNext()) {
409 ResourceChange change = iter.next();
410 if (change.getVdu().equals(vduName)) {