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