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 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;
37 import java.nio.file.Paths;
38 import java.util.ArrayList;
39 import java.util.Iterator;
40 import java.util.List;
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;
48 public class TestVfcGrantManager extends TestBase {
50 private ArgumentCaptor<GrantVNFRequest> grantRequest = ArgumentCaptor.forClass(GrantVNFRequest.class);
51 private GrantVNFResponseVim vim = new GrantVNFResponseVim();
52 private GrantVNFResponse grantResponse = new GrantVNFResponse();
54 private CatalogManager cbamCatalogManager;
56 private VfcGrantManager vfcGrantManager;
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);
67 * test grant request for instantiation
70 public void testGrantDuringInstantiation() throws Exception {
71 String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
73 vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
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);
84 * test failure logging & propagation during grant request for instantiation
87 public void testFailureDuringGrantPreparation() throws Exception {
88 String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
91 vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "missingLevel", cbamVnfdContent, JOB_ID);
94 } catch (RuntimeException e) {
95 verify(logger).error(Mockito.eq("Unable to prepare grant request for instantiation"), Mockito.any(RuntimeException.class));
96 verifyNoMoreInteractions(nsLcmApi);
101 * test grant request for instantiation
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);
110 vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
113 } catch (RuntimeException e) {
114 verify(logger).error("Unable to request grant", expectedException);
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);
233 vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
236 } catch (RuntimeException e) {
237 verify(logger).error(Mockito.eq("Unable to request grant"), Mockito.eq(expectedException));
242 * failure is to request grant is logged
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);
255 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
258 } catch (RuntimeException e) {
259 verify(logger).error(Mockito.eq("Unable to query VNF myVnfId"), Mockito.eq(expectedException));
260 assertEquals(e.getCause(), expectedException);
265 * test grant request for scale out
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);
280 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
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);
291 * test grant request for scale out without VDUs
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);
306 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
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);
317 * test grant request for scale out without resources
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);
332 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
334 } catch (Exception e) {
335 assertEquals("Missing child emptyAspect", e.getMessage());
340 * test grant request for scale in
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);
354 vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
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);
365 * test grant request for healing
368 public void testGrantDuringHealing() throws Exception {
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);
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);
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());
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());
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)) {