API test to verify simpleNoTaskInfo format
[vid.git] / vid-automation / src / test / java / org / onap / vid / api / ChangeManagementApiTest.java
1 package org.onap.vid.api;
2
3 import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals;
4 import static org.hamcrest.CoreMatchers.containsString;
5 import static org.hamcrest.MatcherAssert.assertThat;
6 import static org.hamcrest.core.IsEqual.equalTo;
7 import static org.hamcrest.core.IsInstanceOf.instanceOf;
8 import static org.onap.vid.api.ChangeManagementUserApiLoggingTest.MSO_GET_CHANGE_MANAGEMENTS_SCALEOUT;
9 import static org.onap.vid.api.TestUtils.getNestedPropertyInMap;
10 import static org.testng.AssertJUnit.assertEquals;
11 import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.APPEND;
12
13 import com.google.common.collect.ImmutableList;
14 import com.google.common.collect.ImmutableMap;
15 import com.google.common.collect.ImmutableSet;
16 import java.io.IOException;
17 import java.lang.reflect.Method;
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.Collections;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.Set;
24 import java.util.UUID;
25 import java.util.concurrent.Callable;
26 import java.util.concurrent.ExecutorService;
27 import java.util.concurrent.Executors;
28 import java.util.function.Consumer;
29 import java.util.stream.Collectors;
30 import java.util.stream.Stream;
31 import javax.ws.rs.HttpMethod;
32 import javax.ws.rs.client.Entity;
33 import javax.ws.rs.client.Invocation;
34 import javax.ws.rs.client.WebTarget;
35 import javax.ws.rs.core.GenericType;
36 import javax.ws.rs.core.MediaType;
37 import javax.ws.rs.core.Response;
38 import org.onap.simulator.presetGenerator.presets.aaf.AAFGetBasicAuthPreset;
39 import org.onap.simulator.presetGenerator.presets.aaf.AAFGetUrlServicePreset;
40 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetCloudOwnersByCloudRegionId;
41 import org.onap.simulator.presetGenerator.presets.aai.PresetAAIGetSubscribersGet;
42 import org.onap.simulator.presetGenerator.presets.mso.PresetMSOOrchestrationRequestsGetNoTaskInfoBody;
43 import org.onap.simulator.presetGenerator.presets.mso.changeManagement.PresetMsoChangeManagementBase;
44 import org.onap.simulator.presetGenerator.presets.mso.changeManagement.PresetMsoVnfInPlaceSoftwareUpdate;
45 import org.onap.simulator.presetGenerator.presets.mso.changeManagement.PresetMsoVnfReplace;
46 import org.onap.simulator.presetGenerator.presets.mso.changeManagement.PresetMsoVnfUpdate;
47 import org.onap.vid.model.mso.ChangeManagementRequest;
48 import org.onap.vid.model.mso.ChangeManagementRequestDetails;
49 import org.onap.vid.model.mso.CloudConfiguration;
50 import org.onap.vid.model.mso.MsoExceptionResponse;
51 import org.onap.vid.model.mso.MsoResponseWrapper2;
52 import org.onap.vid.model.mso.RelatedInstance;
53 import org.onap.vid.model.mso.RelatedInstanceList;
54 import org.onap.vid.model.mso.RequestInfo;
55 import org.onap.vid.model.mso.RequestParameters;
56 import org.onap.vid.model.workflow.GetVnfWorkflowRelationRequest;
57 import org.onap.vid.model.workflow.GetWorkflowsResponse;
58 import org.onap.vid.model.workflow.VnfDetails;
59 import org.onap.vid.model.workflow.VnfDetailsWithWorkflows;
60 import org.onap.vid.model.workflow.VnfWorkflowRelationAllResponse;
61 import org.onap.vid.model.workflow.VnfWorkflowRelationRequest;
62 import org.onap.vid.model.workflow.VnfWorkflowRelationResponse;
63 import org.onap.vid.model.workflow.WorkflowsDetail;
64 import org.onap.vid.more.LoggerFormatTest;
65 import org.springframework.http.HttpStatus;
66 import org.springframework.http.ResponseEntity;
67 import org.springframework.util.StopWatch;
68 import org.springframework.web.client.RestTemplate;
69 import org.testng.Assert;
70 import org.testng.annotations.BeforeClass;
71 import org.testng.annotations.DataProvider;
72 import org.testng.annotations.Test;
73 import vid.automation.test.infra.FeatureTogglingTest;
74 import vid.automation.test.infra.Features;
75 import vid.automation.test.services.SimulatorApi;
76 import vid.automation.test.services.SimulatorApi.RegistrationStrategy;
77 import vid.automation.test.utils.InsecureHttpsClient;
78 import vid.automation.test.utils.ReadFile;
79
80
81 //This is integration test that require running tomcat
82 public class ChangeManagementApiTest extends BaseApiTest {
83
84     public static final String WORKFLOW = "/workflow/{vnfname}";
85     public static final String APPLICATION_JSON = "application/json";
86     public static final String DELETE_SCHEDULE_OK_JSON = "delete_schedule_ok.json";
87     public static final String DELETE_SCHEDULE_NOT_AUTHORIZED_JSON = "delete_schedule_not_authorized.json";
88     private static final String UPDATE = "Update";
89     private static final String REPLACE = "Replace";
90     private static final List<String> WORKFLOWS = Arrays.asList(UPDATE, REPLACE);
91     public static final String CHANGE_MANAGEMENT = "change-management";
92     public static final String GET_VNF_WORKFLOW_RELATION = "get_vnf_workflow_relation";
93     public static final String VNF_WORKFLOW_RELATION = "vnf_workflow_relation";
94     public static final String SCHEDULER_BY_SCHEDULE_ID = "/scheduler/schedules/{scheduleId}";
95     public static final String MSO = "/mso";
96
97     @DataProvider
98     public static Object[][] requestWithoutServiceInstanceId(Method test) {
99         return new Object[][]{
100                 {"RelatedInstList null", (Consumer<ChangeManagementRequest>) changeManagementRequest -> changeManagementRequest.getRequestDetails().get(0).setRelatedInstList(null)},
101                 {"Empty list", (Consumer<ChangeManagementRequest>) changeManagementRequest -> changeManagementRequest.getRequestDetails().get(0).setRelatedInstList(new ArrayList<>())},
102                 {"Related instance null", (Consumer<ChangeManagementRequest>) changeManagementRequest -> changeManagementRequest.getRequestDetails().get(0).getRelatedInstList().get(0).setRelatedInstance(null)},
103                 {"instanceId null", (Consumer<ChangeManagementRequest>) changeManagementRequest -> changeManagementRequest.getRequestDetails().get(0).getRelatedInstList().get(0).getRelatedInstance().setInstanceId(null)}
104         };
105     }
106
107     @DataProvider
108     public static Object[][] requestWithoutPayload(Method test) {
109         return new Object[][]{
110                 {(Consumer<ChangeManagementRequest>) changeManagementRequest -> changeManagementRequest.getRequestDetails().get(0).getRequestParameters().getAdditionalProperties().clear()},
111                 {(Consumer<ChangeManagementRequest>) changeManagementRequest -> changeManagementRequest.getRequestDetails().get(0).setRequestParameters(null)},
112         };
113     }
114
115     @DataProvider
116     public static Object[][] wrongPayloads(Method test) {
117         return new Object[][]{
118                 {"{\"existing_software_version\": \"3.1%\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}", "existing_software_version"},
119                 {"{\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}", "existing_software_version"},
120                 {"{\"existing_software_version\": 3.1,\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}", "existing_software_version"},
121                 {"{\"existing_software_version\": \"\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}", "existing_software_version"},
122                 {"{\"existing_software_version\": null,\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}", "existing_software_version"},
123                 {"{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3^.2\", \"operations_timeout\": \"3600\"}", "new_software_version"},
124                 {"{\"existing_software_version\": \"3.1\",\"new_software_version\": 3.2, \"operations_timeout\": \"3600\"}", "new_software_version"},
125                 {"{\"existing_software_version\": \"3.1\", \"operations_timeout\": \"3600\"}", "new_software_version"},
126                 {"{\"existing_software_version\": \"3.1\",\"new_software_version\": \"\", \"operations_timeout\": \"3600\"}", "new_software_version"},
127                 {"{\"existing_software_version\": \"3.1\",\"new_software_version\": null, \"operations_timeout\": \"3600\"}", "new_software_version"},
128                 {"{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"a3600\"}", "operations_timeout"},
129                 {"{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\"}", "operations_timeout"},
130                 {"{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"\"}", "operations_timeout"},
131                 {"{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": null}", "operations_timeout"},
132                 {"", ""},
133         };
134     }
135
136     @DataProvider
137     public static Object[][] goodPayloads(Method test) {
138         return new Object[][]{
139                 {"{\"existing_software_version\": \"a3a.1\",\"new_software_version\": \"b3.2c\", \"operations_timeout\": \"3600\"}"},
140                 {"{\"existing_software_version\": \"a3a.1\",\"new_software_version\": \"b3.2c\", \"operations_timeout\": 3600}"},
141                 {"{\"existing_software_version\": \"a3a.1\",\"new_software_version\": \"b3.2c\", \"operations_timeout\": 3600, \"extra\": \"me\"}"},
142                 {"{\"existing_software_version\": \"3.1\",\"new_software_version\": \"a.c\", \"operations_timeout\": \"0180\"}"},
143
144         };
145     }
146
147     @DataProvider
148     public static Object[][] wrongConfigPayloads(Method test) {
149         return new Object[][]{
150                 {"{\"request-parameters\": \"3.1%\",\"new_software_version\": \"3.2\"}", "configuration-parameters"},
151                 {"{\"configuration-parameters\": 3.1,\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}", "request-parameters"},
152                 {"{\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}", "request-parameters"},
153                 {"{\"payload\": {\"configuration-parameters\": 3.1,\"request-parameters\": \"3.2\" }}", "request-parameters"},
154                 {"",""},
155         };
156     }
157
158     @DataProvider
159     public static Object[][] goodConfigPayloads(Method test){
160         return new Object[][]{
161                 {"{\"configuration-parameters\": 3.1,\"request-parameters\": \"3.2\" }"},
162                 {"{\"configuration-parameters\": 3.1,\"request-parameters\": \"3.2\", \"operations_timeout\": \"3600\"}"},
163                 {"{\"configuration-parameters\": 3.1,\"new_software_version\": \"3.2\",\"request-parameters\": \"3.2\" }"}
164         };
165     }
166
167     @DataProvider
168     public static Object[][] credentialsFilterTestData(Method test) {
169         return new Object[][]{
170                 {AAFGetBasicAuthPreset.VALID_AUTH_VALUE, 200},
171 //                {null, 401}, // No auth header   TODO: Uncomment when the bug in epsdk will be fixed. Currently If there is no auth header then no credentials validation.
172                 {"xyz", 401}, //undecodable value
173                 {"YUBiLmM6ZGVm", 401} //decodable value but not that expected by cadi filter (simulator)
174
175         };
176     }
177
178     @BeforeClass
179     public static void commonSimulatorRegistration() {
180         SimulatorApi.registerExpectationFromPreset(
181                 PresetAAIGetCloudOwnersByCloudRegionId.PRESET_MDT1_TO_ATT_NC,
182                 RegistrationStrategy.CLEAR_THEN_SET);
183         SimulatorApi.registerExpectationFromPreset(
184                 new AAFGetUrlServicePreset(),
185                 RegistrationStrategy.APPEND);
186         SimulatorApi.registerExpectationFromPreset(
187                 new AAFGetBasicAuthPreset(),
188                 RegistrationStrategy.APPEND);
189     }
190
191 //  IN_PLACE_SOFTWARE_UPDATE
192     @Test
193     public void testInPlaceSoftwareUpdateHappyPath() throws IOException {
194         testHappyPath("mso_in_place_software_update_ok.json", ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
195     }
196
197     @Test
198     public void testInPlaceSoftwareUpdate409Error() throws IOException {
199         testChangeManagement409Error("mso_in_place_software_update_error_409.json", ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
200     }
201
202     @Test
203     public void testInPlaceSoftwareUpdate404Error() throws IOException {
204         testChangeManagement404Error("mso_in_place_software_update_error_404.json", ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
205     }
206
207     @Test
208     public void testInPlaceSoftwareUpdateWithoutVnfInstanceId() throws IOException {
209         testChangeManagementWithoutVnfInstanceId(ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
210     }
211
212     @Test(dataProvider = "requestWithoutServiceInstanceId")
213     public void testInPlaceSoftwareUpdateWithoutServiceInstanceId(String desc, Consumer<ChangeManagementRequest> dropInstanceIdMethod) throws IOException {
214         testChangeManagementServiceInstanceId(dropInstanceIdMethod, ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
215     }
216
217     @Test(dataProvider = "wrongPayloads")
218     public void testInPlaceSoftwareUpdateInvalidPayload(String payload, String propertyName) throws IOException {
219         testChangeManagementInvalidPayload(payload, propertyName, ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
220     }
221
222     @Test(dataProvider = "requestWithoutPayload")
223     public void testInPlaceSoftwareUpdateWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod) throws IOException {
224         testChangeManagementWithoutPayload(dropPayloadMethod, ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
225     }
226
227     @Test(dataProvider = "goodPayloads")
228     public void testInPlaceSoftwareUpdateGoodPayload(String payload) throws IOException {
229         testChangeManagementGoodPayload(payload, "mso_in_place_software_update_ok.json", ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
230     }
231
232     @Test
233     public void testInPlaceSoftwareUpdateSimultaneousCalls() throws IOException, InterruptedException {
234         SimulatorApi.clearExpectations();
235         final int SIZE = 20;
236         StopWatch stopWatch = new StopWatch("InPlaceSoftwareUpdateSimultaneousCalls");
237
238         stopWatch.start("init");
239         ExecutorService executor = Executors.newFixedThreadPool(SIZE);
240         List<VnfIds> vnfList = Stream.generate(VnfIds::new).limit(SIZE).collect(Collectors.toList());
241         stopWatch.stop();
242
243         stopWatch.start("invoke registration to simulator");
244         List<Callable<String>> siumlatorRegistrations = vnfList.stream().map(
245                 vnfIds->((Callable<String>)() ->
246                 {
247                     SimulatorApi.registerExpectation(
248                             "mso_in_place_software_update_ok.json",
249                             ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId),
250                             RegistrationStrategy.APPEND);
251                     SimulatorApi.registerExpectationFromPreset(
252                             new AAFGetUrlServicePreset(),
253                             RegistrationStrategy.APPEND);
254                     SimulatorApi.registerExpectationFromPreset(
255                             new AAFGetBasicAuthPreset(),
256                             RegistrationStrategy.APPEND);
257                     return null;
258                 }))
259                 .collect(Collectors.toList());
260
261         executor.invokeAll(siumlatorRegistrations)
262                 .forEach(future -> {
263                     try {
264                         future.get();
265                     }
266                     catch (Exception e) {
267                         throw new RuntimeException(e);
268                     }
269                 });
270         stopWatch.stop();
271
272         stopWatch.start("init requests");
273         List<ChangeManagementRequest> requestsList = vnfList.stream().map(vnfIds -> this.createChangeManagementRequest(vnfIds, ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE)).collect(Collectors.toList());
274         WebTarget webTarget = buildWebTarget("VidVnf");
275         List<Callable<Response>> callables = requestsList.stream().map(request->((Callable<Response>) () -> webTarget.request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", "Basic " + AAFGetBasicAuthPreset.VALID_AUTH_VALUE).post(Entity.json(request)))).collect(Collectors.toList());
276         stopWatch.stop();
277
278         stopWatch.start("invoke calling to vid");
279         List<MsoResponseWrapper2> responseList = executor.invokeAll(callables)
280                 .stream()
281                 .map(future -> {
282                     try {
283                         return future.get().readEntity(MsoResponseWrapper2.class);
284                     }
285                     catch (Exception e) {
286                         throw new RuntimeException(e);
287                     }
288                 })
289                 .collect(Collectors.toList());
290         stopWatch.stop();
291
292         stopWatch.start("assertion");
293         Assert.assertEquals(responseList.size(),SIZE,"Failed to get all responses from server");
294         responseList.forEach(response->Assert.assertEquals(response.getStatus(), 202, "wrong http status for "+response.getEntity() ));
295         vnfList.forEach(vnfIds->
296                 Assert.assertTrue(isTextContainsInList(responseList, vnfIds.serviceInstanceId),
297                         "Failed to find response for isntanceId: "+vnfIds.serviceInstanceId));
298         stopWatch.stop();
299         System.out.print(stopWatch.prettyPrint());
300     }
301
302
303     @Test
304     @FeatureTogglingTest(Features.FLAG_EXP_USE_FORMAT_PARAMETER_FOR_CM_DASHBOARD)
305     public void getOrchestrationForDashboardShouldResponseWithNoTaskInfoBody() {
306         SimulatorApi.registerExpectation(MSO_GET_CHANGE_MANAGEMENTS_SCALEOUT, RegistrationStrategy.CLEAR_THEN_SET);
307         SimulatorApi.registerExpectationFromPreset(new PresetMSOOrchestrationRequestsGetNoTaskInfoBody(), APPEND);
308         ResponseEntity<String> responseEntity = restTemplate.getForEntity(buildUri(CHANGE_MANAGEMENT + MSO ), String.class);
309
310         String expected = getResourceAsString("changeManagement/responseNoTaskInfoBody.json");
311         assertThat(responseEntity.getBody(), jsonEquals(expected));
312
313     }
314
315 //  CONFIG_UPDATE
316     @Test
317     public void testConfigUpdateHappyPath() throws IOException {
318         testHappyPath("mso_config_update_ok.json", ChangeManagementRequest.CONFIG_UPDATE);
319     }
320
321     @Test
322     public void testConfigUpdate409Error() throws IOException {
323         testChangeManagement409Error("mso_config_update_error_409.json", ChangeManagementRequest.CONFIG_UPDATE);
324     }
325
326     @Test
327     public void testConfigUpdate404Error() throws IOException {
328         testChangeManagement404Error("mso_config_update_error_404.json", ChangeManagementRequest.CONFIG_UPDATE);
329     }
330
331     @Test
332     public void testConfigUpdateWithoutVnfInstanceId() throws IOException {
333         testChangeManagementWithoutVnfInstanceId(ChangeManagementRequest.CONFIG_UPDATE);
334     }
335
336     @Test(dataProvider = "requestWithoutServiceInstanceId")
337     public void testConfigUpdateWithoutServiceInstanceId(String desc, Consumer<ChangeManagementRequest> dropInstanceIdMethod) throws IOException {
338         testChangeManagementServiceInstanceId(dropInstanceIdMethod, ChangeManagementRequest.CONFIG_UPDATE);
339     }
340
341     @Test(dataProvider = "wrongConfigPayloads")
342     public void testConfigUpdateInvalidPayload(String payload, String propertyName) throws IOException {
343         testChangeManagementInvalidPayload(payload, propertyName, ChangeManagementRequest.CONFIG_UPDATE);
344     }
345
346     @Test(dataProvider = "requestWithoutPayload")
347     public void testConfigUpdateWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod) throws IOException {
348         testChangeManagementWithoutPayload(dropPayloadMethod, ChangeManagementRequest.CONFIG_UPDATE);
349     }
350
351     @Test(dataProvider = "goodConfigPayloads")
352     public void testConfigUpdateGoodPayload(String payload) throws IOException {
353         testChangeManagementGoodPayload(payload, "mso_config_update_ok.json", ChangeManagementRequest.CONFIG_UPDATE);
354     }
355
356     @Test(dataProvider = "credentialsFilterTestData")
357     public void testCadiCredentialsFilter(String authValue, int expectedStatusCode)
358     {
359         VnfIds vnfIds = new VnfIds();
360         ChangeManagementRequest changeManagementRequest = createBasicChangeManagementRequest(vnfIds);
361         changeManagementRequest.setRequestType(ChangeManagementRequest.REPLACE);
362         WebTarget webTarget = buildWebTarget(vnfIds.vnfName);
363         Entity entity = Entity.json(changeManagementRequest);
364         Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON_TYPE);
365         if (authValue != null) {
366             invocationBuilder.header("Authorization", "Basic " + authValue);
367         }
368         Response response = invocationBuilder.post(entity);
369         String body = response.readEntity(String.class);
370         Assert.assertEquals(response.getStatus(), expectedStatusCode, "Full response: " + body);
371     }
372
373     @DataProvider
374     public static Object[][] requestFromSchedulerDataProvider(Method test) {
375         return new Object[][]{
376                 {
377                     "e9181708-f105-4dfd-9a36-0e089faa72ba",
378                     new PresetMsoVnfReplace("254583ad-b38c-498b-bdbd-b8de5e07541b", "e9181708-f105-4dfd-9a36-0e089faa72ba"),
379                     "changeManagement/vnfReplaceRequest.json"
380                 },
381                 {
382                     "c929b7ec-cc9d-11e8-a8d5-f2801f1b9fd1",
383                     new PresetMsoVnfUpdate("d0c59d4a-cc9d-11e8-a8d5-f2801f1b9fd1","c929b7ec-cc9d-11e8-a8d5-f2801f1b9fd1"),
384                     "changeManagement/vnfUpdateRequest.json"
385                 },
386                 {
387                     "e5403738-da34-4090-8864-ba9cf1bcdd88",
388                     new PresetMsoVnfInPlaceSoftwareUpdate("12709275-787c-4be7-8c9c-fce64ab7ca8c","e5403738-da34-4090-8864-ba9cf1bcdd88"),
389                     "changeManagement/vnfInPlaceSoftwareUpdate.json"
390                 }
391         };
392     }
393
394     @Test(dataProvider = "requestFromSchedulerDataProvider")
395     public void whenGetFromSchedulerRequest_sendAsExpectedToMso(String vnfInstanceId, PresetMsoChangeManagementBase preset, String requestPath) {
396         SimulatorApi.registerExpectationFromPreset(
397                 preset,
398                 RegistrationStrategy.APPEND);
399         String schedulerRequest = ReadFile.loadResourceAsString(requestPath);
400         Response response = callChangeManagement("VidVnf", Entity.json(schedulerRequest));
401         MsoResponseWrapper2 body = response.readEntity(MsoResponseWrapper2.class);
402         assertEquals(202, body.getStatus());
403         assertEquals(vnfInstanceId, getNestedPropertyInMap(body.getEntity(), "requestReferences/instanceId"));
404     }
405
406
407     private void testHappyPath(String expectationPath, String requestType) {
408         VnfIds vnfIds = new VnfIds();
409         MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
410         assertForHappyPath(vnfIds, body, requestType);
411     }
412
413     private void assertForHappyPath(VnfIds vnfIds, MsoResponseWrapper2 body, String requestType) {
414         Assert.assertEquals(body.getStatus(), 202, requestType + " failed with wrong http status");
415         Assert.assertEquals(
416                 getNestedPropertyInMap(body.getEntity(), "requestReferences/instanceId"),
417                 vnfIds.serviceInstanceId,
418                 String.format("Failed to find instanceId: %s in " + requestType + " response.  Actual body:%s",
419                         vnfIds.serviceInstanceId, body.getEntity()));
420     }
421
422     private <T> T callChangeManagementUpdate(VnfIds vnfIds, String expectationPath, Class<T> responseClass, String requestType) {
423         SimulatorApi.registerExpectation(
424                 expectationPath,
425                 ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.APPEND);
426         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
427         Response response =  callChangeManagementUpdate(vnfIds, changeManagementRequest);
428         return response.readEntity(responseClass);
429     }
430
431     private Response callChangeManagementUpdate(VnfIds vnfIds, ChangeManagementRequest changeManagementRequest) {
432         Entity entity = Entity.json(changeManagementRequest);
433         return callChangeManagement(vnfIds.vnfName, entity);
434     }
435
436     private Response callChangeManagement(String vnfName, Entity entity) {
437         WebTarget webTarget = buildWebTarget(vnfName);
438         return webTarget.request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", "Basic " + AAFGetBasicAuthPreset.VALID_AUTH_VALUE).post(entity);
439     }
440
441     private WebTarget buildWebTarget(String vnfName) {
442         return client.target(uri).
443                 path(CHANGE_MANAGEMENT + WORKFLOW).resolveTemplate("vnfname", vnfName);
444     }
445
446     private void testChangeManagement409Error(String expectationPath, String requestType) throws IOException {
447         VnfIds vnfIds = new VnfIds();
448         MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
449         Assert.assertEquals(body.getStatus(), 409, requestType + " failed with wrong http status");
450         Assert.assertEquals(
451                 getNestedPropertyInMap(body.getEntity(), "serviceException/messageId"),
452                 "SVC2000",
453                 String.format("Failed to find messageId: %s in " + requestType + " response.  Actual body:%s",
454                         "SVC2000", body.getEntity()));
455
456
457         assertThat(getNestedPropertyInMap(body.getEntity(), "serviceException/text"), containsString(vnfIds.vnfInstanceId));
458     }
459
460     private void testChangeManagement404Error(String expectationPath, String requestType) throws IOException {
461         VnfIds vnfIds = new VnfIds();
462         MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
463         Assert.assertEquals(body.getStatus(), 404, requestType + " failed with wrong http status");
464         assertThat(body.getEntity(), equalTo("<html><head><title>Error</title></head><body>404 - Not Found</body></html>"));
465     }
466
467     private void testChangeManagementWithoutVnfInstanceId(String requestType) throws IOException {
468         VnfIds vnfIds = new VnfIds();
469         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
470         changeManagementRequest.getRequestDetails().get(0).setVnfInstanceId(null);
471         MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
472         assertThat(exceptionResponse.serviceException.text, containsString("No vnfInstanceId in request"));
473     }
474
475     private void testChangeManagementServiceInstanceId(Consumer<ChangeManagementRequest> dropInstanceIdMethod, String requestType) throws IOException {
476         VnfIds vnfIds = new VnfIds();
477         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
478         dropInstanceIdMethod.accept(changeManagementRequest);
479         MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
480         assertThat(exceptionResponse.serviceException.text, containsString("No instanceId in request"));
481     }
482
483     private void testChangeManagementInvalidPayload(String payload, String propertyName, String requestType) throws IOException {
484         VnfIds vnfIds = new VnfIds();
485         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
486         changeManagementRequest.getRequestDetails().get(0).getRequestParameters().getAdditionalProperties().put("payload",payload);
487         MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
488         assertThat(exceptionResponse.serviceException.text, containsString(propertyName));
489         assertThat(exceptionResponse.serviceException.text, containsString("No valid payload"));
490     }
491
492     private void testChangeManagementWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod, String requestType) throws IOException {
493         VnfIds vnfIds = new VnfIds();
494         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
495         dropPayloadMethod.accept(changeManagementRequest);
496         MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
497         assertThat(exceptionResponse.serviceException.text, containsString("No valid payload"));
498     }
499
500     private MsoExceptionResponse callChangeManagementAndExpectForException(VnfIds vnfIds, ChangeManagementRequest changeManagementRequest, String requestType) {
501         Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest);
502         Assert.assertEquals(response.getStatus(), HttpStatus.OK.value() , requestType + " wrong http status");
503         MsoResponseWrapper2<MsoExceptionResponse> msoResponseWrapper2 = response.readEntity(new GenericType<MsoResponseWrapper2<MsoExceptionResponse>>(){});
504         assertThat(msoResponseWrapper2.getStatus(), equalTo(400));
505         assertThat(msoResponseWrapper2.getEntity(), instanceOf(MsoExceptionResponse.class));
506         return (MsoExceptionResponse) msoResponseWrapper2.getEntity();
507     }
508
509     private void testChangeManagementGoodPayload(String payload, String expectationFileName, String requestType) throws IOException {
510         VnfIds vnfIds = new VnfIds();
511         SimulatorApi.registerExpectation(
512                 expectationFileName,
513                 ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.APPEND);
514         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
515         changeManagementRequest.getRequestDetails().get(0).getRequestParameters().getAdditionalProperties().put("payload",payload);
516         Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest);
517         MsoResponseWrapper2 body = response.readEntity(MsoResponseWrapper2.class);
518         assertForHappyPath(vnfIds, body, requestType);
519         RestTemplate manualRestTemplate = InsecureHttpsClient.newRestTemplate();
520         super.loginWithChosenRESTClient(getUserCredentials(), manualRestTemplate);
521         SimulatorApi.registerExpectationFromPreset( new PresetAAIGetSubscribersGet(), RegistrationStrategy.APPEND);
522         LoggerFormatTest
523             .verifyExistenceOfIncomingReqsInAuditLogs(manualRestTemplate, uri,
524                 response.getHeaders().get("X-ECOMP-RequestID-echo").get(0).toString(),
525                 "/vid/change-management/workflow/VidVnf");
526
527     }
528
529     private ChangeManagementRequest createChangeManagementRequest(VnfIds vnfDetails, String requestType) {
530         ChangeManagementRequest changeManagementRequest = createBasicChangeManagementRequest(vnfDetails);
531         changeManagementRequest.setRequestType(requestType);
532         if(requestType.equals(ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE)) {
533             CloudConfiguration cloudConfiguration = new CloudConfiguration();
534             cloudConfiguration.lcpCloudRegionId = "mdt1";
535             cloudConfiguration.tenantId = "88a6ca3ee0394ade9403f075db23167e";
536             changeManagementRequest.getRequestDetails().get(0).setCloudConfiguration(cloudConfiguration);
537         }
538         changeManagementRequest.getRequestDetails().get(0).getRequestParameters().setAdditionalProperty("payload", getPayload(requestType));
539         return changeManagementRequest;
540     }
541
542     private ChangeManagementRequest createBasicChangeManagementRequest(VnfIds vnfDetails)
543     {
544         ChangeManagementRequestDetails requestDetails = new ChangeManagementRequestDetails();
545
546 //        org.onap.vid.domain.mso.CloudConfiguration cloudConfiguration = new org.onap.vid.domain.mso.CloudConfiguration();
547 //        cloudConfiguration.setLcpCloudRegionId("mdt1");
548 //        cloudConfiguration.setTenantId("88a6ca3ee0394ade9403f075db23167e");
549 //        requestDetails.setCloudConfiguration(cloudConfiguration);
550
551         RequestInfo requestInfo = new RequestInfo();
552         requestInfo.setSource("VID");
553         requestInfo.setRequestorId("az2016");
554         requestDetails.setRequestInfo(requestInfo);
555
556         RequestParameters requestParameters = new RequestParameters();
557         requestDetails.setRequestParameters(requestParameters);
558
559         RelatedInstance relatedInstance = new RelatedInstance();
560         relatedInstance.instanceId = vnfDetails.serviceInstanceId;
561         RelatedInstanceList relatedInstanceList = new RelatedInstanceList();
562         relatedInstanceList.setRelatedInstance(relatedInstance);
563         requestDetails.setRelatedInstList(Collections.singletonList(relatedInstanceList));
564
565         requestDetails.setVnfName(vnfDetails.vnfName);
566         requestDetails.setVnfInstanceId(vnfDetails.vnfInstanceId);
567
568         ChangeManagementRequest changeManagementRequest = new ChangeManagementRequest();
569         changeManagementRequest.setRequestDetails(Collections.singletonList(requestDetails));
570         return changeManagementRequest;
571     }
572
573     private String getPayload(String requestType) {
574         if(requestType.equals(ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE)) {
575             return "{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}";
576         }
577         else if(requestType.equals(ChangeManagementRequest.CONFIG_UPDATE)) {
578             return "{\"request-parameters\": \"3.1\",\"configuration-parameters\": \"3.2\", \"operations_timeout\": \"3600\"}";
579         }
580         return "";
581     }
582
583     private boolean isTextContainsInList(List<MsoResponseWrapper2> responseList, String str) {
584         for (MsoResponseWrapper2 response : responseList) {
585             if (response.getEntity().toString().contains(str))
586                 return true;
587         }
588         return false;
589     }
590
591 //    @Test
592     public void testVnfWorkflowApiCRD() throws IOException {
593         List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(10);
594
595         //create vnf to workflows relations
596         VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
597         vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
598
599         //ensure all relations exist using get workflows for vnf
600         ensureAllVnfToWorkflowsExist(workflowsDetails);
601
602         //ensure all relations exist using get all vnf_to_workflows relations
603         Response response = vnfWorkFlowOperationOK(HttpMethod.GET, null);
604         VnfWorkflowRelationAllResponse vnfWorkflowRelationAllResponse = response.readEntity(VnfWorkflowRelationAllResponse.class);
605         Map<VnfDetails, List<String>> vnfDetailsToWorkflowsMap = vnfWorkflowRelationAllResponse.getVnfs().stream()
606                 .collect(Collectors.toMap(x -> new VnfDetails(x.getUUID(), x.getInvariantUUID()), VnfDetailsWithWorkflows::getWorkflows));
607
608         workflowsDetails.forEach(workflowsDetail ->
609                 Assert.assertTrue(vnfDetailsToWorkflowsMap.get(workflowsDetail.getVnfDetails()).contains(workflowsDetail.getWorkflowName())));
610
611         //delete vnf to workflows relations
612         vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
613
614         //make sure all relations not exist any more
615         ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
616
617     }
618
619     private void ensureAllVnfToWorkflowsExist(List<WorkflowsDetail> workflowsDetails) throws IOException {
620         for (WorkflowsDetail workflowsDetail : workflowsDetails) {
621             GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest = new GetVnfWorkflowRelationRequest(Collections.singletonList(workflowsDetail.getVnfDetails()));
622             GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(getVnfWorkflowRelationRequest);
623             Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 1);
624             Assert.assertEquals(getWorkflowsResponse.getWorkflows().get(0), workflowsDetail.getWorkflowName());
625         }
626     }
627
628     private void ensureAllVnfToWorkflowsRelationsNotExist(List<WorkflowsDetail> workflowsDetails) throws IOException {
629         for (WorkflowsDetail workflowsDetail : workflowsDetails) {
630             GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest = new GetVnfWorkflowRelationRequest(Collections.singletonList(workflowsDetail.getVnfDetails()));
631             GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(getVnfWorkflowRelationRequest);
632             Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 0);
633         }
634     }
635
636 //    @Test
637     public void testVnfWorkflowIntersection() throws IOException {
638         List<WorkflowsDetail> workflowsDetails = new ArrayList<>();
639         List<VnfDetails> vnfDetailsList = new ArrayList<>();
640         //0 - UPDATE,REPLACE
641         VnfDetails vnfDetails = generateRandomVnfDetails(vnfDetailsList);
642         workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
643         workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
644         //1 - UPDATE,REPLACE
645         vnfDetails = generateRandomVnfDetails(vnfDetailsList);
646         workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
647         workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
648         //2 - REPLACE
649         vnfDetails = generateRandomVnfDetails(vnfDetailsList);
650         workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
651         //3 - REPLACE
652         vnfDetails = generateRandomVnfDetails(vnfDetailsList);
653         workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
654         //4 - UPDATE
655         vnfDetails = generateRandomVnfDetails(vnfDetailsList);
656         workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
657
658         VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
659         vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
660
661         Set<String> replaceUpdateSet = ImmutableSet.of(REPLACE, UPDATE);
662         Set<String> replaceSet = ImmutableSet.of(REPLACE);
663         Set<String> emptySet = ImmutableSet.of();
664
665         assertWorkflowsListSize(vnfDetailsList, replaceUpdateSet, 0, 1);
666         assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 2);
667         assertWorkflowsListSize(vnfDetailsList, replaceSet, 2, 3);
668         assertWorkflowsListSize(vnfDetailsList, emptySet, 3, 4);
669         assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 1, 2);
670         assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 1, 2, 3);
671         assertWorkflowsListSize(vnfDetailsList, emptySet, 0, 1, 2, 3, 4);
672         assertWorkflowsListSize(vnfDetailsList, replaceUpdateSet, 0);
673
674         //delete vnf to workflows relations
675         vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
676         ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
677
678         //get vnf that was inserted and relation were removed return empty set
679         assertWorkflowsListSize(vnfDetailsList, emptySet, 0);
680     }
681
682     @Test
683     public void testGetVnfThatWasNeverInsertedReturn404() throws IOException {
684         //get vnf that was never inserted return 404
685         assertWorkflowsResponse(new GetVnfWorkflowRelationRequest(ImmutableList.of(generateRandomVnfDetails())), HttpStatus.NOT_FOUND);
686     }
687
688 //    @Test
689     void testDeleteVnfThatWasNeverInserted() throws IOException {
690         //delete vnf that was never inserted return 200 with error in body
691         WorkflowsDetail randomWorkfowDetail = generateRandomWorkflowsDetail();
692         Response response = vnfWorkFlowOperationOK(HttpMethod.DELETE, new VnfWorkflowRelationRequest(ImmutableList.of(randomWorkfowDetail)));
693         VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
694         Assert.assertEquals(vnfWorkflowRelationResponse.getErrors().size(), 1);
695         Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(randomWorkfowDetail.getVnfDetails().getUUID()));
696         Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(randomWorkfowDetail.getVnfDetails().getInvariantUUID()));
697     }
698
699 //    @Test
700     public void testInsertSameVnfToWorkflowsTwice() throws IOException {
701         List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(1);
702         VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
703         vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
704         vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
705
706         //ensure workflow exist
707         ensureAllVnfToWorkflowsExist(workflowsDetails);
708
709         //delete vnf to workflows relations
710         vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
711
712         //make sure all relations not exist any more
713         ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
714     }
715
716 //    @Test
717     public void testMultipleVnfsWhileOneWorkflowNotExist() throws IOException {
718         List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(3);
719
720         //relation 0 add relation to non exist workflow
721         WorkflowsDetail nonExistWorkflowsDetail = workflowsDetails.get(0);
722         nonExistWorkflowsDetail.setWorkflowName("NotExist");
723         VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
724
725         Response response = vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
726         VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
727         assertErrorResponseForWorkflowDetail(nonExistWorkflowsDetail, vnfWorkflowRelationResponse);
728
729         //ensure other vnf  to workflows exist
730         ensureAllVnfToWorkflowsExist(workflowsDetails.subList(1, workflowsDetails.size()));
731
732         //ensure there is no workflow for vnf 0
733         GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(
734                 new GetVnfWorkflowRelationRequest(ImmutableList.of(nonExistWorkflowsDetail.getVnfDetails())));
735         Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 0);
736
737         //delete vnf to workflows relations
738         response = vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
739         vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
740         assertErrorResponseForWorkflowDetail(nonExistWorkflowsDetail, vnfWorkflowRelationResponse);
741
742         //make sure all relations not exist any more
743         ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
744     }
745
746 //    @Test
747     public void testInsertVnfWithEmptyUUID() throws IOException {
748         assertAddVnfWithEmptyIdReturn404((vnfDetails -> vnfDetails.setUUID("")));
749     }
750
751 //    @Test
752     public void testInsertVnfWithEmptyInvariantUUID() throws IOException {
753         assertAddVnfWithEmptyIdReturn404((vnfDetails -> vnfDetails.setInvariantUUID("")));
754     }
755
756     @Test
757     //This test requires a simulator which runs on VID and is mocking Scheduler
758     public void testDeleteScheduledWorkflowOk() throws Exception {
759         //Register required response
760         SimulatorApi.registerExpectation(DELETE_SCHEDULE_OK_JSON, RegistrationStrategy.APPEND);
761         assertCancelScheduleResponse(HttpStatus.NO_CONTENT);//204
762     }
763
764     @Test
765     //This test requires a simulator which runs on VID and is mocking Scheduler
766     public void testDeleteScheduledWorkflowNotFound() throws Exception {
767         //Register required response
768         SimulatorApi.registerExpectation(DELETE_SCHEDULE_NOT_AUTHORIZED_JSON, RegistrationStrategy.APPEND);
769         assertCancelScheduleResponse(HttpStatus.UNAUTHORIZED);//401
770     }
771
772     private void assertAddVnfWithEmptyIdReturn404(Consumer<VnfDetails> emptyIdSetter) throws IOException {
773         List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(1);
774         emptyIdSetter.accept(workflowsDetails.get(0).getVnfDetails());
775         VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
776         Response response = vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
777         VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
778         assertErrorResponseForWorkflowDetail(workflowsDetails.get(0), vnfWorkflowRelationResponse);
779         assertWorkflowsResponse(new GetVnfWorkflowRelationRequest(ImmutableList.of(generateRandomVnfDetails())), HttpStatus.NOT_FOUND);
780     }
781
782     private void assertErrorResponseForWorkflowDetail(WorkflowsDetail wrongWorkflowsDetail, VnfWorkflowRelationResponse vnfWorkflowRelationResponse) {
783         Assert.assertEquals(vnfWorkflowRelationResponse.getErrors().size(), 1);
784         Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getWorkflowName()));
785         Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getVnfDetails().getUUID()));
786         Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getVnfDetails().getInvariantUUID()));
787     }
788
789     private VnfDetails generateRandomVnfDetails(List<VnfDetails> vnfDetailsList) {
790         VnfDetails vnfDetails = generateRandomVnfDetails();
791         vnfDetailsList.add(vnfDetails);
792         return vnfDetails;
793     }
794
795     private VnfDetails generateRandomVnfDetails() {
796         return new VnfDetails(UUID.randomUUID().toString(), UUID.randomUUID().toString());
797     }
798
799     private void assertWorkflowsListSize(List<VnfDetails> inputList, Set<String> exceptedWorkflows, int... indices) throws IOException {
800         List<VnfDetails> vnfDetailsList = new ArrayList<>();
801         for (int index : indices) {
802             vnfDetailsList.add(inputList.get(index));
803         }
804         GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(new GetVnfWorkflowRelationRequest(vnfDetailsList));
805         Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), exceptedWorkflows.size());
806         Assert.assertTrue(getWorkflowsResponse.getWorkflows().containsAll(exceptedWorkflows));
807     }
808
809     private void assertCancelScheduleResponse(HttpStatus expectedStatus) {
810         WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + SCHEDULER_BY_SCHEDULE_ID.replace("{scheduleId}", "1234"));
811         Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).delete();
812         Assert.assertEquals(response.getStatus(), expectedStatus.value());
813     }
814
815     private GetWorkflowsResponse getWorkflowsResponseOK(GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest) throws IOException {
816         WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + GET_VNF_WORKFLOW_RELATION);
817         Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(getVnfWorkflowRelationRequest));
818         TestUtils.assertStatusOK(getVnfWorkflowRelationRequest, webTarget, response);
819         return response.readEntity(GetWorkflowsResponse.class);
820     }
821
822     private void assertWorkflowsResponse(GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest, HttpStatus exceptedHttpStatus) throws IOException {
823         WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + GET_VNF_WORKFLOW_RELATION);
824         Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(getVnfWorkflowRelationRequest));
825         TestUtils.assertHttpStatus(getVnfWorkflowRelationRequest, webTarget, response, exceptedHttpStatus);
826         response.readEntity(VnfWorkflowRelationResponse.class); //assert the body is of type VnfWorkflowRelationResponse
827         Assert.assertTrue(((String) response.getHeaders().get("Content-Type").get(0)).contains(APPLICATION_JSON));
828     }
829
830     private Response vnfWorkFlowOperationOK(String method, VnfWorkflowRelationRequest vnfWorkflowRelationRequest) throws IOException {
831         return vnfWorkFlowOperation(method, vnfWorkflowRelationRequest, HttpStatus.OK);
832     }
833
834     private Response vnfWorkFlowOperation(String method, VnfWorkflowRelationRequest vnfWorkflowRelationRequest, HttpStatus exceptedHttpStatus) throws IOException {
835         WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + VNF_WORKFLOW_RELATION);
836         Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).method(method, Entity.json(vnfWorkflowRelationRequest));
837         TestUtils.assertHttpStatus(vnfWorkflowRelationRequest, webTarget, response, exceptedHttpStatus);
838         return response;
839     }
840
841     @SuppressWarnings("SameParameterValue")
842     private List<WorkflowsDetail> generateWorkflowsDetails(int size) {
843         List<WorkflowsDetail> workflowsDetails = new ArrayList<>(size);
844         for (int i = 0; i < size; i++) {
845             workflowsDetails.add(i, generateRandomWorkflowsDetail());
846         }
847         return workflowsDetails;
848     }
849
850     private WorkflowsDetail generateRandomWorkflowsDetail() {
851         String workflow = WORKFLOWS.get(random.nextInt(WORKFLOWS.size()));
852         VnfDetails vnfDetails = generateRandomVnfDetails();
853         return new WorkflowsDetail(vnfDetails, workflow);
854     }
855
856     static public class VnfIds {
857         public String serviceInstanceId;
858         public String vnfInstanceId;
859         public String vnfName;
860
861         public VnfIds() {
862             this.serviceInstanceId = UUID.randomUUID().toString();
863             this.vnfInstanceId = UUID.randomUUID().toString();
864             this.vnfName = "VidVnf";
865         }
866
867
868     }
869
870 }