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