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