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.vnfm;
18 import com.google.gson.Gson;
19 import com.google.gson.JsonElement;
20 import com.google.gson.JsonObject;
21 import com.google.gson.JsonParser;
22 import com.nokia.cbam.catalog.v1.model.CatalogAdapterVnfpackage;
23 import com.nokia.cbam.lcm.v32.model.*;
24 import com.nokia.cbam.lcm.v32.model.OperationType;
25 import com.nokia.cbam.lcm.v32.model.VimInfo;
26 import com.nokia.cbam.lcm.v32.model.VnfInfo;
27 import io.reactivex.Observable;
28 import java.nio.file.Paths;
30 import javax.servlet.http.HttpServletResponse;
31 import org.junit.Before;
32 import org.junit.Test;
33 import org.mockito.ArgumentCaptor;
34 import org.mockito.InOrder;
35 import org.mockito.Mock;
36 import org.mockito.Mockito;
37 import org.mockito.invocation.InvocationOnMock;
38 import org.mockito.stubbing.Answer;
39 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.api.VimInfoProvider;
40 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.vfc.TestVfcGrantManager;
41 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.vfc.VfcGrantManager;
42 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.StoreLoader;
43 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.notification.LifecycleChangeNotificationManager;
44 import org.onap.vnfmdriver.model.ExtVirtualLinkInfo;
45 import org.onap.vnfmdriver.model.*;
46 import org.onap.vnfmdriver.model.ScaleDirection;
47 import org.threeten.bp.OffsetDateTime;
49 import static java.lang.Boolean.parseBoolean;
50 import static java.nio.file.Files.readAllBytes;
51 import static java.util.Optional.empty;
53 import static junit.framework.TestCase.*;
54 import static org.mockito.Mockito.*;
55 import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.CbamUtils.child;
56 import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.SystemFunctions.systemFunctions;
57 import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CbamRestApiProvider.NOKIA_LCM_API_VERSION;
58 import static org.springframework.test.util.ReflectionTestUtils.setField;
60 public class TestLifecycleManager extends TestBase {
61 public static final String JOB_ID = "myJobId";
62 public static final String CBAM_VNFD_ID = "cbamVnfdId";
63 public static final String TENANT = "myTenant";
64 public static final String OPERATION_EXECUTION_ID = "operationExecutionId";
65 private static final String ONAP_CSAR_ID = "myOnapCsarId";
66 private static final String VIM_ID = "ownerId_regionId";
68 private CatalogManager catalogManager;
70 private VfcGrantManager vfcGrantManager;
72 private JobManager jobManager;
74 private LifecycleChangeNotificationManager notificationManager;
76 private HttpServletResponse restResponse;
78 private VimInfoProvider vimInfoProvider;
80 private ArgumentCaptor<CreateVnfRequest> createRequest = ArgumentCaptor.forClass(CreateVnfRequest.class);
81 private AdditionalParameters additionalParam = new AdditionalParameters();
82 private String INSTANTIATION_LEVEL = "level1";
83 private GrantVNFResponseVim grantResponse = new GrantVNFResponseVim();
84 private String cbamVnfdContent;
85 private OperationExecution instantiationOperationExecution = new OperationExecution();
86 private OperationExecution modifyPropertyoperationExecution = new OperationExecution();
87 private OperationExecution scaleOperationExecution = new OperationExecution();
88 private OperationExecution healOperationExecution = new OperationExecution();
89 private OperationExecution customOperationExecution = new OperationExecution();
92 private VnfInfo vnfInfo = new VnfInfo();
93 private List<OperationExecution> operationExecutions = new ArrayList<>();
94 private org.onap.vnfmdriver.model.VimInfo vimInfo = new org.onap.vnfmdriver.model.VimInfo();
95 private ExtVirtualLinkInfo externalVirtualLink = new ExtVirtualLinkInfo();
96 private ExtManagedVirtualLinkData extManVl = new ExtManagedVirtualLinkData();
97 private ArgumentCaptor<ModifyVnfInfoRequest> actualVnfModifyRequest = ArgumentCaptor.forClass(ModifyVnfInfoRequest.class);
98 private Set<Boolean> finished = new HashSet<>();
99 private ArgumentCaptor<ScaleVnfRequest> actualScaleRequest = ArgumentCaptor.forClass(ScaleVnfRequest.class);
100 private ArgumentCaptor<HealVnfRequest> actualHealRequest = ArgumentCaptor.forClass(HealVnfRequest.class);
101 private ArgumentCaptor<CustomOperationRequest> customOperationRequestArgumentCaptor = ArgumentCaptor.forClass(CustomOperationRequest.class);
102 private ArgumentCaptor<String> operationIdCaptor = ArgumentCaptor.forClass(String.class);
104 private LifecycleManager lifecycleManager;
107 public void initMocks() throws Exception {
108 vnfInfo.setExtensions(new ArrayList<>());
109 vnfInfo.setOperationExecutions(new ArrayList<>());
110 lifecycleManager = new LifecycleManager(catalogManager, vfcGrantManager, cbamRestApiProvider, vimInfoProvider, jobManager, notificationManager);
111 cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.full.yaml").toURI())));
112 setField(LifecycleManager.class, "logger", logger);
113 CatalogAdapterVnfpackage cbamPackage = new CatalogAdapterVnfpackage();
114 when(catalogManager.preparePackageInCbam(VNFM_ID, ONAP_CSAR_ID)).thenReturn(cbamPackage);
115 cbamPackage.setVnfdId(CBAM_VNFD_ID);
116 vnfInfo.setVnfdId(CBAM_VNFD_ID);
117 vnfInfo.setId(VNF_ID);
118 when(jobManager.spawnJob(VNF_ID, restResponse)).thenReturn(JOB_ID);
119 when(catalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
120 cbamPackage.setId(CBAM_VNFD_ID);
121 vimInfo.setUrl("cloudUrl");
122 vimInfo.setPassword("vimPassword");
123 vimInfo.setUserName("vimUsername");
124 vimInfo.setSslInsecure("true");
125 vimInfo.setVimId(VIM_ID);
126 vimInfo.setName("vimName");
127 when(vimInfoProvider.getVimInfo((VIM_ID))).thenReturn(vimInfo);
128 instantiationOperationExecution.setId(OPERATION_EXECUTION_ID);
129 instantiationOperationExecution.setOperationType(OperationType.INSTANTIATE);
130 instantiationOperationExecution.setStartTime(OffsetDateTime.now());
131 when(vnfApi.vnfsVnfInstanceIdOperationExecutionsGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(operationExecutions));
132 operationExecutions.add(modifyPropertyoperationExecution);
133 modifyPropertyoperationExecution.setStartTime(OffsetDateTime.now());
134 modifyPropertyoperationExecution.setOperationType(OperationType.MODIFY_INFO);
135 operationExecutions.add(instantiationOperationExecution);
136 instantiationOperationExecution.setStatus(OperationStatus.FINISHED);
137 modifyPropertyoperationExecution.setStatus(OperationStatus.FINISHED);
138 customOperationExecution.setStatus(OperationStatus.FINISHED);
139 modifyPropertyoperationExecution.setId(UUID.randomUUID().toString());
140 scaleOperationExecution.setId(UUID.randomUUID().toString());
141 healOperationExecution.setId(UUID.randomUUID().toString());
142 customOperationExecution.setId(UUID.randomUUID().toString());
144 when(vnfApi.vnfsVnfInstanceIdPatch(eq(VNF_ID), actualVnfModifyRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(modifyPropertyoperationExecution));
145 doAnswer(new Answer() {
147 public Object answer(InvocationOnMock invocation) throws Throwable {
148 finished.add(Boolean.TRUE);
151 }).when(jobManager).jobFinished(JOB_ID);
152 when(vnfApi.vnfsVnfInstanceIdScalePost(eq(VNF_ID), actualScaleRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenAnswer(new Answer<Observable<OperationExecution>>() {
154 public Observable<OperationExecution> answer(InvocationOnMock invocation) throws Throwable {
155 operationExecutions.add(scaleOperationExecution);
156 return buildObservable(scaleOperationExecution);
159 when(vnfApi.vnfsVnfInstanceIdHealPost(eq(VNF_ID), actualHealRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenAnswer(new Answer<Observable<OperationExecution>>() {
161 public Observable<OperationExecution> answer(InvocationOnMock invocation) throws Throwable {
162 operationExecutions.add(healOperationExecution);
163 return buildObservable(healOperationExecution);
166 when(vnfApi.vnfsVnfInstanceIdCustomCustomOperationNamePost(eq(VNF_ID), operationIdCaptor.capture(), customOperationRequestArgumentCaptor.capture(), eq(NOKIA_LCM_API_VERSION))).thenAnswer(new Answer<Observable<OperationExecution>>() {
168 public Observable<OperationExecution> answer(InvocationOnMock invocation) throws Throwable {
169 operationExecutions.add(customOperationExecution);
170 return buildObservable(customOperationExecution);
179 public void testInstantiation() throws Exception {
181 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
183 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
184 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
185 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
186 grantResponse.setVimId(VIM_ID);
187 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
188 accessInfo.setTenant(TENANT);
189 grantResponse.setAccessInfo(accessInfo);
190 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
191 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
193 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
194 waitForJobToFinishInJobManager(finished);
196 assertEquals(VNF_ID, response.getVnfInstanceId());
197 assertEquals(JOB_ID, response.getJobId());
198 assertEquals(createRequest.getAllValues().size(), 1);
199 assertEquals("myDescription", createRequest.getValue().getDescription());
200 assertEquals("vnfName", createRequest.getValue().getName());
201 assertEquals(CBAM_VNFD_ID, createRequest.getValue().getVnfdId());
202 assertEquals(1, actualInstantiationRequest.getAllValues().size());
203 assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
204 OPENSTACKV2INFO actualVim = (OPENSTACKV2INFO) actualInstantiationRequest.getValue().getVims().get(0);
205 assertEquals(VIM_ID, actualVim.getId());
206 assertEquals(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO, actualVim.getVimInfoType());
207 assertEquals(Boolean.valueOf(parseBoolean(vimInfo.getSslInsecure())), actualVim.getInterfaceInfo().isSkipCertificateVerification());
208 assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint());
209 //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates());
210 assertEquals("vimPassword", actualVim.getAccessInfo().getPassword());
211 assertEquals("regionId", actualVim.getAccessInfo().getRegion());
212 assertEquals("myTenant", actualVim.getAccessInfo().getTenant());
213 assertEquals("vimUsername", actualVim.getAccessInfo().getUsername());
214 assertEquals(1, actualInstantiationRequest.getValue().getComputeResourceFlavours().size());
215 assertEquals("flavourProviderId", actualInstantiationRequest.getValue().getComputeResourceFlavours().get(0).getResourceId());
216 assertEquals(VIM_ID, actualInstantiationRequest.getValue().getComputeResourceFlavours().get(0).getVimId());
217 assertEquals("virtualComputeDescId", actualInstantiationRequest.getValue().getComputeResourceFlavours().get(0).getVnfdVirtualComputeDescId());
218 assertEquals(1, actualInstantiationRequest.getValue().getExtManagedVirtualLinks().size());
219 assertEquals(extManVl, actualInstantiationRequest.getValue().getExtManagedVirtualLinks().get(0));
220 assertEquals(2, actualInstantiationRequest.getValue().getExtVirtualLinks().size());
222 assertEquals("myNetworkProviderId", actualInstantiationRequest.getValue().getExtVirtualLinks().get(0).getResourceId());
223 assertEquals("myEVlId", actualInstantiationRequest.getValue().getExtVirtualLinks().get(0).getExtVirtualLinkId());
224 assertEquals(1, actualInstantiationRequest.getValue().getExtVirtualLinks().get(0).getExtCps().size());
225 assertEquals("myCpdId", actualInstantiationRequest.getValue().getExtVirtualLinks().get(0).getExtCps().get(0).getCpdId());
227 assertEquals(VIM_ID, actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getVimId());
228 assertEquals("evlId1", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtVirtualLinkId());
229 assertEquals("networkProviderId1", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getResourceId());
230 assertEquals(1, actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().size());
233 assertEquals(Integer.valueOf(2), actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getNumDynamicAddresses());
234 assertEquals("cpdId3", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getCpdId());
235 assertEquals(1, actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getAddresses().size());
236 assertEquals("1.2.3.4", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getAddresses().get(0).getIp());
237 assertEquals("mac", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getAddresses().get(0).getMac());
238 assertEquals("subnetId", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getAddresses().get(0).getSubnetId());
240 assertEquals("myFlavorId", actualInstantiationRequest.getValue().getFlavourId());
241 assertEquals(Boolean.TRUE, actualInstantiationRequest.getValue().isGrantlessMode());
242 assertEquals("level1", actualInstantiationRequest.getValue().getInstantiationLevelId());
243 assertEquals(1, actualInstantiationRequest.getValue().getZones().size());
244 assertEquals(VIM_ID, actualInstantiationRequest.getValue().getZones().get(0).getVimId());
245 assertEquals("zoneProviderId", actualInstantiationRequest.getValue().getZones().get(0).getResourceId());
246 assertEquals("zoneId", actualInstantiationRequest.getValue().getZones().get(0).getId());
247 assertEquals(1, actualInstantiationRequest.getValue().getSoftwareImages().size());
248 assertEquals(VIM_ID, actualInstantiationRequest.getValue().getSoftwareImages().get(0).getVimId());
249 assertEquals("imageProviderId", actualInstantiationRequest.getValue().getSoftwareImages().get(0).getResourceId());
250 assertEquals("imageId", actualInstantiationRequest.getValue().getSoftwareImages().get(0).getVnfdSoftwareImageId());
251 String actualEmbeddedAdditionParams = new Gson().toJson(actualInstantiationRequest.getValue().getAdditionalParams());
252 assertTrue("{\"jobId\":\"myJobId\",\"a\":\"b\"}".equals(actualEmbeddedAdditionParams) || "{\"a\":\"b\",\"jobId\":\"myJobId\"}".equals(actualEmbeddedAdditionParams));
253 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateVerification());
254 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
256 assertEquals(1, actualVnfModifyRequest.getAllValues().size());
257 assertEquals(2, actualVnfModifyRequest.getValue().getExtensions().size());
258 assertEquals(LifecycleManager.ONAP_CSAR_ID, actualVnfModifyRequest.getValue().getExtensions().get(0).getName());
259 assertEquals(ONAP_CSAR_ID, actualVnfModifyRequest.getValue().getExtensions().get(0).getValue());
260 assertEquals(LifecycleManager.EXTERNAL_VNFM_ID, actualVnfModifyRequest.getValue().getExtensions().get(1).getName());
261 assertEquals(VNFM_ID, actualVnfModifyRequest.getValue().getExtensions().get(1).getValue());
263 //the 3.2 API does not accept empty array
264 assertNull(actualVnfModifyRequest.getValue().getVnfConfigurableProperties());
265 verify(jobManager).spawnJob(VNF_ID, restResponse);
266 verify(logger).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("creation"), eq("not yet specified"), anyString());
267 verify(logger).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("instantiation"), eq(VNF_ID), anyString());
271 * invalid VIM type results in failure
274 public void testInstantiationWithInvalidVimType() throws Exception {
276 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OTHER_VIM_INFO);
277 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
278 when(logger.isInfoEnabled()).thenReturn(false);
281 lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
284 } catch (Exception e) {
285 assertEquals("Only OPENSTACK_V2_INFO, OPENSTACK_V3_INFO and VMWARE_VCLOUD_INFO is the supported VIM types", e.getMessage());
287 verify(vnfApi, never()).vnfsPost(Mockito.any(), Mockito.any());
288 verify(logger, never()).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("creation"), eq("not yet specified"), anyString());
289 verify(logger, never()).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("instantiation"), eq(VNF_ID), anyString());
290 verify(logger).error("Only OPENSTACK_V2_INFO, OPENSTACK_V3_INFO and VMWARE_VCLOUD_INFO is the supported VIM types");
294 * test instantiation with KeyStone V2 based with SSL
297 public void testInstantiationV2WithSsl() throws Exception {
298 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
299 when(logger.isInfoEnabled()).thenReturn(false);
300 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
301 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
302 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
303 grantResponse.setVimId(VIM_ID);
304 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
305 accessInfo.setTenant(TENANT);
306 String caCert = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/localhost.cert.pem").toURI())));
307 vimInfo.setSslInsecure("false");
308 vimInfo.setSslCacert(caCert);
309 grantResponse.setAccessInfo(accessInfo);
310 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
311 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
312 JsonObject inputs = child((JsonObject) instantiationRequest.getAdditionalParam(), "inputs");
313 JsonObject vnfs = child(child(inputs, "vnfs"), ONAP_CSAR_ID);
314 vnfs.remove("additionalParams");
316 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
317 waitForJobToFinishInJobManager(finished);
318 assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
320 OPENSTACKV2INFO actualVim = (OPENSTACKV2INFO) actualInstantiationRequest.getValue().getVims().get(0);
321 assertEquals(StoreLoader.getCertifacates(caCert).iterator().next(), new String(actualVim.getInterfaceInfo().getTrustedCertificates().get(0)));
322 assertTrue(!actualVim.getInterfaceInfo().isSkipCertificateVerification());
323 assertTrue(!actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
324 verify(logger).warn("No additional parameters were specified for the operation");
325 verify(logger, never()).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), anyString(), anyString(), anyString());
329 * non specified SSL verification means not verified
332 public void testInstantiationV2WithoutSsl() throws Exception {
333 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
335 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
336 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
337 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
338 grantResponse.setVimId(VIM_ID);
339 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
340 accessInfo.setTenant(TENANT);
341 vimInfo.setSslInsecure(null);
342 grantResponse.setAccessInfo(accessInfo);
343 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
344 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
346 lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
347 waitForJobToFinishInJobManager(finished);
348 assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
350 OPENSTACKV2INFO actualVim = (OPENSTACKV2INFO) actualInstantiationRequest.getValue().getVims().get(0);
351 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateVerification());
352 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
356 * test instantiation with KeyStone V3 based
359 public void testInstantiationV3() throws Exception {
360 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO);
361 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
362 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
363 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
364 grantResponse.setVimId(VIM_ID);
365 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
366 accessInfo.setTenant(TENANT);
367 grantResponse.setAccessInfo(accessInfo);
368 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
369 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
371 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
372 waitForJobToFinishInJobManager(finished);
373 assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
375 OPENSTACKV3INFO actualVim = (OPENSTACKV3INFO) actualInstantiationRequest.getValue().getVims().get(0);
376 assertEquals(VIM_ID, actualVim.getId());
377 assertEquals(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO, actualVim.getVimInfoType());
378 assertEquals(Boolean.valueOf(parseBoolean(vimInfo.getSslInsecure())), actualVim.getInterfaceInfo().isSkipCertificateVerification());
379 assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint());
380 //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates());
381 assertEquals("vimPassword", actualVim.getAccessInfo().getPassword());
382 assertEquals("regionId", actualVim.getAccessInfo().getRegion());
383 assertEquals("myTenant", actualVim.getAccessInfo().getProject());
384 assertEquals("myDomain", actualVim.getAccessInfo().getDomain());
385 assertEquals("vimUsername", actualVim.getAccessInfo().getUsername());
386 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateVerification());
387 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
391 * test instantiation with backward compatibility test with Amsterdam release
392 * - the vim identifier is supplied as vimid with not camel case
395 public void testInstantiationNoVimId() throws Exception {
397 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
398 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
399 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
400 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
401 grantResponse.setVimid(VIM_ID);
402 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
403 accessInfo.setTenant(TENANT);
404 grantResponse.setAccessinfo(accessInfo);
405 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
406 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
408 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
409 waitForJobToFinishInJobManager(finished);
411 assertEquals(VNF_ID, response.getVnfInstanceId());
412 assertEquals(JOB_ID, response.getJobId());
413 assertEquals(createRequest.getAllValues().size(), 1);
414 assertEquals("myDescription", createRequest.getValue().getDescription());
415 assertEquals("vnfName", createRequest.getValue().getName());
416 assertEquals(CBAM_VNFD_ID, createRequest.getValue().getVnfdId());
417 assertEquals(1, actualInstantiationRequest.getAllValues().size());
418 assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
419 OPENSTACKV2INFO actualVim = (OPENSTACKV2INFO) actualInstantiationRequest.getValue().getVims().get(0);
420 assertEquals(VIM_ID, actualVim.getId());
421 assertEquals(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO, actualVim.getVimInfoType());
422 assertEquals(Boolean.valueOf(parseBoolean(vimInfo.getSslInsecure())), actualVim.getInterfaceInfo().isSkipCertificateVerification());
423 assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint());
424 //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates());
425 assertEquals("vimPassword", actualVim.getAccessInfo().getPassword());
426 assertEquals("regionId", actualVim.getAccessInfo().getRegion());
427 assertEquals("myTenant", actualVim.getAccessInfo().getTenant());
428 assertEquals("vimUsername", actualVim.getAccessInfo().getUsername());
429 assertEquals(1, actualInstantiationRequest.getValue().getComputeResourceFlavours().size());
430 assertEquals("flavourProviderId", actualInstantiationRequest.getValue().getComputeResourceFlavours().get(0).getResourceId());
431 assertEquals(VIM_ID, actualInstantiationRequest.getValue().getComputeResourceFlavours().get(0).getVimId());
432 assertEquals("virtualComputeDescId", actualInstantiationRequest.getValue().getComputeResourceFlavours().get(0).getVnfdVirtualComputeDescId());
433 assertEquals(1, actualInstantiationRequest.getValue().getExtManagedVirtualLinks().size());
434 assertEquals(extManVl, actualInstantiationRequest.getValue().getExtManagedVirtualLinks().get(0));
435 assertEquals(2, actualInstantiationRequest.getValue().getExtVirtualLinks().size());
437 assertEquals("myNetworkProviderId", actualInstantiationRequest.getValue().getExtVirtualLinks().get(0).getResourceId());
438 assertEquals("myEVlId", actualInstantiationRequest.getValue().getExtVirtualLinks().get(0).getExtVirtualLinkId());
439 assertEquals(1, actualInstantiationRequest.getValue().getExtVirtualLinks().get(0).getExtCps().size());
440 assertEquals("myCpdId", actualInstantiationRequest.getValue().getExtVirtualLinks().get(0).getExtCps().get(0).getCpdId());
442 assertEquals(VIM_ID, actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getVimId());
443 assertEquals("evlId1", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtVirtualLinkId());
444 assertEquals("networkProviderId1", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getResourceId());
445 assertEquals(1, actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().size());
448 assertEquals(Integer.valueOf(2), actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getNumDynamicAddresses());
449 assertEquals("cpdId3", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getCpdId());
450 assertEquals(1, actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getAddresses().size());
451 assertEquals("1.2.3.4", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getAddresses().get(0).getIp());
452 assertEquals("mac", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getAddresses().get(0).getMac());
453 assertEquals("subnetId", actualInstantiationRequest.getValue().getExtVirtualLinks().get(1).getExtCps().get(0).getAddresses().get(0).getSubnetId());
455 assertEquals("myFlavorId", actualInstantiationRequest.getValue().getFlavourId());
456 assertEquals(Boolean.TRUE, actualInstantiationRequest.getValue().isGrantlessMode());
457 assertEquals("level1", actualInstantiationRequest.getValue().getInstantiationLevelId());
458 assertEquals(1, actualInstantiationRequest.getValue().getZones().size());
459 assertEquals(VIM_ID, actualInstantiationRequest.getValue().getZones().get(0).getVimId());
460 assertEquals("zoneProviderId", actualInstantiationRequest.getValue().getZones().get(0).getResourceId());
461 assertEquals("zoneId", actualInstantiationRequest.getValue().getZones().get(0).getId());
462 assertEquals(1, actualInstantiationRequest.getValue().getSoftwareImages().size());
463 assertEquals(VIM_ID, actualInstantiationRequest.getValue().getSoftwareImages().get(0).getVimId());
464 assertEquals("imageProviderId", actualInstantiationRequest.getValue().getSoftwareImages().get(0).getResourceId());
465 assertEquals("imageId", actualInstantiationRequest.getValue().getSoftwareImages().get(0).getVnfdSoftwareImageId());
466 String actualEmbeddedAdditionParams = new Gson().toJson(actualInstantiationRequest.getValue().getAdditionalParams());
467 assertTrue("{\"jobId\":\"myJobId\",\"a\":\"b\"}".equals(actualEmbeddedAdditionParams) || "{\"a\":\"b\",\"jobId\":\"myJobId\"}".equals(actualEmbeddedAdditionParams));
468 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateVerification());
469 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
471 assertEquals(1, actualVnfModifyRequest.getAllValues().size());
472 assertEquals(2, actualVnfModifyRequest.getValue().getExtensions().size());
473 assertEquals(LifecycleManager.ONAP_CSAR_ID, actualVnfModifyRequest.getValue().getExtensions().get(0).getName());
474 assertEquals(ONAP_CSAR_ID, actualVnfModifyRequest.getValue().getExtensions().get(0).getValue());
475 assertEquals(LifecycleManager.EXTERNAL_VNFM_ID, actualVnfModifyRequest.getValue().getExtensions().get(1).getName());
476 assertEquals(VNFM_ID, actualVnfModifyRequest.getValue().getExtensions().get(1).getValue());
478 //the 3.2 API does not accept empty array
479 assertNull(actualVnfModifyRequest.getValue().getVnfConfigurableProperties());
480 verify(jobManager).spawnJob(VNF_ID, restResponse);
481 verify(logger).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("creation"), eq("not yet specified"), anyString());
482 verify(logger).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("instantiation"), eq(VNF_ID), anyString());
486 * test instantiation with KeyStone V3 based with SSL
489 public void testInstantiationV3WithSsl() throws Exception {
490 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO);
491 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
492 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
493 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
494 grantResponse.setVimId(VIM_ID);
495 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
496 accessInfo.setTenant(TENANT);
497 String caCert = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/localhost.cert.pem").toURI())));
498 vimInfo.setSslInsecure("false");
499 vimInfo.setSslCacert(caCert);
500 grantResponse.setAccessInfo(accessInfo);
501 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
502 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
504 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
505 waitForJobToFinishInJobManager(finished);
506 assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
508 OPENSTACKV3INFO actualVim = (OPENSTACKV3INFO) actualInstantiationRequest.getValue().getVims().get(0);
509 assertEquals(VIM_ID, actualVim.getId());
510 assertEquals(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO, actualVim.getVimInfoType());
511 assertEquals(Boolean.valueOf(parseBoolean(vimInfo.getSslInsecure())), actualVim.getInterfaceInfo().isSkipCertificateVerification());
512 assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint());
513 //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates());
514 assertEquals("vimPassword", actualVim.getAccessInfo().getPassword());
515 assertEquals("regionId", actualVim.getAccessInfo().getRegion());
516 assertEquals("myTenant", actualVim.getAccessInfo().getProject());
517 assertEquals("myDomain", actualVim.getAccessInfo().getDomain());
518 assertEquals("vimUsername", actualVim.getAccessInfo().getUsername());
519 assertEquals(StoreLoader.getCertifacates(caCert).iterator().next(), new String(actualVim.getInterfaceInfo().getTrustedCertificates().get(0)));
520 assertTrue(!actualVim.getInterfaceInfo().isSkipCertificateVerification());
521 assertTrue(!actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
525 * non specified SSL verification meams not verified for KeyStone V3 based
528 public void testInstantiationV3WithNonSpecifiedSsl() throws Exception {
529 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO);
530 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
531 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
532 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
533 grantResponse.setVimId(VIM_ID);
534 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
535 accessInfo.setTenant(TENANT);
536 vimInfo.setSslInsecure(null);
537 grantResponse.setAccessInfo(accessInfo);
538 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
539 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
541 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
542 waitForJobToFinishInJobManager(finished);
543 assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
545 OPENSTACKV3INFO actualVim = (OPENSTACKV3INFO) actualInstantiationRequest.getValue().getVims().get(0);
546 assertEquals(VIM_ID, actualVim.getId());
547 assertEquals(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO, actualVim.getVimInfoType());
548 assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint());
549 //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates());
550 assertEquals("vimPassword", actualVim.getAccessInfo().getPassword());
551 assertEquals("regionId", actualVim.getAccessInfo().getRegion());
552 assertEquals("myTenant", actualVim.getAccessInfo().getProject());
553 assertEquals("myDomain", actualVim.getAccessInfo().getDomain());
554 assertEquals("vimUsername", actualVim.getAccessInfo().getUsername());
555 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateVerification());
556 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
560 * verify backward compatibility with Amsterdam release
563 public void testInstantiationV3WithNoDomain() throws Exception {
564 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
565 additionalParam.setDomain("myDomain");
566 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO);
567 vimInfo.setDomain(null);
568 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
569 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
570 grantResponse.setVimId(VIM_ID);
571 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
572 accessInfo.setTenant(TENANT);
573 vimInfo.setSslInsecure(null);
574 grantResponse.setAccessInfo(accessInfo);
575 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
576 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
578 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
579 waitForJobToFinishInJobManager(finished);
580 assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
582 OPENSTACKV3INFO actualVim = (OPENSTACKV3INFO) actualInstantiationRequest.getValue().getVims().get(0);
583 assertEquals(VIM_ID, actualVim.getId());
584 assertEquals(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO, actualVim.getVimInfoType());
585 assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint());
586 //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates());
587 assertEquals("vimPassword", actualVim.getAccessInfo().getPassword());
588 assertEquals("regionId", actualVim.getAccessInfo().getRegion());
589 assertEquals("myTenant", actualVim.getAccessInfo().getProject());
590 assertEquals("myDomain", actualVim.getAccessInfo().getDomain());
591 assertEquals("vimUsername", actualVim.getAccessInfo().getUsername());
592 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateVerification());
593 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
594 verify(logger).warn("Setting domain from additional parameters");
598 * verify backward compatibility with Amsterdam release
599 * if no domain is specified error is propagated
602 public void testInstantiationV3WithNoDomainFail() throws Exception {
603 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO);
604 vimInfo.setDomain(null);
605 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
606 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
607 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
608 grantResponse.setVimId(VIM_ID);
609 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
610 accessInfo.setTenant(TENANT);
611 vimInfo.setSslInsecure(null);
612 grantResponse.setAccessInfo(accessInfo);
613 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
614 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
616 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
617 waitForJobToFinishInJobManager(finished);
618 assertEquals(0, actualInstantiationRequest.getAllValues().size());
620 verify(logger).error("The cloud did not supply the cloud domain (Amsterdam release) and was not supplied as additional data");
624 * test instantiation with vcloud
627 public void testInstantiationVcloud() throws Exception {
628 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.VMWARE_VCLOUD_INFO);
630 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
631 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
632 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
633 grantResponse.setVimId(VIM_ID);
634 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
635 accessInfo.setTenant(TENANT);
636 grantResponse.setAccessInfo(accessInfo);
637 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
638 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
640 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
641 waitForJobToFinishInJobManager(finished);
642 assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
644 VMWAREVCLOUDINFO actualVim = (VMWAREVCLOUDINFO) actualInstantiationRequest.getValue().getVims().get(0);
645 assertEquals(VIM_ID, actualVim.getId());
646 assertEquals(VimInfo.VimInfoTypeEnum.VMWARE_VCLOUD_INFO, actualVim.getVimInfoType());
647 assertEquals(Boolean.valueOf(parseBoolean(vimInfo.getSslInsecure())), actualVim.getInterfaceInfo().isSkipCertificateVerification());
648 assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint());
649 //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates());
650 assertEquals("vimPassword", actualVim.getAccessInfo().getPassword());
651 assertEquals("regionId", actualVim.getAccessInfo().getOrganization());
652 assertEquals("vimUsername", actualVim.getAccessInfo().getUsername());
653 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateVerification());
654 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
658 * test instantiation with vCloud with SSL
661 public void testInstantiationVcloudWithSsl() throws Exception {
662 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.VMWARE_VCLOUD_INFO);
664 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
665 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
666 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
667 grantResponse.setVimId(VIM_ID);
668 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
669 accessInfo.setTenant(TENANT);
670 String caCert = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/localhost.cert.pem").toURI())));
671 vimInfo.setSslInsecure("false");
672 vimInfo.setSslCacert(caCert);
673 grantResponse.setAccessInfo(accessInfo);
674 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
675 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
677 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
678 waitForJobToFinishInJobManager(finished);
679 assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
681 VMWAREVCLOUDINFO actualVim = (VMWAREVCLOUDINFO) actualInstantiationRequest.getValue().getVims().get(0);
682 assertEquals(VIM_ID, actualVim.getId());
683 assertEquals(VimInfo.VimInfoTypeEnum.VMWARE_VCLOUD_INFO, actualVim.getVimInfoType());
684 assertEquals(Boolean.valueOf(parseBoolean(vimInfo.getSslInsecure())), actualVim.getInterfaceInfo().isSkipCertificateVerification());
685 assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint());
686 //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates());
687 assertEquals("vimPassword", actualVim.getAccessInfo().getPassword());
688 assertEquals("regionId", actualVim.getAccessInfo().getOrganization());
689 assertEquals("vimUsername", actualVim.getAccessInfo().getUsername());
690 assertEquals(StoreLoader.getCertifacates(caCert).iterator().next(), new String(actualVim.getInterfaceInfo().getTrustedCertificates().get(0)));
691 assertTrue(!actualVim.getInterfaceInfo().isSkipCertificateVerification());
692 assertTrue(!actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
696 * test instantiation with vCloud with SSL
699 public void testInstantiationVcloudWithNonSecifedSSl() throws Exception {
700 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.VMWARE_VCLOUD_INFO);
702 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
703 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
704 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
705 grantResponse.setVimId(VIM_ID);
706 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
707 accessInfo.setTenant(TENANT);
708 vimInfo.setSslInsecure(null);
709 grantResponse.setAccessInfo(accessInfo);
710 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
711 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
713 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
714 waitForJobToFinishInJobManager(finished);
715 assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
717 VMWAREVCLOUDINFO actualVim = (VMWAREVCLOUDINFO) actualInstantiationRequest.getValue().getVims().get(0);
718 assertEquals(VIM_ID, actualVim.getId());
719 assertEquals(VimInfo.VimInfoTypeEnum.VMWARE_VCLOUD_INFO, actualVim.getVimInfoType());
720 assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint());
721 //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates());
722 assertEquals("vimPassword", actualVim.getAccessInfo().getPassword());
723 assertEquals("regionId", actualVim.getAccessInfo().getOrganization());
724 assertEquals("vimUsername", actualVim.getAccessInfo().getUsername());
725 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateVerification());
726 assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
730 * test failure in the instantiation request marks the job to be finished in job manager
733 public void testFailureInTheInstantiationRequest() throws Exception {
734 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
735 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
736 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
737 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
738 grantResponse.setVimId(VIM_ID);
739 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
740 accessInfo.setTenant(TENANT);
741 grantResponse.setAccessInfo(accessInfo);
742 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
743 RuntimeException expectedException = new RuntimeException();
744 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenThrow(expectedException);
747 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
749 waitForJobToFinishInJobManager(finished);
750 assertEquals(VNF_ID, response.getVnfInstanceId());
751 assertEquals(JOB_ID, response.getJobId());
752 verify(logger).error("Unable to instantiate VNF with myVnfId identifier", expectedException);
756 * instantiation fails if VF-C does not send vim identifier in grant response
759 public void testVfcFailsToSendVimId() throws Exception {
760 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
762 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
763 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
764 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
765 //grantResponse.setVimId(VIM_ID);
766 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
767 accessInfo.setTenant(TENANT);
768 String caCert = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/localhost.cert.pem").toURI())));
769 vimInfo.setSslInsecure("false");
770 vimInfo.setSslCacert(caCert);
771 grantResponse.setAccessInfo(accessInfo);
772 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
773 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
775 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
776 waitForJobToFinishInJobManager(finished);
777 assertEquals(0, actualInstantiationRequest.getAllValues().size());
779 verify(logger).error("VF-C did not send VIM identifier in grant response");
784 * test operation execution polling is retried in case of failures
787 public void testFailureInTheOperationExecutionPollingDuringInstantiationRequest() throws Exception {
788 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
789 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
790 additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
791 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
792 grantResponse.setVimId(VIM_ID);
793 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
794 accessInfo.setTenant(TENANT);
795 grantResponse.setAccessInfo(accessInfo);
796 ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
797 List<RuntimeException> polling = new ArrayList<>();
798 when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
799 when(vnfApi.vnfsVnfInstanceIdOperationExecutionsGet(VNF_ID, NOKIA_LCM_API_VERSION)).then(new Answer<Observable<List<OperationExecution>>>() {
801 public Observable<List<OperationExecution>> answer(InvocationOnMock invocation) throws Throwable {
802 if (polling.size() > 2) {
803 return buildObservable(operationExecutions);
805 RuntimeException runtimeException = new RuntimeException();
806 polling.add(runtimeException);
807 throw runtimeException;
811 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
813 waitForJobToFinishInJobManager(finished);
814 assertEquals(VNF_ID, response.getVnfInstanceId());
815 assertEquals(JOB_ID, response.getJobId());
816 assertEquals(3, polling.size());
817 for (RuntimeException e : polling) {
818 verify(logger).warn("Unable to retrieve operations details", e);
820 verify(systemFunctions, Mockito.times(3)).sleep(5000);
824 * failure in VNF creation is logged an proagated
827 public void failureInVnfCreationIsPropagated() throws Exception {
829 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
831 RuntimeException expectedException = new RuntimeException();
832 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenThrow(expectedException);
835 lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
838 } catch (RuntimeException e) {
839 assertEquals(expectedException, e.getCause());
840 verify(logger).error("Unable to create the VNF", expectedException);
845 * failure in updating the modifyable attributes of the VNF is logged an proagated
848 public void failureInVnfModificationIsPropagated() throws Exception {
850 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
852 RuntimeException expectedException = new RuntimeException();
853 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
854 when(vnfApi.vnfsVnfInstanceIdPatch(eq(VNF_ID), actualVnfModifyRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenThrow(expectedException);
858 lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
861 } catch (RuntimeException e) {
862 assertEquals(expectedException, e.getCause().getCause());
863 verify(logger).error("Unable to set the onapCsarId property on the VNF", expectedException);
868 * if the VIM info can not be queried the VNF is not instantiated and
869 * error propagated through job
872 public void testFailureInQueryVimInfo() throws Exception {
873 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
874 when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
875 when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
876 grantResponse.setVimId(VIM_ID);
877 GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
878 accessInfo.setTenant(TENANT);
879 grantResponse.setAccessInfo(accessInfo);
881 when(vimInfoProvider.getVimInfo(VIM_ID)).thenThrow(new RuntimeException());
883 lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
885 waitForJobToFinishInJobManager(finished);
886 verify(vnfApi, never()).vnfsVnfInstanceIdInstantiatePost(Mockito.any(), Mockito.any(), Mockito.any());
890 * test termination basic success scenario
891 * - the VNF is not deleted before the notifications are processed
894 public void testTerminationAndDeletion() throws Exception {
896 VnfTerminateRequest terminationRequest = new VnfTerminateRequest();
897 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
898 vnfInfo.setInstantiationState(InstantiationState.INSTANTIATED);
899 vnfInfo.setOperationExecutions(operationExecutions);
900 VnfProperty vnfdId = new VnfProperty();
901 vnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
902 vnfdId.setValue(ONAP_CSAR_ID);
903 vnfInfo.getExtensions().add(vnfdId);
904 ArgumentCaptor<TerminateVnfRequest> actualTerminationRequest = ArgumentCaptor.forClass(TerminateVnfRequest.class);
905 when(vnfApi.vnfsVnfInstanceIdTerminatePost(eq(VNF_ID), actualTerminationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenAnswer(new Answer<Observable<OperationExecution>>() {
907 public Observable<OperationExecution> answer(InvocationOnMock invocation) throws Throwable {
908 OperationExecution terminationOperation = new OperationExecution();
909 terminationOperation.setId("terminationId");
910 operationExecutions.add(terminationOperation);
911 terminationOperation.setStatus(OperationStatus.FINISHED);
912 return buildObservable(terminationOperation);
915 when(vnfApi.vnfsVnfInstanceIdDelete(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(VOID_OBSERVABLE.value());
916 JsonElement instantiationParameters = new JsonParser().parse("{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] } ");
917 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet("operationExecutionId", NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(instantiationParameters));
919 JobInfo jobInfo = lifecycleManager.terminateAndDelete(VNFM_ID, VNF_ID, terminationRequest, restResponse);
921 waitForJobToFinishInJobManager(finished);
922 assertEquals(1, actualTerminationRequest.getAllValues().size());
923 assertEquals(TerminationType.FORCEFUL, actualTerminationRequest.getValue().getTerminationType());
924 assertEquals(JOB_ID, new Gson().toJsonTree(actualTerminationRequest.getValue().getAdditionalParams()).getAsJsonObject().get("jobId").getAsString());
925 InOrder notificationIsProcessedBeforeDeletingTheVnf = Mockito.inOrder(vfcGrantManager, notificationManager, vnfApi);
926 notificationIsProcessedBeforeDeletingTheVnf.verify(vfcGrantManager).requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnfInfo, JOB_ID);
927 notificationIsProcessedBeforeDeletingTheVnf.verify(notificationManager).waitForTerminationToBeProcessed("terminationId");
928 notificationIsProcessedBeforeDeletingTheVnf.verify(vnfApi).vnfsVnfInstanceIdDelete(VNF_ID, NOKIA_LCM_API_VERSION);
929 VOID_OBSERVABLE.assertCalled();
930 verify(jobManager).spawnJob(VNF_ID, restResponse);
931 verify(logger).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("termination"), eq(VNF_ID), anyString());
935 * test termination basic success scenario
936 * - the VNF is not deleted before the notifications are processed
939 public void testTermination() throws Exception {
941 VnfTerminateRequest terminationRequest = new VnfTerminateRequest();
942 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
943 vnfInfo.setInstantiationState(InstantiationState.INSTANTIATED);
944 vnfInfo.setOperationExecutions(operationExecutions);
945 VnfProperty vnfdId = new VnfProperty();
946 vnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
947 vnfdId.setValue(ONAP_CSAR_ID);
948 vnfInfo.getExtensions().add(vnfdId);
949 ArgumentCaptor<TerminateVnfRequest> actualTerminationRequest = ArgumentCaptor.forClass(TerminateVnfRequest.class);
950 when(vnfApi.vnfsVnfInstanceIdTerminatePost(eq(VNF_ID), actualTerminationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenAnswer(new Answer<Observable<OperationExecution>>() {
952 public Observable<OperationExecution> answer(InvocationOnMock invocation) throws Throwable {
953 OperationExecution terminationOperation = new OperationExecution();
954 terminationOperation.setId("terminationId");
955 operationExecutions.add(terminationOperation);
956 terminationOperation.setStatus(OperationStatus.FINISHED);
957 return buildObservable(terminationOperation);
960 JsonElement instantiationParameters = new JsonParser().parse("{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] } ");
961 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet("operationExecutionId", NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(instantiationParameters));
963 JobInfo jobInfo = lifecycleManager.terminate(VNFM_ID, VNF_ID, terminationRequest, restResponse);
965 waitForJobToFinishInJobManager(finished);
966 assertEquals(1, actualTerminationRequest.getAllValues().size());
967 assertEquals(TerminationType.FORCEFUL, actualTerminationRequest.getValue().getTerminationType());
968 assertEquals(JOB_ID, new Gson().toJsonTree(actualTerminationRequest.getValue().getAdditionalParams()).getAsJsonObject().get("jobId").getAsString());
969 InOrder notificationIsProcessedBeforeDeletingTheVnf = Mockito.inOrder(vfcGrantManager, notificationManager, vnfApi);
970 notificationIsProcessedBeforeDeletingTheVnf.verify(vfcGrantManager).requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnfInfo, JOB_ID);
971 notificationIsProcessedBeforeDeletingTheVnf.verify(notificationManager).waitForTerminationToBeProcessed("terminationId");
972 verify(vnfApi, never()).vnfsVnfInstanceIdDelete(VNF_ID, NOKIA_LCM_API_VERSION);
973 verify(jobManager).spawnJob(VNF_ID, restResponse);
974 verify(logger).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("termination"), eq(VNF_ID), anyString());
978 * test termination of a non instantiated VNF
979 * - the VNF is not terminated (only deleted)
982 public void testTerminationOfNonInstantiated() throws Exception {
984 VnfTerminateRequest terminationRequest = new VnfTerminateRequest();
985 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
986 vnfInfo.setInstantiationState(InstantiationState.NOT_INSTANTIATED);
987 vnfInfo.setOperationExecutions(operationExecutions);
988 VnfProperty vnfdId = new VnfProperty();
989 vnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
990 vnfdId.setValue(ONAP_CSAR_ID);
991 vnfInfo.getExtensions().add(vnfdId);
992 JsonElement instantiationParameters = new JsonParser().parse("{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] } ");
993 when(vnfApi.vnfsVnfInstanceIdDelete(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(VOID_OBSERVABLE.value());
994 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet("operationExecutionId", NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(instantiationParameters));
996 lifecycleManager.terminateAndDelete(VNFM_ID, VNF_ID, terminationRequest, restResponse);
998 boolean deleted = false;
1001 verify(logger).info("The VNF with {} identifier has been deleted", VNF_ID);
1006 verify(vfcGrantManager, never()).requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnfInfo, JOB_ID);
1007 verify(notificationManager, never()).waitForTerminationToBeProcessed("terminationId");
1008 verify(logger).warn("The VNF with {} identifier is not instantiated no termination is required", VNF_ID);
1009 verify(logger).info("Deleting VNF with {} identifier", VNF_ID);
1010 verify(vnfApi).vnfsVnfInstanceIdDelete(VNF_ID, NOKIA_LCM_API_VERSION);
1011 VOID_OBSERVABLE.assertCalled();
1015 * test that the VNF deletion is not started before the termination finishes
1018 public void testTerminationOperationIsOutwaited() throws Exception {
1020 VnfTerminateRequest terminationRequest = new VnfTerminateRequest();
1021 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1022 vnfInfo.setInstantiationState(InstantiationState.INSTANTIATED);
1023 vnfInfo.setOperationExecutions(operationExecutions);
1024 VnfProperty vnfdId = new VnfProperty();
1025 vnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
1026 vnfdId.setValue(ONAP_CSAR_ID);
1027 vnfInfo.getExtensions().add(vnfdId);
1028 ArgumentCaptor<TerminateVnfRequest> actualTerminationRequest = ArgumentCaptor.forClass(TerminateVnfRequest.class);
1029 OperationExecution terminationOperation = new OperationExecution();
1030 when(vnfApi.vnfsVnfInstanceIdTerminatePost(eq(VNF_ID), actualTerminationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenAnswer(invocation -> {
1031 terminationOperation.setId("terminationId");
1032 operationExecutions.add(terminationOperation);
1033 terminationOperation.setStatus(OperationStatus.STARTED);
1034 return buildObservable(terminationOperation);
1036 JsonElement instantiationParameters = new JsonParser().parse("{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] } ");
1037 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet("operationExecutionId", NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(instantiationParameters));
1038 Set<Integer> calls = new HashSet<>();
1039 when(vnfApi.vnfsVnfInstanceIdOperationExecutionsGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenAnswer(invocation -> {
1040 if (calls.size() == 1000) {
1041 terminationOperation.setStatus(OperationStatus.FINISHED);
1043 calls.add(calls.size());
1044 return buildObservable(operationExecutions);
1047 JobInfo jobInfo = lifecycleManager.terminateAndDelete(VNFM_ID, VNF_ID, terminationRequest, restResponse);
1049 waitForJobToFinishInJobManager(finished);
1050 verify(vnfApi, times(1001)).vnfsVnfInstanceIdOperationExecutionsGet(VNF_ID, NOKIA_LCM_API_VERSION);
1051 verify(systemFunctions, times(1000)).sleep(5000);
1056 * test that failured during waiting for the operation to finish is tolerated (idefineiatelly)
1059 public void testTerminationOperationIsOutwaitedWithErrors() throws Exception {
1061 VnfTerminateRequest terminationRequest = new VnfTerminateRequest();
1062 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1063 vnfInfo.setInstantiationState(InstantiationState.INSTANTIATED);
1064 vnfInfo.setOperationExecutions(operationExecutions);
1065 VnfProperty vnfdId = new VnfProperty();
1066 vnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
1067 vnfdId.setValue(ONAP_CSAR_ID);
1068 vnfInfo.getExtensions().add(vnfdId);
1069 ArgumentCaptor<TerminateVnfRequest> actualTerminationRequest = ArgumentCaptor.forClass(TerminateVnfRequest.class);
1070 OperationExecution terminationOperation = new OperationExecution();
1071 when(vnfApi.vnfsVnfInstanceIdTerminatePost(eq(VNF_ID), actualTerminationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenAnswer(new Answer<Observable<OperationExecution>>() {
1073 public Observable<OperationExecution> answer(InvocationOnMock invocation) throws Throwable {
1074 terminationOperation.setId("terminationId");
1075 operationExecutions.add(terminationOperation);
1076 terminationOperation.setStatus(OperationStatus.STARTED);
1077 return buildObservable(terminationOperation);
1080 JsonElement instantiationParameters = new JsonParser().parse("{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] } ");
1081 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet("operationExecutionId", NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(instantiationParameters));
1082 Set<Integer> calls = new HashSet<>();
1083 List<RuntimeException> expectedExceptions = new ArrayList<>();
1084 when(vnfApi.vnfsVnfInstanceIdOperationExecutionsGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenAnswer(new Answer<Observable<List<OperationExecution>>>() {
1086 public Observable<List<OperationExecution>> answer(InvocationOnMock invocation) throws Throwable {
1087 if (calls.size() >= 100) {
1088 terminationOperation.setStatus(OperationStatus.FINISHED);
1089 return buildObservable(operationExecutions);
1091 calls.add(calls.size());
1092 RuntimeException RuntimeException = new RuntimeException();
1093 expectedExceptions.add(RuntimeException);
1094 throw RuntimeException;
1098 JobInfo jobInfo = lifecycleManager.terminateAndDelete(VNFM_ID, VNF_ID, terminationRequest, restResponse);
1100 waitForJobToFinishInJobManager(finished);
1101 verify(vnfApi, times(101)).vnfsVnfInstanceIdOperationExecutionsGet(VNF_ID, NOKIA_LCM_API_VERSION);
1102 verify(systemFunctions, times(100)).sleep(5000);
1103 for (RuntimeException expectedException : expectedExceptions) {
1104 verify(logger).warn("Unable to retrieve operations details", expectedException);
1109 * test gracefull termination
1112 public void testGracefullTermination() throws Exception {
1114 VnfTerminateRequest terminationRequest = new VnfTerminateRequest();
1115 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1116 terminationRequest.setTerminationType(VnfTerminationType.GRACEFUL);
1117 terminationRequest.setGracefulTerminationTimeout("1234");
1118 vnfInfo.setInstantiationState(InstantiationState.INSTANTIATED);
1119 vnfInfo.setOperationExecutions(operationExecutions);
1120 VnfProperty vnfdId = new VnfProperty();
1121 vnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
1122 vnfdId.setValue(ONAP_CSAR_ID);
1123 vnfInfo.getExtensions().add(vnfdId);
1124 ArgumentCaptor<TerminateVnfRequest> actualTerminationRequest = ArgumentCaptor.forClass(TerminateVnfRequest.class);
1125 when(vnfApi.vnfsVnfInstanceIdTerminatePost(eq(VNF_ID), actualTerminationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenAnswer(new Answer<Observable<OperationExecution>>() {
1127 public Observable<OperationExecution> answer(InvocationOnMock invocation) throws Throwable {
1128 OperationExecution terminationOperation = new OperationExecution();
1129 terminationOperation.setId("terminationId");
1130 operationExecutions.add(terminationOperation);
1131 terminationOperation.setStatus(OperationStatus.FINISHED);
1132 return buildObservable(terminationOperation);
1135 doAnswer(invocation -> {
1136 verify(jobManager, Mockito.never()).jobFinished(JOB_ID);
1138 }).when(vnfApi).vnfsVnfInstanceIdDelete(VNF_ID, NOKIA_LCM_API_VERSION);
1139 JsonElement instantiationParameters = new JsonParser().parse("{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] } ");
1140 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet("operationExecutionId", NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(instantiationParameters));
1142 JobInfo jobInfo = lifecycleManager.terminateAndDelete(VNFM_ID, VNF_ID, terminationRequest, restResponse);
1144 waitForJobToFinishInJobManager(finished);
1145 assertEquals(1, actualTerminationRequest.getAllValues().size());
1146 assertEquals(TerminationType.GRACEFUL, actualTerminationRequest.getValue().getTerminationType());
1147 assertEquals(Integer.valueOf(1234), actualTerminationRequest.getValue().getGracefulTerminationTimeout());
1148 InOrder notificationIsProcessedBeforeDeletingTheVnf = Mockito.inOrder(vfcGrantManager, notificationManager, vnfApi);
1149 notificationIsProcessedBeforeDeletingTheVnf.verify(vfcGrantManager).requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnfInfo, JOB_ID);
1150 notificationIsProcessedBeforeDeletingTheVnf.verify(notificationManager).waitForTerminationToBeProcessed("terminationId");
1151 notificationIsProcessedBeforeDeletingTheVnf.verify(vnfApi).vnfsVnfInstanceIdDelete(VNF_ID, NOKIA_LCM_API_VERSION);
1155 * instantiation with missing ONAP csarId to instantiation extra param result in failure
1158 public void testMissingVnfParameters() throws Exception {
1160 VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
1161 String src = "{ \"inputs\" : { \"vnfs\" : { \"" + ONAP_CSAR_ID + "invalid" + "\" : {}}}, \"vimId\" : \"" + VIM_ID + "\"}";
1162 instantiationRequest.setAdditionalParam(new JsonParser().parse(src));
1165 VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
1167 } catch (Exception e) {
1168 assertEquals("The additional parameter section does not contain setting for VNF with myOnapCsarId CSAR id", e.getMessage());
1169 verify(logger).error("The additional parameter section does not contain setting for VNF with myOnapCsarId CSAR id");
1174 * test explicit forceful termination
1177 public void testExplicitForcefulTermination() throws Exception {
1179 VnfTerminateRequest terminationRequest = new VnfTerminateRequest();
1180 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1181 terminationRequest.setTerminationType(VnfTerminationType.FORCEFUL);
1182 terminationRequest.setGracefulTerminationTimeout("1234");
1183 vnfInfo.setInstantiationState(InstantiationState.INSTANTIATED);
1184 vnfInfo.setOperationExecutions(operationExecutions);
1185 VnfProperty vnfdId = new VnfProperty();
1186 vnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
1187 vnfdId.setValue(ONAP_CSAR_ID);
1188 vnfInfo.getExtensions().add(vnfdId);
1189 ArgumentCaptor<TerminateVnfRequest> actualTerminationRequest = ArgumentCaptor.forClass(TerminateVnfRequest.class);
1190 when(vnfApi.vnfsVnfInstanceIdTerminatePost(eq(VNF_ID), actualTerminationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenAnswer(invocation -> {
1191 OperationExecution terminationOperation = new OperationExecution();
1192 terminationOperation.setId("terminationId");
1193 operationExecutions.add(terminationOperation);
1194 terminationOperation.setStatus(OperationStatus.FINISHED);
1195 return buildObservable(terminationOperation);
1197 doAnswer(invocation -> {
1198 verify(jobManager, Mockito.never()).jobFinished(JOB_ID);
1200 }).when(vnfApi).vnfsVnfInstanceIdDelete(VNF_ID, NOKIA_LCM_API_VERSION);
1201 JsonElement instantiationParameters = new JsonParser().parse("{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] } ");
1202 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet("operationExecutionId", NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(instantiationParameters));
1204 JobInfo jobInfo = lifecycleManager.terminateAndDelete(VNFM_ID, VNF_ID, terminationRequest, restResponse);
1206 waitForJobToFinishInJobManager(finished);
1207 assertEquals(1, actualTerminationRequest.getAllValues().size());
1208 assertEquals(TerminationType.FORCEFUL, actualTerminationRequest.getValue().getTerminationType());
1209 assertNull(actualTerminationRequest.getValue().getGracefulTerminationTimeout());
1210 InOrder notificationIsProcessedBeforeDeletingTheVnf = Mockito.inOrder(vfcGrantManager, notificationManager, vnfApi);
1211 notificationIsProcessedBeforeDeletingTheVnf.verify(vfcGrantManager).requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnfInfo, JOB_ID);
1212 notificationIsProcessedBeforeDeletingTheVnf.verify(notificationManager).waitForTerminationToBeProcessed("terminationId");
1213 notificationIsProcessedBeforeDeletingTheVnf.verify(vnfApi).vnfsVnfInstanceIdDelete(VNF_ID, NOKIA_LCM_API_VERSION);
1217 * test failure in the termination workflow finishes the job
1220 public void testFailureInTheTerminationFinishesTheManagedJob() throws Exception {
1222 VnfTerminateRequest terminationRequest = new VnfTerminateRequest();
1223 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1224 terminationRequest.setTerminationType(VnfTerminationType.FORCEFUL);
1225 terminationRequest.setGracefulTerminationTimeout("1234");
1226 vnfInfo.setInstantiationState(InstantiationState.INSTANTIATED);
1227 vnfInfo.setOperationExecutions(operationExecutions);
1228 VnfProperty vnfdId = new VnfProperty();
1229 vnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
1230 vnfdId.setValue(ONAP_CSAR_ID);
1231 vnfInfo.getExtensions().add(vnfdId);
1232 ArgumentCaptor<TerminateVnfRequest> actualTerminationRequest = ArgumentCaptor.forClass(TerminateVnfRequest.class);
1233 when(vnfApi.vnfsVnfInstanceIdTerminatePost(eq(VNF_ID), actualTerminationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenAnswer(new Answer<OperationExecution>() {
1235 public OperationExecution answer(InvocationOnMock invocation) throws Throwable {
1236 OperationExecution terminationOperation = new OperationExecution();
1237 terminationOperation.setId("terminationId");
1238 operationExecutions.add(terminationOperation);
1239 terminationOperation.setStatus(OperationStatus.FINISHED);
1240 return terminationOperation;
1243 RuntimeException expectedException = new RuntimeException();
1244 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenThrow(expectedException);
1245 JsonElement instantiationParameters = new JsonParser().parse("{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] } ");
1246 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet("operationExecutionId", NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(instantiationParameters));
1248 JobInfo jobInfo = lifecycleManager.terminateAndDelete(VNFM_ID, VNF_ID, terminationRequest, restResponse);
1250 waitForJobToFinishInJobManager(finished);
1251 assertEquals(0, actualTerminationRequest.getAllValues().size());
1252 Mockito.verifyZeroInteractions(vfcGrantManager);
1256 * if termination fails the VNF is not deleted
1259 public void testFailedTerminationAbortsTerminationWorkflow() throws Exception {
1261 VnfTerminateRequest terminationRequest = new VnfTerminateRequest();
1262 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1263 vnfInfo.setInstantiationState(InstantiationState.INSTANTIATED);
1264 vnfInfo.setOperationExecutions(operationExecutions);
1265 VnfProperty vnfdId = new VnfProperty();
1266 vnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
1267 vnfdId.setValue(ONAP_CSAR_ID);
1268 vnfInfo.getExtensions().add(vnfdId);
1269 ArgumentCaptor<TerminateVnfRequest> actualTerminationRequest = ArgumentCaptor.forClass(TerminateVnfRequest.class);
1270 when(vnfApi.vnfsVnfInstanceIdTerminatePost(eq(VNF_ID), actualTerminationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenAnswer(new Answer<Observable<OperationExecution>>() {
1272 public Observable<OperationExecution> answer(InvocationOnMock invocation) throws Throwable {
1273 OperationExecution terminationOperation = new OperationExecution();
1274 terminationOperation.setId("terminationId");
1275 operationExecutions.add(terminationOperation);
1276 terminationOperation.setStatus(OperationStatus.FAILED);
1277 return buildObservable(terminationOperation);
1280 JsonElement instantiationParameters = new JsonParser().parse("{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] } ");
1281 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet("operationExecutionId", NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(instantiationParameters));
1283 JobInfo jobInfo = lifecycleManager.terminateAndDelete(VNFM_ID, VNF_ID, terminationRequest, restResponse);
1285 waitForJobToFinishInJobManager(finished);
1286 assertEquals(1, actualTerminationRequest.getAllValues().size());
1287 assertEquals(TerminationType.FORCEFUL, actualTerminationRequest.getValue().getTerminationType());
1288 verify(vfcGrantManager).requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnfInfo, JOB_ID);
1289 verify(vnfApi, never()).vnfsVnfInstanceIdDelete(VNF_ID, NOKIA_LCM_API_VERSION);
1290 verify(logger).error("Unable to terminate VNF the operation did not finish with success");
1294 * test VNF query basic success scenario
1297 public void testQuery() throws Exception {
1298 vnfInfo.setDescription("myDescription");
1299 vnfInfo.setName("myName");
1300 vnfInfo.setVnfSoftwareVersion("vnfSoftwareVersion");
1301 vnfInfo.setVnfProvider("myProvider");
1302 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1303 VnfProperty prop = new VnfProperty();
1304 prop.setName(LifecycleManager.ONAP_CSAR_ID);
1305 prop.setValue(ONAP_CSAR_ID);
1306 vnfInfo.getExtensions().add(prop);
1308 org.onap.vnfmdriver.model.VnfInfo vnf = lifecycleManager.queryVnf(VNFM_ID, VNF_ID);
1310 assertEquals(VNF_ID, vnf.getVnfInstanceId());
1311 //FIXME ? (do not know what exactly the vnf version mean in core terminology)
1312 assertEquals("vnfSoftwareVersion", vnf.getVersion());
1313 assertEquals(ONAP_CSAR_ID, vnf.getVnfdId());
1314 assertEquals("myDescription", vnf.getVnfInstanceDescription());
1315 assertEquals("myName", vnf.getVnfInstanceName());
1316 assertEquals(ONAP_CSAR_ID, vnf.getVnfPackageId());
1317 assertEquals("myProvider", vnf.getVnfProvider());
1318 //FIXME (in swagger schema )
1319 assertEquals("ACTIVE", vnf.getVnfStatus());
1320 assertEquals("Kuku", vnf.getVnfType());
1324 * error is propagated and logged if the queried VNF does not exist
1327 public void testQueryForNonExistingVnf() throws Exception {
1329 RuntimeException expectedException = new RuntimeException();
1330 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenThrow(expectedException);
1333 lifecycleManager.queryVnf(VNFM_ID, VNF_ID);
1336 } catch (Exception e) {
1337 verify(logger).error("Unable to query VNF (myVnfId)", expectedException);
1338 assertEquals(expectedException, e.getCause());
1343 * test scale basic scenario
1346 public void testScale() throws Exception {
1347 VnfScaleRequest scaleRequest = new VnfScaleRequest();
1348 scaleRequest.setNumberOfSteps("2");
1349 scaleRequest.setAspectId("myAspect");
1350 scaleRequest.setType(ScaleDirection.IN);
1351 scaleRequest.setAdditionalParam(new JsonParser().parse("{ \"a\" : \"b\", \"c\" : \"d\" }"));
1352 scaleOperationExecution.setStatus(OperationStatus.FINISHED);
1353 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1354 VnfProperty prop = new VnfProperty();
1355 prop.setValue(ONAP_CSAR_ID);
1356 prop.setName(LifecycleManager.ONAP_CSAR_ID);
1357 vnfInfo.getExtensions().add(prop);
1358 vnfInfo.getOperationExecutions().add(instantiationOperationExecution);
1359 String instantiationParams = "{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] }";
1360 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet(instantiationOperationExecution.getId(), NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(new JsonParser().parse(instantiationParams)));
1362 JobInfo job = lifecycleManager.scaleVnf(VNFM_ID, VNF_ID, scaleRequest, restResponse);
1364 waitForJobToFinishInJobManager(finished);
1365 assertEquals(1, actualScaleRequest.getAllValues().size());
1366 ScaleVnfRequest sRequest = actualScaleRequest.getValue();
1367 InOrder workflowOrder = Mockito.inOrder(vfcGrantManager, vnfApi);
1368 workflowOrder.verify(vfcGrantManager).requestGrantForScale(eq(VNFM_ID), eq(VNF_ID), eq(VIM_ID), eq(ONAP_CSAR_ID), eq(scaleRequest), eq(JOB_ID));
1369 workflowOrder.verify(vnfApi).vnfsVnfInstanceIdScalePost(VNF_ID, sRequest, NOKIA_LCM_API_VERSION);
1370 assertEquals("myAspect", sRequest.getAspectId());
1371 assertEquals(com.nokia.cbam.lcm.v32.model.ScaleDirection.IN, sRequest.getType());
1372 assertEquals(Integer.valueOf(2), sRequest.getNumberOfSteps());
1373 assertTrue("{\"jobId\":\"myJobId\",\"a\":\"b\"}".equals(new Gson().toJson(sRequest.getAdditionalParams())) || "{\"a\":\"b\",\"jobId\":\"myJobId\"}".equals(new Gson().toJson(sRequest.getAdditionalParams())));
1374 verify(jobManager).spawnJob(VNF_ID, restResponse);
1375 verify(logger).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("scale"), eq(VNF_ID), anyString());
1380 * the VNFM should tolerate that no additional params were supplied
1383 public void testScaleWithoutAddtionalParams() throws Exception {
1384 VnfScaleRequest scaleRequest = new VnfScaleRequest();
1385 scaleRequest.setNumberOfSteps("2");
1386 scaleRequest.setAspectId("myAspect");
1387 scaleRequest.setType(ScaleDirection.IN);
1388 scaleRequest.setAdditionalParam(null);
1389 scaleOperationExecution.setStatus(OperationStatus.FINISHED);
1390 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1391 VnfProperty prop = new VnfProperty();
1392 prop.setValue(ONAP_CSAR_ID);
1393 prop.setName(LifecycleManager.ONAP_CSAR_ID);
1394 vnfInfo.getExtensions().add(prop);
1395 vnfInfo.getOperationExecutions().add(instantiationOperationExecution);
1396 String instantiationParams = "{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] }";
1397 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet(instantiationOperationExecution.getId(), NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(new JsonParser().parse(instantiationParams)));
1399 JobInfo job = lifecycleManager.scaleVnf(VNFM_ID, VNF_ID, scaleRequest, restResponse);
1401 waitForJobToFinishInJobManager(finished);
1402 assertEquals(1, actualScaleRequest.getAllValues().size());
1403 ScaleVnfRequest sRequest = actualScaleRequest.getValue();
1404 InOrder workflowOrder = Mockito.inOrder(vfcGrantManager, vnfApi);
1405 workflowOrder.verify(vfcGrantManager).requestGrantForScale(eq(VNFM_ID), eq(VNF_ID), eq(VIM_ID), eq(ONAP_CSAR_ID), eq(scaleRequest), eq(JOB_ID));
1406 workflowOrder.verify(vnfApi).vnfsVnfInstanceIdScalePost(VNF_ID, sRequest, NOKIA_LCM_API_VERSION);
1407 assertEquals("myAspect", sRequest.getAspectId());
1408 assertEquals(com.nokia.cbam.lcm.v32.model.ScaleDirection.IN, sRequest.getType());
1409 assertEquals(Integer.valueOf(2), sRequest.getNumberOfSteps());
1410 assertEquals("{\"jobId\":\"myJobId\"}", new Gson().toJson(sRequest.getAdditionalParams()));
1411 verify(jobManager).spawnJob(VNF_ID, restResponse);
1415 * test scale out basic scenario
1418 public void testScaleOut() throws Exception {
1419 VnfScaleRequest scaleRequest = new VnfScaleRequest();
1420 scaleRequest.setNumberOfSteps("2");
1421 scaleRequest.setAspectId("myAspect");
1422 scaleRequest.setType(ScaleDirection.OUT);
1423 scaleRequest.setAdditionalParam(new JsonParser().parse("{ \"a\" : \"b\" }"));
1424 scaleOperationExecution.setStatus(OperationStatus.FINISHED);
1425 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1426 VnfProperty prop = new VnfProperty();
1427 prop.setValue(ONAP_CSAR_ID);
1428 prop.setName(LifecycleManager.ONAP_CSAR_ID);
1429 vnfInfo.getExtensions().add(prop);
1430 vnfInfo.getOperationExecutions().add(instantiationOperationExecution);
1431 String instantiationParams = "{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] }";
1432 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet(instantiationOperationExecution.getId(), NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(new JsonParser().parse(instantiationParams)));
1434 JobInfo job = lifecycleManager.scaleVnf(VNFM_ID, VNF_ID, scaleRequest, restResponse);
1436 waitForJobToFinishInJobManager(finished);
1437 assertEquals(1, actualScaleRequest.getAllValues().size());
1438 ScaleVnfRequest sRequest = actualScaleRequest.getValue();
1439 InOrder workflowOrder = Mockito.inOrder(vfcGrantManager, vnfApi);
1440 workflowOrder.verify(vfcGrantManager).requestGrantForScale(eq(VNFM_ID), eq(VNF_ID), eq(VIM_ID), eq(ONAP_CSAR_ID), eq(scaleRequest), eq(JOB_ID));
1441 workflowOrder.verify(vnfApi).vnfsVnfInstanceIdScalePost(VNF_ID, sRequest, NOKIA_LCM_API_VERSION);
1442 assertEquals("myAspect", sRequest.getAspectId());
1443 assertEquals(com.nokia.cbam.lcm.v32.model.ScaleDirection.OUT, sRequest.getType());
1444 assertEquals(Integer.valueOf(2), sRequest.getNumberOfSteps());
1445 assertTrue("{\"jobId\":\"myJobId\",\"a\":\"b\"}".equals(new Gson().toJson(sRequest.getAdditionalParams())) || "{\"a\":\"b\",\"jobId\":\"myJobId\"}".equals(new Gson().toJson(sRequest.getAdditionalParams())));
1449 * test scale operation is out waited
1452 public void testScaleOutwait() throws Exception {
1453 VnfScaleRequest scaleRequest = new VnfScaleRequest();
1454 scaleRequest.setNumberOfSteps("2");
1455 scaleRequest.setAspectId("myAspect");
1456 scaleRequest.setType(ScaleDirection.IN);
1457 scaleRequest.setAdditionalParam(new JsonParser().parse("{ \"a\" : \"b\" }"));
1458 scaleOperationExecution.setStatus(OperationStatus.STARTED);
1459 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1460 VnfProperty prop = new VnfProperty();
1461 prop.setValue(ONAP_CSAR_ID);
1462 prop.setName(LifecycleManager.ONAP_CSAR_ID);
1463 vnfInfo.getExtensions().add(prop);
1464 vnfInfo.getOperationExecutions().add(instantiationOperationExecution);
1465 String instantiationParams = "{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] }";
1466 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet(instantiationOperationExecution.getId(), NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(new JsonParser().parse(instantiationParams)));
1467 List<RuntimeException> expectedExceptions = new ArrayList<>();
1468 when(vnfApi.vnfsVnfInstanceIdOperationExecutionsGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenAnswer((Answer<Observable<List<OperationExecution>>>) invocation -> {
1469 if (expectedExceptions.size() >= 100) {
1470 when(operationExecutionApi.operationExecutionsOperationExecutionIdGet(scaleOperationExecution.getId(), NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(scaleOperationExecution));
1471 scaleOperationExecution.setStatus(OperationStatus.FINISHED);
1472 return buildObservable(operationExecutions);
1474 RuntimeException RuntimeException = new RuntimeException();
1475 expectedExceptions.add(RuntimeException);
1476 throw RuntimeException;
1480 JobInfo job = lifecycleManager.scaleVnf(VNFM_ID, VNF_ID, scaleRequest, restResponse);
1482 waitForJobToFinishInJobManager(finished);
1483 assertEquals(100, expectedExceptions.size());
1484 for (RuntimeException expectedException : expectedExceptions) {
1485 verify(logger).warn("Unable to retrieve operations details", expectedException);
1487 verify(systemFunctions, times(100)).sleep(5000);
1491 * test scale failure propagation
1494 public void testScaleFailurePropagation() throws Exception {
1495 RuntimeException expectedException = new RuntimeException();
1496 VnfScaleRequest scaleRequest = new VnfScaleRequest();
1497 scaleRequest.setNumberOfSteps("2");
1498 scaleRequest.setAspectId("myAspect");
1499 scaleRequest.setType(ScaleDirection.IN);
1500 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenThrow(expectedException);
1502 lifecycleManager.scaleVnf(VNFM_ID, VNF_ID, scaleRequest, restResponse);
1504 waitForJobToFinishInJobManager(finished);
1505 verify(logger).error("Unable to scale VNF with myVnfId identifier", expectedException);
1509 * test heal basic scenario
1512 public void testHeal() throws Exception {
1513 VnfHealRequest healRequest = new VnfHealRequest();
1514 healRequest.setAction("myAction");
1515 VnfHealRequestAffectedvm affectedVm = new VnfHealRequestAffectedvm();
1516 affectedVm.setVmname("vmName");
1517 healRequest.setAffectedvm(affectedVm);
1518 healOperationExecution.setStatus(OperationStatus.FINISHED);
1519 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1520 VnfProperty prop = new VnfProperty();
1521 prop.setValue(ONAP_CSAR_ID);
1522 prop.setName(LifecycleManager.ONAP_CSAR_ID);
1523 vnfInfo.getExtensions().add(prop);
1524 vnfInfo.getOperationExecutions().add(instantiationOperationExecution);
1525 String instantiationParams = "{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] }";
1526 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet(instantiationOperationExecution.getId(), NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(new JsonParser().parse(instantiationParams)));
1528 JobInfo job = lifecycleManager.healVnf(VNFM_ID, VNF_ID, healRequest, empty(), restResponse);
1530 waitForJobToFinishInJobManager(finished);
1531 assertEquals(1, actualHealRequest.getAllValues().size());
1532 HealVnfRequest sRequest = actualHealRequest.getValue();
1533 InOrder workflowOrder = Mockito.inOrder(vfcGrantManager, vnfApi);
1534 workflowOrder.verify(vfcGrantManager).requestGrantForHeal(eq(VNFM_ID), eq(VNF_ID), eq(VIM_ID), eq(ONAP_CSAR_ID), eq(healRequest), eq(JOB_ID));
1535 workflowOrder.verify(vnfApi).vnfsVnfInstanceIdHealPost(VNF_ID, sRequest, NOKIA_LCM_API_VERSION);
1536 JsonObject root = new Gson().toJsonTree(sRequest.getAdditionalParams()).getAsJsonObject();
1537 assertEquals("myAction", root.get("action").getAsString());
1538 assertEquals("vmName", root.get("vmName").getAsString());
1539 assertEquals(JOB_ID, root.get("jobId").getAsString());
1540 verify(jobManager).spawnJob(VNF_ID, restResponse);
1541 verify(logger).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("heal"), eq(VNF_ID), anyString());
1545 * test heal operation is out waited
1548 public void testHealOutwait() throws Exception {
1549 VnfHealRequest healRequest = new VnfHealRequest();
1550 healRequest.setAction("myAction");
1551 VnfHealRequestAffectedvm affectedVm = new VnfHealRequestAffectedvm();
1552 affectedVm.setVmname("vmName");
1553 healRequest.setAffectedvm(affectedVm);
1554 healOperationExecution.setStatus(OperationStatus.FINISHED);
1555 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnfInfo));
1556 VnfProperty prop = new VnfProperty();
1557 prop.setValue(ONAP_CSAR_ID);
1558 prop.setName(LifecycleManager.ONAP_CSAR_ID);
1559 vnfInfo.getExtensions().add(prop);
1560 vnfInfo.getOperationExecutions().add(instantiationOperationExecution);
1561 String instantiationParams = "{ \"vims\" : [ { \"id\" : \"" + VIM_ID + "\" } ] }";
1562 when(operationExecutionApi.operationExecutionsOperationExecutionIdOperationParamsGet(instantiationOperationExecution.getId(), NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(new JsonParser().parse(instantiationParams)));
1563 List<RuntimeException> expectedExceptions = new ArrayList<>();
1564 when(vnfApi.vnfsVnfInstanceIdOperationExecutionsGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenAnswer(new Answer<Observable<List<OperationExecution>>>() {
1566 public Observable<List<OperationExecution>> answer(InvocationOnMock invocation) throws Throwable {
1567 if (expectedExceptions.size() >= 100) {
1568 scaleOperationExecution.setStatus(OperationStatus.FINISHED);
1569 return buildObservable(operationExecutions);
1571 RuntimeException RuntimeException = new RuntimeException();
1572 expectedExceptions.add(RuntimeException);
1573 throw RuntimeException;
1577 JobInfo job = lifecycleManager.healVnf(VNFM_ID, VNF_ID, healRequest, empty(), restResponse);
1579 waitForJobToFinishInJobManager(finished);
1580 assertEquals(100, expectedExceptions.size());
1581 for (RuntimeException expectedException : expectedExceptions) {
1582 verify(logger).warn("Unable to retrieve operations details", expectedException);
1584 verify(systemFunctions, times(100)).sleep(5000);
1588 * failure in heal propagates in error
1591 public void testHealFailurePropagation() throws Exception {
1592 RuntimeException expectedException = new RuntimeException();
1593 VnfHealRequest healRequest = new VnfHealRequest();
1594 healRequest.setAction("myAction");
1595 VnfHealRequestAffectedvm affectedVm = new VnfHealRequestAffectedvm();
1596 affectedVm.setVmname("vmName");
1597 healRequest.setAffectedvm(affectedVm);
1598 when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenThrow(expectedException);
1600 JobInfo job = lifecycleManager.healVnf(VNFM_ID, VNF_ID, healRequest, empty(), restResponse);
1602 waitForJobToFinishInJobManager(finished);
1603 verify(logger).error("Unable to heal VNF with myVnfId identifier", expectedException);
1608 * test custom operation basic scenario
1611 public void testCustomOperation() throws Exception {
1612 String operationId = "operationIdCaptor";
1613 Object additionalParams = new JsonObject();
1615 JobInfo job = lifecycleManager.customOperation(VNFM_ID, VNF_ID, operationId, additionalParams, restResponse);
1617 waitForJobToFinishInJobManager(finished);
1618 assertEquals(operationId, operationIdCaptor.getValue());
1619 assertEquals(additionalParams, customOperationRequestArgumentCaptor.getValue().getAdditionalParams());
1622 private void waitForJobToFinishInJobManager(Set<Boolean> finished) throws InterruptedException {
1623 while (finished.size() == 0) {
1624 systemFunctions().sleep(100);
1628 private VnfInstantiateRequest prepareInstantiationRequest(VimInfo.VimInfoTypeEnum cloudType) {
1629 VnfInstantiateRequest instantiationRequest = new VnfInstantiateRequest();
1630 instantiationRequest.setVnfPackageId(ONAP_CSAR_ID);
1631 instantiationRequest.setVnfDescriptorId(ONAP_CSAR_ID);
1632 instantiationRequest.setVnfInstanceDescription("myDescription");
1633 instantiationRequest.setVnfInstanceName("vnfName");
1634 additionalParam.setInstantiationLevel("level1");
1635 switch (cloudType) {
1636 case OPENSTACK_V2_INFO:
1637 additionalParam.setVimType(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
1639 case OPENSTACK_V3_INFO:
1640 additionalParam.setVimType(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO);
1641 vimInfo.setDomain("myDomain");
1643 case VMWARE_VCLOUD_INFO:
1644 additionalParam.setVimType(VimInfo.VimInfoTypeEnum.VMWARE_VCLOUD_INFO);
1647 additionalParam.setVimType(VimInfo.VimInfoTypeEnum.OTHER_VIM_INFO);
1650 Map<String, List<NetworkAddress>> exteranalConnectionPointAddresses = new HashMap<>();
1651 exteranalConnectionPointAddresses.put("ecp1", new ArrayList<>());
1652 NetworkAddress networkAddress = new NetworkAddress();
1653 networkAddress.setIp("1.2.3.4");
1654 networkAddress.setMac("mac");
1655 networkAddress.setSubnetId("subnetId");
1656 exteranalConnectionPointAddresses.get("ecp1").add(networkAddress);
1657 additionalParam.setExternalConnectionPointAddresses(exteranalConnectionPointAddresses);
1658 VimComputeResourceFlavour flavor = new VimComputeResourceFlavour();
1659 flavor.setResourceId("flavourProviderId");
1660 flavor.setVimId(VIM_ID);
1661 flavor.setVnfdVirtualComputeDescId("virtualComputeDescId");
1662 additionalParam.getComputeResourceFlavours().add(flavor);
1663 ExtVirtualLinkData evl = new ExtVirtualLinkData();
1664 evl.setResourceId("networkProviderId1");
1665 evl.setVimId(VIM_ID);
1666 evl.setExtVirtualLinkId("evlId1");
1667 VnfExtCpData ecp2 = new VnfExtCpData();
1668 ecp2.setCpdId("cpdId3");
1669 ecp2.setAddresses(new ArrayList<>());
1670 ecp2.getAddresses().add(networkAddress);
1671 ecp2.setNumDynamicAddresses(2);
1672 evl.getExtCps().add(ecp2);
1673 additionalParam.getExtVirtualLinks().add(evl);
1674 externalVirtualLink.setCpdId("myCpdId");
1675 externalVirtualLink.setResourceId("myNetworkProviderId");
1676 externalVirtualLink.setVlInstanceId("myEVlId");
1677 externalVirtualLink.setResourceSubnetId("notUsedSubnetId");
1678 instantiationRequest.setExtVirtualLink(new ArrayList<>());
1679 instantiationRequest.getExtVirtualLink().add(externalVirtualLink);
1680 additionalParam.getExtManagedVirtualLinks().add(extManVl);
1681 ZoneInfo zone = new ZoneInfo();
1682 zone.setId("zoneId");
1683 zone.setResourceId("zoneProviderId");
1684 zone.setVimId(VIM_ID);
1685 additionalParam.getZones().add(zone);
1686 VimSoftwareImage image = new VimSoftwareImage();
1687 image.setResourceId("imageProviderId");
1688 image.setVimId(VIM_ID);
1689 image.setVnfdSoftwareImageId("imageId");
1690 additionalParam.getSoftwareImages().add(image);
1691 additionalParam.setAdditionalParams(new JsonParser().parse("{ \"a\" : \"b\" }"));
1692 String params = new Gson().toJson(additionalParam);
1693 String src = "{ \"inputs\" : { \"vnfs\" : { \"" + ONAP_CSAR_ID + "\" : " + params + "}}, \"vimId\" : \"" + VIM_ID + "\"}";
1694 instantiationRequest.setAdditionalParam(new JsonParser().parse(src));
1695 return instantiationRequest;
1699 * Test vimId decomposition
1702 public void testVimIdSplitting() {
1703 assertEquals("regionId", LifecycleManager.getRegionName("cloudOwner_regionId"));
1704 assertEquals("cloudOwner", LifecycleManager.getCloudOwner("cloudOwner_regionId"));