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