1fc3879a4493cf916892944d674d82f6a0809c89
[vid.git] / vid-app-common / src / test / java / org / onap / vid / services / MsoRequestBuilderTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * VID
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20
21 package org.onap.vid.services;
22
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;
38
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;
45 import java.net.URL;
46 import java.util.ArrayList;
47 import java.util.Arrays;
48 import java.util.HashMap;
49 import java.util.List;
50 import java.util.Map;
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;
97
98 @ContextConfiguration(classes = {DataSourceConfig.class, SystemProperties.class, MockedAaiClientAndFeatureManagerConfig.class})
99 public class MsoRequestBuilderTest extends AsyncInstantiationBaseTest {
100
101     @Inject
102     private DataAccessService dataAccessService;
103
104     @Mock
105     private JobAdapter jobAdapterMock;
106
107     @Mock
108     private JobsBrokerService jobsBrokerServiceMock;
109
110     private AsyncInstantiationRepository asyncInstantiationRepository;
111
112     private AuditService auditService;
113
114     @Autowired
115     private SessionFactory sessionFactory;
116
117     private AsyncInstantiationBusinessLogicImpl asyncInstantiationBL;
118
119     private MsoRequestBuilder msoRequestBuilder;
120
121
122     @BeforeClass
123     void initServicesInfoService() {
124         MockitoAnnotations.initMocks(this);
125         AsyncInstantiationRepository realAsyncInstantiationRepository = new AsyncInstantiationRepository(dataAccessService);
126         asyncInstantiationRepository = spy(realAsyncInstantiationRepository);
127
128         auditService = new AuditServiceImpl(null, asyncInstantiationRepository);
129
130         AsyncInstantiationBusinessLogicImpl realAsyncInstantiationBL = new AsyncInstantiationBusinessLogicImpl(jobAdapterMock, jobsBrokerServiceMock, sessionFactory, aaiClient, featureManager, cloudOwnerService, asyncInstantiationRepository, auditService);
131         asyncInstantiationBL = Mockito.spy(realAsyncInstantiationBL);
132
133         msoRequestBuilder = new MsoRequestBuilder(asyncInstantiationBL, cloudOwnerService, aaiClient, featureManager);
134
135         createInstanceParamsMaps();
136     }
137
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), createPnfList());
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);
146     }
147
148     @Test
149     public void createServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected() throws IOException {
150         createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(true,
151                 false);
152     }
153
154     @Test
155     public void createServiceInfo_WithUserProvidedNamingFalseAndNoVfmodules_ServiceInfoIsAsExpected() throws IOException {
156         createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(false, false);
157     }
158
159     @Test
160     public void shouldCreateServiceInfoWithHomingSolutionDisabled() throws IOException {
161         doReturn(true).when(featureManager).isActive(Features.FLAG_DISABLE_HOMING);
162
163         createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(true, true);
164     }
165
166     private void createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(boolean withVfmodules, boolean disabledHoming) throws IOException {
167
168         ServiceInstantiation serviceInstantiationPayload = generateMockMacroServiceInstantiationPayload(true,
169                 createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, EMPTY_LIST, false), null,
170                 1, false, PROJECT_NAME, true);
171         URL resource;
172         if (disabledHoming) {
173             resource = this.getClass().getResource("/payload_jsons/bulk_service_no_homing.json");
174         } else if (withVfmodules) {
175             resource = this.getClass().getResource("/payload_jsons/bulk_service_request_ecomp_naming.json");
176         } else {
177             // remove the vf modules
178             serviceInstantiationPayload.getVnfs().values().forEach(vnf -> vnf.getVfModules().clear());
179             resource = this.getClass().getResource("/payload_jsons/bulk_service_request_no_vfmodule_ecomp_naming.json");
180         }
181
182         RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
183                 msoRequestBuilder.generateMacroServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
184
185         String expected = IOUtils.toString(resource, "UTF-8");
186         assertThat(result, jsonEquals(expected));
187     }
188
189     @Test
190     public void createALaCarteService_WithUserProvidedNamingFalse_RequestDetailsIsAsExpected() throws IOException {
191         ServiceInstantiation serviceInstantiationPayload = generateMockALaCarteServiceInstantiationPayload(false,
192                 newHashMap(),
193                 newHashMap(),
194                 newHashMap(),
195                 1,
196                 false, PROJECT_NAME, true, null);
197
198         RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
199                 msoRequestBuilder.generateALaCarteServiceInstantiationRequest(serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
200
201         URL resource = this.getClass().getResource("/payload_jsons/bulk_alacarte_service_request_naming_false.json");
202         String expected = IOUtils.toString(resource, "UTF-8");
203         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
204     }
205
206     @Test
207     public void generateALaCarteServiceInstantiationRequest_withVnfList_HappyFllow() throws IOException {
208         ServiceInstantiation serviceInstantiationPayload = generateALaCarteWithVnfsServiceInstantiationPayload();
209         RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
210                 msoRequestBuilder.generateALaCarteServiceInstantiationRequest(serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
211
212         String serviceExpected = IOUtils.toString(this.getClass().getResource("/payload_jsons/bulk_alacarte_service_request.json"), "UTF-8");
213         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(serviceExpected, result);
214     }
215
216     @Test
217     public void generateALaCarteServiceInstantiationRequest_verifyRequestIsAsExpected() throws IOException {
218         ServiceInstantiation serviceInstantiationPayload = generateALaCarteServiceInstantiationPayload();
219         final URL resource = this.getClass().getResource("/payload_jsons/bulk_alacarte_service_request.json");
220         RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
221                 msoRequestBuilder.generateALaCarteServiceInstantiationRequest(serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
222         String expected = IOUtils.toString(resource, "UTF-8");
223         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
224     }
225
226     @Test
227     public void generateALaCarteServiceDeletionRequest_verifyRequestIsAsExpected() throws IOException {
228         String expected = generateServiceDeletionRequest(true, "VNF_API");
229
230         ServiceInstantiation serviceDeletionPayload = generateALaCarteServiceDeletionPayload();
231         RequestDetailsWrapper<ServiceDeletionRequestDetails> result =
232                 msoRequestBuilder.generateServiceDeletionRequest(serviceDeletionPayload, "az2016");
233
234         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
235     }
236
237     private ServiceInstantiation generateALaCarteServiceDeletionPayload() {
238         return generateMockAlaCarteServiceDeletionPayload(false, EMPTY_MAP, EMPTY_MAP, EMPTY_MAP, 1, true, PROJECT_NAME, false, "VNF_API", "1234567890");
239     }
240
241     @Test
242     public void generateServiceDeletionRequest_verifyRequestIsAsExpected() throws IOException {
243         String expected = generateServiceDeletionRequest(false, null);
244
245         ServiceInstantiation serviceDeletionPayload = generateServiceDeletionPayload();
246         RequestDetailsWrapper<ServiceDeletionRequestDetails> result =
247                 msoRequestBuilder.generateServiceDeletionRequest(serviceDeletionPayload, "az2016");
248
249         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
250     }
251
252     private String generateServiceDeletionRequest(boolean isAlaCarte, String testApi) {
253         String expected = TestUtils.readFileAsString("/payload_jsons/bulk_alacarte_service_deletion_request.json");
254         expected = expected.replace("[TEST_API]", String.valueOf(testApi));
255         expected = expected.replace("[IS_ALACARTE]", Boolean.toString(isAlaCarte));
256         return expected;
257     }
258
259     private ServiceInstantiation generateServiceDeletionPayload() {
260         return generateMockServiceDeletionPayload(false, EMPTY_MAP, EMPTY_MAP, EMPTY_MAP, EMPTY_MAP,1, true, PROJECT_NAME, false, "VNF_API", "1234567890");
261     }
262
263     @DataProvider
264     public static Object[][] createVnfParameters() {
265         return new Object[][]{
266                 {true, true, "/payload_jsons/vnf/bulk_vnf_request.json"},
267                 {false, true, "/payload_jsons/vnf/bulk_vnf_request_without_cloud_owner.json"},
268                 {true, false, "/payload_jsons/vnf/bulk_vnf_request_without_instance_name.json"},
269         };
270     }
271
272     @Test(dataProvider = "createVnfParameters")
273     public void createVnfRequestDetails_detailsAreAsExpected(boolean isFlagAddCloudOwnerActive, boolean isUserProvidedNaming, String expectedFile) throws IOException {
274         final List<Vnf> vnfList = new ArrayList<>(createVnfList(new HashMap<>(), null, isUserProvidedNaming, true).values());
275         createVnfPayloadAndAssert(vnfList.get(0), isFlagAddCloudOwnerActive, expectedFile);
276     }
277
278     @DataProvider
279     public static Object[][] inputVnfEndExpectedResult() {
280         return new Object[][]{
281                 {"/payload_jsons/vnf/vnf_without_lob_user_input.json", "/payload_jsons/vnf/vnf_without_lob_expected.json"},
282         };
283     }
284
285     @Test(dataProvider = "inputVnfEndExpectedResult")
286     public void createVnfRequestFromJson_andCompre(String userInputFile, String expectedFile) throws IOException {
287         Vnf vnf = TestUtils.readJsonResourceFileAsObject(userInputFile, Vnf.class);
288         createVnfPayloadAndAssert(vnf, true, expectedFile);
289     }
290
291     private void createVnfPayloadAndAssert(Vnf vnf, boolean isFlagAddCloudOwnerActive, String expectedFile) throws IOException {
292         ModelInfo siModelInfo = createServiceModelInfo();
293         String serviceInstanceId = "aa3514e3-5a33-55df-13ab-12abad84e7aa";
294         Mockito.reset(aaiClient);
295         mockAaiClientAaiStatusOK();
296         enableAddCloudOwnerOnMsoRequest(isFlagAddCloudOwnerActive);
297         final RequestDetailsWrapper<VnfInstantiationRequestDetails> result = msoRequestBuilder.generateVnfInstantiationRequest(vnf, siModelInfo, serviceInstanceId, "pa0916", "VNF_API");
298         String expected = IOUtils.toString(this.getClass().getResource(expectedFile), "UTF-8");
299         assertThat(result, jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
300     }
301
302     @DataProvider
303     public static Object[][] testBuildVnfInstanceParamsDataProvider(Method test) {
304         return new Object[][]{
305                 {
306                         EMPTY_LIST,
307                         ImmutableList.of(
308                                 ImmutableList.of(ImmutableMap.of("k1", "v1", "k2", "v2")),
309                                 ImmutableList.of(ImmutableMap.of("k3", "v3", "k2", "v2"))
310                         ),
311                         ImmutableList.of(ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3"))
312                 },
313                 {
314                         ImmutableList.of(ImmutableMap.of("j1", "w1", "k1", "v1", "vnf_name", "w2", "vf_module_name", "w3")), //vnf_name, vf_module_name are excluded
315                         ImmutableList.of(
316                                 ImmutableList.of(ImmutableMap.of("k1", "v1", "k2", "v2")),
317                                 ImmutableList.of(ImmutableMap.of("k3", "v3", "k2", "v2")),
318                                 ImmutableList.of(EMPTY_MAP),
319                                 singletonList(null)
320                         ),
321                         ImmutableList.of(ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3", "j1", "w1"))
322                 },
323                 {
324                         EMPTY_LIST,
325                         Arrays.asList(null, null),
326                         EMPTY_LIST //mso is expect to empty list and not list with empty map
327                 },
328                 {
329                         ImmutableList.of(EMPTY_MAP),
330                         ImmutableList.of(
331                                 ImmutableList.of(EMPTY_MAP),
332                                 ImmutableList.of(EMPTY_MAP)
333                         ),
334                         EMPTY_LIST //mso is expect to empty list and not list with empty map
335                 }
336         };
337     }
338
339     @Test(dataProvider = "testBuildVnfInstanceParamsDataProvider")
340     public void testBuildVnfInstanceParams(List<Map<String, String>> currentVnfInstanceParams,
341                                            List<List<Map<String, String>>> vfModulesInstanceParams,
342                                            List<Map<String, String>> expectedResult) {
343         List<VfModuleMacro> vfModules =
344                 vfModulesInstanceParams.stream().map(params -> new VfModuleMacro(new ModelInfo(), null, null, params)).collect(Collectors.toList());
345         List<Map<String, String>> actual = msoRequestBuilder.buildVnfInstanceParams(currentVnfInstanceParams, vfModules);
346         assertThat(actual, equalTo(expectedResult));
347     }
348
349     @DataProvider
350     public static Object[][] vfModuleRequestDetails(Method test) {
351         return new Object[][]{
352                 {"cc3514e3-5a33-55df-13ab-12abad84e7cc", true, false, "/payload_jsons/vfmodule_instantiation_request.json"},
353                 {null, true, null, "/payload_jsons/vfmodule_instantiation_request_without_volume_group.json"},
354                 {null, false, true, "/payload_jsons/vfmodule_instantiation_request_without_instance_name.json"}
355         };
356     }
357
358     @Test(dataProvider = "vfModuleRequestDetails")
359     public void createVfModuleRequestDetails_detailsAreAsExpected(String volumeGroupInstanceId, boolean isUserProvidedNaming, Boolean usePreload, String fileName) throws IOException {
360
361         ModelInfo siModelInfo = createServiceModelInfo();
362         ModelInfo vnfModelInfo = createVnfModelInfo(true);
363         List<Map<String, String>> instanceParams = ImmutableList.of(ImmutableMap.of("vmx_int_net_len", "24",
364                 "vre_a_volume_size_0", "120"));
365         List<UserParamNameAndValue> supplementaryParams = ImmutableList.of(
366             new UserParamNameAndValue("vre_a_volume_size_0", "100"),
367             new UserParamNameAndValue("availability_zone_0", "mtpocdv-kvm-az01")
368         );
369
370         VfModule vfModule = createVfModule("201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1", "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
371                 "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", instanceParams, supplementaryParams,
372                 (isUserProvidedNaming ? "vmxnjr001_AVPN_base_vRE_BV_expansion" : null), "myVgName", true, usePreload);
373
374         String serviceInstanceId = "aa3514e3-5a33-55df-13ab-12abad84e7aa";
375         String vnfInstanceId = "bb3514e3-5a33-55df-13ab-12abad84e7bb";
376
377         Mockito.reset(aaiClient);
378         mockAaiClientAaiStatusOK();
379         enableAddCloudOwnerOnMsoRequest();
380         when(aaiClient.isNodeTypeExistsByName(eq("vmxnjr001_AVPN_base_vRE_BV_expansion"), eq(ResourceType.VF_MODULE))).thenReturn(false);
381
382         String expected = IOUtils.toString(this.getClass().getResource(fileName), "UTF-8");
383         final RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> result = msoRequestBuilder.generateVfModuleInstantiationRequest(
384                 vfModule, siModelInfo, serviceInstanceId,
385                 vnfModelInfo, vnfInstanceId, volumeGroupInstanceId, "pa0916", "VNF_API");
386         assertThat(result, jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
387     }
388
389     @Test
390     public void createVolumeGroup_verifyResultAsExpected() throws IOException {
391         final URL resource = this.getClass().getResource("/payload_jsons/volumegroup_instantiation_request.json");
392         VfModule vfModule = createVfModule("201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1",
393                 "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
394                 "72d9d1cd-f46d-447a-abdb-451d6fb05fa8",
395                 emptyList(),
396                 emptyList(),
397                 "vmxnjr001_AVPN_base_vRE_BV_expansion",
398                 "myVgName",
399                 true,
400                 true);
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",
408                         vnfModelInfo,
409                         "vnfInstanceId",
410                         "az2016",
411                         "VNF_API");
412         String expected = IOUtils.toString(resource, "UTF-8");
413         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
414     }
415
416     @DataProvider
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"}
421         };
422     }
423
424     @Test(dataProvider = "expectedNetworkRequestDetailsParameters")
425     public void createNetworkRequestDetails_detailsAreAsExpected(String networkName, String filePath) throws IOException {
426
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";
431
432         Mockito.reset(aaiClient);
433         mockAaiClientAaiStatusOK();
434         enableAddCloudOwnerOnMsoRequest();
435
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);
439     }
440
441     @Test
442     public void createInstanceGroupRequestDetails_detailsAreAsExpected() throws IOException {
443
444         final InstanceGroup instanceGroup = createInstanceGroup(true, Action.Create);
445         ModelInfo siModelInfo = createServiceModelInfo();
446         String serviceInstanceId = "aa3514e3-5a33-55df-13ab-12abad84e7aa";
447
448         Mockito.reset(aaiClient);
449         mockAaiClientAaiStatusOK();
450         enableAddCloudOwnerOnMsoRequest();
451
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);
455     }
456
457     @Test
458     public void generateAddOrRemoveInstanceGroupMemberRequest_verifyResultAsExpected() throws IOException {
459         String expected = " {" +
460                 "   \"requestDetails\": {" +
461                 "     \"requestInfo\": {" +
462                 "       \"source\": \"VID\"," +
463                 "       \"requestorId\": \"az2018\"" +
464                 "     }," +
465                 "     \"relatedInstanceList\": [" +
466                 "        {" +
467                 "           \"relatedInstance\": {" +
468                 "              \"instanceId\": \"aa3514e3-5a33-55df-13ab-12abad84e7aa\"," +
469                 "              \"modelInfo\": {" +
470                 "                 \"modelType\": \"vnf\"" +
471                 "              }" +
472                 "           }" +
473                 "        }" +
474                 "     ]" +
475                 "   }" +
476                 " }";
477         RequestDetailsWrapper<AddOrRemoveInstanceGroupMemberRequestDetails> result =
478                 msoRequestBuilder.generateInstanceGroupMemberRequest("aa3514e3-5a33-55df-13ab-12abad84e7aa", "az2018");
479         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
480     }
481
482     @Test
483     public void checkIfNullProjectNameSentToMso() {
484         ServiceInstantiation serviceInstantiationPayload = generateMockMacroServiceInstantiationPayload(true,
485                 createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, EMPTY_LIST, false),
486                 createPnfList(), 1, false, null, false);
487         RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
488                 msoRequestBuilder.generateMacroServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
489         JsonNode jsonNode = new ObjectMapper().valueToTree(result.requestDetails);
490         Assert.assertTrue(jsonNode.get("project").isNull());
491         serviceInstantiationPayload = generateMockMacroServiceInstantiationPayload(true,
492                 createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, EMPTY_LIST, false),
493                 createPnfList(), 1, false, "not null", false);
494         result = msoRequestBuilder.generateMacroServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
495         jsonNode = new ObjectMapper().valueToTree(result.requestDetails);
496         Assert.assertTrue(jsonNode.get("project").get("projectName").asText().equalsIgnoreCase("not null"));
497     }
498
499     @Test
500     public void generateDeleteVnfRequest_verifyResultAsExpected() throws IOException {
501         String expected =
502                 "{ " +
503                         "\"requestDetails\" : {\n" +
504                         "    \"modelInfo\" : {\n" +
505                         "      \"modelCustomizationName\" : \"2016-73_MOW-AVPN-vPE-BV-L 0\",\n" +
506                         "      \"modelCustomizationId\" : \"ab153b6e-c364-44c0-bef6-1f2982117f04\",\n" +
507                         "      \"modelInvariantId\" : \"11111111-f63c-463e-ba94-286933b895f9\",\n" +
508                         "      \"modelVersionId\" : \"7f40c192-f63c-463e-ba94-286933b895f8\",\n" +
509                         "      \"modelName\" : \"2016-73_MOW-AVPN-vPE-BV-L\",\n" +
510                         "      \"modelType\" : \"vnf\",\n" +
511                         "      \"modelVersion\" : \"10.0\"\n" +
512                         "    },\n" +
513                         "    \"cloudConfiguration\" : {\n" +
514                         "      \"lcpCloudRegionId\" : \"AAIAIC25\",\n" +
515                         "      \"tenantId\" : \"092eb9e8e4b7412e8787dd091bc58e86\",\n" +
516                         "      \"cloudOwner\" : \"irma-aic\"\n" +
517                         "    },\n" +
518                         "    \"requestInfo\" : {\n" +
519                         "      \"source\" : \"VID\",\n" +
520                         "      \"requestorId\" : \"az2018\"\n" +
521                         "    }\n" +
522                         "  }" +
523                         "}";
524         Vnf vnfDetails = new Vnf(createVnfModelInfo(true), "productFamily", "instanceName", Action.Delete.name(), "platform", "AAIAIC25", null,
525                 "092eb9e8e4b7412e8787dd091bc58e86", null, null, false, "VNF_INSTANCE_ID", null, UUID.randomUUID().toString(), null, null,
526             null, "originalName");
527         RequestDetailsWrapper<VnfInstantiationRequestDetails> result =
528                 msoRequestBuilder.generateDeleteVnfRequest(vnfDetails, "az2018");
529         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
530     }
531
532     @Test
533     public void generateDeleteVfModuleRequest_verifyResultAsExpected() throws IOException {
534         String expected =
535                 "{ " +
536                         "\"requestDetails\" : {" +
537                         "    \"modelInfo\" : {" +
538                         "      \"modelCustomizationName\" : \"201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0\"," +
539                         "      \"modelCustomizationId\" : \"a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f\"," +
540                         "      \"modelVersionId\" : \"4c75f813-fa91-45a4-89d0-790ff5f1ae79\"," +
541                         "      \"modelInvariantId\" : \"22222222-f63c-463e-ba94-286933b895f9\"," +
542                         "      \"modelName\" : \"201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0\"," +
543                         "      \"modelType\" : \"vfModule\"," +
544                         "      \"modelVersion\" : \"10.0\"" +
545                         "    }," +
546                         "    \"cloudConfiguration\" : {" +
547                         "      \"lcpCloudRegionId\" : \"mdt1\"," +
548                         "      \"tenantId\" : \"88a6ca3ee0394ade9403f075db23167e\"," +
549                         "      \"cloudOwner\" : \"irma-aic\"" +
550                         "    }," +
551                         "    \"requestInfo\" : {" +
552                         "      \"source\" : \"VID\"," +
553                         "      \"requestorId\" : \"az2018\"" +
554                         "    }" +
555                         "  }" +
556                         "}";
557         VfModule vfModuleDetails = createVfModule("201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0", VF_MODULE_0_MODEL_VERSION_ID, VF_MODULE_0_MODEL_CUSTOMIZATION_NAME,
558             null, emptyList(), "vmxnjr001_AVPN_base_vPE_BV_base", null, true, true);
559         RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> result =
560                 msoRequestBuilder.generateDeleteVfModuleRequest(vfModuleDetails, "az2018");
561         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
562     }
563
564     @Test(dataProvider = "cloudConfigurationPermutations")
565     public void createPre1806TransportServiceInstantiationMsoRequest(String tenantId, String lcpCloudRegionId, String jsonFile) throws IOException {
566         ServiceInstantiation serviceInstantiationPayload = generatePre1806MacroTransportServiceInstantiationPayload(tenantId, lcpCloudRegionId);
567
568         final URL resource = this.getClass().getResource(jsonFile);
569         RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
570                 msoRequestBuilder.generateMacroServicePre1806InstantiationRequest(serviceInstantiationPayload, "az2016");
571         String expected = IOUtils.toString(resource, "UTF-8");
572         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
573     }
574
575     @DataProvider
576     public static Object[][] cloudConfigurationPermutations() {
577         return new Object[][]{
578                 {"88a6ca3ee0394ade9403f075db23167e", "mdt1", "/payload_jsons/pre_1806_macro_service_instantiation_request.json"},
579                 {"", "mdt1", "/payload_jsons/pre_1806_macro_without_cloudConfiguration.json"},
580                 {"88a6ca3ee0394ade9403f075db23167e", "", "/payload_jsons/pre_1806_macro_without_cloudConfiguration.json"},
581                 {null, null, "/payload_jsons/pre_1806_macro_without_cloudConfiguration.json"}
582         };
583     }
584
585     @Test
586     public void createPre1806MacroWithVrfEntry() throws IOException {
587         ServiceInstantiation serviceInstantiationPayload = TestUtils.readJsonResourceFileAsObject(
588                 "/payload_jsons/vrfEntry/service_with_vrf_entry_fe_input.json",
589                 ServiceInstantiation.class);
590
591         when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(true);
592         when(aaiClient.getCloudOwnerByCloudRegionId("lcpCloudRegionId")).thenReturn("irma-aic");
593
594         RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
595                 msoRequestBuilder.generateMacroServicePre1806InstantiationRequest(serviceInstantiationPayload, "az2016");
596
597         final URL url = this.getClass().getResource("/payload_jsons/vrfEntry/service_with_vrf_instantiation_request.json");
598         String expected = IOUtils.toString(url, "UTF-8");
599
600         assertThat(result, jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
601     }
602
603     @Test(dataProvider = "trueAndFalseAndNull", dataProviderClass = TestUtils.class)
604     public void generateReplaceVfModuleRequest_whenRetainAssignmentsProvidedFromFrontend_retainAssignmentsToMsoIsTheSame(Boolean retainAssignments) {
605         assertThat(generatedVfModuleReplaceRequest(retainAssignments, null, null),
606             jsonPartEqualsOrUndefined(
607                 "requestDetails.requestParameters.retainAssignments", retainAssignments));
608     }
609
610     @Test(dataProvider = "trueAndFalseAndNull", dataProviderClass = TestUtils.class)
611     public void generateReplaceVfModuleRequest_whenRetainVolumeGroupIsGiven_rebuildVolumeGroupIsNegated(Boolean retainVolumeGroups) {
612         assertThat(generatedVfModuleReplaceRequest(null, retainVolumeGroups, null),
613             jsonPartEqualsOrUndefined("requestDetails.requestParameters.rebuildVolumeGroups", BooleanUtils.negate(retainVolumeGroups)));
614     }
615
616     private <T> ConfigurableJsonMatcher<T> jsonPartEqualsOrUndefined(String path, Boolean expected) {
617         return (expected != null)
618             ? jsonPartEquals(path, expected)
619             : jsonNodeAbsent(path);
620     }
621
622     @Test
623     public void generateReplaceVfModuleRequest_whenThereAreSupplementaryParams_thenTheyAreAddToUserParams() {
624
625         String expectedParams = "["
626             + "        {"
627             + "          \"name\": \"vre_a_volume_size_0\","
628             + "          \"value\": \"100\""
629             + "        },"
630             + "        {"
631             + "          \"name\": \"vmx_int_net_len\","
632             + "          \"value\": \"24\""
633             + "        },"
634             + "        {"
635             + "          \"name\": \"availability_zone_0\","
636             + "          \"value\": \"abc\""
637             + "        }"
638             + "     ]";
639
640         List<UserParamNameAndValue> supplementaryParams = ImmutableList.of(
641             new UserParamNameAndValue( "vre_a_volume_size_0", "100"),
642             new UserParamNameAndValue("vmx_int_net_len", "24"),
643             new UserParamNameAndValue("availability_zone_0", "abc")
644         );
645
646         assertThat(generatedVfModuleReplaceRequest(null, null, supplementaryParams),
647             jsonPartEquals("requestDetails.requestParameters.userParams", expectedParams));
648     }
649
650     @Test
651     public void generateReplaceVfModuleRequest_verifyResultAsExpected() {
652         Boolean retainVolumeGroups = null;
653         Boolean retainAssignments = null;
654
655         String expected = TestUtils.readFileAsString("/payload_jsons/vfmodule/replace_vfmodule__payload_to_mso.json");
656         assertThat(generatedVfModuleReplaceRequest(retainAssignments, retainVolumeGroups, null), jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
657     }
658
659     @Test
660     public void generateReplaceVfModuleRequestWithoutCloudConfiguration_verifyResultAsExpected() {
661         String expected = TestUtils.readFileAsString("/payload_jsons/vfmodule/replace_vfmodule__payload_to_mso.json");
662         assertThat(generatedVfModuleReplaceRequestWithOrWithoutCloudConfiguration(null, null, null, true), jsonNodeAbsent("requestDetails.cloudConfiguration"));
663         assertThat(generatedVfModuleReplaceRequestWithOrWithoutCloudConfiguration(null, null, null, true), jsonEquals(expected).whenIgnoringPaths("requestDetails.cloudConfiguration").when(IGNORING_ARRAY_ORDER));
664     }
665
666     private RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> generatedVfModuleReplaceRequest(
667         Boolean retainAssignments, Boolean retainVolumeGroups, List<UserParamNameAndValue> supplementaryParams) {
668         return generatedVfModuleReplaceRequestWithOrWithoutCloudConfiguration(retainAssignments, retainVolumeGroups, supplementaryParams, false);
669     }
670
671     private RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> generatedVfModuleReplaceRequestWithOrWithoutCloudConfiguration(
672             Boolean retainAssignments, Boolean retainVolumeGroups, List<UserParamNameAndValue> supplementaryParams, Boolean noHomingData) {
673         when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(true);
674         when(aaiClient.getCloudOwnerByCloudRegionId("regionOne")).thenReturn("irma-aic");
675
676         ModelInfo vfModuleModelInfo = createVfModuleModelInfo("newest-model-name-vfm", "newest-model-version-vfm", "newest-model-uuid-vfm",
677                 "f7a867f2-596b-4f4a-a128-421e825a6190", "newest-model-customization-uuid-vfm","newest-model-customization-name-vfm" );
678
679         VfModule vfModuleDetails = createVfModuleForReplace(vfModuleModelInfo, "replace_module", noHomingData? null : "regionOne", noHomingData? null :"0422ffb57ba042c0800a29dc85ca70f8",
680                 retainAssignments, retainVolumeGroups, supplementaryParams);
681
682         ModelInfo serviceModelInfo = createServiceModelInfo("newest-model-name-service", "newest-model-version-service", "newest-model-uuid-service", "b16a9398-ffa3-4041-b78c-2956b8ad9c7b", null, null );
683
684         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" );
685
686         return msoRequestBuilder.generateVfModuleReplaceRequest(vfModuleDetails, serviceModelInfo,
687                 "e9993045-cc96-4f3f-bf9a-71b2a400a956", vnfModelInfo,
688                 "5c9c2896-1fe6-4055-b7ec-d0a01e5f9bf5", null, "az2016", "GR_API"
689         );
690     }
691 }