6416244aaeb48ec586dbc654fbb0817ede328780
[vid.git] / vid-automation / src / test / java / org / onap / vid / api / ChangeManagementApiTest.java
1 package org.onap.vid.api;
2
3 import static org.hamcrest.CoreMatchers.containsString;
4 import static org.hamcrest.MatcherAssert.assertThat;
5 import static org.hamcrest.core.IsEqual.equalTo;
6 import static org.hamcrest.core.IsInstanceOf.instanceOf;
7 import static org.onap.vid.api.ChangeManagementUserApiLoggingTest.MSO_GET_CHANGE_MANAGEMENTS_SCALEOUT;
8 import static org.onap.vid.api.TestUtils.getNestedPropertyInMap;
9 import static org.testng.AssertJUnit.assertEquals;
10 import static org.testng.AssertJUnit.assertFalse;
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 getOrchestrationForDashboardShouldResponseWithFullBody() {
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         assertFalse(responseEntity.getBody().contains("requestProcessingData"));
311
312     }
313
314 //  CONFIG_UPDATE
315     @Test
316     public void testConfigUpdateHappyPath() throws IOException {
317         testHappyPath("mso_config_update_ok.json", ChangeManagementRequest.CONFIG_UPDATE);
318     }
319
320     @Test
321     public void testConfigUpdate409Error() throws IOException {
322         testChangeManagement409Error("mso_config_update_error_409.json", ChangeManagementRequest.CONFIG_UPDATE);
323     }
324
325     @Test
326     public void testConfigUpdate404Error() throws IOException {
327         testChangeManagement404Error("mso_config_update_error_404.json", ChangeManagementRequest.CONFIG_UPDATE);
328     }
329
330     @Test
331     public void testConfigUpdateWithoutVnfInstanceId() throws IOException {
332         testChangeManagementWithoutVnfInstanceId(ChangeManagementRequest.CONFIG_UPDATE);
333     }
334
335     @Test(dataProvider = "requestWithoutServiceInstanceId")
336     public void testConfigUpdateWithoutServiceInstanceId(String desc, Consumer<ChangeManagementRequest> dropInstanceIdMethod) throws IOException {
337         testChangeManagementServiceInstanceId(dropInstanceIdMethod, ChangeManagementRequest.CONFIG_UPDATE);
338     }
339
340     @Test(dataProvider = "wrongConfigPayloads")
341     public void testConfigUpdateInvalidPayload(String payload, String propertyName) throws IOException {
342         testChangeManagementInvalidPayload(payload, propertyName, ChangeManagementRequest.CONFIG_UPDATE);
343     }
344
345     @Test(dataProvider = "requestWithoutPayload")
346     public void testConfigUpdateWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod) throws IOException {
347         testChangeManagementWithoutPayload(dropPayloadMethod, ChangeManagementRequest.CONFIG_UPDATE);
348     }
349
350     @Test(dataProvider = "goodConfigPayloads")
351     public void testConfigUpdateGoodPayload(String payload) throws IOException {
352         testChangeManagementGoodPayload(payload, "mso_config_update_ok.json", ChangeManagementRequest.CONFIG_UPDATE);
353     }
354
355     @Test(dataProvider = "credentialsFilterTestData")
356     public void testCadiCredentialsFilter(String authValue, int expectedStatusCode)
357     {
358         VnfIds vnfIds = new VnfIds();
359         ChangeManagementRequest changeManagementRequest = createBasicChangeManagementRequest(vnfIds);
360         changeManagementRequest.setRequestType(ChangeManagementRequest.REPLACE);
361         WebTarget webTarget = buildWebTarget(vnfIds.vnfName);
362         Entity entity = Entity.json(changeManagementRequest);
363         Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON_TYPE);
364         if (authValue != null) {
365             invocationBuilder.header("Authorization", "Basic " + authValue);
366         }
367         Response response = invocationBuilder.post(entity);
368         String body = response.readEntity(String.class);
369         Assert.assertEquals(response.getStatus(), expectedStatusCode, "Full response: " + body);
370     }
371
372     @DataProvider
373     public static Object[][] requestFromSchedulerDataProvider(Method test) {
374         return new Object[][]{
375                 {
376                     "e9181708-f105-4dfd-9a36-0e089faa72ba",
377                     new PresetMsoVnfReplace("254583ad-b38c-498b-bdbd-b8de5e07541b", "e9181708-f105-4dfd-9a36-0e089faa72ba"),
378                     "changeManagement/vnfReplaceRequest.json"
379                 },
380                 {
381                     "c929b7ec-cc9d-11e8-a8d5-f2801f1b9fd1",
382                     new PresetMsoVnfUpdate("d0c59d4a-cc9d-11e8-a8d5-f2801f1b9fd1","c929b7ec-cc9d-11e8-a8d5-f2801f1b9fd1"),
383                     "changeManagement/vnfUpdateRequest.json"
384                 },
385                 {
386                     "e5403738-da34-4090-8864-ba9cf1bcdd88",
387                     new PresetMsoVnfInPlaceSoftwareUpdate("12709275-787c-4be7-8c9c-fce64ab7ca8c","e5403738-da34-4090-8864-ba9cf1bcdd88"),
388                     "changeManagement/vnfInPlaceSoftwareUpdate.json"
389                 }
390         };
391     }
392
393     @Test(dataProvider = "requestFromSchedulerDataProvider")
394     public void whenGetFromSchedulerRequest_sendAsExpectedToMso(String vnfInstanceId, PresetMsoChangeManagementBase preset, String requestPath) {
395         SimulatorApi.registerExpectationFromPreset(
396                 preset,
397                 RegistrationStrategy.APPEND);
398         String schedulerRequest = ReadFile.loadResourceAsString(requestPath);
399         Response response = callChangeManagement("VidVnf", Entity.json(schedulerRequest));
400         MsoResponseWrapper2 body = response.readEntity(MsoResponseWrapper2.class);
401         assertEquals(202, body.getStatus());
402         assertEquals(vnfInstanceId, getNestedPropertyInMap(body.getEntity(), "requestReferences/instanceId"));
403     }
404
405
406     private void testHappyPath(String expectationPath, String requestType) {
407         VnfIds vnfIds = new VnfIds();
408         MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
409         assertForHappyPath(vnfIds, body, requestType);
410     }
411
412     private void assertForHappyPath(VnfIds vnfIds, MsoResponseWrapper2 body, String requestType) {
413         Assert.assertEquals(body.getStatus(), 202, requestType + " failed with wrong http status");
414         Assert.assertEquals(
415                 getNestedPropertyInMap(body.getEntity(), "requestReferences/instanceId"),
416                 vnfIds.serviceInstanceId,
417                 String.format("Failed to find instanceId: %s in " + requestType + " response.  Actual body:%s",
418                         vnfIds.serviceInstanceId, body.getEntity()));
419     }
420
421     private <T> T callChangeManagementUpdate(VnfIds vnfIds, String expectationPath, Class<T> responseClass, String requestType) {
422         SimulatorApi.registerExpectation(
423                 expectationPath,
424                 ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.APPEND);
425         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
426         Response response =  callChangeManagementUpdate(vnfIds, changeManagementRequest);
427         return response.readEntity(responseClass);
428     }
429
430     private Response callChangeManagementUpdate(VnfIds vnfIds, ChangeManagementRequest changeManagementRequest) {
431         Entity entity = Entity.json(changeManagementRequest);
432         return callChangeManagement(vnfIds.vnfName, entity);
433     }
434
435     private Response callChangeManagement(String vnfName, Entity entity) {
436         WebTarget webTarget = buildWebTarget(vnfName);
437         return webTarget.request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", "Basic " + AAFGetBasicAuthPreset.VALID_AUTH_VALUE).post(entity);
438     }
439
440     private WebTarget buildWebTarget(String vnfName) {
441         return client.target(uri).
442                 path(CHANGE_MANAGEMENT + WORKFLOW).resolveTemplate("vnfname", vnfName);
443     }
444
445     private void testChangeManagement409Error(String expectationPath, String requestType) throws IOException {
446         VnfIds vnfIds = new VnfIds();
447         MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
448         Assert.assertEquals(body.getStatus(), 409, requestType + " failed with wrong http status");
449         Assert.assertEquals(
450                 getNestedPropertyInMap(body.getEntity(), "serviceException/messageId"),
451                 "SVC2000",
452                 String.format("Failed to find messageId: %s in " + requestType + " response.  Actual body:%s",
453                         "SVC2000", body.getEntity()));
454
455
456         assertThat(getNestedPropertyInMap(body.getEntity(), "serviceException/text"), containsString(vnfIds.vnfInstanceId));
457     }
458
459     private void testChangeManagement404Error(String expectationPath, String requestType) throws IOException {
460         VnfIds vnfIds = new VnfIds();
461         MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
462         Assert.assertEquals(body.getStatus(), 404, requestType + " failed with wrong http status");
463         assertThat(body.getEntity(), equalTo("<html><head><title>Error</title></head><body>404 - Not Found</body></html>"));
464     }
465
466     private void testChangeManagementWithoutVnfInstanceId(String requestType) throws IOException {
467         VnfIds vnfIds = new VnfIds();
468         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
469         changeManagementRequest.getRequestDetails().get(0).setVnfInstanceId(null);
470         MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
471         assertThat(exceptionResponse.serviceException.text, containsString("No vnfInstanceId in request"));
472     }
473
474     private void testChangeManagementServiceInstanceId(Consumer<ChangeManagementRequest> dropInstanceIdMethod, String requestType) throws IOException {
475         VnfIds vnfIds = new VnfIds();
476         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
477         dropInstanceIdMethod.accept(changeManagementRequest);
478         MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
479         assertThat(exceptionResponse.serviceException.text, containsString("No instanceId in request"));
480     }
481
482     private void testChangeManagementInvalidPayload(String payload, String propertyName, String requestType) throws IOException {
483         VnfIds vnfIds = new VnfIds();
484         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
485         changeManagementRequest.getRequestDetails().get(0).getRequestParameters().getAdditionalProperties().put("payload",payload);
486         MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
487         assertThat(exceptionResponse.serviceException.text, containsString(propertyName));
488         assertThat(exceptionResponse.serviceException.text, containsString("No valid payload"));
489     }
490
491     private void testChangeManagementWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod, String requestType) throws IOException {
492         VnfIds vnfIds = new VnfIds();
493         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
494         dropPayloadMethod.accept(changeManagementRequest);
495         MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
496         assertThat(exceptionResponse.serviceException.text, containsString("No valid payload"));
497     }
498
499     private MsoExceptionResponse callChangeManagementAndExpectForException(VnfIds vnfIds, ChangeManagementRequest changeManagementRequest, String requestType) {
500         Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest);
501         Assert.assertEquals(response.getStatus(), HttpStatus.OK.value() , requestType + " wrong http status");
502         MsoResponseWrapper2<MsoExceptionResponse> msoResponseWrapper2 = response.readEntity(new GenericType<MsoResponseWrapper2<MsoExceptionResponse>>(){});
503         assertThat(msoResponseWrapper2.getStatus(), equalTo(400));
504         assertThat(msoResponseWrapper2.getEntity(), instanceOf(MsoExceptionResponse.class));
505         return (MsoExceptionResponse) msoResponseWrapper2.getEntity();
506     }
507
508     private void testChangeManagementGoodPayload(String payload, String expectationFileName, String requestType) throws IOException {
509         VnfIds vnfIds = new VnfIds();
510         SimulatorApi.registerExpectation(
511                 expectationFileName,
512                 ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.APPEND);
513         ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
514         changeManagementRequest.getRequestDetails().get(0).getRequestParameters().getAdditionalProperties().put("payload",payload);
515         Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest);
516         MsoResponseWrapper2 body = response.readEntity(MsoResponseWrapper2.class);
517         assertForHappyPath(vnfIds, body, requestType);
518         RestTemplate manualRestTemplate = InsecureHttpsClient.newRestTemplate();
519         super.loginWithChosenRESTClient(getUserCredentials(), manualRestTemplate);
520         SimulatorApi.registerExpectationFromPreset( new PresetAAIGetSubscribersGet(), RegistrationStrategy.APPEND);
521         LoggerFormatTest
522             .verifyExistenceOfIncomingReqsInAuditLogs(manualRestTemplate, uri,
523                 response.getHeaders().get("X-ECOMP-RequestID-echo").get(0).toString(),
524                 "/vid/change-management/workflow/VidVnf");
525
526     }
527
528     private ChangeManagementRequest createChangeManagementRequest(VnfIds vnfDetails, String requestType) {
529         ChangeManagementRequest changeManagementRequest = createBasicChangeManagementRequest(vnfDetails);
530         changeManagementRequest.setRequestType(requestType);
531         if(requestType.equals(ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE)) {
532             CloudConfiguration cloudConfiguration = new CloudConfiguration();
533             cloudConfiguration.lcpCloudRegionId = "mdt1";
534             cloudConfiguration.tenantId = "88a6ca3ee0394ade9403f075db23167e";
535             changeManagementRequest.getRequestDetails().get(0).setCloudConfiguration(cloudConfiguration);
536         }
537         changeManagementRequest.getRequestDetails().get(0).getRequestParameters().setAdditionalProperty("payload", getPayload(requestType));
538         return changeManagementRequest;
539     }
540
541     private ChangeManagementRequest createBasicChangeManagementRequest(VnfIds vnfDetails)
542     {
543         ChangeManagementRequestDetails requestDetails = new ChangeManagementRequestDetails();
544
545 //        org.onap.vid.domain.mso.CloudConfiguration cloudConfiguration = new org.onap.vid.domain.mso.CloudConfiguration();
546 //        cloudConfiguration.setLcpCloudRegionId("mdt1");
547 //        cloudConfiguration.setTenantId("88a6ca3ee0394ade9403f075db23167e");
548 //        requestDetails.setCloudConfiguration(cloudConfiguration);
549
550         RequestInfo requestInfo = new RequestInfo();
551         requestInfo.setSource("VID");
552         requestInfo.setRequestorId("az2016");
553         requestDetails.setRequestInfo(requestInfo);
554
555         RequestParameters requestParameters = new RequestParameters();
556         requestDetails.setRequestParameters(requestParameters);
557
558         RelatedInstance relatedInstance = new RelatedInstance();
559         relatedInstance.instanceId = vnfDetails.serviceInstanceId;
560         RelatedInstanceList relatedInstanceList = new RelatedInstanceList();
561         relatedInstanceList.setRelatedInstance(relatedInstance);
562         requestDetails.setRelatedInstList(Collections.singletonList(relatedInstanceList));
563
564         requestDetails.setVnfName(vnfDetails.vnfName);
565         requestDetails.setVnfInstanceId(vnfDetails.vnfInstanceId);
566
567         ChangeManagementRequest changeManagementRequest = new ChangeManagementRequest();
568         changeManagementRequest.setRequestDetails(Collections.singletonList(requestDetails));
569         return changeManagementRequest;
570     }
571
572     private String getPayload(String requestType) {
573         if(requestType.equals(ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE)) {
574             return "{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}";
575         }
576         else if(requestType.equals(ChangeManagementRequest.CONFIG_UPDATE)) {
577             return "{\"request-parameters\": \"3.1\",\"configuration-parameters\": \"3.2\", \"operations_timeout\": \"3600\"}";
578         }
579         return "";
580     }
581
582     private boolean isTextContainsInList(List<MsoResponseWrapper2> responseList, String str) {
583         for (MsoResponseWrapper2 response : responseList) {
584             if (response.getEntity().toString().contains(str))
585                 return true;
586         }
587         return false;
588     }
589
590 //    @Test
591     public void testVnfWorkflowApiCRD() throws IOException {
592         List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(10);
593
594         //create vnf to workflows relations
595         VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
596         vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
597
598         //ensure all relations exist using get workflows for vnf
599         ensureAllVnfToWorkflowsExist(workflowsDetails);
600
601         //ensure all relations exist using get all vnf_to_workflows relations
602         Response response = vnfWorkFlowOperationOK(HttpMethod.GET, null);
603         VnfWorkflowRelationAllResponse vnfWorkflowRelationAllResponse = response.readEntity(VnfWorkflowRelationAllResponse.class);
604         Map<VnfDetails, List<String>> vnfDetailsToWorkflowsMap = vnfWorkflowRelationAllResponse.getVnfs().stream()
605                 .collect(Collectors.toMap(x -> new VnfDetails(x.getUUID(), x.getInvariantUUID()), VnfDetailsWithWorkflows::getWorkflows));
606
607         workflowsDetails.forEach(workflowsDetail ->
608                 Assert.assertTrue(vnfDetailsToWorkflowsMap.get(workflowsDetail.getVnfDetails()).contains(workflowsDetail.getWorkflowName())));
609
610         //delete vnf to workflows relations
611         vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
612
613         //make sure all relations not exist any more
614         ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
615
616     }
617
618     private void ensureAllVnfToWorkflowsExist(List<WorkflowsDetail> workflowsDetails) throws IOException {
619         for (WorkflowsDetail workflowsDetail : workflowsDetails) {
620             GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest = new GetVnfWorkflowRelationRequest(Collections.singletonList(workflowsDetail.getVnfDetails()));
621             GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(getVnfWorkflowRelationRequest);
622             Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 1);
623             Assert.assertEquals(getWorkflowsResponse.getWorkflows().get(0), workflowsDetail.getWorkflowName());
624         }
625     }
626
627     private void ensureAllVnfToWorkflowsRelationsNotExist(List<WorkflowsDetail> workflowsDetails) throws IOException {
628         for (WorkflowsDetail workflowsDetail : workflowsDetails) {
629             GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest = new GetVnfWorkflowRelationRequest(Collections.singletonList(workflowsDetail.getVnfDetails()));
630             GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(getVnfWorkflowRelationRequest);
631             Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 0);
632         }
633     }
634
635 //    @Test
636     public void testVnfWorkflowIntersection() throws IOException {
637         List<WorkflowsDetail> workflowsDetails = new ArrayList<>();
638         List<VnfDetails> vnfDetailsList = new ArrayList<>();
639         //0 - UPDATE,REPLACE
640         VnfDetails vnfDetails = generateRandomVnfDetails(vnfDetailsList);
641         workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
642         workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
643         //1 - UPDATE,REPLACE
644         vnfDetails = generateRandomVnfDetails(vnfDetailsList);
645         workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
646         workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
647         //2 - REPLACE
648         vnfDetails = generateRandomVnfDetails(vnfDetailsList);
649         workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
650         //3 - REPLACE
651         vnfDetails = generateRandomVnfDetails(vnfDetailsList);
652         workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
653         //4 - UPDATE
654         vnfDetails = generateRandomVnfDetails(vnfDetailsList);
655         workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
656
657         VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
658         vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
659
660         Set<String> replaceUpdateSet = ImmutableSet.of(REPLACE, UPDATE);
661         Set<String> replaceSet = ImmutableSet.of(REPLACE);
662         Set<String> emptySet = ImmutableSet.of();
663
664         assertWorkflowsListSize(vnfDetailsList, replaceUpdateSet, 0, 1);
665         assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 2);
666         assertWorkflowsListSize(vnfDetailsList, replaceSet, 2, 3);
667         assertWorkflowsListSize(vnfDetailsList, emptySet, 3, 4);
668         assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 1, 2);
669         assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 1, 2, 3);
670         assertWorkflowsListSize(vnfDetailsList, emptySet, 0, 1, 2, 3, 4);
671         assertWorkflowsListSize(vnfDetailsList, replaceUpdateSet, 0);
672
673         //delete vnf to workflows relations
674         vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
675         ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
676
677         //get vnf that was inserted and relation were removed return empty set
678         assertWorkflowsListSize(vnfDetailsList, emptySet, 0);
679     }
680
681     @Test
682     public void testGetVnfThatWasNeverInsertedReturn404() throws IOException {
683         //get vnf that was never inserted return 404
684         assertWorkflowsResponse(new GetVnfWorkflowRelationRequest(ImmutableList.of(generateRandomVnfDetails())), HttpStatus.NOT_FOUND);
685     }
686
687 //    @Test
688     void testDeleteVnfThatWasNeverInserted() throws IOException {
689         //delete vnf that was never inserted return 200 with error in body
690         WorkflowsDetail randomWorkfowDetail = generateRandomWorkflowsDetail();
691         Response response = vnfWorkFlowOperationOK(HttpMethod.DELETE, new VnfWorkflowRelationRequest(ImmutableList.of(randomWorkfowDetail)));
692         VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
693         Assert.assertEquals(vnfWorkflowRelationResponse.getErrors().size(), 1);
694         Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(randomWorkfowDetail.getVnfDetails().getUUID()));
695         Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(randomWorkfowDetail.getVnfDetails().getInvariantUUID()));
696     }
697
698 //    @Test
699     public void testInsertSameVnfToWorkflowsTwice() throws IOException {
700         List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(1);
701         VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
702         vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
703         vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
704
705         //ensure workflow exist
706         ensureAllVnfToWorkflowsExist(workflowsDetails);
707
708         //delete vnf to workflows relations
709         vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
710
711         //make sure all relations not exist any more
712         ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
713     }
714
715 //    @Test
716     public void testMultipleVnfsWhileOneWorkflowNotExist() throws IOException {
717         List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(3);
718
719         //relation 0 add relation to non exist workflow
720         WorkflowsDetail nonExistWorkflowsDetail = workflowsDetails.get(0);
721         nonExistWorkflowsDetail.setWorkflowName("NotExist");
722         VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
723
724         Response response = vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
725         VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
726         assertErrorResponseForWorkflowDetail(nonExistWorkflowsDetail, vnfWorkflowRelationResponse);
727
728         //ensure other vnf  to workflows exist
729         ensureAllVnfToWorkflowsExist(workflowsDetails.subList(1, workflowsDetails.size()));
730
731         //ensure there is no workflow for vnf 0
732         GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(
733                 new GetVnfWorkflowRelationRequest(ImmutableList.of(nonExistWorkflowsDetail.getVnfDetails())));
734         Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 0);
735
736         //delete vnf to workflows relations
737         response = vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
738         vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
739         assertErrorResponseForWorkflowDetail(nonExistWorkflowsDetail, vnfWorkflowRelationResponse);
740
741         //make sure all relations not exist any more
742         ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
743     }
744
745 //    @Test
746     public void testInsertVnfWithEmptyUUID() throws IOException {
747         assertAddVnfWithEmptyIdReturn404((vnfDetails -> vnfDetails.setUUID("")));
748     }
749
750 //    @Test
751     public void testInsertVnfWithEmptyInvariantUUID() throws IOException {
752         assertAddVnfWithEmptyIdReturn404((vnfDetails -> vnfDetails.setInvariantUUID("")));
753     }
754
755     @Test
756     //This test requires a simulator which runs on VID and is mocking Scheduler
757     public void testDeleteScheduledWorkflowOk() throws Exception {
758         //Register required response
759         SimulatorApi.registerExpectation(DELETE_SCHEDULE_OK_JSON, RegistrationStrategy.APPEND);
760         assertCancelScheduleResponse(HttpStatus.NO_CONTENT);//204
761     }
762
763     @Test
764     //This test requires a simulator which runs on VID and is mocking Scheduler
765     public void testDeleteScheduledWorkflowNotFound() throws Exception {
766         //Register required response
767         SimulatorApi.registerExpectation(DELETE_SCHEDULE_NOT_AUTHORIZED_JSON, RegistrationStrategy.APPEND);
768         assertCancelScheduleResponse(HttpStatus.UNAUTHORIZED);//401
769     }
770
771     private void assertAddVnfWithEmptyIdReturn404(Consumer<VnfDetails> emptyIdSetter) throws IOException {
772         List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(1);
773         emptyIdSetter.accept(workflowsDetails.get(0).getVnfDetails());
774         VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
775         Response response = vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
776         VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
777         assertErrorResponseForWorkflowDetail(workflowsDetails.get(0), vnfWorkflowRelationResponse);
778         assertWorkflowsResponse(new GetVnfWorkflowRelationRequest(ImmutableList.of(generateRandomVnfDetails())), HttpStatus.NOT_FOUND);
779     }
780
781     private void assertErrorResponseForWorkflowDetail(WorkflowsDetail wrongWorkflowsDetail, VnfWorkflowRelationResponse vnfWorkflowRelationResponse) {
782         Assert.assertEquals(vnfWorkflowRelationResponse.getErrors().size(), 1);
783         Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getWorkflowName()));
784         Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getVnfDetails().getUUID()));
785         Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getVnfDetails().getInvariantUUID()));
786     }
787
788     private VnfDetails generateRandomVnfDetails(List<VnfDetails> vnfDetailsList) {
789         VnfDetails vnfDetails = generateRandomVnfDetails();
790         vnfDetailsList.add(vnfDetails);
791         return vnfDetails;
792     }
793
794     private VnfDetails generateRandomVnfDetails() {
795         return new VnfDetails(UUID.randomUUID().toString(), UUID.randomUUID().toString());
796     }
797
798     private void assertWorkflowsListSize(List<VnfDetails> inputList, Set<String> exceptedWorkflows, int... indices) throws IOException {
799         List<VnfDetails> vnfDetailsList = new ArrayList<>();
800         for (int index : indices) {
801             vnfDetailsList.add(inputList.get(index));
802         }
803         GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(new GetVnfWorkflowRelationRequest(vnfDetailsList));
804         Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), exceptedWorkflows.size());
805         Assert.assertTrue(getWorkflowsResponse.getWorkflows().containsAll(exceptedWorkflows));
806     }
807
808     private void assertCancelScheduleResponse(HttpStatus expectedStatus) {
809         WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + SCHEDULER_BY_SCHEDULE_ID.replace("{scheduleId}", "1234"));
810         Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).delete();
811         Assert.assertEquals(response.getStatus(), expectedStatus.value());
812     }
813
814     private GetWorkflowsResponse getWorkflowsResponseOK(GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest) throws IOException {
815         WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + GET_VNF_WORKFLOW_RELATION);
816         Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(getVnfWorkflowRelationRequest));
817         TestUtils.assertStatusOK(getVnfWorkflowRelationRequest, webTarget, response);
818         return response.readEntity(GetWorkflowsResponse.class);
819     }
820
821     private void assertWorkflowsResponse(GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest, HttpStatus exceptedHttpStatus) throws IOException {
822         WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + GET_VNF_WORKFLOW_RELATION);
823         Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(getVnfWorkflowRelationRequest));
824         TestUtils.assertHttpStatus(getVnfWorkflowRelationRequest, webTarget, response, exceptedHttpStatus);
825         response.readEntity(VnfWorkflowRelationResponse.class); //assert the body is of type VnfWorkflowRelationResponse
826         Assert.assertTrue(((String) response.getHeaders().get("Content-Type").get(0)).contains(APPLICATION_JSON));
827     }
828
829     private Response vnfWorkFlowOperationOK(String method, VnfWorkflowRelationRequest vnfWorkflowRelationRequest) throws IOException {
830         return vnfWorkFlowOperation(method, vnfWorkflowRelationRequest, HttpStatus.OK);
831     }
832
833     private Response vnfWorkFlowOperation(String method, VnfWorkflowRelationRequest vnfWorkflowRelationRequest, HttpStatus exceptedHttpStatus) throws IOException {
834         WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + VNF_WORKFLOW_RELATION);
835         Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).method(method, Entity.json(vnfWorkflowRelationRequest));
836         TestUtils.assertHttpStatus(vnfWorkflowRelationRequest, webTarget, response, exceptedHttpStatus);
837         return response;
838     }
839
840     @SuppressWarnings("SameParameterValue")
841     private List<WorkflowsDetail> generateWorkflowsDetails(int size) {
842         List<WorkflowsDetail> workflowsDetails = new ArrayList<>(size);
843         for (int i = 0; i < size; i++) {
844             workflowsDetails.add(i, generateRandomWorkflowsDetail());
845         }
846         return workflowsDetails;
847     }
848
849     private WorkflowsDetail generateRandomWorkflowsDetail() {
850         String workflow = WORKFLOWS.get(random.nextInt(WORKFLOWS.size()));
851         VnfDetails vnfDetails = generateRandomVnfDetails();
852         return new WorkflowsDetail(vnfDetails, workflow);
853     }
854
855     static public class VnfIds {
856         public String serviceInstanceId;
857         public String vnfInstanceId;
858         public String vnfName;
859
860         public VnfIds() {
861             this.serviceInstanceId = UUID.randomUUID().toString();
862             this.vnfInstanceId = UUID.randomUUID().toString();
863             this.vnfName = "VidVnf";
864         }
865
866
867     }
868
869 }