2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.vid.services;
23 import static com.google.common.collect.Maps.newHashMap;
24 import static java.util.Collections.EMPTY_LIST;
25 import static java.util.Collections.EMPTY_MAP;
26 import static java.util.Collections.emptyList;
27 import static java.util.Collections.singletonList;
28 import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals;
29 import static net.javacrumbs.jsonunit.JsonMatchers.jsonNodeAbsent;
30 import static net.javacrumbs.jsonunit.JsonMatchers.jsonPartEquals;
31 import static net.javacrumbs.jsonunit.core.Option.IGNORING_ARRAY_ORDER;
32 import static org.hamcrest.MatcherAssert.assertThat;
33 import static org.hamcrest.core.IsEqual.equalTo;
34 import static org.mockito.ArgumentMatchers.eq;
35 import static org.mockito.Mockito.doReturn;
36 import static org.mockito.Mockito.spy;
37 import static org.mockito.Mockito.when;
39 import com.fasterxml.jackson.databind.JsonNode;
40 import com.fasterxml.jackson.databind.ObjectMapper;
41 import com.google.common.collect.ImmutableList;
42 import com.google.common.collect.ImmutableMap;
43 import java.io.IOException;
44 import java.lang.reflect.Method;
46 import java.util.ArrayList;
47 import java.util.Arrays;
48 import java.util.HashMap;
49 import java.util.List;
51 import java.util.UUID;
52 import java.util.stream.Collectors;
53 import javax.inject.Inject;
54 import net.javacrumbs.jsonunit.ConfigurableJsonMatcher;
55 import org.apache.commons.io.IOUtils;
56 import org.apache.commons.lang3.BooleanUtils;
57 import org.hibernate.SessionFactory;
58 import org.mockito.Mock;
59 import org.mockito.Mockito;
60 import org.mockito.MockitoAnnotations;
61 import org.onap.portalsdk.core.service.DataAccessService;
62 import org.onap.portalsdk.core.util.SystemProperties;
63 import org.onap.vid.aai.model.ResourceType;
64 import org.onap.vid.changeManagement.RequestDetailsWrapper;
65 import org.onap.vid.config.DataSourceConfig;
66 import org.onap.vid.config.MockedAaiClientAndFeatureManagerConfig;
67 import org.onap.vid.dal.AsyncInstantiationRepository;
68 import org.onap.vid.job.JobAdapter;
69 import org.onap.vid.job.JobsBrokerService;
70 import org.onap.vid.job.command.MsoRequestBuilder;
71 import org.onap.vid.model.Action;
72 import org.onap.vid.model.serviceInstantiation.InstanceGroup;
73 import org.onap.vid.model.serviceInstantiation.Network;
74 import org.onap.vid.model.serviceInstantiation.ServiceInstantiation;
75 import org.onap.vid.model.serviceInstantiation.VfModule;
76 import org.onap.vid.model.serviceInstantiation.Vnf;
77 import org.onap.vid.mso.MsoOperationalEnvironmentTest;
78 import org.onap.vid.mso.model.AddOrRemoveInstanceGroupMemberRequestDetails;
79 import org.onap.vid.mso.model.InstanceGroupInstantiationRequestDetails;
80 import org.onap.vid.mso.model.ModelInfo;
81 import org.onap.vid.mso.model.NetworkInstantiationRequestDetails;
82 import org.onap.vid.mso.model.ServiceDeletionRequestDetails;
83 import org.onap.vid.mso.model.ServiceInstantiationRequestDetails;
84 import org.onap.vid.mso.model.ServiceInstantiationRequestDetails.UserParamNameAndValue;
85 import org.onap.vid.mso.model.VfModuleMacro;
86 import org.onap.vid.mso.model.VfModuleOrVolumeGroupRequestDetails;
87 import org.onap.vid.mso.model.VnfInstantiationRequestDetails;
88 import org.onap.vid.mso.model.VolumeGroupRequestDetails;
89 import org.onap.vid.properties.Features;
90 import org.onap.vid.testUtils.TestUtils;
91 import org.springframework.beans.factory.annotation.Autowired;
92 import org.springframework.test.context.ContextConfiguration;
93 import org.testng.Assert;
94 import org.testng.annotations.BeforeClass;
95 import org.testng.annotations.DataProvider;
96 import org.testng.annotations.Test;
98 @ContextConfiguration(classes = {DataSourceConfig.class, SystemProperties.class, MockedAaiClientAndFeatureManagerConfig.class})
99 public class MsoRequestBuilderTest extends AsyncInstantiationBaseTest {
102 private DataAccessService dataAccessService;
105 private JobAdapter jobAdapterMock;
108 private JobsBrokerService jobsBrokerServiceMock;
110 private AsyncInstantiationRepository asyncInstantiationRepository;
112 private AuditService auditService;
115 private SessionFactory sessionFactory;
117 private AsyncInstantiationBusinessLogicImpl asyncInstantiationBL;
119 private MsoRequestBuilder msoRequestBuilder;
123 void initServicesInfoService() {
124 MockitoAnnotations.initMocks(this);
125 AsyncInstantiationRepository realAsyncInstantiationRepository = new AsyncInstantiationRepository(dataAccessService);
126 asyncInstantiationRepository = spy(realAsyncInstantiationRepository);
128 auditService = new AuditServiceImpl(null, asyncInstantiationRepository);
130 AsyncInstantiationBusinessLogicImpl realAsyncInstantiationBL = new AsyncInstantiationBusinessLogicImpl(jobAdapterMock, jobsBrokerServiceMock, sessionFactory, aaiClient, featureManager, cloudOwnerService, asyncInstantiationRepository, auditService);
131 asyncInstantiationBL = Mockito.spy(realAsyncInstantiationBL);
133 msoRequestBuilder = new MsoRequestBuilder(asyncInstantiationBL, cloudOwnerService, aaiClient, featureManager);
135 createInstanceParamsMaps();
138 @Test(dataProvider = "pauseAndInstanceParams", enabled = false) //Test is irrelevant with unique names feature
139 public void createMacroServiceInstantiationMsoRequest(Boolean isPause, HashMap<String, String> vfModuleInstanceParamsMap, List vnfInstanceParams) throws Exception {
140 ServiceInstantiation serviceInstantiationPayload = generateMacroMockServiceInstantiationPayload(isPause, createVnfList(vfModuleInstanceParamsMap, vnfInstanceParams, true));
141 final URL resource = this.getClass().getResource("/payload_jsons/bulk_macro_service_request.json");
142 RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
143 msoRequestBuilder.generateMacroServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
144 String expected = IOUtils.toString(resource, "UTF-8");
145 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
149 public void createServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected() throws IOException {
150 createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(true,
155 public void createServiceInfo_WithUserProvidedNamingFalseAndNoVfmodules_ServiceInfoIsAsExpected() throws IOException {
156 createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(false, false);
160 public void shouldCreateServiceInfoWithHomingSolutionDisabled() throws IOException {
161 doReturn(true).when(featureManager).isActive(Features.FLAG_DISABLE_HOMING);
163 createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(true, true);
166 private void createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(boolean withVfmodules, boolean disabledHoming) throws IOException {
168 ServiceInstantiation serviceInstantiationPayload = generateMockMacroServiceInstantiationPayload(true,
169 createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, EMPTY_LIST, false),
171 false, PROJECT_NAME, true);
173 if (disabledHoming) {
174 resource = this.getClass().getResource("/payload_jsons/bulk_service_no_homing.json");
175 } else if (withVfmodules) {
176 resource = this.getClass().getResource("/payload_jsons/bulk_service_request_ecomp_naming.json");
178 // remove the vf modules
179 serviceInstantiationPayload.getVnfs().values().forEach(vnf -> vnf.getVfModules().clear());
180 resource = this.getClass().getResource("/payload_jsons/bulk_service_request_no_vfmodule_ecomp_naming.json");
183 RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
184 msoRequestBuilder.generateMacroServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
186 String expected = IOUtils.toString(resource, "UTF-8");
187 assertThat(result, jsonEquals(expected));
191 public void createALaCarteService_WithUserProvidedNamingFalse_RequestDetailsIsAsExpected() throws IOException {
192 ServiceInstantiation serviceInstantiationPayload = generateMockALaCarteServiceInstantiationPayload(false,
197 false, PROJECT_NAME, true, null);
199 RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
200 msoRequestBuilder.generateALaCarteServiceInstantiationRequest(serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
202 URL resource = this.getClass().getResource("/payload_jsons/bulk_alacarte_service_request_naming_false.json");
203 String expected = IOUtils.toString(resource, "UTF-8");
204 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
208 public void generateALaCarteServiceInstantiationRequest_withVnfList_HappyFllow() throws IOException {
209 ServiceInstantiation serviceInstantiationPayload = generateALaCarteWithVnfsServiceInstantiationPayload();
210 RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
211 msoRequestBuilder.generateALaCarteServiceInstantiationRequest(serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
213 String serviceExpected = IOUtils.toString(this.getClass().getResource("/payload_jsons/bulk_alacarte_service_request.json"), "UTF-8");
214 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(serviceExpected, result);
218 public void generateALaCarteServiceInstantiationRequest_verifyRequestIsAsExpected() throws IOException {
219 ServiceInstantiation serviceInstantiationPayload = generateALaCarteServiceInstantiationPayload();
220 final URL resource = this.getClass().getResource("/payload_jsons/bulk_alacarte_service_request.json");
221 RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
222 msoRequestBuilder.generateALaCarteServiceInstantiationRequest(serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
223 String expected = IOUtils.toString(resource, "UTF-8");
224 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
228 public void generateALaCarteServiceDeletionRequest_verifyRequestIsAsExpected() throws IOException {
229 String expected = generateServiceDeletionRequest(true, "VNF_API");
231 ServiceInstantiation serviceDeletionPayload = generateALaCarteServiceDeletionPayload();
232 RequestDetailsWrapper<ServiceDeletionRequestDetails> result =
233 msoRequestBuilder.generateServiceDeletionRequest(serviceDeletionPayload, "az2016");
235 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
238 private ServiceInstantiation generateALaCarteServiceDeletionPayload() {
239 return generateMockAlaCarteServiceDeletionPayload(false, EMPTY_MAP, EMPTY_MAP, EMPTY_MAP, 1, true, PROJECT_NAME, false, "VNF_API", "1234567890");
243 public void generateServiceDeletionRequest_verifyRequestIsAsExpected() throws IOException {
244 String expected = generateServiceDeletionRequest(false, null);
246 ServiceInstantiation serviceDeletionPayload = generateServiceDeletionPayload();
247 RequestDetailsWrapper<ServiceDeletionRequestDetails> result =
248 msoRequestBuilder.generateServiceDeletionRequest(serviceDeletionPayload, "az2016");
250 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
253 private String generateServiceDeletionRequest(boolean isAlaCarte, String testApi) {
254 String expected = TestUtils.readFileAsString("/payload_jsons/bulk_alacarte_service_deletion_request.json");
255 expected = expected.replace("[TEST_API]", String.valueOf(testApi));
256 expected = expected.replace("[IS_ALACARTE]", Boolean.toString(isAlaCarte));
260 private ServiceInstantiation generateServiceDeletionPayload() {
261 return generateMockServiceDeletionPayload(false, EMPTY_MAP, EMPTY_MAP, EMPTY_MAP, 1, true, PROJECT_NAME, false, "VNF_API", "1234567890");
265 public static Object[][] createVnfParameters() {
266 return new Object[][]{
267 {true, true, "/payload_jsons/vnf/bulk_vnf_request.json"},
268 {false, true, "/payload_jsons/vnf/bulk_vnf_request_without_cloud_owner.json"},
269 {true, false, "/payload_jsons/vnf/bulk_vnf_request_without_instance_name.json"},
273 @Test(dataProvider = "createVnfParameters")
274 public void createVnfRequestDetails_detailsAreAsExpected(boolean isFlagAddCloudOwnerActive, boolean isUserProvidedNaming, String expectedFile) throws IOException {
275 final List<Vnf> vnfList = new ArrayList<>(createVnfList(new HashMap<>(), null, isUserProvidedNaming, true).values());
276 createVnfPayloadAndAssert(vnfList.get(0), isFlagAddCloudOwnerActive, expectedFile);
280 public static Object[][] inputVnfEndExpectedResult() {
281 return new Object[][]{
282 {"/payload_jsons/vnf/vnf_without_lob_user_input.json", "/payload_jsons/vnf/vnf_without_lob_expected.json"},
286 @Test(dataProvider = "inputVnfEndExpectedResult")
287 public void createVnfRequestFromJson_andCompre(String userInputFile, String expectedFile) throws IOException {
288 Vnf vnf = TestUtils.readJsonResourceFileAsObject(userInputFile, Vnf.class);
289 createVnfPayloadAndAssert(vnf, true, expectedFile);
292 private void createVnfPayloadAndAssert(Vnf vnf, boolean isFlagAddCloudOwnerActive, String expectedFile) throws IOException {
293 ModelInfo siModelInfo = createServiceModelInfo();
294 String serviceInstanceId = "aa3514e3-5a33-55df-13ab-12abad84e7aa";
295 Mockito.reset(aaiClient);
296 mockAaiClientAaiStatusOK();
297 enableAddCloudOwnerOnMsoRequest(isFlagAddCloudOwnerActive);
298 final RequestDetailsWrapper<VnfInstantiationRequestDetails> result = msoRequestBuilder.generateVnfInstantiationRequest(vnf, siModelInfo, serviceInstanceId, "pa0916", "VNF_API");
299 String expected = IOUtils.toString(this.getClass().getResource(expectedFile), "UTF-8");
300 assertThat(result, jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
304 public static Object[][] testBuildVnfInstanceParamsDataProvider(Method test) {
305 return new Object[][]{
309 ImmutableList.of(ImmutableMap.of("k1", "v1", "k2", "v2")),
310 ImmutableList.of(ImmutableMap.of("k3", "v3", "k2", "v2"))
312 ImmutableList.of(ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3"))
315 ImmutableList.of(ImmutableMap.of("j1", "w1", "k1", "v1", "vnf_name", "w2", "vf_module_name", "w3")), //vnf_name, vf_module_name are excluded
317 ImmutableList.of(ImmutableMap.of("k1", "v1", "k2", "v2")),
318 ImmutableList.of(ImmutableMap.of("k3", "v3", "k2", "v2")),
319 ImmutableList.of(EMPTY_MAP),
322 ImmutableList.of(ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3", "j1", "w1"))
326 Arrays.asList(null, null),
327 EMPTY_LIST //mso is expect to empty list and not list with empty map
330 ImmutableList.of(EMPTY_MAP),
332 ImmutableList.of(EMPTY_MAP),
333 ImmutableList.of(EMPTY_MAP)
335 EMPTY_LIST //mso is expect to empty list and not list with empty map
340 @Test(dataProvider = "testBuildVnfInstanceParamsDataProvider")
341 public void testBuildVnfInstanceParams(List<Map<String, String>> currentVnfInstanceParams,
342 List<List<Map<String, String>>> vfModulesInstanceParams,
343 List<Map<String, String>> expectedResult) {
344 List<VfModuleMacro> vfModules =
345 vfModulesInstanceParams.stream().map(params -> new VfModuleMacro(new ModelInfo(), null, null, params)).collect(Collectors.toList());
346 List<Map<String, String>> actual = msoRequestBuilder.buildVnfInstanceParams(currentVnfInstanceParams, vfModules);
347 assertThat(actual, equalTo(expectedResult));
351 public static Object[][] vfModuleRequestDetails(Method test) {
352 return new Object[][]{
353 {"cc3514e3-5a33-55df-13ab-12abad84e7cc", true, "/payload_jsons/vfmodule_instantiation_request.json"},
354 {null, true, "/payload_jsons/vfmodule_instantiation_request_without_volume_group.json"},
355 {null, false, "/payload_jsons/vfmodule_instantiation_request_without_instance_name.json"}
359 @Test(dataProvider = "vfModuleRequestDetails")
360 public void createVfModuleRequestDetails_detailsAreAsExpected(String volumeGroupInstanceId, boolean isUserProvidedNaming, String fileName) throws IOException {
362 ModelInfo siModelInfo = createServiceModelInfo();
363 ModelInfo vnfModelInfo = createVnfModelInfo(true);
364 List<Map<String, String>> instanceParams = ImmutableList.of(ImmutableMap.of("vmx_int_net_len", "24",
365 "vre_a_volume_size_0", "120"));
366 List<UserParamNameAndValue> supplementaryParams = ImmutableList.of(
367 new UserParamNameAndValue("vre_a_volume_size_0", "100"),
368 new UserParamNameAndValue("availability_zone_0", "mtpocdv-kvm-az01")
371 VfModule vfModule = createVfModule("201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1", "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
372 "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", instanceParams, supplementaryParams,
373 (isUserProvidedNaming ? "vmxnjr001_AVPN_base_vRE_BV_expansion" : null), "myVgName", true);
375 String serviceInstanceId = "aa3514e3-5a33-55df-13ab-12abad84e7aa";
376 String vnfInstanceId = "bb3514e3-5a33-55df-13ab-12abad84e7bb";
378 Mockito.reset(aaiClient);
379 mockAaiClientAaiStatusOK();
380 enableAddCloudOwnerOnMsoRequest();
381 when(aaiClient.isNodeTypeExistsByName(eq("vmxnjr001_AVPN_base_vRE_BV_expansion"), eq(ResourceType.VF_MODULE))).thenReturn(false);
383 String expected = IOUtils.toString(this.getClass().getResource(fileName), "UTF-8");
384 final RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> result = msoRequestBuilder.generateVfModuleInstantiationRequest(
385 vfModule, siModelInfo, serviceInstanceId,
386 vnfModelInfo, vnfInstanceId, volumeGroupInstanceId, "pa0916", "VNF_API");
387 assertThat(result, jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
391 public void createVolumeGroup_verifyResultAsExpected() throws IOException {
392 final URL resource = this.getClass().getResource("/payload_jsons/volumegroup_instantiation_request.json");
393 VfModule vfModule = createVfModule("201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1",
394 "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
395 "72d9d1cd-f46d-447a-abdb-451d6fb05fa8",
398 "vmxnjr001_AVPN_base_vRE_BV_expansion",
401 vfModule.getModelInfo().setModelInvariantId("ff5256d2-5a33-55df-13ab-12abad84e7ff");
402 vfModule.getModelInfo().setModelVersion("1");
403 ModelInfo vnfModelInfo = createVnfModelInfo(true);
404 RequestDetailsWrapper<VolumeGroupRequestDetails> result =
405 msoRequestBuilder.generateVolumeGroupInstantiationRequest(vfModule,
406 createServiceModelInfo(),
407 "ff3514e3-5a33-55df-13ab-12abad84e7ff",
412 String expected = IOUtils.toString(resource, "UTF-8");
413 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
417 public static Object[][] expectedNetworkRequestDetailsParameters() {
418 return new Object[][]{
419 {VNF_NAME, "/payload_jsons/network_instantiation_request.json"},
420 {null, "/payload_jsons/network_instantiation_request_without_instance_name.json"}
424 @Test(dataProvider = "expectedNetworkRequestDetailsParameters")
425 public void createNetworkRequestDetails_detailsAreAsExpected(String networkName, String filePath) throws IOException {
427 List<NetworkDetails> networkDetails = singletonList(new NetworkDetails(networkName, "ab153b6e-c364-44c0-bef6-1f2982117f04"));
428 final List<Network> networksList = new ArrayList<>(createNetworkList(null, networkDetails, true).values());
429 ModelInfo siModelInfo = createServiceModelInfo();
430 String serviceInstanceId = "aa3514e3-5a33-55df-13ab-12abad84e7aa";
432 Mockito.reset(aaiClient);
433 mockAaiClientAaiStatusOK();
434 enableAddCloudOwnerOnMsoRequest();
436 String expected = IOUtils.toString(this.getClass().getResource(filePath), "UTF-8");
437 final RequestDetailsWrapper<NetworkInstantiationRequestDetails> result = msoRequestBuilder.generateNetworkInstantiationRequest(networksList.get(0), siModelInfo, serviceInstanceId, "pa0916", "VNF_API");
438 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
442 public void createInstanceGroupRequestDetails_detailsAreAsExpected() throws IOException {
444 final InstanceGroup instanceGroup = createInstanceGroup(true, Action.Create);
445 ModelInfo siModelInfo = createServiceModelInfo();
446 String serviceInstanceId = "aa3514e3-5a33-55df-13ab-12abad84e7aa";
448 Mockito.reset(aaiClient);
449 mockAaiClientAaiStatusOK();
450 enableAddCloudOwnerOnMsoRequest();
452 String expected = IOUtils.toString(this.getClass().getResource("/payload_jsons/instance_group_instantiation_request.json"), "UTF-8");
453 final RequestDetailsWrapper<InstanceGroupInstantiationRequestDetails> result = msoRequestBuilder.generateInstanceGroupInstantiationRequest(instanceGroup, siModelInfo, serviceInstanceId, "az2018", "VNF_API");
454 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
458 public void generateAddOrRemoveInstanceGroupMemberRequest_verifyResultAsExpected() throws IOException {
459 String expected = " {" +
460 " \"requestDetails\": {" +
461 " \"requestInfo\": {" +
462 " \"source\": \"VID\"," +
463 " \"requestorId\": \"az2018\"" +
465 " \"relatedInstanceList\": [" +
467 " \"relatedInstance\": {" +
468 " \"instanceId\": \"aa3514e3-5a33-55df-13ab-12abad84e7aa\"," +
469 " \"modelInfo\": {" +
470 " \"modelType\": \"vnf\"" +
477 RequestDetailsWrapper<AddOrRemoveInstanceGroupMemberRequestDetails> result =
478 msoRequestBuilder.generateInstanceGroupMemberRequest("aa3514e3-5a33-55df-13ab-12abad84e7aa", "az2018");
479 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
483 public void checkIfNullProjectNameSentToMso() {
484 ServiceInstantiation serviceInstantiationPayload = generateMockMacroServiceInstantiationPayload(true,
485 createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, EMPTY_LIST, false),
488 RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
489 msoRequestBuilder.generateMacroServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
490 JsonNode jsonNode = new ObjectMapper().valueToTree(result.requestDetails);
491 Assert.assertTrue(jsonNode.get("project").isNull());
492 serviceInstantiationPayload = generateMockMacroServiceInstantiationPayload(true,
493 createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, EMPTY_LIST, false),
495 false, "not null", false);
496 result = msoRequestBuilder.generateMacroServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
497 jsonNode = new ObjectMapper().valueToTree(result.requestDetails);
498 Assert.assertTrue(jsonNode.get("project").get("projectName").asText().equalsIgnoreCase("not null"));
502 public void generateDeleteVnfRequest_verifyResultAsExpected() throws IOException {
505 "\"requestDetails\" : {\n" +
506 " \"modelInfo\" : {\n" +
507 " \"modelCustomizationName\" : \"2016-73_MOW-AVPN-vPE-BV-L 0\",\n" +
508 " \"modelCustomizationId\" : \"ab153b6e-c364-44c0-bef6-1f2982117f04\",\n" +
509 " \"modelInvariantId\" : \"11111111-f63c-463e-ba94-286933b895f9\",\n" +
510 " \"modelVersionId\" : \"7f40c192-f63c-463e-ba94-286933b895f8\",\n" +
511 " \"modelName\" : \"2016-73_MOW-AVPN-vPE-BV-L\",\n" +
512 " \"modelType\" : \"vnf\",\n" +
513 " \"modelVersion\" : \"10.0\"\n" +
515 " \"cloudConfiguration\" : {\n" +
516 " \"lcpCloudRegionId\" : \"AAIAIC25\",\n" +
517 " \"tenantId\" : \"092eb9e8e4b7412e8787dd091bc58e86\",\n" +
518 " \"cloudOwner\" : \"irma-aic\"\n" +
520 " \"requestInfo\" : {\n" +
521 " \"source\" : \"VID\",\n" +
522 " \"requestorId\" : \"az2018\"\n" +
526 Vnf vnfDetails = new Vnf(createVnfModelInfo(true), "productFamily", "instanceName", Action.Delete.name(), "platform", "AAIAIC25", null,
527 "092eb9e8e4b7412e8787dd091bc58e86", null, null, false, "VNF_INSTANCE_ID", null, UUID.randomUUID().toString(), null, null,
529 RequestDetailsWrapper<VnfInstantiationRequestDetails> result =
530 msoRequestBuilder.generateDeleteVnfRequest(vnfDetails, "az2018");
531 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
535 public void generateDeleteVfModuleRequest_verifyResultAsExpected() throws IOException {
538 "\"requestDetails\" : {" +
539 " \"modelInfo\" : {" +
540 " \"modelCustomizationName\" : \"201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0\"," +
541 " \"modelCustomizationId\" : \"a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f\"," +
542 " \"modelVersionId\" : \"4c75f813-fa91-45a4-89d0-790ff5f1ae79\"," +
543 " \"modelInvariantId\" : \"22222222-f63c-463e-ba94-286933b895f9\"," +
544 " \"modelName\" : \"201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0\"," +
545 " \"modelType\" : \"vfModule\"," +
546 " \"modelVersion\" : \"10.0\"" +
548 " \"cloudConfiguration\" : {" +
549 " \"lcpCloudRegionId\" : \"mdt1\"," +
550 " \"tenantId\" : \"88a6ca3ee0394ade9403f075db23167e\"," +
551 " \"cloudOwner\" : \"irma-aic\"" +
553 " \"requestInfo\" : {" +
554 " \"source\" : \"VID\"," +
555 " \"requestorId\" : \"az2018\"" +
559 VfModule vfModuleDetails = createVfModule("201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0", VF_MODULE_0_MODEL_VERSION_ID, VF_MODULE_0_MODEL_CUSTOMIZATION_NAME, null, emptyList(), "vmxnjr001_AVPN_base_vPE_BV_base", null, true);
560 RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> result =
561 msoRequestBuilder.generateDeleteVfModuleRequest(vfModuleDetails, "az2018");
562 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
565 @Test(dataProvider = "cloudConfigurationPermutations")
566 public void createPre1806TransportServiceInstantiationMsoRequest(String tenantId, String lcpCloudRegionId, String jsonFile) throws IOException {
567 ServiceInstantiation serviceInstantiationPayload = generatePre1806MacroTransportServiceInstantiationPayload(tenantId, lcpCloudRegionId);
569 final URL resource = this.getClass().getResource(jsonFile);
570 RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
571 msoRequestBuilder.generateMacroServicePre1806InstantiationRequest(serviceInstantiationPayload, "az2016");
572 String expected = IOUtils.toString(resource, "UTF-8");
573 MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
577 public static Object[][] cloudConfigurationPermutations() {
578 return new Object[][]{
579 {"88a6ca3ee0394ade9403f075db23167e", "mdt1", "/payload_jsons/pre_1806_macro_service_instantiation_request.json"},
580 {"", "mdt1", "/payload_jsons/pre_1806_macro_without_cloudConfiguration.json"},
581 {"88a6ca3ee0394ade9403f075db23167e", "", "/payload_jsons/pre_1806_macro_without_cloudConfiguration.json"},
582 {null, null, "/payload_jsons/pre_1806_macro_without_cloudConfiguration.json"}
587 public void createPre1806MacroWithVrfEntry() throws IOException {
588 ServiceInstantiation serviceInstantiationPayload = TestUtils.readJsonResourceFileAsObject(
589 "/payload_jsons/vrfEntry/service_with_vrf_entry_fe_input.json",
590 ServiceInstantiation.class);
592 when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(true);
593 when(aaiClient.getCloudOwnerByCloudRegionId("lcpCloudRegionId")).thenReturn("irma-aic");
595 RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
596 msoRequestBuilder.generateMacroServicePre1806InstantiationRequest(serviceInstantiationPayload, "az2016");
598 final URL url = this.getClass().getResource("/payload_jsons/vrfEntry/service_with_vrf_instantiation_request.json");
599 String expected = IOUtils.toString(url, "UTF-8");
601 assertThat(result, jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
604 @Test(dataProvider = "trueAndFalseAndNull", dataProviderClass = TestUtils.class)
605 public void generateReplaceVfModuleRequest_whenRetainAssignmentsProvidedFromFrontend_retainAssignmentsToMsoIsTheSame(Boolean retainAssignments) {
606 assertThat(generatedVfModuleReplaceRequest(retainAssignments, null, null),
607 jsonPartEqualsOrUndefined(
608 "requestDetails.requestParameters.retainAssignments", retainAssignments));
611 @Test(dataProvider = "trueAndFalseAndNull", dataProviderClass = TestUtils.class)
612 public void generateReplaceVfModuleRequest_whenRetainVolumeGroupIsGiven_rebuildVolumeGroupIsNegated(Boolean retainVolumeGroups) {
613 assertThat(generatedVfModuleReplaceRequest(null, retainVolumeGroups, null),
614 jsonPartEqualsOrUndefined("requestDetails.requestParameters.rebuildVolumeGroups", BooleanUtils.negate(retainVolumeGroups)));
617 private <T> ConfigurableJsonMatcher<T> jsonPartEqualsOrUndefined(String path, Boolean expected) {
618 return (expected != null)
619 ? jsonPartEquals(path, expected)
620 : jsonNodeAbsent(path);
624 public void generateReplaceVfModuleRequest_whenThereAreSupplementaryParams_thenTheyAreAddToUserParams() {
626 String expectedParams = "["
628 + " \"name\": \"vre_a_volume_size_0\","
629 + " \"value\": \"100\""
632 + " \"name\": \"vmx_int_net_len\","
633 + " \"value\": \"24\""
636 + " \"name\": \"availability_zone_0\","
637 + " \"value\": \"abc\""
641 List<UserParamNameAndValue> supplementaryParams = ImmutableList.of(
642 new UserParamNameAndValue( "vre_a_volume_size_0", "100"),
643 new UserParamNameAndValue("vmx_int_net_len", "24"),
644 new UserParamNameAndValue("availability_zone_0", "abc")
647 assertThat(generatedVfModuleReplaceRequest(null, null, supplementaryParams),
648 jsonPartEquals("requestDetails.requestParameters.userParams", expectedParams));
652 public void generateReplaceVfModuleRequest_verifyResultAsExpected() {
653 Boolean retainVolumeGroups = null;
654 Boolean retainAssignments = null;
656 String expected = TestUtils.readFileAsString("/payload_jsons/vfmodule/replace_vfmodule__payload_to_mso.json");
657 assertThat(generatedVfModuleReplaceRequest(retainAssignments, retainVolumeGroups, null), jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
660 private RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> generatedVfModuleReplaceRequest(
661 Boolean retainAssignments, Boolean retainVolumeGroups, List<UserParamNameAndValue> supplementaryParams) {
662 when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(true);
663 when(aaiClient.getCloudOwnerByCloudRegionId("regionOne")).thenReturn("irma-aic");
665 ModelInfo vfModuleModelInfo = createVfModuleModelInfo("newest-model-name-vfm", "newest-model-version-vfm", "newest-model-uuid-vfm",
666 "f7a867f2-596b-4f4a-a128-421e825a6190", "newest-model-customization-uuid-vfm","newest-model-customization-name-vfm" );
668 VfModule vfModuleDetails = createVfModuleForReplace(vfModuleModelInfo, "replace_module", "regionOne", "0422ffb57ba042c0800a29dc85ca70f8",
669 retainAssignments, retainVolumeGroups, supplementaryParams);
671 ModelInfo serviceModelInfo = createServiceModelInfo("newest-model-name-service", "newest-model-version-service", "newest-model-uuid-service", "b16a9398-ffa3-4041-b78c-2956b8ad9c7b", null, null );
673 ModelInfo vnfModelInfo = createVnfModelInfo("newest-model-name-vnf", "newest-model-version-vnf", "newest-model-uuid-vnf", "23122c9b-dd7f-483f-bf0a-e069303db2f7", "newest-model-customization-uuid-vnf", "newest-model-customization-name-vnf" );
675 return msoRequestBuilder.generateVfModuleReplaceRequest(vfModuleDetails, serviceModelInfo,
676 "e9993045-cc96-4f3f-bf9a-71b2a400a956", vnfModelInfo,
677 "5c9c2896-1fe6-4055-b7ec-d0a01e5f9bf5", null, "az2016", "GR_API"