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