1 package org.onap.vid.api;
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;
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;
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;
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;
56 //This is integration test that require running tomcat
57 public class ChangeManagementApiTest extends BaseApiTest {
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}";
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)}
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)},
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"},
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\"}"},
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"},
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\" }"}
142 // IN_PLACE_SOFTWARE_UPDATE
144 public void testInPlaceSoftwareUpdateHappyPath() throws IOException {
145 testHappyPath("mso_in_place_software_update_ok.json", ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
149 public void testInPlaceSoftwareUpdate409Error() throws IOException {
150 testChangeManagement409Error("mso_in_place_software_update_error_409.json", ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
154 public void testInPlaceSoftwareUpdate404Error() throws IOException {
155 testChangeManagement404Error("mso_in_place_software_update_error_404.json", ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
159 public void testInPlaceSoftwareUpdateWithoutVnfInstanceId() throws IOException {
160 testChangeManagementWithoutVnfInstanceId(ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
163 @Test(dataProvider = "requestWithoutServiceInstanceId")
164 public void testInPlaceSoftwareUpdateWithoutServiceInstanceId(Consumer<ChangeManagementRequest> dropInstanceIdMethod) throws IOException {
165 testChangeManagementServiceInstanceId(dropInstanceIdMethod, ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
168 @Test(dataProvider = "wrongPayloads")
169 public void testInPlaceSoftwareUpdateInvalidPayload(String payload, String propertyName) throws IOException {
170 testChangeManagementInvalidPayload(payload, propertyName, ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
173 @Test(dataProvider = "requestWithoutPayload")
174 public void testInPlaceSoftwareUpdateWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod) throws IOException {
175 testChangeManagementWithoutPayload(dropPayloadMethod, ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
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);
184 public void testInPlaceSoftwareUpdateSimultaneousCalls() throws IOException, InterruptedException {
185 SimulatorApi.clearExpectations();
187 StopWatch stopWatch = new StopWatch("InPlaceSoftwareUpdateSimultaneousCalls");
189 stopWatch.start("init");
190 ExecutorService executor = Executors.newFixedThreadPool(SIZE);
191 List<VnfIds> vnfList = Stream.generate(VnfIds::new).limit(SIZE).collect(Collectors.toList());
194 stopWatch.start("invoke registration to simulator");
195 List<Callable<String>> siumlatorRegistrations = vnfList.stream().map(
196 vnfIds->((Callable<String>)() ->
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);
204 .collect(Collectors.toList());
206 executor.invokeAll(siumlatorRegistrations)
211 catch (Exception e) {
212 throw new RuntimeException(e);
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());
224 stopWatch.start("invoke calling to vid");
225 List<MsoResponseWrapper2> responseList = executor.invokeAll(callables)
229 return future.get().readEntity(MsoResponseWrapper2.class);
231 catch (Exception e) {
232 throw new RuntimeException(e);
235 .collect(Collectors.toList());
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));
245 System.out.print(stopWatch.prettyPrint());
250 public void testConfigUpdateHappyPath() throws IOException {
251 testHappyPath("mso_config_update_ok.json", ChangeManagementRequest.CONFIG_UPDATE);
255 public void testConfigUpdate409Error() throws IOException {
256 testChangeManagement409Error("mso_config_update_error_409.json", ChangeManagementRequest.CONFIG_UPDATE);
260 public void testConfigUpdate404Error() throws IOException {
261 testChangeManagement404Error("mso_config_update_error_404.json", ChangeManagementRequest.CONFIG_UPDATE);
265 public void testConfigUpdateWithoutVnfInstanceId() throws IOException {
266 testChangeManagementWithoutVnfInstanceId(ChangeManagementRequest.CONFIG_UPDATE);
269 @Test(dataProvider = "requestWithoutServiceInstanceId")
270 public void testConfigUpdateWithoutServiceInstanceId(Consumer<ChangeManagementRequest> dropInstanceIdMethod) throws IOException {
271 testChangeManagementServiceInstanceId(dropInstanceIdMethod, ChangeManagementRequest.CONFIG_UPDATE);
274 @Test(dataProvider = "wrongConfigPayloads")
275 public void testConfigUpdateInvalidPayload(String payload, String propertyName) throws IOException {
276 testChangeManagementInvalidPayload(payload, propertyName, ChangeManagementRequest.CONFIG_UPDATE);
279 @Test(dataProvider = "requestWithoutPayload")
280 public void testConfigUpdateWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod) throws IOException {
281 testChangeManagementWithoutPayload(dropPayloadMethod, ChangeManagementRequest.CONFIG_UPDATE);
284 @Test(dataProvider = "goodConfigPayloads")
285 public void testConfigUpdateGoodPayload(String payload) throws IOException {
286 testChangeManagementGoodPayload(payload, "mso_config_update_ok.json", ChangeManagementRequest.CONFIG_UPDATE);
290 public void testClientCredentialsFilter_expect401()
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());
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);
308 private void assertForHappyPath(VnfIds vnfIds, MsoResponseWrapper2 body, String requestType) {
309 Assert.assertEquals(body.getStatus(), 202, requestType + " failed with wrong http status");
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()));
317 private <T> T callChangeManagementUpdate(VnfIds vnfIds, String expectationPath, Class<T> responseClass, String requestType) {
318 SimulatorApi.registerExpectation(
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);
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);
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");
339 TestUtils.getNestedPropertyInMap(body.getEntity(), "serviceException/messageId"),
341 String.format("Failed to find messageId: %s in " + requestType + " response. Actual body:%s",
342 "SVC2000", body.getEntity()));
345 assertThat(TestUtils.getNestedPropertyInMap(body.getEntity(), "serviceException/text"), containsString(vnfIds.vnfInstanceId));
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>"));
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"));
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"));
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"));
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"));
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();
397 private void testChangeManagementGoodPayload(String payload, String expectationFileName, String requestType) throws IOException {
398 VnfIds vnfIds = new VnfIds();
399 SimulatorApi.registerExpectation(
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);
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);
418 changeManagementRequest.getRequestDetails().get(0).getRequestParameters().setAdditionalProperty("payload", getPayload(requestType));
419 return changeManagementRequest;
422 private ChangeManagementRequest createBasicChangeManagementRequest(VnfIds vnfDetails)
424 ChangeManagementRequestDetails requestDetails = new ChangeManagementRequestDetails();
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);
431 RequestInfo requestInfo = new RequestInfo();
432 requestInfo.setSource("VID");
433 requestInfo.setRequestorId("az2016");
434 requestDetails.setRequestInfo(requestInfo);
436 RequestParameters requestParameters = new RequestParameters();
437 requestDetails.setRequestParameters(requestParameters);
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));
445 requestDetails.setVnfName(vnfDetails.vnfName);
446 requestDetails.setVnfInstanceId(vnfDetails.vnfInstanceId);
448 ChangeManagementRequest changeManagementRequest = new ChangeManagementRequest();
449 changeManagementRequest.setRequestDetails(Collections.singletonList(requestDetails));
450 return changeManagementRequest;
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\"}";
457 else if(requestType.equals(ChangeManagementRequest.CONFIG_UPDATE)) {
458 return "{\"request-parameters\": \"3.1\",\"configuration-parameters\": \"3.2\", \"operations_timeout\": \"3600\"}";
463 private boolean isTextContainsInList(List<MsoResponseWrapper2> responseList, String str) {
464 for (MsoResponseWrapper2 response : responseList) {
465 if (response.getEntity().toString().contains(str))
472 public void testVnfWorkflowApiCRD() throws IOException {
473 List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(10);
475 //create vnf to workflows relations
476 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
477 vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
479 //ensure all relations exist using get workflows for vnf
480 ensureAllVnfToWorkflowsExist(workflowsDetails);
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));
488 workflowsDetails.forEach(workflowsDetail ->
489 Assert.assertTrue(vnfDetailsToWorkflowsMap.get(workflowsDetail.getVnfDetails()).contains(workflowsDetail.getWorkflowName())));
491 //delete vnf to workflows relations
492 vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
494 //make sure all relations not exist any more
495 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
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());
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);
517 public void testVnfWorkflowIntersection() throws IOException {
518 List<WorkflowsDetail> workflowsDetails = new ArrayList<>();
519 List<VnfDetails> vnfDetailsList = new ArrayList<>();
521 VnfDetails vnfDetails = generateRandomVnfDetails(vnfDetailsList);
522 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
523 workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
525 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
526 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
527 workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
529 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
530 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
532 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
533 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
535 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
536 workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
538 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
539 vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
541 Set<String> replaceUpdateSet = ImmutableSet.of(REPLACE, UPDATE);
542 Set<String> replaceSet = ImmutableSet.of(REPLACE);
543 Set<String> emptySet = ImmutableSet.of();
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);
554 //delete vnf to workflows relations
555 vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
556 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
558 //get vnf that was inserted and relation were removed return empty set
559 assertWorkflowsListSize(vnfDetailsList, emptySet, 0);
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);
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()));
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);
586 //ensure workflow exist
587 ensureAllVnfToWorkflowsExist(workflowsDetails);
589 //delete vnf to workflows relations
590 vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
592 //make sure all relations not exist any more
593 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
597 public void testMultipleVnfsWhileOneWorkflowNotExist() throws IOException {
598 List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(3);
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);
605 Response response = vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
606 VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
607 assertErrorResponseForWorkflowDetail(nonExistWorkflowsDetail, vnfWorkflowRelationResponse);
609 //ensure other vnf to workflows exist
610 ensureAllVnfToWorkflowsExist(workflowsDetails.subList(1, workflowsDetails.size()));
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);
617 //delete vnf to workflows relations
618 response = vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
619 vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
620 assertErrorResponseForWorkflowDetail(nonExistWorkflowsDetail, vnfWorkflowRelationResponse);
622 //make sure all relations not exist any more
623 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
627 public void testInsertVnfWithEmptyUUID() throws IOException {
628 assertAddVnfWithEmptyIdReturn404((vnfDetails -> vnfDetails.setUUID("")));
632 public void testInsertVnfWithEmptyInvariantUUID() throws IOException {
633 assertAddVnfWithEmptyIdReturn404((vnfDetails -> vnfDetails.setInvariantUUID("")));
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
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
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);
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()));
669 private VnfDetails generateRandomVnfDetails(List<VnfDetails> vnfDetailsList) {
670 VnfDetails vnfDetails = generateRandomVnfDetails();
671 vnfDetailsList.add(vnfDetails);
675 private VnfDetails generateRandomVnfDetails() {
676 return new VnfDetails(UUID.randomUUID().toString(), UUID.randomUUID().toString());
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));
684 GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(new GetVnfWorkflowRelationRequest(vnfDetailsList));
685 Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), exceptedWorkflows.size());
686 Assert.assertTrue(getWorkflowsResponse.getWorkflows().containsAll(exceptedWorkflows));
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());
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);
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));
710 private Response vnfWorkFlowOperationOK(String method, VnfWorkflowRelationRequest vnfWorkflowRelationRequest) throws IOException {
711 return vnfWorkFlowOperation(method, vnfWorkflowRelationRequest, HttpStatus.OK);
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);
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());
727 return workflowsDetails;
730 private WorkflowsDetail generateRandomWorkflowsDetail() {
731 String workflow = WORKFLOWS.get(random.nextInt(WORKFLOWS.size()));
732 VnfDetails vnfDetails = generateRandomVnfDetails();
733 return new WorkflowsDetail(vnfDetails, workflow);
736 static public class VnfIds {
737 public String serviceInstanceId;
738 public String vnfInstanceId;
739 public String vnfName;
742 this.serviceInstanceId = UUID.randomUUID().toString();
743 this.vnfInstanceId = UUID.randomUUID().toString();
744 this.vnfName = "VidVnf";