1 package org.onap.vid.api;
3 import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals;
4 import static org.hamcrest.CoreMatchers.containsString;
5 import static org.hamcrest.MatcherAssert.assertThat;
6 import static org.hamcrest.core.IsEqual.equalTo;
7 import static org.hamcrest.core.IsInstanceOf.instanceOf;
8 import static org.onap.vid.api.ChangeManagementUserApiLoggingTest.MSO_GET_CHANGE_MANAGEMENTS_SCALEOUT;
9 import static org.onap.vid.api.TestUtils.getNestedPropertyInMap;
10 import static org.testng.AssertJUnit.assertEquals;
11 import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.APPEND;
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;
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;
81 //This is integration test that require running tomcat
82 public class ChangeManagementApiTest extends BaseApiTest {
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";
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)}
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)},
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"},
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\"}"},
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"},
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\" }"}
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)
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);
191 // IN_PLACE_SOFTWARE_UPDATE
193 public void testInPlaceSoftwareUpdateHappyPath() throws IOException {
194 testHappyPath("mso_in_place_software_update_ok.json", ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
198 public void testInPlaceSoftwareUpdate409Error() throws IOException {
199 testChangeManagement409Error("mso_in_place_software_update_error_409.json", ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
203 public void testInPlaceSoftwareUpdate404Error() throws IOException {
204 testChangeManagement404Error("mso_in_place_software_update_error_404.json", ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
208 public void testInPlaceSoftwareUpdateWithoutVnfInstanceId() throws IOException {
209 testChangeManagementWithoutVnfInstanceId(ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
212 @Test(dataProvider = "requestWithoutServiceInstanceId")
213 public void testInPlaceSoftwareUpdateWithoutServiceInstanceId(String desc, Consumer<ChangeManagementRequest> dropInstanceIdMethod) throws IOException {
214 testChangeManagementServiceInstanceId(dropInstanceIdMethod, ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
217 @Test(dataProvider = "wrongPayloads")
218 public void testInPlaceSoftwareUpdateInvalidPayload(String payload, String propertyName) throws IOException {
219 testChangeManagementInvalidPayload(payload, propertyName, ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
222 @Test(dataProvider = "requestWithoutPayload")
223 public void testInPlaceSoftwareUpdateWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod) throws IOException {
224 testChangeManagementWithoutPayload(dropPayloadMethod, ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE);
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);
233 public void testInPlaceSoftwareUpdateSimultaneousCalls() throws IOException, InterruptedException {
234 SimulatorApi.clearExpectations();
236 StopWatch stopWatch = new StopWatch("InPlaceSoftwareUpdateSimultaneousCalls");
238 stopWatch.start("init");
239 ExecutorService executor = Executors.newFixedThreadPool(SIZE);
240 List<VnfIds> vnfList = Stream.generate(VnfIds::new).limit(SIZE).collect(Collectors.toList());
243 stopWatch.start("invoke registration to simulator");
244 List<Callable<String>> siumlatorRegistrations = vnfList.stream().map(
245 vnfIds->((Callable<String>)() ->
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);
259 .collect(Collectors.toList());
261 executor.invokeAll(siumlatorRegistrations)
266 catch (Exception e) {
267 throw new RuntimeException(e);
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());
278 stopWatch.start("invoke calling to vid");
279 List<MsoResponseWrapper2> responseList = executor.invokeAll(callables)
283 return future.get().readEntity(MsoResponseWrapper2.class);
285 catch (Exception e) {
286 throw new RuntimeException(e);
289 .collect(Collectors.toList());
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));
299 System.out.print(stopWatch.prettyPrint());
304 @FeatureTogglingTest(Features.FLAG_EXP_USE_FORMAT_PARAMETER_FOR_CM_DASHBOARD)
305 public void getOrchestrationForDashboardShouldResponseWithNoTaskInfoBody() {
306 SimulatorApi.registerExpectation(MSO_GET_CHANGE_MANAGEMENTS_SCALEOUT, RegistrationStrategy.CLEAR_THEN_SET);
307 SimulatorApi.registerExpectationFromPreset(new PresetMSOOrchestrationRequestsGetNoTaskInfoBody(), APPEND);
308 ResponseEntity<String> responseEntity = restTemplate.getForEntity(buildUri(CHANGE_MANAGEMENT + MSO ), String.class);
310 String expected = getResourceAsString("changeManagement/responseNoTaskInfoBody.json");
311 assertThat(responseEntity.getBody(), jsonEquals(expected));
317 public void testConfigUpdateHappyPath() throws IOException {
318 testHappyPath("mso_config_update_ok.json", ChangeManagementRequest.CONFIG_UPDATE);
322 public void testConfigUpdate409Error() throws IOException {
323 testChangeManagement409Error("mso_config_update_error_409.json", ChangeManagementRequest.CONFIG_UPDATE);
327 public void testConfigUpdate404Error() throws IOException {
328 testChangeManagement404Error("mso_config_update_error_404.json", ChangeManagementRequest.CONFIG_UPDATE);
332 public void testConfigUpdateWithoutVnfInstanceId() throws IOException {
333 testChangeManagementWithoutVnfInstanceId(ChangeManagementRequest.CONFIG_UPDATE);
336 @Test(dataProvider = "requestWithoutServiceInstanceId")
337 public void testConfigUpdateWithoutServiceInstanceId(String desc, Consumer<ChangeManagementRequest> dropInstanceIdMethod) throws IOException {
338 testChangeManagementServiceInstanceId(dropInstanceIdMethod, ChangeManagementRequest.CONFIG_UPDATE);
341 @Test(dataProvider = "wrongConfigPayloads")
342 public void testConfigUpdateInvalidPayload(String payload, String propertyName) throws IOException {
343 testChangeManagementInvalidPayload(payload, propertyName, ChangeManagementRequest.CONFIG_UPDATE);
346 @Test(dataProvider = "requestWithoutPayload")
347 public void testConfigUpdateWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod) throws IOException {
348 testChangeManagementWithoutPayload(dropPayloadMethod, ChangeManagementRequest.CONFIG_UPDATE);
351 @Test(dataProvider = "goodConfigPayloads")
352 public void testConfigUpdateGoodPayload(String payload) throws IOException {
353 testChangeManagementGoodPayload(payload, "mso_config_update_ok.json", ChangeManagementRequest.CONFIG_UPDATE);
356 @Test(dataProvider = "credentialsFilterTestData")
357 public void testCadiCredentialsFilter(String authValue, int expectedStatusCode)
359 VnfIds vnfIds = new VnfIds();
360 ChangeManagementRequest changeManagementRequest = createBasicChangeManagementRequest(vnfIds);
361 changeManagementRequest.setRequestType(ChangeManagementRequest.REPLACE);
362 WebTarget webTarget = buildWebTarget(vnfIds.vnfName);
363 Entity entity = Entity.json(changeManagementRequest);
364 Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON_TYPE);
365 if (authValue != null) {
366 invocationBuilder.header("Authorization", "Basic " + authValue);
368 Response response = invocationBuilder.post(entity);
369 String body = response.readEntity(String.class);
370 Assert.assertEquals(response.getStatus(), expectedStatusCode, "Full response: " + body);
374 public static Object[][] requestFromSchedulerDataProvider(Method test) {
375 return new Object[][]{
377 "e9181708-f105-4dfd-9a36-0e089faa72ba",
378 new PresetMsoVnfReplace("254583ad-b38c-498b-bdbd-b8de5e07541b", "e9181708-f105-4dfd-9a36-0e089faa72ba"),
379 "changeManagement/vnfReplaceRequest.json"
382 "c929b7ec-cc9d-11e8-a8d5-f2801f1b9fd1",
383 new PresetMsoVnfUpdate("d0c59d4a-cc9d-11e8-a8d5-f2801f1b9fd1","c929b7ec-cc9d-11e8-a8d5-f2801f1b9fd1"),
384 "changeManagement/vnfUpdateRequest.json"
387 "e5403738-da34-4090-8864-ba9cf1bcdd88",
388 new PresetMsoVnfInPlaceSoftwareUpdate("12709275-787c-4be7-8c9c-fce64ab7ca8c","e5403738-da34-4090-8864-ba9cf1bcdd88"),
389 "changeManagement/vnfInPlaceSoftwareUpdate.json"
394 @Test(dataProvider = "requestFromSchedulerDataProvider")
395 public void whenGetFromSchedulerRequest_sendAsExpectedToMso(String vnfInstanceId, PresetMsoChangeManagementBase preset, String requestPath) {
396 SimulatorApi.registerExpectationFromPreset(
398 RegistrationStrategy.APPEND);
399 String schedulerRequest = ReadFile.loadResourceAsString(requestPath);
400 Response response = callChangeManagement("VidVnf", Entity.json(schedulerRequest));
401 MsoResponseWrapper2 body = response.readEntity(MsoResponseWrapper2.class);
402 assertEquals(202, body.getStatus());
403 assertEquals(vnfInstanceId, getNestedPropertyInMap(body.getEntity(), "requestReferences/instanceId"));
407 private void testHappyPath(String expectationPath, String requestType) {
408 VnfIds vnfIds = new VnfIds();
409 MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
410 assertForHappyPath(vnfIds, body, requestType);
413 private void assertForHappyPath(VnfIds vnfIds, MsoResponseWrapper2 body, String requestType) {
414 Assert.assertEquals(body.getStatus(), 202, requestType + " failed with wrong http status");
416 getNestedPropertyInMap(body.getEntity(), "requestReferences/instanceId"),
417 vnfIds.serviceInstanceId,
418 String.format("Failed to find instanceId: %s in " + requestType + " response. Actual body:%s",
419 vnfIds.serviceInstanceId, body.getEntity()));
422 private <T> T callChangeManagementUpdate(VnfIds vnfIds, String expectationPath, Class<T> responseClass, String requestType) {
423 SimulatorApi.registerExpectation(
425 ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.APPEND);
426 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
427 Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest);
428 return response.readEntity(responseClass);
431 private Response callChangeManagementUpdate(VnfIds vnfIds, ChangeManagementRequest changeManagementRequest) {
432 Entity entity = Entity.json(changeManagementRequest);
433 return callChangeManagement(vnfIds.vnfName, entity);
436 private Response callChangeManagement(String vnfName, Entity entity) {
437 WebTarget webTarget = buildWebTarget(vnfName);
438 return webTarget.request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", "Basic " + AAFGetBasicAuthPreset.VALID_AUTH_VALUE).post(entity);
441 private WebTarget buildWebTarget(String vnfName) {
442 return client.target(uri).
443 path(CHANGE_MANAGEMENT + WORKFLOW).resolveTemplate("vnfname", vnfName);
446 private void testChangeManagement409Error(String expectationPath, String requestType) throws IOException {
447 VnfIds vnfIds = new VnfIds();
448 MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
449 Assert.assertEquals(body.getStatus(), 409, requestType + " failed with wrong http status");
451 getNestedPropertyInMap(body.getEntity(), "serviceException/messageId"),
453 String.format("Failed to find messageId: %s in " + requestType + " response. Actual body:%s",
454 "SVC2000", body.getEntity()));
457 assertThat(getNestedPropertyInMap(body.getEntity(), "serviceException/text"), containsString(vnfIds.vnfInstanceId));
460 private void testChangeManagement404Error(String expectationPath, String requestType) throws IOException {
461 VnfIds vnfIds = new VnfIds();
462 MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
463 Assert.assertEquals(body.getStatus(), 404, requestType + " failed with wrong http status");
464 assertThat(body.getEntity(), equalTo("<html><head><title>Error</title></head><body>404 - Not Found</body></html>"));
467 private void testChangeManagementWithoutVnfInstanceId(String requestType) throws IOException {
468 VnfIds vnfIds = new VnfIds();
469 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
470 changeManagementRequest.getRequestDetails().get(0).setVnfInstanceId(null);
471 MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
472 assertThat(exceptionResponse.serviceException.text, containsString("No vnfInstanceId in request"));
475 private void testChangeManagementServiceInstanceId(Consumer<ChangeManagementRequest> dropInstanceIdMethod, String requestType) throws IOException {
476 VnfIds vnfIds = new VnfIds();
477 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
478 dropInstanceIdMethod.accept(changeManagementRequest);
479 MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
480 assertThat(exceptionResponse.serviceException.text, containsString("No instanceId in request"));
483 private void testChangeManagementInvalidPayload(String payload, String propertyName, String requestType) throws IOException {
484 VnfIds vnfIds = new VnfIds();
485 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
486 changeManagementRequest.getRequestDetails().get(0).getRequestParameters().getAdditionalProperties().put("payload",payload);
487 MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
488 assertThat(exceptionResponse.serviceException.text, containsString(propertyName));
489 assertThat(exceptionResponse.serviceException.text, containsString("No valid payload"));
492 private void testChangeManagementWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod, String requestType) throws IOException {
493 VnfIds vnfIds = new VnfIds();
494 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
495 dropPayloadMethod.accept(changeManagementRequest);
496 MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
497 assertThat(exceptionResponse.serviceException.text, containsString("No valid payload"));
500 private MsoExceptionResponse callChangeManagementAndExpectForException(VnfIds vnfIds, ChangeManagementRequest changeManagementRequest, String requestType) {
501 Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest);
502 Assert.assertEquals(response.getStatus(), HttpStatus.OK.value() , requestType + " wrong http status");
503 MsoResponseWrapper2<MsoExceptionResponse> msoResponseWrapper2 = response.readEntity(new GenericType<MsoResponseWrapper2<MsoExceptionResponse>>(){});
504 assertThat(msoResponseWrapper2.getStatus(), equalTo(400));
505 assertThat(msoResponseWrapper2.getEntity(), instanceOf(MsoExceptionResponse.class));
506 return (MsoExceptionResponse) msoResponseWrapper2.getEntity();
509 private void testChangeManagementGoodPayload(String payload, String expectationFileName, String requestType) throws IOException {
510 VnfIds vnfIds = new VnfIds();
511 SimulatorApi.registerExpectation(
513 ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.APPEND);
514 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
515 changeManagementRequest.getRequestDetails().get(0).getRequestParameters().getAdditionalProperties().put("payload",payload);
516 Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest);
517 MsoResponseWrapper2 body = response.readEntity(MsoResponseWrapper2.class);
518 assertForHappyPath(vnfIds, body, requestType);
519 RestTemplate manualRestTemplate = InsecureHttpsClient.newRestTemplate();
520 super.loginWithChosenRESTClient(getUserCredentials(), manualRestTemplate);
521 SimulatorApi.registerExpectationFromPreset( new PresetAAIGetSubscribersGet(), RegistrationStrategy.APPEND);
523 .verifyExistenceOfIncomingReqsInAuditLogs(manualRestTemplate, uri,
524 response.getHeaders().get("X-ECOMP-RequestID-echo").get(0).toString(),
525 "/vid/change-management/workflow/VidVnf");
529 private ChangeManagementRequest createChangeManagementRequest(VnfIds vnfDetails, String requestType) {
530 ChangeManagementRequest changeManagementRequest = createBasicChangeManagementRequest(vnfDetails);
531 changeManagementRequest.setRequestType(requestType);
532 if(requestType.equals(ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE)) {
533 CloudConfiguration cloudConfiguration = new CloudConfiguration();
534 cloudConfiguration.lcpCloudRegionId = "mdt1";
535 cloudConfiguration.tenantId = "88a6ca3ee0394ade9403f075db23167e";
536 changeManagementRequest.getRequestDetails().get(0).setCloudConfiguration(cloudConfiguration);
538 changeManagementRequest.getRequestDetails().get(0).getRequestParameters().setAdditionalProperty("payload", getPayload(requestType));
539 return changeManagementRequest;
542 private ChangeManagementRequest createBasicChangeManagementRequest(VnfIds vnfDetails)
544 ChangeManagementRequestDetails requestDetails = new ChangeManagementRequestDetails();
546 // org.onap.vid.domain.mso.CloudConfiguration cloudConfiguration = new org.onap.vid.domain.mso.CloudConfiguration();
547 // cloudConfiguration.setLcpCloudRegionId("mdt1");
548 // cloudConfiguration.setTenantId("88a6ca3ee0394ade9403f075db23167e");
549 // requestDetails.setCloudConfiguration(cloudConfiguration);
551 RequestInfo requestInfo = new RequestInfo();
552 requestInfo.setSource("VID");
553 requestInfo.setRequestorId("az2016");
554 requestDetails.setRequestInfo(requestInfo);
556 RequestParameters requestParameters = new RequestParameters();
557 requestDetails.setRequestParameters(requestParameters);
559 RelatedInstance relatedInstance = new RelatedInstance();
560 relatedInstance.instanceId = vnfDetails.serviceInstanceId;
561 RelatedInstanceList relatedInstanceList = new RelatedInstanceList();
562 relatedInstanceList.setRelatedInstance(relatedInstance);
563 requestDetails.setRelatedInstList(Collections.singletonList(relatedInstanceList));
565 requestDetails.setVnfName(vnfDetails.vnfName);
566 requestDetails.setVnfInstanceId(vnfDetails.vnfInstanceId);
568 ChangeManagementRequest changeManagementRequest = new ChangeManagementRequest();
569 changeManagementRequest.setRequestDetails(Collections.singletonList(requestDetails));
570 return changeManagementRequest;
573 private String getPayload(String requestType) {
574 if(requestType.equals(ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE)) {
575 return "{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}";
577 else if(requestType.equals(ChangeManagementRequest.CONFIG_UPDATE)) {
578 return "{\"request-parameters\": \"3.1\",\"configuration-parameters\": \"3.2\", \"operations_timeout\": \"3600\"}";
583 private boolean isTextContainsInList(List<MsoResponseWrapper2> responseList, String str) {
584 for (MsoResponseWrapper2 response : responseList) {
585 if (response.getEntity().toString().contains(str))
592 public void testVnfWorkflowApiCRD() throws IOException {
593 List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(10);
595 //create vnf to workflows relations
596 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
597 vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
599 //ensure all relations exist using get workflows for vnf
600 ensureAllVnfToWorkflowsExist(workflowsDetails);
602 //ensure all relations exist using get all vnf_to_workflows relations
603 Response response = vnfWorkFlowOperationOK(HttpMethod.GET, null);
604 VnfWorkflowRelationAllResponse vnfWorkflowRelationAllResponse = response.readEntity(VnfWorkflowRelationAllResponse.class);
605 Map<VnfDetails, List<String>> vnfDetailsToWorkflowsMap = vnfWorkflowRelationAllResponse.getVnfs().stream()
606 .collect(Collectors.toMap(x -> new VnfDetails(x.getUUID(), x.getInvariantUUID()), VnfDetailsWithWorkflows::getWorkflows));
608 workflowsDetails.forEach(workflowsDetail ->
609 Assert.assertTrue(vnfDetailsToWorkflowsMap.get(workflowsDetail.getVnfDetails()).contains(workflowsDetail.getWorkflowName())));
611 //delete vnf to workflows relations
612 vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
614 //make sure all relations not exist any more
615 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
619 private void ensureAllVnfToWorkflowsExist(List<WorkflowsDetail> workflowsDetails) throws IOException {
620 for (WorkflowsDetail workflowsDetail : workflowsDetails) {
621 GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest = new GetVnfWorkflowRelationRequest(Collections.singletonList(workflowsDetail.getVnfDetails()));
622 GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(getVnfWorkflowRelationRequest);
623 Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 1);
624 Assert.assertEquals(getWorkflowsResponse.getWorkflows().get(0), workflowsDetail.getWorkflowName());
628 private void ensureAllVnfToWorkflowsRelationsNotExist(List<WorkflowsDetail> workflowsDetails) throws IOException {
629 for (WorkflowsDetail workflowsDetail : workflowsDetails) {
630 GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest = new GetVnfWorkflowRelationRequest(Collections.singletonList(workflowsDetail.getVnfDetails()));
631 GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(getVnfWorkflowRelationRequest);
632 Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 0);
637 public void testVnfWorkflowIntersection() throws IOException {
638 List<WorkflowsDetail> workflowsDetails = new ArrayList<>();
639 List<VnfDetails> vnfDetailsList = new ArrayList<>();
641 VnfDetails vnfDetails = generateRandomVnfDetails(vnfDetailsList);
642 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
643 workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
645 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
646 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
647 workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
649 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
650 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
652 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
653 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
655 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
656 workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
658 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
659 vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
661 Set<String> replaceUpdateSet = ImmutableSet.of(REPLACE, UPDATE);
662 Set<String> replaceSet = ImmutableSet.of(REPLACE);
663 Set<String> emptySet = ImmutableSet.of();
665 assertWorkflowsListSize(vnfDetailsList, replaceUpdateSet, 0, 1);
666 assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 2);
667 assertWorkflowsListSize(vnfDetailsList, replaceSet, 2, 3);
668 assertWorkflowsListSize(vnfDetailsList, emptySet, 3, 4);
669 assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 1, 2);
670 assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 1, 2, 3);
671 assertWorkflowsListSize(vnfDetailsList, emptySet, 0, 1, 2, 3, 4);
672 assertWorkflowsListSize(vnfDetailsList, replaceUpdateSet, 0);
674 //delete vnf to workflows relations
675 vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
676 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
678 //get vnf that was inserted and relation were removed return empty set
679 assertWorkflowsListSize(vnfDetailsList, emptySet, 0);
683 public void testGetVnfThatWasNeverInsertedReturn404() throws IOException {
684 //get vnf that was never inserted return 404
685 assertWorkflowsResponse(new GetVnfWorkflowRelationRequest(ImmutableList.of(generateRandomVnfDetails())), HttpStatus.NOT_FOUND);
689 void testDeleteVnfThatWasNeverInserted() throws IOException {
690 //delete vnf that was never inserted return 200 with error in body
691 WorkflowsDetail randomWorkfowDetail = generateRandomWorkflowsDetail();
692 Response response = vnfWorkFlowOperationOK(HttpMethod.DELETE, new VnfWorkflowRelationRequest(ImmutableList.of(randomWorkfowDetail)));
693 VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
694 Assert.assertEquals(vnfWorkflowRelationResponse.getErrors().size(), 1);
695 Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(randomWorkfowDetail.getVnfDetails().getUUID()));
696 Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(randomWorkfowDetail.getVnfDetails().getInvariantUUID()));
700 public void testInsertSameVnfToWorkflowsTwice() throws IOException {
701 List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(1);
702 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
703 vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
704 vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
706 //ensure workflow exist
707 ensureAllVnfToWorkflowsExist(workflowsDetails);
709 //delete vnf to workflows relations
710 vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
712 //make sure all relations not exist any more
713 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
717 public void testMultipleVnfsWhileOneWorkflowNotExist() throws IOException {
718 List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(3);
720 //relation 0 add relation to non exist workflow
721 WorkflowsDetail nonExistWorkflowsDetail = workflowsDetails.get(0);
722 nonExistWorkflowsDetail.setWorkflowName("NotExist");
723 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
725 Response response = vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
726 VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
727 assertErrorResponseForWorkflowDetail(nonExistWorkflowsDetail, vnfWorkflowRelationResponse);
729 //ensure other vnf to workflows exist
730 ensureAllVnfToWorkflowsExist(workflowsDetails.subList(1, workflowsDetails.size()));
732 //ensure there is no workflow for vnf 0
733 GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(
734 new GetVnfWorkflowRelationRequest(ImmutableList.of(nonExistWorkflowsDetail.getVnfDetails())));
735 Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 0);
737 //delete vnf to workflows relations
738 response = vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
739 vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
740 assertErrorResponseForWorkflowDetail(nonExistWorkflowsDetail, vnfWorkflowRelationResponse);
742 //make sure all relations not exist any more
743 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
747 public void testInsertVnfWithEmptyUUID() throws IOException {
748 assertAddVnfWithEmptyIdReturn404((vnfDetails -> vnfDetails.setUUID("")));
752 public void testInsertVnfWithEmptyInvariantUUID() throws IOException {
753 assertAddVnfWithEmptyIdReturn404((vnfDetails -> vnfDetails.setInvariantUUID("")));
757 //This test requires a simulator which runs on VID and is mocking Scheduler
758 public void testDeleteScheduledWorkflowOk() throws Exception {
759 //Register required response
760 SimulatorApi.registerExpectation(DELETE_SCHEDULE_OK_JSON, RegistrationStrategy.APPEND);
761 assertCancelScheduleResponse(HttpStatus.NO_CONTENT);//204
765 //This test requires a simulator which runs on VID and is mocking Scheduler
766 public void testDeleteScheduledWorkflowNotFound() throws Exception {
767 //Register required response
768 SimulatorApi.registerExpectation(DELETE_SCHEDULE_NOT_AUTHORIZED_JSON, RegistrationStrategy.APPEND);
769 assertCancelScheduleResponse(HttpStatus.UNAUTHORIZED);//401
772 private void assertAddVnfWithEmptyIdReturn404(Consumer<VnfDetails> emptyIdSetter) throws IOException {
773 List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(1);
774 emptyIdSetter.accept(workflowsDetails.get(0).getVnfDetails());
775 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
776 Response response = vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
777 VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
778 assertErrorResponseForWorkflowDetail(workflowsDetails.get(0), vnfWorkflowRelationResponse);
779 assertWorkflowsResponse(new GetVnfWorkflowRelationRequest(ImmutableList.of(generateRandomVnfDetails())), HttpStatus.NOT_FOUND);
782 private void assertErrorResponseForWorkflowDetail(WorkflowsDetail wrongWorkflowsDetail, VnfWorkflowRelationResponse vnfWorkflowRelationResponse) {
783 Assert.assertEquals(vnfWorkflowRelationResponse.getErrors().size(), 1);
784 Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getWorkflowName()));
785 Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getVnfDetails().getUUID()));
786 Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getVnfDetails().getInvariantUUID()));
789 private VnfDetails generateRandomVnfDetails(List<VnfDetails> vnfDetailsList) {
790 VnfDetails vnfDetails = generateRandomVnfDetails();
791 vnfDetailsList.add(vnfDetails);
795 private VnfDetails generateRandomVnfDetails() {
796 return new VnfDetails(UUID.randomUUID().toString(), UUID.randomUUID().toString());
799 private void assertWorkflowsListSize(List<VnfDetails> inputList, Set<String> exceptedWorkflows, int... indices) throws IOException {
800 List<VnfDetails> vnfDetailsList = new ArrayList<>();
801 for (int index : indices) {
802 vnfDetailsList.add(inputList.get(index));
804 GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(new GetVnfWorkflowRelationRequest(vnfDetailsList));
805 Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), exceptedWorkflows.size());
806 Assert.assertTrue(getWorkflowsResponse.getWorkflows().containsAll(exceptedWorkflows));
809 private void assertCancelScheduleResponse(HttpStatus expectedStatus) {
810 WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + SCHEDULER_BY_SCHEDULE_ID.replace("{scheduleId}", "1234"));
811 Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).delete();
812 Assert.assertEquals(response.getStatus(), expectedStatus.value());
815 private GetWorkflowsResponse getWorkflowsResponseOK(GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest) throws IOException {
816 WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + GET_VNF_WORKFLOW_RELATION);
817 Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(getVnfWorkflowRelationRequest));
818 TestUtils.assertStatusOK(getVnfWorkflowRelationRequest, webTarget, response);
819 return response.readEntity(GetWorkflowsResponse.class);
822 private void assertWorkflowsResponse(GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest, HttpStatus exceptedHttpStatus) throws IOException {
823 WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + GET_VNF_WORKFLOW_RELATION);
824 Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(getVnfWorkflowRelationRequest));
825 TestUtils.assertHttpStatus(getVnfWorkflowRelationRequest, webTarget, response, exceptedHttpStatus);
826 response.readEntity(VnfWorkflowRelationResponse.class); //assert the body is of type VnfWorkflowRelationResponse
827 Assert.assertTrue(((String) response.getHeaders().get("Content-Type").get(0)).contains(APPLICATION_JSON));
830 private Response vnfWorkFlowOperationOK(String method, VnfWorkflowRelationRequest vnfWorkflowRelationRequest) throws IOException {
831 return vnfWorkFlowOperation(method, vnfWorkflowRelationRequest, HttpStatus.OK);
834 private Response vnfWorkFlowOperation(String method, VnfWorkflowRelationRequest vnfWorkflowRelationRequest, HttpStatus exceptedHttpStatus) throws IOException {
835 WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + VNF_WORKFLOW_RELATION);
836 Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).method(method, Entity.json(vnfWorkflowRelationRequest));
837 TestUtils.assertHttpStatus(vnfWorkflowRelationRequest, webTarget, response, exceptedHttpStatus);
841 @SuppressWarnings("SameParameterValue")
842 private List<WorkflowsDetail> generateWorkflowsDetails(int size) {
843 List<WorkflowsDetail> workflowsDetails = new ArrayList<>(size);
844 for (int i = 0; i < size; i++) {
845 workflowsDetails.add(i, generateRandomWorkflowsDetail());
847 return workflowsDetails;
850 private WorkflowsDetail generateRandomWorkflowsDetail() {
851 String workflow = WORKFLOWS.get(random.nextInt(WORKFLOWS.size()));
852 VnfDetails vnfDetails = generateRandomVnfDetails();
853 return new WorkflowsDetail(vnfDetails, workflow);
856 static public class VnfIds {
857 public String serviceInstanceId;
858 public String vnfInstanceId;
859 public String vnfName;
862 this.serviceInstanceId = UUID.randomUUID().toString();
863 this.vnfInstanceId = UUID.randomUUID().toString();
864 this.vnfName = "VidVnf";