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 com.google.common.collect.ImmutableList;
24 import com.google.common.collect.ImmutableMap;
25 import org.onap.vid.aai.AaiClientInterface;
26 import org.onap.vid.aai.ExceptionWithRequestInfo;
27 import org.onap.vid.model.Action;
28 import org.onap.vid.model.VidNotions;
29 import org.onap.vid.model.VidNotions.InstantiationType;
30 import org.onap.vid.model.VidNotions.InstantiationUI;
31 import org.onap.vid.model.VidNotions.ModelCategory;
32 import org.onap.vid.model.serviceInstantiation.*;
33 import org.onap.vid.mso.RestObject;
34 import org.onap.vid.mso.model.ModelInfo;
35 import org.onap.vid.mso.rest.AsyncRequestStatus;
36 import org.onap.vid.mso.rest.RequestStatus;
37 import org.onap.vid.properties.Features;
38 import org.onap.vid.utils.TimeUtils;
39 import org.springframework.http.HttpMethod;
40 import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
41 import org.togglz.core.manager.FeatureManager;
43 import javax.inject.Inject;
44 import java.time.ZonedDateTime;
46 import java.util.stream.Collectors;
47 import java.util.stream.Stream;
49 import static java.util.Collections.emptyList;
50 import static java.util.Collections.emptyMap;
51 import static org.mockito.ArgumentMatchers.*;
52 import static org.mockito.Mockito.when;
54 public class AsyncInstantiationBaseTest extends AbstractTestNGSpringContextTests {
56 public static final String OWNING_ENTITY_ID = "038d99af-0427-42c2-9d15-971b99b9b489";
57 public static final String JULIO_ERICKSON = "JULIO ERICKSON";
58 public static final String PACKET_CORE = "PACKET CORE";
59 public static final String PROJECT_NAME = "{some project name}";
60 public static final String SUBSCRIBER_ID = "{some subscriber id}";
61 public static final String SUBSCRIBER_NAME = "{some subscriber name}";
62 public static final String PRODUCT_FAMILY_ID = "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb";
63 public static final String INSTANCE_NAME = "vPE_Service";
64 public static final String SUBSCRIPTION_SERVICE_TYPE = "VMX";
65 public static final String LCP_CLOUD_REGION_ID = "mdt1";
66 public static final String A6CA3EE0394ADE9403F075DB23167E = "88a6ca3ee0394ade9403f075db23167e";
67 public static final String TENANT_NAME = "USP-SIP-IC-24335-T-01";
68 public static final String AIC_ZONE_ID = "NFT1";
69 public static final String AIC_ZONE_NAME = "NFTJSSSS-NFT1";
70 public static final String TEST_API = "GR_API";
71 public static final String SERVICE_MODEL_VERSION_ID = "3c40d244-808e-42ca-b09a-256d83d19d0a";
72 public static final String VF_MODULE_0_MODEL_CUSTOMIZATION_NAME = "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f";
73 public static final String VF_MODULE_1_MODEL_CUSTOMIZATION_NAME = "72d9d1cd-f46d-447a-abdb-451d6fb05fa8";
74 public static final String VF_MODULE_0_MODEL_VERSION_ID = "4c75f813-fa91-45a4-89d0-790ff5f1ae79";
75 public static final String VF_MODULE_1_MODEL_VERSION_ID = "56e2b103-637c-4d1a-adc8-3a7f4a6c3240";
76 public static final String VNF_NAME = "vmxnjr001";
77 public static final String VNF_GROUP_NAME = "VNF_GROUP_NAME";
79 protected HashMap<String, String> instanceParamsMapWithoutParams;
80 protected HashMap<String, String> vfModuleInstanceParamsMapWithParamsToRemove;
81 protected HashMap<String, String> vnfInstanceParamsMapWithParamsToRemove;
84 protected FeatureManager featureManager;
87 protected AaiClientInterface aaiClient;
90 protected CloudOwnerService cloudOwnerService;
92 public ServiceInstantiation generateMockMacroServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs, int bulkSize, boolean isUserProvidedNaming, String projectName, boolean rollbackOnFailure) {
93 return generateMockServiceInstantiationPayload(isPause, vnfs, Collections.EMPTY_MAP, Collections.EMPTY_MAP, bulkSize, isUserProvidedNaming, projectName, rollbackOnFailure, false, null, Action.Create, null);
96 public ServiceInstantiation generateMockALaCarteServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs, Map<String, Network> networks, Map<String, InstanceGroup> vnfGroups, int bulkSize, boolean isUserProvidedNaming, String projectName, boolean rollbackOnFailure, String testApi) {
97 return generateMockServiceInstantiationPayload(isPause, vnfs, networks, vnfGroups, bulkSize, isUserProvidedNaming, projectName, rollbackOnFailure, true, testApi, Action.Create, null);
100 public ServiceInstantiation generateMockALaCarteServiceDeletionPayload(boolean isPause, Map<String, Vnf> vnfs, Map<String, Network> networks, Map<String, InstanceGroup> vnfGroups, int bulkSize, boolean isUserProvidedNaming, String projectName, boolean rollbackOnFailure, String testApi, String instanceId) {
101 return generateMockServiceInstantiationPayload(isPause, vnfs, networks, vnfGroups, bulkSize, isUserProvidedNaming, projectName, rollbackOnFailure, true, testApi, Action.Delete, instanceId);
103 private ServiceInstantiation generateMockServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs, Map<String, Network> networks, Map<String, InstanceGroup> vnfGroups, int bulkSize, boolean isUserProvidedNaming, String projectName, boolean rollbackOnFailure, boolean isAlacarte, String testApi, Action action, String instanceId) {
104 ModelInfo modelInfo = createModelInfo();
106 List<Map<String,String>> instanceParams = createInstanceParams();
108 return new ServiceInstantiation ( modelInfo,
109 AsyncInstantiationBusinessLogicTest.OWNING_ENTITY_ID,
110 AsyncInstantiationBusinessLogicTest.JULIO_ERICKSON,
112 AsyncInstantiationBusinessLogicTest.SUBSCRIBER_ID,
113 AsyncInstantiationBusinessLogicTest.SUBSCRIBER_NAME,
114 AsyncInstantiationBusinessLogicTest.PRODUCT_FAMILY_ID,
115 isUserProvidedNaming ? AsyncInstantiationBusinessLogicTest.INSTANCE_NAME : null,
116 AsyncInstantiationBusinessLogicTest.SUBSCRIPTION_SERVICE_TYPE,
117 AsyncInstantiationBusinessLogicTest.LCP_CLOUD_REGION_ID,
119 AsyncInstantiationBusinessLogicTest.A6CA3EE0394ADE9403F075DB23167E,
120 AsyncInstantiationBusinessLogicTest.TENANT_NAME,
121 AsyncInstantiationBusinessLogicTest.AIC_ZONE_ID,
122 AsyncInstantiationBusinessLogicTest.AIC_ZONE_NAME,
135 UUID.randomUUID().toString(), null, null, null);
138 private List<Map<String,String>> createInstanceParams() {
139 List<Map<String, String>> instanceParams = new ArrayList<>();
140 HashMap<String, String> map = new HashMap<>();
141 map.put("instanceParams_test1" , "some text");
142 map.put("instanceParams_test2" , "another text");
143 instanceParams.add(map);
144 return instanceParams;
147 protected VfModule createVfModule(String modelName, String modelVersionId, String modelCustomizationId,
148 List<Map<String, String>> instanceParams, Map<String, String> supplementaryParams, String instanceName, String volumeGroupInstanceName, boolean isAlacarte) {
149 ModelInfo vfModuleInfo = new ModelInfo();
150 vfModuleInfo.setModelType("vfModule");
151 vfModuleInfo.setModelName(modelName);
152 vfModuleInfo.setModelVersionId(modelVersionId);
153 vfModuleInfo.setModelCustomizationId(modelCustomizationId);
154 vfModuleInfo.setModelCustomizationName(modelName);
157 vfModuleInfo.setModelInvariantId("22222222-f63c-463e-ba94-286933b895f9");
158 vfModuleInfo.setModelVersion("10.0");
159 return new VfModule(vfModuleInfo, instanceName, volumeGroupInstanceName, Action.Create.name(), "mdt1", null,
160 "88a6ca3ee0394ade9403f075db23167e", instanceParams, supplementaryParams, false, true, null, UUID.randomUUID().toString(), null, null);
163 return new VfModule(vfModuleInfo, instanceName, volumeGroupInstanceName, Action.Create.name(), null, null, null,
164 instanceParams, supplementaryParams, false, false, null, UUID.randomUUID().toString(), null, null);
167 protected ModelInfo createVnfModelInfo(boolean isAlacarte) {
168 ModelInfo vnfModelInfo = new ModelInfo();
169 vnfModelInfo.setModelType("vnf");
170 vnfModelInfo.setModelName("2016-73_MOW-AVPN-vPE-BV-L");
171 vnfModelInfo.setModelVersionId("7f40c192-f63c-463e-ba94-286933b895f8");
172 vnfModelInfo.setModelCustomizationName("2016-73_MOW-AVPN-vPE-BV-L 0");
173 vnfModelInfo.setModelCustomizationId("ab153b6e-c364-44c0-bef6-1f2982117f04");
174 //added two conditional fields according to MSO AID - needed only in alacarte
176 vnfModelInfo.setModelInvariantId("11111111-f63c-463e-ba94-286933b895f9");
177 vnfModelInfo.setModelVersion("10.0");
182 private ModelInfo createNetworkModelInfo(boolean isAlacarte, String modelCustomizationId)
184 ModelInfo modelInfo = new ModelInfo();
185 modelInfo.setModelType("network");
186 modelInfo.setModelName("2016-73_MOW-AVPN-vPE-BV-L");
187 modelInfo.setModelVersionId("7f40c192-f63c-463e-ba94-286933b895f8");
188 modelInfo.setModelCustomizationName("2016-73_MOW-AVPN-vPE-BV-L 0");
189 modelInfo.setModelCustomizationId(modelCustomizationId);
190 //added two conditional fields according to MSO AID - needed only in alacarte
192 modelInfo.setModelInvariantId("11111111-f63c-463e-ba94-286933b895f9");
193 modelInfo.setModelVersion("10.0");
198 private ModelInfo createModelInfo() {
199 ModelInfo modelInfo = new ModelInfo();
200 modelInfo.setModelType("service");
201 modelInfo.setModelVersionId(SERVICE_MODEL_VERSION_ID);
202 modelInfo.setModelVersion("10.0");
203 modelInfo.setModelInvariantId("5d48acb5-097d-4982-aeb2-f4a3bd87d31b");
204 modelInfo.setModelName("MOW AVPN vMX BV vPE 1 Service");
208 protected Map<String, Vnf> createVnfList(HashMap<String, String> vfModuleInstanceParamsMap, List vnfInstanceParams, boolean isUserProvidedNaming) {
209 return createVnfList(vfModuleInstanceParamsMap, vnfInstanceParams, isUserProvidedNaming, false);
212 protected Map<String, Vnf> createVnfList(HashMap<String, String> vfModuleInstanceParamsMap, List vnfInstanceParams, boolean isUserProvidedNaming, boolean isAlacarte) {
213 Map<String, Vnf> vnfs = new HashMap<>();
214 ModelInfo vnfModelInfo = createVnfModelInfo(isAlacarte);
216 Map<String, Map<String, VfModule>> vfModules = new HashMap<>();
218 List<Map<String, String>> instanceParams1 = ImmutableList.of((ImmutableMap.of("vmx_int_net_len", "24")));
219 VfModule vfModule1 = createVfModule("201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0", VF_MODULE_0_MODEL_VERSION_ID, VF_MODULE_0_MODEL_CUSTOMIZATION_NAME, instanceParams1, new HashMap<>(), (isUserProvidedNaming ? "vmxnjr001_AVPN_base_vPE_BV_base" : null), null, isAlacarte);
220 List<Map<String, String>> instanceParams2 = ImmutableList.of(vfModuleInstanceParamsMap);
221 VfModule vfModule2 = createVfModule("201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1", VF_MODULE_1_MODEL_VERSION_ID, VF_MODULE_1_MODEL_CUSTOMIZATION_NAME, instanceParams2, new HashMap<>(), (isUserProvidedNaming ? "vmxnjr001_AVPN_base_vRE_BV_expansion": null), (isUserProvidedNaming ? "myVgName" : null), isAlacarte);
223 String vfModuleModelName = vfModule1.getModelInfo().getModelName();
224 vfModules.put(vfModuleModelName, new LinkedHashMap<>());
226 vfModules.get(vfModuleModelName).put(vfModuleModelName + ":001", vfModule1);
227 vfModules.get(vfModuleModelName).put(vfModuleModelName + ":002", vfModule2);
229 Vnf vnf = new Vnf(vnfModelInfo, "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", (isUserProvidedNaming ? VNF_NAME : null), Action.Create.name(),
230 "platformName", "mdt1", null, "88a6ca3ee0394ade9403f075db23167e", vnfInstanceParams,"lineOfBusinessName" , false, null, vfModules,
231 UUID.randomUUID().toString(), null, null);
233 vnfs.put(vnf.getModelInfo().getModelName(), vnf);
237 public static class NetworkDetails {
239 public NetworkDetails(String name, String modelCustomizationId) {
241 this.modelCustomizationId = modelCustomizationId;
245 public String modelCustomizationId;
249 protected Map<String, Network> createNetworkList(List instanceParams, List<NetworkDetails> networkDetails, boolean isALaCarte) {
250 Stream<Network> networkStream = networkDetails.stream().map(
251 details->new Network(createNetworkModelInfo(isALaCarte, details.modelCustomizationId), "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
252 details.name, Action.Create.name(),
253 "platformName", "mdt1", null, "88a6ca3ee0394ade9403f075db23167e", instanceParams,"lineOfBusinessName" ,
254 false, null, UUID.randomUUID().toString(), null, null));
255 // I can't tell why compiler don't like the statement if it's only one line...
256 return networkStream.collect(Collectors.toMap(network -> network.getModelInfo().getModelCustomizationId(), network -> network));
259 protected InstanceGroup createInstanceGroup(boolean isUserProvidedNaming, Action action) {
260 ModelInfo modelInfo = new ModelInfo();
261 modelInfo.setModelType("instanceGroup");
262 modelInfo.setModelName("2016-73_MOW-AVPN-vPE-BV-L");
263 modelInfo.setModelVersionId("7f40c192-f63c-463e-ba94-286933b895f8");
264 modelInfo.setModelCustomizationName("2016-73_MOW-AVPN-vPE-BV-L 0");
265 modelInfo.setModelCustomizationId("ab153b6e-c364-44c0-bef6-1f2982117f04");
266 modelInfo.setModelInvariantId("11111111-f63c-463e-ba94-286933b895f9");
267 modelInfo.setModelVersion("10.0");
269 return new InstanceGroup(modelInfo, (isUserProvidedNaming ? VNF_GROUP_NAME : null), action.name(), false, null, emptyMap(), UUID.randomUUID().toString(), null, null);
272 protected ModelInfo createServiceModelInfo() {
273 ModelInfo siModelInfo = new ModelInfo();
274 siModelInfo.setModelName("sriov");
275 siModelInfo.setModelType("service");
276 siModelInfo.setModelInvariantId("ff3514e3-5a33-55df-13ab-12abad84e7ff");
277 siModelInfo.setModelVersionId("fe6985cd-ea33-3346-ac12-ab121484a3fe");
278 siModelInfo.setModelVersion("1.0");
283 protected void createInstanceParamsMaps() {
284 instanceParamsMapWithoutParams = new HashMap<>();
285 instanceParamsMapWithoutParams.put("availability_zone_0" , "mtpocdv-kvm-az01");
286 instanceParamsMapWithoutParams.put("vre_a_volume_size_0" , "100");
288 vfModuleInstanceParamsMapWithParamsToRemove = new HashMap<>();
289 vfModuleInstanceParamsMapWithParamsToRemove.put(AsyncInstantiationBusinessLogic.PARAMS_TO_IGNORE.get(0), "should be removed");
290 vfModuleInstanceParamsMapWithParamsToRemove.put("availability_zone_0" , "mtpocdv-kvm-az01");
291 vfModuleInstanceParamsMapWithParamsToRemove.put("vre_a_volume_size_0" , "100");
293 vnfInstanceParamsMapWithParamsToRemove = new HashMap<>();
294 vnfInstanceParamsMapWithParamsToRemove.put(AsyncInstantiationBusinessLogic.PARAMS_TO_IGNORE.get(1), "should be removed");
297 public static AsyncRequestStatus asyncRequestStatusResponse(String msoStatus) {
298 AsyncRequestStatus asyncRequestStatus = new AsyncRequestStatus(new AsyncRequestStatus.Request(new RequestStatus()));
299 asyncRequestStatus.request.requestStatus.setRequestState(msoStatus);
300 asyncRequestStatus.request.requestId = UUID.randomUUID().toString();
301 asyncRequestStatus.request.startTime = TimeUtils.zonedDateTimeToString(ZonedDateTime.now());
302 return asyncRequestStatus;
305 public static RestObject<AsyncRequestStatus> asyncRequestStatusResponseAsRestObject(String msoStatus) {
306 return asyncRequestStatusResponseAsRestObject(msoStatus, 200);
309 public static RestObject<AsyncRequestStatus> asyncRequestStatusResponseAsRestObject(String msoStatus, int httpStatusCode) {
310 RestObject<AsyncRequestStatus> restObject = new RestObject<>();
311 restObject.set(asyncRequestStatusResponse(msoStatus));
312 restObject.setStatusCode(httpStatusCode);
316 protected void mockAaiClientAnyNameFree() {
317 when(aaiClient.isNodeTypeExistsByName(any(), any())).thenReturn(false);
320 protected ExceptionWithRequestInfo aaiNodeQueryBadResponseException() {
321 return new ExceptionWithRequestInfo(HttpMethod.GET, "url", "raw data", 500, null);
324 protected ServiceInstantiation generateALaCarteWithVnfsServiceInstantiationPayload() {
325 Map<String, Vnf> vnfs = createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, Collections.singletonList(vnfInstanceParamsMapWithParamsToRemove) , true);
326 ServiceInstantiation serviceInstantiation = generateMockALaCarteServiceInstantiationPayload(false, vnfs, emptyMap(), emptyMap(), 1, true, PROJECT_NAME, false, "VNF_API");
327 return serviceInstantiation;
330 protected ServiceInstantiation generateALaCarteWithNetworksPayload(List<NetworkDetails> networkDetails) {
331 Map<String, Network> networks = createNetworkList(emptyList(), networkDetails, true);
332 ServiceInstantiation serviceInstantiation = generateMockALaCarteServiceInstantiationPayload(false, emptyMap(), networks, emptyMap(), 1, true, PROJECT_NAME, false, "VNF_API");
333 return serviceInstantiation;
336 protected ServiceInstantiation generateALaCarteUpdateWith1ExistingGroup2NewGroupsPayload() {
337 final InstanceGroup instanceGroup1 = createInstanceGroup(true, Action.None);
338 final InstanceGroup instanceGroup2 = createInstanceGroup(false, Action.Create);
339 final InstanceGroup instanceGroup3 = createInstanceGroup(true, Action.Create);
340 Map<String, InstanceGroup> groups = ImmutableMap.of(
341 "foo:001", instanceGroup1,
342 "foo:002", instanceGroup2,
343 "foo:003", instanceGroup3
345 return generateMockServiceInstantiationPayload(false, emptyMap(), emptyMap(), groups,
346 1, true, PROJECT_NAME, false, true, "VNF_API",
347 Action.None, "1234567890");
350 protected void enableAddCloudOwnerOnMsoRequest() {
351 enableAddCloudOwnerOnMsoRequest(true);
354 protected void enableAddCloudOwnerOnMsoRequest(boolean isActive) {
355 // always turn on the feature flag
356 when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(isActive);
357 when(aaiClient.getCloudOwnerByCloudRegionId(anyString())).thenReturn("irma-aic");
360 protected ServiceInstantiation generateALaCarteServiceInstantiationPayload() {
361 return generateMockALaCarteServiceInstantiationPayload(false, Collections.EMPTY_MAP, Collections.EMPTY_MAP, Collections.EMPTY_MAP, 1, true, PROJECT_NAME, false, "VNF_API");
364 protected ServiceInstantiation generateMacroMockServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs) {
365 return generateMockMacroServiceInstantiationPayload(isPause, vnfs, 1, true, PROJECT_NAME, false);
368 protected ServiceInstantiation generatePre1806MacroTransportServiceInstantiationPayload(String tenantId, String lcpCloudRegionId) {
369 List<Map<String, String>> instanceParams = ImmutableList.of(ImmutableMap.of("someUserParam","someValue", "anotherUserParam","anotherValue"));
370 ServiceInstantiation serviceInstantiation = new ServiceInstantiation(createServiceModelInfo(), "038d99af-0427-42c2-9d15-971b99b9b489",
371 "JULIO ERICKSON", "some_project_name", "some_subscriber_id", "some_subscriber_name",
372 "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", null, "MOG", lcpCloudRegionId, null, tenantId,
373 null, null, null, Collections.EMPTY_MAP, Collections.EMPTY_MAP, Collections.EMPTY_MAP, Collections.EMPTY_MAP, instanceParams, false, 1, false, false,
374 null, null, null, null, null, null,
375 new VidNotions(InstantiationUI.TRANSPORT_SERVICE, ModelCategory.Transport, InstantiationUI.TRANSPORT_SERVICE, InstantiationType.Macro)
377 return serviceInstantiation;
380 protected void mockAaiClientAaiStatusOK() {
381 when(aaiClient.isNodeTypeExistsByName(eq(AsyncInstantiationBusinessLogicImpl.NAME_FOR_CHECK_AAI_STATUS), any())).thenReturn(false);