Merge "FE getServicesJobInfo can filter by serviceModelId"
[vid.git] / vid-automation / src / test / java / org / onap / vid / api / AsyncInstantiationALaCarteApiTest.java
1 package org.onap.vid.api;
2
3 import static java.util.Collections.emptyMap;
4 import static java.util.stream.Collectors.toList;
5 import static java.util.stream.Collectors.toSet;
6 import static org.hamcrest.CoreMatchers.containsString;
7 import static org.hamcrest.CoreMatchers.hasItems;
8 import static org.hamcrest.MatcherAssert.assertThat;
9 import static org.hamcrest.Matchers.allOf;
10 import static org.hamcrest.Matchers.contains;
11 import static org.hamcrest.Matchers.containsInAnyOrder;
12 import static org.hamcrest.Matchers.matchesPattern;
13 import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
14 import static org.onap.simulator.presetGenerator.presets.BasePresets.BaseMSOPreset.DEFAULT_INSTANCE_ID;
15 import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOBaseCreateInstancePost.DEFAULT_REQUEST_ID;
16 import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestGet.COMPLETE;
17 import static org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames.Keys.SERVICE_NAME;
18 import static vid.automation.test.services.SimulatorApi.registerExpectationFromPresets;
19 import static vid.automation.test.services.SimulatorApi.retrieveRecordedRequests;
20
21 import com.google.common.collect.ImmutableList;
22 import com.google.common.collect.ImmutableMap;
23 import java.util.ArrayList;
24 import java.util.HashSet;
25 import java.util.LinkedList;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.UUID;
29 import org.onap.simulator.presetGenerator.presets.BasePresets.BaseMSOPreset;
30 import org.onap.simulator.presetGenerator.presets.BasePresets.BasePreset;
31 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetCloudOwnersByCloudRegionId;
32 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOAddOrRemoveOneInstanceGroupMember;
33 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOAddOrRemoveOneInstanceGroupMember.InstanceGroupMemberAction;
34 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOBaseCreateInstancePost;
35 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOBaseDelete;
36 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateNetworkALaCarteCypress;
37 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateServiceInstanceGen2WithNamesAlacarteService;
38 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateServiceInstanceGen2WithNamesAlacarteServiceCypress;
39 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateVfModuleALaCarteCypress;
40 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateVfModuleWithVolumeGroupALaCarteCypress;
41 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateVnfALaCarteCypress2;
42 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOCreateVnfGroup;
43 import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeleteALaCarteService;
44 import org.onap.simulator.presetGenerator.presets.mso.PresetMSODeleteInstanceGroup;
45 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestGet;
46 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOServiceInstanceGen2WithNames;
47 import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceMetadataGet;
48 import org.onap.simulator.presetGenerator.presets.sdc.PresetSDCGetServiceToscaModelGet;
49 import org.onap.vid.model.asyncInstantiation.JobAuditStatus;
50 import org.onap.vid.model.asyncInstantiation.JobAuditStatus.SourceStatus;
51 import org.onap.vid.model.asyncInstantiation.ServiceInfo;
52 import org.onap.vid.more.LoggerFormatTest;
53 import org.onap.vid.more.LoggerFormatTest.LogName;
54 import org.springframework.core.ParameterizedTypeReference;
55 import org.springframework.http.HttpMethod;
56 import org.springframework.http.ResponseEntity;
57 import org.testng.annotations.AfterMethod;
58 import org.testng.annotations.DataProvider;
59 import org.testng.annotations.Test;
60 import vid.automation.test.Constants;
61 import vid.automation.test.infra.FeatureTogglingTest;
62 import vid.automation.test.infra.Features;
63 import vid.automation.test.model.JobStatus;
64 import vid.automation.test.model.ServiceAction;
65 import vid.automation.test.services.AsyncJobsService;
66 import vid.automation.test.services.SimulatorApi;
67 import vid.automation.test.services.SimulatorApi.RecordedRequests;
68 import vid.automation.test.services.SimulatorApi.RegistrationStrategy;
69
70 @FeatureTogglingTest({Features.FLAG_ASYNC_ALACARTE_VNF})
71 public class AsyncInstantiationALaCarteApiTest extends AsyncInstantiationBase {
72
73     private static final String CREATE_BULK_OF_ALACARTE_REQUEST = "asyncInstantiation/vidRequestCreateALaCarte.json";
74     private static final String CREATE_BULK_OF_ALACARTE_REQUEST_CYPRESS = "a-la-carte/redux-a-la-carte.json";
75     private static final String CREATE_BULK_OF_ALACARTE_NO_TESTAPI_REQUEST_CYPRESS = "a-la-carte/redux-a-la-carte-no-testapi.json";
76     private static final String DELETE_BULK_OF_ALACARTE_REQUEST = "VnfGroup/ServiceWithVnfGroupsDeleteRequest.json";
77     private static final String VIEW_EDIT_VNF_GROUPS_REQUEST = "VnfGroup/VnfGroupCreate1Delete1None1Request.json";
78     private static final String DELETE_TWO_VNF_GROUPS_MEMBER_AND_ADD_ONE_REQUEST = "VnfGroup/vnfGroupCreate1VnfGroupAndDelete2VnfGroupsRequest.json";
79     private static final String DELETE_SERVICE_WITH_TWO_VNF_GROUPS_REQUEST_WITH_GROUPMEMBERS = "VnfGroup/deleteServiceWith2VnfGroupsRequest_AndThreeGroupMembers.json";
80
81
82     private static final String SERVICE_INSTANCE_ID = BaseMSOPreset.DEFAULT_INSTANCE_ID;
83     private static final String MSO_COMPLETE_STATUS = "COMPLETE";
84     private static final String MSO_FAILED_STATUS = "FAILED";
85
86
87     @DataProvider
88     public static Object[][] scenarios() {
89         return new Object[][]{
90                 {Scenario.PARALLEL},
91                 {Scenario.COMPLETED},
92 //                {Scenario.NAME_TAKEN}, Not relevant because the name uniqueness is supported only for bulk in Macro
93 //                {Scenario.DUPLICATE_NAME}, Not relevant because name duplication is not handled in A La Carte
94                 {Scenario.IN_PROGRESS},
95                 {Scenario.MSO_FAIL}
96         };
97     }
98
99     @AfterMethod
100     protected void dropAllFromNameCounter() {
101         AsyncJobsService asyncJobsService = new AsyncJobsService();
102         asyncJobsService.dropAllFromNameCounter();
103     }
104
105     @Test
106     public void deploy1Service0VnfWithStrictSimulatorCompare__verifyStatusAndAudit() {
107         /*
108         Legit Preset  ||  deploy 1 Service, no VNF inside
109                 -> JobStatus is Eventually success, audit
110                    is adequate; strict simulator compare
111          */
112
113         final ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names = ImmutableMap.of(SERVICE_NAME, "calazixide85");
114         List<PresetMSOBaseCreateInstancePost> createPresets =   ImmutableList.of(new PresetMSOCreateServiceInstanceGen2WithNamesAlacarteService(names, 0, DEFAULT_REQUEST_ID));
115         List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of(new PresetMSOOrchestrationRequestGet());
116         List<BasePreset> presets = getPresets(createPresets, inProgressPresets);
117
118         registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET);
119         final List<String> uuids = createBulkOfInstances(false, 1, names, CREATE_BULK_OF_ALACARTE_REQUEST);
120
121         assertThat(uuids, hasSize(1));
122         final String jobId = uuids.get(0);
123
124         assertServiceInfoSpecific1(jobId, JobStatus.COMPLETED, names.get(SERVICE_NAME));
125         assertAuditStatuses(jobId, vidAuditStatusesCompleted(jobId), msoAuditStatusesCompleted(jobId));
126     }
127
128     @Test
129     public void deployTwoServicesGetServicesFilterByModelId() {
130         final ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names = ImmutableMap
131             .of(SERVICE_NAME, "calazixide85");
132
133         final List<String> uuids1 = createBulkOfInstances(false, 2, names, CREATE_BULK_OF_ALACARTE_REQUEST);
134         final List<String> uuids2 = createBulkOfInstances(false, 1, names, DELETE_BULK_OF_ALACARTE_REQUEST);
135
136         String SERVICE_MODEL_UUID = "e3c34d88-a216-4f1d-a782-9af9f9588705";
137         ResponseEntity<List<ServiceInfo>> response = restTemplate.exchange(
138             getServiceInfoUrl() + "?serviceModelId=" + SERVICE_MODEL_UUID,
139             HttpMethod.GET,
140             null,
141             new ParameterizedTypeReference<List<ServiceInfo>>() {
142             });
143         assertThat(response.getBody().stream().map(x -> x.serviceModelId).collect(toSet()),
144             contains(SERVICE_MODEL_UUID));
145
146     }
147
148
149     @Test
150     public void deleteServiceWithTwoVnfGroups_andRetry() {
151         String parentServiceInstanceId = "service-instance-id";
152         String firstVnfGroupToDeleteInstanceId = "VNF_GROUP1_INSTANCE_ID";
153         String secondVnfGroupToDeleteInstanceId = "VNF_GROUP2_INSTANCE_ID";
154         String firstVnfGroupToDeleteRequestId = UUID.randomUUID().toString();
155         String secondVnfGroupToDeleteRequestId = UUID.randomUUID().toString();
156         String parentServiceRequestId = UUID.randomUUID().toString();
157         List<String> vnfGroupMemberRemoveRequestsIds = ImmutableList.of(UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString());
158
159         //failed to delete vnf group, and then also service is not deleted
160         List<PresetMSOBaseCreateInstancePost> createPresets = ImmutableList.of(
161                 new PresetMSOAddOrRemoveOneInstanceGroupMember(firstVnfGroupToDeleteInstanceId, "RELATED_VNF1_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(0), InstanceGroupMemberAction.Remove),
162                 new PresetMSOAddOrRemoveOneInstanceGroupMember(firstVnfGroupToDeleteInstanceId, "RELATED_VNF2_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(1), InstanceGroupMemberAction.Remove),
163                 new PresetMSOAddOrRemoveOneInstanceGroupMember(firstVnfGroupToDeleteInstanceId, "RELATED_VNF3_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(2), InstanceGroupMemberAction.Remove));
164
165             List<PresetMSOBaseDelete> deletePresets = ImmutableList.of(
166                     new PresetMSODeleteInstanceGroup(firstVnfGroupToDeleteRequestId, firstVnfGroupToDeleteInstanceId, getUserCredentials().getUserId()),
167                     new PresetMSODeleteInstanceGroup(secondVnfGroupToDeleteRequestId, secondVnfGroupToDeleteInstanceId, getUserCredentials().getUserId())
168             );
169
170         List<PresetMSOOrchestrationRequestGet> inProgressPresets = new ArrayList<>();
171         inProgressPresets.add(new  PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, firstVnfGroupToDeleteRequestId));
172         inProgressPresets.add(new  PresetMSOOrchestrationRequestGet( MSO_FAILED_STATUS, secondVnfGroupToDeleteRequestId));
173         inProgressPresets.add(new  PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, vnfGroupMemberRemoveRequestsIds.get(0)));
174         inProgressPresets.add(new  PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, vnfGroupMemberRemoveRequestsIds.get(1)));
175         inProgressPresets.add(new  PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, vnfGroupMemberRemoveRequestsIds.get(2)));
176
177         List<BasePreset> presets = getPresets(deletePresets, createPresets, inProgressPresets);
178         registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET);
179         final List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), DELETE_SERVICE_WITH_TWO_VNF_GROUPS_REQUEST_WITH_GROUPMEMBERS);
180
181         assertThat(uuids, hasSize(1));
182         final String jobId = uuids.get(0);
183         assertServiceInfoSpecificDeletion(jobId, JobStatus.COMPLETED_WITH_ERRORS, "SERVICE_INSTANCE_NAME", "service-instance-type");
184         assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf(
185                 TestUtils.hasOrLacksOfEntry(deletePresets.get(0).getReqPath(), 1L),
186                 TestUtils.hasOrLacksOfEntry(deletePresets.get(1).getReqPath(), 1L),
187
188                 TestUtils.hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 1L),
189                 TestUtils.hasOrLacksOfEntry(inProgressPresets.get(1).getReqPath(), 1L),
190                 TestUtils.hasOrLacksOfEntry(createPresets.get(0).getReqPath(), 3L)
191
192         ));
193
194         //retry to delete vnf-group and then delete service
195         List<BasePreset> retryPresets = ImmutableList.of(
196                 new PresetMSODeleteInstanceGroup(secondVnfGroupToDeleteRequestId, secondVnfGroupToDeleteInstanceId, getUserCredentials().getUserId()),
197                 new PresetMSODeleteALaCarteService(parentServiceRequestId,parentServiceInstanceId ),
198                 new PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, secondVnfGroupToDeleteRequestId),
199                 new PresetMSOOrchestrationRequestGet( MSO_COMPLETE_STATUS, parentServiceRequestId));
200         registerExpectationFromPresets(retryPresets, RegistrationStrategy.CLEAR_THEN_SET);
201
202         List<String> retryUuids = retryJob(jobId);
203         assertThat(retryUuids, hasSize(1));
204         final String retryJobId = retryUuids.get(0);
205         assertServiceInfoSpecificDeletion(retryJobId, JobStatus.COMPLETED, "SERVICE_INSTANCE_NAME", "service-instance-type");
206
207         assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf(
208                 TestUtils.hasOrLacksOfEntry(retryPresets.get(0).getReqPath(), 1L),
209                 TestUtils.hasOrLacksOfEntry(retryPresets.get(1).getReqPath(), 1L),
210                 TestUtils.hasOrLacksOfEntry(retryPresets.get(2).getReqPath(), 1L),
211                 TestUtils.hasOrLacksOfEntry(retryPresets.get(3).getReqPath(), 1L)
212         ));
213     }
214
215     @DataProvider
216     public static Object[][] msoRequestStatusDataProvider() {
217         return new Object[][]{
218                 {MSO_COMPLETE_STATUS, JobStatus.COMPLETED},
219                 {MSO_FAILED_STATUS, JobStatus.FAILED}
220         };
221     }
222
223     @Test(dataProvider = "msoRequestStatusDataProvider")
224     public void deleteServiceWithStrictSimulatorCompare__verifyStatusAndAudit(String msoStatus, JobStatus expectedStatus) {
225         List<PresetMSOBaseDelete> deletePresets =   ImmutableList.of(new PresetMSODeleteALaCarteService( DEFAULT_REQUEST_ID, SERVICE_INSTANCE_ID));
226         List<PresetMSOOrchestrationRequestGet> inProgressPresets =  ImmutableList.of (new PresetMSOOrchestrationRequestGet(msoStatus),
227         new PresetMSOOrchestrationRequestGet(msoStatus));
228         List<BasePreset> presets = getDeletePresets(deletePresets, inProgressPresets);
229
230         registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET);
231         final List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), DELETE_BULK_OF_ALACARTE_REQUEST);
232
233         assertThat(uuids, hasSize(1));
234         final String jobId = uuids.get(0);
235
236         assertServiceInfoSpecificDeletion(jobId, expectedStatus, "wowServiceWithVnfGroping", "TYLER SILVIA");
237         switch (expectedStatus) {
238             case COMPLETED:
239                 assertAuditStatuses(jobId, vidAuditStatusesCompleted(jobId), msoAuditStatusesCompleted(jobId));
240                 break;
241
242             case FAILED:
243                 assertAuditStatuses(jobId, vidAuditStatusesFailed(jobId), null);
244                 break;
245         }
246
247         assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf(
248                 TestUtils.hasOrLacksOfEntry(deletePresets.get(0).getReqPath(), 1L),
249                 TestUtils.hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 1L)
250         ));
251     }
252
253     @Test(dataProvider = "msoRequestStatusDataProvider")
254     public void deleteTwoGroupsAddOneGroup(String msoStatus, JobStatus expectedStatus) {
255         String parentServiceInstanceId = "service-instance-id";
256         String firstVnfGroupToDeleteInstanceId = "VNF_GROUP1_INSTANCE_ID";
257         String secondVnfGroupToDeleteInstanceId = "VNF_GROUP2_INSTANCE_ID";
258         String firstVnfGroupToDeleteRequestId = UUID.randomUUID().toString();
259         String secondVnfGroupToDeleteRequestId = UUID.randomUUID().toString();
260         String vnfGroupToCreateRequestId = UUID.randomUUID().toString();
261
262         List<PresetMSOBaseDelete> deletePresets = ImmutableList.of(
263                 new PresetMSODeleteInstanceGroup(firstVnfGroupToDeleteRequestId, firstVnfGroupToDeleteInstanceId, getUserCredentials().getUserId()),
264                 new PresetMSODeleteInstanceGroup(secondVnfGroupToDeleteRequestId, secondVnfGroupToDeleteInstanceId, getUserCredentials().getUserId()));
265
266         List<PresetMSOBaseCreateInstancePost> createPresets = ImmutableList.of(
267                 new PresetMSOCreateVnfGroup("VNF_GROUP3_INSTANCE_NAME", vnfGroupToCreateRequestId,
268                         PresetMSOCreateVnfGroup.MODEL_INFO_0, parentServiceInstanceId, false));
269         List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of(
270                 new PresetMSOOrchestrationRequestGet(msoStatus, firstVnfGroupToDeleteRequestId),
271                 new PresetMSOOrchestrationRequestGet(msoStatus, secondVnfGroupToDeleteRequestId),
272                 new PresetMSOOrchestrationRequestGet(msoStatus, vnfGroupToCreateRequestId, "Instance group was created successfully.")
273         );
274         List<BasePreset> presets = getPresets(deletePresets, createPresets, inProgressPresets);
275         registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET);
276         final List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), DELETE_TWO_VNF_GROUPS_MEMBER_AND_ADD_ONE_REQUEST);
277
278         assertThat(uuids, hasSize(1));
279         final String jobId = uuids.get(0);
280
281         assertServiceInfoSpecificUpdate(jobId, expectedStatus, "SERVICE_INSTANCE_NAME");
282         assertExpectedStatus(expectedStatus, jobId);
283         assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf(
284                 TestUtils.hasOrLacksOfEntry(deletePresets.get(0).getReqPath(), 1L),
285                 TestUtils.hasOrLacksOfEntry(inProgressPresets.get(0).getReqPath(), 1L),
286                 TestUtils.hasOrLacksOfEntry(deletePresets.get(1).getReqPath(), 1L),
287                 TestUtils.hasOrLacksOfEntry(inProgressPresets.get(1).getReqPath(), 1L),
288                 TestUtils.hasOrLacksOfEntry(createPresets.get(0).getReqPath(), 1L),
289                 TestUtils.hasOrLacksOfEntry(inProgressPresets.get(2).getReqPath(), 1L)
290         ));
291
292     }
293
294     @Test
295     public void viewEditVnfGroup__verifyStatusAndAudit() {
296         String parentServiceInstanceId = "service-instance-id";
297         String vnfGroupToDeleteInstanceId = "VNF_GROUP1_INSTANCE_ID";
298
299         //failed to create vnf group, failed to remove 1 member (and then also vnf group isn't deleted)
300         viewEditVnfGroup_registerPresets(parentServiceInstanceId, vnfGroupToDeleteInstanceId, MSO_FAILED_STATUS);
301
302         final List<String> uuids = createBulkOfInstances(false, 1, ImmutableMap.of(), VIEW_EDIT_VNF_GROUPS_REQUEST);
303
304         assertThat(uuids, hasSize(1));
305         final String jobId = uuids.get(0);
306
307         assertServiceInfoSpecificUpdate(jobId, JobStatus.COMPLETED_WITH_ERRORS, "SERVICE_INSTANCE_NAME");
308         assertExpectedStatus(JobStatus.COMPLETED_WITH_ERRORS, jobId);
309         Map<String, Long> recordedRequest = SimulatorApi.retrieveRecordedRequestsPathCounter();
310         assertThat(recordedRequest, allOf(
311                 TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups/" + vnfGroupToDeleteInstanceId, 0L), //delete vnf group
312                 TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups", 1L), //create vnf group
313                 TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups/" + vnfGroupToDeleteInstanceId + "/removeMembers", 3L) //remove vnf group members
314         ));
315
316         //retry - vnf group create, 1 member remove, vnf group delete
317         viewEditVnfGroup_registerPresets(parentServiceInstanceId, vnfGroupToDeleteInstanceId, MSO_COMPLETE_STATUS);
318         final List<String> retryUuids = retryJob(jobId);
319         assertThat(retryUuids, hasSize(1));
320         final String retryJobId = retryUuids.get(0);
321
322         assertServiceInfoSpecificUpdate(retryJobId, JobStatus.COMPLETED, "SERVICE_INSTANCE_NAME");
323         assertExpectedStatus(JobStatus.COMPLETED, retryJobId);
324         assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf(
325                 TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups/" + vnfGroupToDeleteInstanceId, 1L), //delete vnf group
326                 TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups", 1L), //create vnf group
327                 TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./instanceGroups/" + vnfGroupToDeleteInstanceId + "/removeMembers", 1L) //remove vnf group members
328         ));
329     }
330
331     private void viewEditVnfGroup_registerPresets(String parentServiceInstanceId, String vnfGroupToDeleteInstanceId, String msoStatus) {
332         String vnfGroupToDeleteRequestId = UUID.randomUUID().toString();
333         String vnfGroupToCreateRequestId = UUID.randomUUID().toString();
334         List<String> vnfGroupMemberRemoveRequestsIds = ImmutableList.of(UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString());
335
336         List<PresetMSOBaseDelete> deletePresets = ImmutableList.of(
337                 new PresetMSODeleteInstanceGroup(vnfGroupToDeleteRequestId, vnfGroupToDeleteInstanceId, getUserCredentials().getUserId()));
338         List<PresetMSOBaseCreateInstancePost> createPresets = ImmutableList.of(
339                 new PresetMSOCreateVnfGroup("VNF_GROUP3_INSTANCE_NAME", vnfGroupToCreateRequestId,
340                         PresetMSOCreateVnfGroup.MODEL_INFO_0, parentServiceInstanceId, false),
341                 new PresetMSOAddOrRemoveOneInstanceGroupMember(vnfGroupToDeleteInstanceId, "RELATED_VNF1_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(0), InstanceGroupMemberAction.Remove),
342                 new PresetMSOAddOrRemoveOneInstanceGroupMember(vnfGroupToDeleteInstanceId, "RELATED_VNF2_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(1), InstanceGroupMemberAction.Remove),
343                 new PresetMSOAddOrRemoveOneInstanceGroupMember(vnfGroupToDeleteInstanceId, "RELATED_VNF3_INSTANCE_ID", getUserCredentials().getUserId(), vnfGroupMemberRemoveRequestsIds.get(2), InstanceGroupMemberAction.Remove));
344         List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of(
345                 new PresetMSOOrchestrationRequestGet(MSO_COMPLETE_STATUS, vnfGroupToDeleteRequestId), // delete instance group
346                 new PresetMSOOrchestrationRequestGet(msoStatus, vnfGroupToCreateRequestId, "Instance group was created successfully."), // create instance group
347                 new PresetMSOOrchestrationRequestGet(MSO_COMPLETE_STATUS, vnfGroupMemberRemoveRequestsIds.get(0)), // remove instance group member
348                 new PresetMSOOrchestrationRequestGet(msoStatus, vnfGroupMemberRemoveRequestsIds.get(1)), // remove instance group member
349                 new PresetMSOOrchestrationRequestGet(MSO_COMPLETE_STATUS, vnfGroupMemberRemoveRequestsIds.get(2))); // remove instance group member
350
351         List<BasePreset> presets = getPresets(deletePresets, createPresets, inProgressPresets);
352         registerExpectationFromPresets(presets, RegistrationStrategy.CLEAR_THEN_SET);
353     }
354
355     private void assertExpectedStatus(JobStatus expectedStatus, String jobId) {
356         switch (expectedStatus) {
357             case COMPLETED:
358                 assertAuditStatuses(jobId, vidAuditStatusesCompleted(jobId), null);
359                 break;
360
361             case FAILED:
362                 assertAuditStatuses(jobId, vidAuditStatusesFailed(jobId), null);
363                 break;
364         }
365     }
366
367     @Test
368     public void deploy1Service1FailedVnf__verifyStatus_andRetry() {
369         //CreateServiceWithFailedVnf is common for API test and UI test,
370         //so if you change it, make sure both test are compatible with your changes
371         CreateServiceWithFailedVnf createServiceWithFailedVnf = new CreateServiceWithFailedVnf(this);
372         createServiceWithFailedVnf.deployService1FailedVnf();
373         createServiceWithFailedVnf.secondRegistration();
374         createServiceWithFailedVnf.retryJob();
375         createServiceWithFailedVnf.retryAssertion();
376         createServiceWithFailedVnf.simulatorCallsAssertion();
377     }
378
379     @DataProvider
380     Object[][] data_deploy1ServiceFromCypress__verifyStatusAndMsoCalls() {
381         return Features.FLAG_ASYNC_ALACARTE_VFMODULE.isActive() ? new Object[][]{
382                 {"none", emptyMap(), emptyMap(), true},
383                 {"none", emptyMap(), emptyMap(), false},
384                 {"instance",  ImmutableMap.of("vnfs", 0L, "networks", 0L, "vfModules", 0L, "volumeGroups", 0L),
385                         ImmutableMap.of("serviceInstances", 1L, "vnfs", 1L, "networks", 1L, "vfModules", 3L, "volumeGroups", 1L),true},
386                 {"network", emptyMap(),
387                         ImmutableMap.of("networks", 1L), true},
388                 {"vnf0", ImmutableMap.of("vfModules", 0L, "volumeGroups", 0L),
389                         ImmutableMap.of("vnfs", 1L, "vfModules", 3L, "volumeGroups", 1L), true},
390                 {"vfModule0", ImmutableMap.of("vfModules", 1L, "volumeGroups", 0L),
391                         ImmutableMap.of("vfModules", 3L, "volumeGroups", 1L), true},
392                 {"volumeGroup", ImmutableMap.of("vfModules", 2L),
393                         ImmutableMap.of("vfModules", 1L, "volumeGroups", 1L), true},
394                 {"vfModule1", emptyMap(),
395                         ImmutableMap.of("vfModules", 1L, "volumeGroups", 1L), true},
396                 {"vfModule2", emptyMap(),
397                         ImmutableMap.of("vfModules", 1L), true}
398         } : new Object[][]{
399                 {"none", ImmutableMap.of("vfModules", 0L, "volumeGroups", 0L), emptyMap(), true}
400         };
401     }
402
403     @Test(dataProvider = "data_deploy1ServiceFromCypress__verifyStatusAndMsoCalls")
404     public void deploy1ServiceFromCypress__verifyStatusAndMsoCalls_andRetry(String whatToFail, Map<String, Long> pathCounterOverride, Map<String, Long> retryPathCounterOverride, boolean withTestApi) {
405         final ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names = ImmutableMap.of(SERVICE_NAME, "serviceInstanceName");
406         String vnfRequestId = UUID.randomUUID().toString();
407         registerPresetsForRetryTest(whatToFail, names, vnfRequestId, withTestApi);
408
409         final List<String> uuids = createBulkOfInstances(false, 1, names, withTestApi? CREATE_BULK_OF_ALACARTE_REQUEST_CYPRESS: CREATE_BULK_OF_ALACARTE_NO_TESTAPI_REQUEST_CYPRESS);
410
411         assertThat(uuids, hasSize(1));
412         final String jobId = uuids.get(0);
413
414         JobStatus finalJobStatus;
415         switch (whatToFail) {
416             case "none": finalJobStatus = JobStatus.COMPLETED; break;
417             case "instance": finalJobStatus = JobStatus.FAILED; break;
418             default: finalJobStatus = JobStatus.COMPLETED_WITH_ERRORS; break;
419         }
420         assertServiceInfoSpecific2(jobId, finalJobStatus, names.get(SERVICE_NAME));
421         assertRecordedRequests(pathCounterOverride, 1L, vnfRequestId);
422
423         if (!"none".equals(whatToFail)) {
424             registerPresetsForRetryTest("none", names, vnfRequestId, withTestApi);
425
426             List<String> retryUuids = retryJob(jobId);
427             assertThat(retryUuids, hasSize(1));
428             final String retryJobId = retryUuids.get(0);
429
430             ServiceAction serviceAction = "instance".equals(whatToFail) ? ServiceAction.INSTANTIATE : ServiceAction.UPDATE;
431             assertServiceInfoSpecific2(retryJobId, JobStatus.COMPLETED, names.get(SERVICE_NAME), serviceAction);
432
433             assertRecordedRequests(retryPathCounterOverride, 0L, vnfRequestId);
434         }
435     }
436
437
438     @Test
439     public void deployServiceAfterDragAndDropVFModule__verifyOrderMsoCalls() {
440         final ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names = ImmutableMap
441             .of(SERVICE_NAME, "serviceInstanceName");
442         String vnfRequestId = UUID.randomUUID().toString();
443         registerPresetsForRetryTest("none", names, vnfRequestId, false);
444
445         final List<String> uuids = createBulkOfInstances(false, 1, names,
446             CREATE_BULK_OF_ALACARTE_NO_TESTAPI_REQUEST_CYPRESS);
447
448         final String jobId = uuids.get(0);
449
450         assertServiceInfoSpecific2(jobId, JobStatus.COMPLETED, names.get(SERVICE_NAME));
451         assertMSOcalledWithOrder();
452     }
453
454     @Test
455     public void verifyMetricsLogInAsyncInstantiation() {
456
457         final String UUID_REGEX = "[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{4}\\-[0-9a-fA-F]{12}";
458
459         final String msoURL = "/mso/serviceInstantiation/v";
460
461         deploy1ServiceFromCypress__verifyStatusAndMsoCalls_andRetry("none", emptyMap(), emptyMap(), true);
462         List<String> logLines =  LoggerFormatTest.getLogLinesAsList(LogName.metrics2019, 200, 1, restTemplate, uri);
463         List<RecordedRequests> underTestRequests = retrieveRecordedRequests();
464
465         underTestRequests.forEach(request-> {
466             assertThat("X-ONAP-RequestID", request.headers.get("X-ONAP-RequestID"), contains(matchesPattern(UUID_REGEX)));
467             assertThat("X-ECOMP-RequestID", request.headers.get("X-ECOMP-RequestID"), contains(matchesPattern(UUID_REGEX)));
468             assertThat("X-ECOMP-RequestID", request.headers.get("X-InvocationID"), contains(matchesPattern(UUID_REGEX)));
469             assertThat("X-ONAP-PartnerName", request.headers.get("X-ONAP-PartnerName"), contains("VID.VID"));
470         });
471
472         List<String> allInvocationIds = new LinkedList<>();
473         List<String> allMsoRequestsIds = new LinkedList<>();
474
475         underTestRequests.forEach(request->{
476             String invocationId = request.headers.get("X-InvocationID").get(0);
477             allInvocationIds.add(invocationId);
478
479             String requestId = request.headers.get("X-ONAP-RequestID").get(0);
480             if (request.path.contains(msoURL)) {
481                 allMsoRequestsIds.add(requestId);
482             }
483
484             assertThat("request id and invocation id must be found in two rows",
485                 logLines,
486                 hasItems(
487                     allOf(
488                         containsString("RequestID="+requestId),
489                         containsString("InvocationID="+ invocationId),
490                         containsString("Invoke")),
491                     allOf(
492                         containsString("RequestID="+requestId),
493                         containsString("InvocationID="+ invocationId),
494                         containsString("InvokeReturn"))
495                 ));
496         });
497
498         //make sure no InvocationId is repeated twice
499         assertThat("expect all InvocationIds to be unique",
500             allInvocationIds, containsInAnyOrder(new HashSet<>(allInvocationIds).toArray()));
501
502         //make sure no RequestId is repeated twice
503         assertThat("expect all RequestIds to be unique",
504             allMsoRequestsIds, containsInAnyOrder(new HashSet<>(allMsoRequestsIds).toArray()));
505
506     }
507
508     private void registerPresetsForRetryTest(String whatToFail, ImmutableMap<PresetMSOServiceInstanceGen2WithNames.Keys, String> names, String vnfRequestId, boolean withTestApi ) {
509         String networkRequestId = UUID.randomUUID().toString();
510         String vfModule0RequestId = UUID.randomUUID().toString();
511         String vfModule1RequestId = UUID.randomUUID().toString();
512         String vfModule2RequestId = UUID.randomUUID().toString();
513         String volumeGroupRequestId = UUID.randomUUID().toString();
514         List<PresetMSOBaseCreateInstancePost> createPresets =   ImmutableList.of(
515                 new PresetMSOCreateServiceInstanceGen2WithNamesAlacarteServiceCypress(names, 0, DEFAULT_REQUEST_ID, Constants.GR_API, withTestApi),
516                 new PresetMSOCreateVnfALaCarteCypress2(vnfRequestId, DEFAULT_INSTANCE_ID, vnfRequestId, "2017-488_PASQUALE-vPE", Constants.GR_API,  withTestApi),
517                 new PresetMSOCreateNetworkALaCarteCypress(networkRequestId, DEFAULT_INSTANCE_ID,  networkRequestId, "ExtVL", Constants.GR_API, withTestApi)
518         );
519         List<PresetMSOOrchestrationRequestGet> inProgressPresets = ImmutableList.of(
520                 new PresetMSOOrchestrationRequestGet("instance".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE),
521                 new PresetMSOOrchestrationRequestGet("vnf0".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, vnfRequestId),
522                 new PresetMSOOrchestrationRequestGet("vfModule0".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, vfModule0RequestId),
523                 new PresetMSOOrchestrationRequestGet("vfModule1".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, vfModule1RequestId),
524                 new PresetMSOOrchestrationRequestGet("vfModule2".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, vfModule2RequestId),
525                 new PresetMSOOrchestrationRequestGet("volumeGroup".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, volumeGroupRequestId),
526                 new PresetMSOOrchestrationRequestGet("network".equals(whatToFail) ? MSO_FAILED_STATUS : COMPLETE, networkRequestId)
527         );
528         List<BasePreset> presetsWithoutVfModule = getPresets(createPresets, inProgressPresets);
529
530         ImmutableList<BasePreset> presets = new ImmutableList.Builder<BasePreset>()
531                 .addAll(presetsWithoutVfModule)
532                 .add(new PresetSDCGetServiceToscaModelGet("2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", "csar-noDynamicFields-ecompNamingFalse-fullModelDetails.zip"))
533                 .add(new PresetSDCGetServiceMetadataGet("2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", "e49fbd11-e60c-4a8e-b4bf-30fbe8f4fcc0", "csar-noDynamicFields-ecompNamingFalse-fullModelDetails.zip"))
534                 .add(new PresetMSOCreateVfModuleALaCarteCypress(vfModule0RequestId, DEFAULT_INSTANCE_ID, vnfRequestId, PresetMSOCreateVfModuleALaCarteCypress.module0Names,  Constants.GR_API, withTestApi))
535                 .add(PresetMSOCreateVfModuleWithVolumeGroupALaCarteCypress.forVolumeGroup(volumeGroupRequestId, DEFAULT_INSTANCE_ID, vnfRequestId,  Constants.GR_API, withTestApi))
536                 .add(PresetMSOCreateVfModuleWithVolumeGroupALaCarteCypress.forVfModule(vfModule1RequestId, DEFAULT_INSTANCE_ID, vnfRequestId, volumeGroupRequestId, Constants.GR_API, withTestApi))
537                 .add(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_JUST_ANOTHER_REGION_TO_ATT_AIC)
538                 .add(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MTN6_TO_ATT_AIC)
539                 .add(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MY_REGION_TO_ATT_AIC)
540                 .add(PresetAAIGetCloudOwnersByCloudRegionId.PRESET_LCP_REGION_TEXT_TO_ATT_AIC)
541                 .add(new PresetMSOCreateVfModuleALaCarteCypress(vfModule2RequestId, DEFAULT_INSTANCE_ID, vnfRequestId, PresetMSOCreateVfModuleALaCarteCypress.module2Names,  Constants.GR_API, withTestApi))
542                 .build();
543
544         registerExpectationFromPresets(
545                 Features.FLAG_ASYNC_ALACARTE_VFMODULE.isActive() ? presets : presetsWithoutVfModule,
546                 RegistrationStrategy.CLEAR_THEN_SET);
547     }
548
549     private void assertRecordedRequests(Map<String, Long> pathCounterOverride, Long defaultValue, String vnfRequestId) {
550         Long vfModulesDefaultValue = defaultValue == 1L ? 3L : 0L;
551
552         //noinspection unchecked
553         assertThat(SimulatorApi.retrieveRecordedRequestsPathCounter(), allOf(
554                 TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./serviceInstances",
555                         pathCounterOverride.getOrDefault("serviceInstances", defaultValue)),
556
557                 TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./serviceInstances/" + DEFAULT_INSTANCE_ID + "/networks",
558                         pathCounterOverride.getOrDefault("networks", defaultValue)),
559
560                 TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./serviceInstances/" + DEFAULT_INSTANCE_ID + "/vnfs",
561                         pathCounterOverride.getOrDefault("vnfs", defaultValue)),
562
563                 TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./serviceInstances/" + DEFAULT_INSTANCE_ID + "/vnfs/" + vnfRequestId + "/volumeGroups",
564                         pathCounterOverride.getOrDefault("volumeGroups", defaultValue)),
565
566                 TestUtils.hasOrLacksOfEntry("/mso/serviceInstantiation/v./serviceInstances/" + DEFAULT_INSTANCE_ID + "/vnfs/" + vnfRequestId + "/vfModules",
567                         pathCounterOverride.getOrDefault("vfModules", vfModulesDefaultValue))
568         ));
569     }
570
571
572     private void assertMSOcalledWithOrder() {
573
574         List<RecordedRequests> requests = retrieveRecordedRequests();
575
576         String path = "/mso/serviceInstantiation/v7/serviceInstances/.*/vnfs/.*/vfModules";
577         List<String> msoVFModulesRequests =
578             requests.stream().filter(x -> x.path.matches(path)).map(x -> x.body).collect(toList());
579
580         assertThat("request for vfNodule send with position order",
581             msoVFModulesRequests,
582             contains(
583                 containsString("2017488PasqualeVpe..PASQUALE_base_vPE_BV..module-0"),
584                 containsString("2017488PasqualeVpe..PASQUALE_vPFE_BV..module-2"),
585                 containsString("2017488PasqualeVpe..PASQUALE_vRE_BV..module-1")
586             ));
587     }
588
589     private ImmutableList<JobAuditStatus> vidAuditStatusesCompleted(String jobId) {
590         return ImmutableList.of(
591                 vidAuditStatus(jobId, "PENDING", false),
592                 vidAuditStatus(jobId, "IN_PROGRESS", false),
593                 vidAuditStatus(jobId, "COMPLETED", true)
594      );
595     }
596
597     private ImmutableList<JobAuditStatus> msoAuditStatusesCompleted(String jobId ) {
598         return ImmutableList.of(
599                 msoAuditStatus(jobId, "REQUESTED", null, UUID.fromString(DEFAULT_REQUEST_ID)),
600                 msoAuditStatus(jobId, MSO_COMPLETE_STATUS, "Service Instance was created successfully.", UUID.fromString(DEFAULT_REQUEST_ID))
601         );
602     }
603
604     private JobAuditStatus msoAuditStatus(String jobId, String jobStatus, String additionalInfo, UUID requestId) {
605         return new JobAuditStatus(UUID.fromString(jobId), jobStatus, SourceStatus.MSO, requestId, additionalInfo, false);
606     }
607
608     private void assertServiceInfoSpecific2(String jobId, JobStatus jobStatus, String serviceInstanceName) {
609         assertServiceInfoSpecific2(jobId, jobStatus, serviceInstanceName, ServiceAction.INSTANTIATE);
610     }
611
612     private void assertServiceInfoSpecific2(String jobId, JobStatus jobStatus, String serviceInstanceName, ServiceAction serviceAction) {
613         assertExpectedStatusAndServiceInfo(jobStatus, jobId, PATIENCE_LEVEL.FAIL_VERY_SLOW, new ServiceInfo(
614                 "us16807000", jobStatus, false,
615                 "d61e6f2d-12fa-4cc2-91df-7c244011d6fc", "WayneHolland", "WATKINS",
616                 "JAG1", null,
617                 "092eb9e8e4b7412e8787dd091bc58e86", null,
618                 "AAIAIC25", null,
619                 "TYLER SILVIA", null,
620                 null, serviceInstanceName,
621                 "2f80c596-27e5-4ca9-b5bb-e03a7fd4c0fd", "action-data", "1.0",
622                 jobId, null, serviceAction, false)
623         );
624     }
625
626     private void assertServiceInfoSpecificDeletion(String jobId, JobStatus jobStatus, String serviceInstanceName, String serviceType) {
627         assertExpectedStatusAndServiceInfo(jobStatus, jobId, PATIENCE_LEVEL.FAIL_SLOW, new ServiceInfo(
628                 "us16807000", jobStatus, false,
629                 null, null, null,
630                 null, null,
631                 null, null,
632                 null, null,
633                 serviceType, null,
634                 null, serviceInstanceName,
635                 "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", "Grouping Service for Test", "1.0",
636                 jobId, null, ServiceAction.DELETE, false)
637         );
638     }
639
640     private void assertServiceInfoSpecificUpdate(String jobId, JobStatus jobStatus, String serviceInstanceName) {
641         assertExpectedStatusAndServiceInfo(jobStatus, jobId, PATIENCE_LEVEL.FAIL_SLOW, new ServiceInfo(
642                 "us16807000", jobStatus, false,
643                 null, null, null,
644                 null, null,
645                 null, null,
646                 null, null,
647                 "service-instance-type", null,
648                 "service-instance-id", serviceInstanceName,
649                 "4117a0b6-e234-467d-b5b9-fe2f68c8b0fc", "Grouping Service for Test", "1.0",
650                 jobId, null, ServiceAction.UPDATE, false)
651         );
652     }
653
654     enum Scenario {
655         PARALLEL, COMPLETED, NAME_TAKEN, DUPLICATE_NAME, IN_PROGRESS, MSO_FAIL
656     }
657
658 }