1 package org.onap.vid.api;
3 import static org.hamcrest.CoreMatchers.containsString;
4 import static org.hamcrest.MatcherAssert.assertThat;
5 import static org.hamcrest.core.IsEqual.equalTo;
6 import static org.hamcrest.core.IsInstanceOf.instanceOf;
7 import static org.onap.vid.api.ChangeManagementUserApiLoggingTest.MSO_GET_CHANGE_MANAGEMENTS_SCALEOUT;
8 import static org.onap.vid.api.TestUtils.getNestedPropertyInMap;
9 import static org.testng.AssertJUnit.assertEquals;
10 import static org.testng.AssertJUnit.assertFalse;
11 import static vid.automation.test.services.SimulatorApi.RegistrationStrategy.APPEND;
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 getOrchestrationForDashboardShouldResponseWithFullBody() {
306 SimulatorApi.registerExpectation(MSO_GET_CHANGE_MANAGEMENTS_SCALEOUT, RegistrationStrategy.CLEAR_THEN_SET);
307 SimulatorApi.registerExpectationFromPreset(new PresetMSOOrchestrationRequestsGetNoTaskInfoBody(), APPEND);
308 ResponseEntity<String> responseEntity = restTemplate.getForEntity(buildUri(CHANGE_MANAGEMENT + MSO ), String.class);
310 assertFalse(responseEntity.getBody().contains("requestProcessingData"));
316 public void testConfigUpdateHappyPath() throws IOException {
317 testHappyPath("mso_config_update_ok.json", ChangeManagementRequest.CONFIG_UPDATE);
321 public void testConfigUpdate409Error() throws IOException {
322 testChangeManagement409Error("mso_config_update_error_409.json", ChangeManagementRequest.CONFIG_UPDATE);
326 public void testConfigUpdate404Error() throws IOException {
327 testChangeManagement404Error("mso_config_update_error_404.json", ChangeManagementRequest.CONFIG_UPDATE);
331 public void testConfigUpdateWithoutVnfInstanceId() throws IOException {
332 testChangeManagementWithoutVnfInstanceId(ChangeManagementRequest.CONFIG_UPDATE);
335 @Test(dataProvider = "requestWithoutServiceInstanceId")
336 public void testConfigUpdateWithoutServiceInstanceId(String desc, Consumer<ChangeManagementRequest> dropInstanceIdMethod) throws IOException {
337 testChangeManagementServiceInstanceId(dropInstanceIdMethod, ChangeManagementRequest.CONFIG_UPDATE);
340 @Test(dataProvider = "wrongConfigPayloads")
341 public void testConfigUpdateInvalidPayload(String payload, String propertyName) throws IOException {
342 testChangeManagementInvalidPayload(payload, propertyName, ChangeManagementRequest.CONFIG_UPDATE);
345 @Test(dataProvider = "requestWithoutPayload")
346 public void testConfigUpdateWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod) throws IOException {
347 testChangeManagementWithoutPayload(dropPayloadMethod, ChangeManagementRequest.CONFIG_UPDATE);
350 @Test(dataProvider = "goodConfigPayloads")
351 public void testConfigUpdateGoodPayload(String payload) throws IOException {
352 testChangeManagementGoodPayload(payload, "mso_config_update_ok.json", ChangeManagementRequest.CONFIG_UPDATE);
355 @Test(dataProvider = "credentialsFilterTestData")
356 public void testCadiCredentialsFilter(String authValue, int expectedStatusCode)
358 VnfIds vnfIds = new VnfIds();
359 ChangeManagementRequest changeManagementRequest = createBasicChangeManagementRequest(vnfIds);
360 changeManagementRequest.setRequestType(ChangeManagementRequest.REPLACE);
361 WebTarget webTarget = buildWebTarget(vnfIds.vnfName);
362 Entity entity = Entity.json(changeManagementRequest);
363 Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON_TYPE);
364 if (authValue != null) {
365 invocationBuilder.header("Authorization", "Basic " + authValue);
367 Response response = invocationBuilder.post(entity);
368 String body = response.readEntity(String.class);
369 Assert.assertEquals(response.getStatus(), expectedStatusCode, "Full response: " + body);
373 public static Object[][] requestFromSchedulerDataProvider(Method test) {
374 return new Object[][]{
376 "e9181708-f105-4dfd-9a36-0e089faa72ba",
377 new PresetMsoVnfReplace("254583ad-b38c-498b-bdbd-b8de5e07541b", "e9181708-f105-4dfd-9a36-0e089faa72ba"),
378 "changeManagement/vnfReplaceRequest.json"
381 "c929b7ec-cc9d-11e8-a8d5-f2801f1b9fd1",
382 new PresetMsoVnfUpdate("d0c59d4a-cc9d-11e8-a8d5-f2801f1b9fd1","c929b7ec-cc9d-11e8-a8d5-f2801f1b9fd1"),
383 "changeManagement/vnfUpdateRequest.json"
386 "e5403738-da34-4090-8864-ba9cf1bcdd88",
387 new PresetMsoVnfInPlaceSoftwareUpdate("12709275-787c-4be7-8c9c-fce64ab7ca8c","e5403738-da34-4090-8864-ba9cf1bcdd88"),
388 "changeManagement/vnfInPlaceSoftwareUpdate.json"
393 @Test(dataProvider = "requestFromSchedulerDataProvider")
394 public void whenGetFromSchedulerRequest_sendAsExpectedToMso(String vnfInstanceId, PresetMsoChangeManagementBase preset, String requestPath) {
395 SimulatorApi.registerExpectationFromPreset(
397 RegistrationStrategy.APPEND);
398 String schedulerRequest = ReadFile.loadResourceAsString(requestPath);
399 Response response = callChangeManagement("VidVnf", Entity.json(schedulerRequest));
400 MsoResponseWrapper2 body = response.readEntity(MsoResponseWrapper2.class);
401 assertEquals(202, body.getStatus());
402 assertEquals(vnfInstanceId, getNestedPropertyInMap(body.getEntity(), "requestReferences/instanceId"));
406 private void testHappyPath(String expectationPath, String requestType) {
407 VnfIds vnfIds = new VnfIds();
408 MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
409 assertForHappyPath(vnfIds, body, requestType);
412 private void assertForHappyPath(VnfIds vnfIds, MsoResponseWrapper2 body, String requestType) {
413 Assert.assertEquals(body.getStatus(), 202, requestType + " failed with wrong http status");
415 getNestedPropertyInMap(body.getEntity(), "requestReferences/instanceId"),
416 vnfIds.serviceInstanceId,
417 String.format("Failed to find instanceId: %s in " + requestType + " response. Actual body:%s",
418 vnfIds.serviceInstanceId, body.getEntity()));
421 private <T> T callChangeManagementUpdate(VnfIds vnfIds, String expectationPath, Class<T> responseClass, String requestType) {
422 SimulatorApi.registerExpectation(
424 ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.APPEND);
425 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
426 Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest);
427 return response.readEntity(responseClass);
430 private Response callChangeManagementUpdate(VnfIds vnfIds, ChangeManagementRequest changeManagementRequest) {
431 Entity entity = Entity.json(changeManagementRequest);
432 return callChangeManagement(vnfIds.vnfName, entity);
435 private Response callChangeManagement(String vnfName, Entity entity) {
436 WebTarget webTarget = buildWebTarget(vnfName);
437 return webTarget.request(MediaType.APPLICATION_JSON_TYPE).header("Authorization", "Basic " + AAFGetBasicAuthPreset.VALID_AUTH_VALUE).post(entity);
440 private WebTarget buildWebTarget(String vnfName) {
441 return client.target(uri).
442 path(CHANGE_MANAGEMENT + WORKFLOW).resolveTemplate("vnfname", vnfName);
445 private void testChangeManagement409Error(String expectationPath, String requestType) throws IOException {
446 VnfIds vnfIds = new VnfIds();
447 MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
448 Assert.assertEquals(body.getStatus(), 409, requestType + " failed with wrong http status");
450 getNestedPropertyInMap(body.getEntity(), "serviceException/messageId"),
452 String.format("Failed to find messageId: %s in " + requestType + " response. Actual body:%s",
453 "SVC2000", body.getEntity()));
456 assertThat(getNestedPropertyInMap(body.getEntity(), "serviceException/text"), containsString(vnfIds.vnfInstanceId));
459 private void testChangeManagement404Error(String expectationPath, String requestType) throws IOException {
460 VnfIds vnfIds = new VnfIds();
461 MsoResponseWrapper2 body = callChangeManagementUpdate(vnfIds, expectationPath, MsoResponseWrapper2.class, requestType);
462 Assert.assertEquals(body.getStatus(), 404, requestType + " failed with wrong http status");
463 assertThat(body.getEntity(), equalTo("<html><head><title>Error</title></head><body>404 - Not Found</body></html>"));
466 private void testChangeManagementWithoutVnfInstanceId(String requestType) throws IOException {
467 VnfIds vnfIds = new VnfIds();
468 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
469 changeManagementRequest.getRequestDetails().get(0).setVnfInstanceId(null);
470 MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
471 assertThat(exceptionResponse.serviceException.text, containsString("No vnfInstanceId in request"));
474 private void testChangeManagementServiceInstanceId(Consumer<ChangeManagementRequest> dropInstanceIdMethod, String requestType) throws IOException {
475 VnfIds vnfIds = new VnfIds();
476 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
477 dropInstanceIdMethod.accept(changeManagementRequest);
478 MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
479 assertThat(exceptionResponse.serviceException.text, containsString("No instanceId in request"));
482 private void testChangeManagementInvalidPayload(String payload, String propertyName, String requestType) throws IOException {
483 VnfIds vnfIds = new VnfIds();
484 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
485 changeManagementRequest.getRequestDetails().get(0).getRequestParameters().getAdditionalProperties().put("payload",payload);
486 MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
487 assertThat(exceptionResponse.serviceException.text, containsString(propertyName));
488 assertThat(exceptionResponse.serviceException.text, containsString("No valid payload"));
491 private void testChangeManagementWithoutPayload(Consumer<ChangeManagementRequest> dropPayloadMethod, String requestType) throws IOException {
492 VnfIds vnfIds = new VnfIds();
493 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
494 dropPayloadMethod.accept(changeManagementRequest);
495 MsoExceptionResponse exceptionResponse = callChangeManagementAndExpectForException(vnfIds, changeManagementRequest, requestType);
496 assertThat(exceptionResponse.serviceException.text, containsString("No valid payload"));
499 private MsoExceptionResponse callChangeManagementAndExpectForException(VnfIds vnfIds, ChangeManagementRequest changeManagementRequest, String requestType) {
500 Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest);
501 Assert.assertEquals(response.getStatus(), HttpStatus.OK.value() , requestType + " wrong http status");
502 MsoResponseWrapper2<MsoExceptionResponse> msoResponseWrapper2 = response.readEntity(new GenericType<MsoResponseWrapper2<MsoExceptionResponse>>(){});
503 assertThat(msoResponseWrapper2.getStatus(), equalTo(400));
504 assertThat(msoResponseWrapper2.getEntity(), instanceOf(MsoExceptionResponse.class));
505 return (MsoExceptionResponse) msoResponseWrapper2.getEntity();
508 private void testChangeManagementGoodPayload(String payload, String expectationFileName, String requestType) throws IOException {
509 VnfIds vnfIds = new VnfIds();
510 SimulatorApi.registerExpectation(
512 ImmutableMap.of("SERVICE_INSTANCE_ID", vnfIds.serviceInstanceId, "VNF_INSTANCE_ID", vnfIds.vnfInstanceId), RegistrationStrategy.APPEND);
513 ChangeManagementRequest changeManagementRequest = createChangeManagementRequest(vnfIds, requestType);
514 changeManagementRequest.getRequestDetails().get(0).getRequestParameters().getAdditionalProperties().put("payload",payload);
515 Response response = callChangeManagementUpdate(vnfIds, changeManagementRequest);
516 MsoResponseWrapper2 body = response.readEntity(MsoResponseWrapper2.class);
517 assertForHappyPath(vnfIds, body, requestType);
518 RestTemplate manualRestTemplate = InsecureHttpsClient.newRestTemplate();
519 super.loginWithChosenRESTClient(getUserCredentials(), manualRestTemplate);
520 SimulatorApi.registerExpectationFromPreset( new PresetAAIGetSubscribersGet(), RegistrationStrategy.APPEND);
522 .verifyExistenceOfIncomingReqsInAuditLogs(manualRestTemplate, uri,
523 response.getHeaders().get("X-ECOMP-RequestID-echo").get(0).toString(),
524 "/vid/change-management/workflow/VidVnf");
528 private ChangeManagementRequest createChangeManagementRequest(VnfIds vnfDetails, String requestType) {
529 ChangeManagementRequest changeManagementRequest = createBasicChangeManagementRequest(vnfDetails);
530 changeManagementRequest.setRequestType(requestType);
531 if(requestType.equals(ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE)) {
532 CloudConfiguration cloudConfiguration = new CloudConfiguration();
533 cloudConfiguration.lcpCloudRegionId = "mdt1";
534 cloudConfiguration.tenantId = "88a6ca3ee0394ade9403f075db23167e";
535 changeManagementRequest.getRequestDetails().get(0).setCloudConfiguration(cloudConfiguration);
537 changeManagementRequest.getRequestDetails().get(0).getRequestParameters().setAdditionalProperty("payload", getPayload(requestType));
538 return changeManagementRequest;
541 private ChangeManagementRequest createBasicChangeManagementRequest(VnfIds vnfDetails)
543 ChangeManagementRequestDetails requestDetails = new ChangeManagementRequestDetails();
545 // org.onap.vid.domain.mso.CloudConfiguration cloudConfiguration = new org.onap.vid.domain.mso.CloudConfiguration();
546 // cloudConfiguration.setLcpCloudRegionId("mdt1");
547 // cloudConfiguration.setTenantId("88a6ca3ee0394ade9403f075db23167e");
548 // requestDetails.setCloudConfiguration(cloudConfiguration);
550 RequestInfo requestInfo = new RequestInfo();
551 requestInfo.setSource("VID");
552 requestInfo.setRequestorId("az2016");
553 requestDetails.setRequestInfo(requestInfo);
555 RequestParameters requestParameters = new RequestParameters();
556 requestDetails.setRequestParameters(requestParameters);
558 RelatedInstance relatedInstance = new RelatedInstance();
559 relatedInstance.instanceId = vnfDetails.serviceInstanceId;
560 RelatedInstanceList relatedInstanceList = new RelatedInstanceList();
561 relatedInstanceList.setRelatedInstance(relatedInstance);
562 requestDetails.setRelatedInstList(Collections.singletonList(relatedInstanceList));
564 requestDetails.setVnfName(vnfDetails.vnfName);
565 requestDetails.setVnfInstanceId(vnfDetails.vnfInstanceId);
567 ChangeManagementRequest changeManagementRequest = new ChangeManagementRequest();
568 changeManagementRequest.setRequestDetails(Collections.singletonList(requestDetails));
569 return changeManagementRequest;
572 private String getPayload(String requestType) {
573 if(requestType.equals(ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE)) {
574 return "{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}";
576 else if(requestType.equals(ChangeManagementRequest.CONFIG_UPDATE)) {
577 return "{\"request-parameters\": \"3.1\",\"configuration-parameters\": \"3.2\", \"operations_timeout\": \"3600\"}";
582 private boolean isTextContainsInList(List<MsoResponseWrapper2> responseList, String str) {
583 for (MsoResponseWrapper2 response : responseList) {
584 if (response.getEntity().toString().contains(str))
591 public void testVnfWorkflowApiCRD() throws IOException {
592 List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(10);
594 //create vnf to workflows relations
595 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
596 vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
598 //ensure all relations exist using get workflows for vnf
599 ensureAllVnfToWorkflowsExist(workflowsDetails);
601 //ensure all relations exist using get all vnf_to_workflows relations
602 Response response = vnfWorkFlowOperationOK(HttpMethod.GET, null);
603 VnfWorkflowRelationAllResponse vnfWorkflowRelationAllResponse = response.readEntity(VnfWorkflowRelationAllResponse.class);
604 Map<VnfDetails, List<String>> vnfDetailsToWorkflowsMap = vnfWorkflowRelationAllResponse.getVnfs().stream()
605 .collect(Collectors.toMap(x -> new VnfDetails(x.getUUID(), x.getInvariantUUID()), VnfDetailsWithWorkflows::getWorkflows));
607 workflowsDetails.forEach(workflowsDetail ->
608 Assert.assertTrue(vnfDetailsToWorkflowsMap.get(workflowsDetail.getVnfDetails()).contains(workflowsDetail.getWorkflowName())));
610 //delete vnf to workflows relations
611 vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
613 //make sure all relations not exist any more
614 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
618 private void ensureAllVnfToWorkflowsExist(List<WorkflowsDetail> workflowsDetails) throws IOException {
619 for (WorkflowsDetail workflowsDetail : workflowsDetails) {
620 GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest = new GetVnfWorkflowRelationRequest(Collections.singletonList(workflowsDetail.getVnfDetails()));
621 GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(getVnfWorkflowRelationRequest);
622 Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 1);
623 Assert.assertEquals(getWorkflowsResponse.getWorkflows().get(0), workflowsDetail.getWorkflowName());
627 private void ensureAllVnfToWorkflowsRelationsNotExist(List<WorkflowsDetail> workflowsDetails) throws IOException {
628 for (WorkflowsDetail workflowsDetail : workflowsDetails) {
629 GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest = new GetVnfWorkflowRelationRequest(Collections.singletonList(workflowsDetail.getVnfDetails()));
630 GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(getVnfWorkflowRelationRequest);
631 Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 0);
636 public void testVnfWorkflowIntersection() throws IOException {
637 List<WorkflowsDetail> workflowsDetails = new ArrayList<>();
638 List<VnfDetails> vnfDetailsList = new ArrayList<>();
640 VnfDetails vnfDetails = generateRandomVnfDetails(vnfDetailsList);
641 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
642 workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
644 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
645 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
646 workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
648 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
649 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
651 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
652 workflowsDetails.add(new WorkflowsDetail(vnfDetails, REPLACE));
654 vnfDetails = generateRandomVnfDetails(vnfDetailsList);
655 workflowsDetails.add(new WorkflowsDetail(vnfDetails, UPDATE));
657 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
658 vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
660 Set<String> replaceUpdateSet = ImmutableSet.of(REPLACE, UPDATE);
661 Set<String> replaceSet = ImmutableSet.of(REPLACE);
662 Set<String> emptySet = ImmutableSet.of();
664 assertWorkflowsListSize(vnfDetailsList, replaceUpdateSet, 0, 1);
665 assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 2);
666 assertWorkflowsListSize(vnfDetailsList, replaceSet, 2, 3);
667 assertWorkflowsListSize(vnfDetailsList, emptySet, 3, 4);
668 assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 1, 2);
669 assertWorkflowsListSize(vnfDetailsList, replaceSet, 0, 1, 2, 3);
670 assertWorkflowsListSize(vnfDetailsList, emptySet, 0, 1, 2, 3, 4);
671 assertWorkflowsListSize(vnfDetailsList, replaceUpdateSet, 0);
673 //delete vnf to workflows relations
674 vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
675 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
677 //get vnf that was inserted and relation were removed return empty set
678 assertWorkflowsListSize(vnfDetailsList, emptySet, 0);
682 public void testGetVnfThatWasNeverInsertedReturn404() throws IOException {
683 //get vnf that was never inserted return 404
684 assertWorkflowsResponse(new GetVnfWorkflowRelationRequest(ImmutableList.of(generateRandomVnfDetails())), HttpStatus.NOT_FOUND);
688 void testDeleteVnfThatWasNeverInserted() throws IOException {
689 //delete vnf that was never inserted return 200 with error in body
690 WorkflowsDetail randomWorkfowDetail = generateRandomWorkflowsDetail();
691 Response response = vnfWorkFlowOperationOK(HttpMethod.DELETE, new VnfWorkflowRelationRequest(ImmutableList.of(randomWorkfowDetail)));
692 VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
693 Assert.assertEquals(vnfWorkflowRelationResponse.getErrors().size(), 1);
694 Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(randomWorkfowDetail.getVnfDetails().getUUID()));
695 Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(randomWorkfowDetail.getVnfDetails().getInvariantUUID()));
699 public void testInsertSameVnfToWorkflowsTwice() throws IOException {
700 List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(1);
701 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
702 vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
703 vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
705 //ensure workflow exist
706 ensureAllVnfToWorkflowsExist(workflowsDetails);
708 //delete vnf to workflows relations
709 vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
711 //make sure all relations not exist any more
712 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
716 public void testMultipleVnfsWhileOneWorkflowNotExist() throws IOException {
717 List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(3);
719 //relation 0 add relation to non exist workflow
720 WorkflowsDetail nonExistWorkflowsDetail = workflowsDetails.get(0);
721 nonExistWorkflowsDetail.setWorkflowName("NotExist");
722 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
724 Response response = vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
725 VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
726 assertErrorResponseForWorkflowDetail(nonExistWorkflowsDetail, vnfWorkflowRelationResponse);
728 //ensure other vnf to workflows exist
729 ensureAllVnfToWorkflowsExist(workflowsDetails.subList(1, workflowsDetails.size()));
731 //ensure there is no workflow for vnf 0
732 GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(
733 new GetVnfWorkflowRelationRequest(ImmutableList.of(nonExistWorkflowsDetail.getVnfDetails())));
734 Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), 0);
736 //delete vnf to workflows relations
737 response = vnfWorkFlowOperationOK(HttpMethod.DELETE, vnfWorkflowRelationRequest);
738 vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
739 assertErrorResponseForWorkflowDetail(nonExistWorkflowsDetail, vnfWorkflowRelationResponse);
741 //make sure all relations not exist any more
742 ensureAllVnfToWorkflowsRelationsNotExist(workflowsDetails);
746 public void testInsertVnfWithEmptyUUID() throws IOException {
747 assertAddVnfWithEmptyIdReturn404((vnfDetails -> vnfDetails.setUUID("")));
751 public void testInsertVnfWithEmptyInvariantUUID() throws IOException {
752 assertAddVnfWithEmptyIdReturn404((vnfDetails -> vnfDetails.setInvariantUUID("")));
756 //This test requires a simulator which runs on VID and is mocking Scheduler
757 public void testDeleteScheduledWorkflowOk() throws Exception {
758 //Register required response
759 SimulatorApi.registerExpectation(DELETE_SCHEDULE_OK_JSON, RegistrationStrategy.APPEND);
760 assertCancelScheduleResponse(HttpStatus.NO_CONTENT);//204
764 //This test requires a simulator which runs on VID and is mocking Scheduler
765 public void testDeleteScheduledWorkflowNotFound() throws Exception {
766 //Register required response
767 SimulatorApi.registerExpectation(DELETE_SCHEDULE_NOT_AUTHORIZED_JSON, RegistrationStrategy.APPEND);
768 assertCancelScheduleResponse(HttpStatus.UNAUTHORIZED);//401
771 private void assertAddVnfWithEmptyIdReturn404(Consumer<VnfDetails> emptyIdSetter) throws IOException {
772 List<WorkflowsDetail> workflowsDetails = generateWorkflowsDetails(1);
773 emptyIdSetter.accept(workflowsDetails.get(0).getVnfDetails());
774 VnfWorkflowRelationRequest vnfWorkflowRelationRequest = new VnfWorkflowRelationRequest(workflowsDetails);
775 Response response = vnfWorkFlowOperationOK(HttpMethod.POST, vnfWorkflowRelationRequest);
776 VnfWorkflowRelationResponse vnfWorkflowRelationResponse = response.readEntity(VnfWorkflowRelationResponse.class);
777 assertErrorResponseForWorkflowDetail(workflowsDetails.get(0), vnfWorkflowRelationResponse);
778 assertWorkflowsResponse(new GetVnfWorkflowRelationRequest(ImmutableList.of(generateRandomVnfDetails())), HttpStatus.NOT_FOUND);
781 private void assertErrorResponseForWorkflowDetail(WorkflowsDetail wrongWorkflowsDetail, VnfWorkflowRelationResponse vnfWorkflowRelationResponse) {
782 Assert.assertEquals(vnfWorkflowRelationResponse.getErrors().size(), 1);
783 Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getWorkflowName()));
784 Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getVnfDetails().getUUID()));
785 Assert.assertTrue(vnfWorkflowRelationResponse.getErrors().get(0).contains(wrongWorkflowsDetail.getVnfDetails().getInvariantUUID()));
788 private VnfDetails generateRandomVnfDetails(List<VnfDetails> vnfDetailsList) {
789 VnfDetails vnfDetails = generateRandomVnfDetails();
790 vnfDetailsList.add(vnfDetails);
794 private VnfDetails generateRandomVnfDetails() {
795 return new VnfDetails(UUID.randomUUID().toString(), UUID.randomUUID().toString());
798 private void assertWorkflowsListSize(List<VnfDetails> inputList, Set<String> exceptedWorkflows, int... indices) throws IOException {
799 List<VnfDetails> vnfDetailsList = new ArrayList<>();
800 for (int index : indices) {
801 vnfDetailsList.add(inputList.get(index));
803 GetWorkflowsResponse getWorkflowsResponse = getWorkflowsResponseOK(new GetVnfWorkflowRelationRequest(vnfDetailsList));
804 Assert.assertEquals(getWorkflowsResponse.getWorkflows().size(), exceptedWorkflows.size());
805 Assert.assertTrue(getWorkflowsResponse.getWorkflows().containsAll(exceptedWorkflows));
808 private void assertCancelScheduleResponse(HttpStatus expectedStatus) {
809 WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + SCHEDULER_BY_SCHEDULE_ID.replace("{scheduleId}", "1234"));
810 Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).delete();
811 Assert.assertEquals(response.getStatus(), expectedStatus.value());
814 private GetWorkflowsResponse getWorkflowsResponseOK(GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest) throws IOException {
815 WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + GET_VNF_WORKFLOW_RELATION);
816 Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(getVnfWorkflowRelationRequest));
817 TestUtils.assertStatusOK(getVnfWorkflowRelationRequest, webTarget, response);
818 return response.readEntity(GetWorkflowsResponse.class);
821 private void assertWorkflowsResponse(GetVnfWorkflowRelationRequest getVnfWorkflowRelationRequest, HttpStatus exceptedHttpStatus) throws IOException {
822 WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + GET_VNF_WORKFLOW_RELATION);
823 Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(getVnfWorkflowRelationRequest));
824 TestUtils.assertHttpStatus(getVnfWorkflowRelationRequest, webTarget, response, exceptedHttpStatus);
825 response.readEntity(VnfWorkflowRelationResponse.class); //assert the body is of type VnfWorkflowRelationResponse
826 Assert.assertTrue(((String) response.getHeaders().get("Content-Type").get(0)).contains(APPLICATION_JSON));
829 private Response vnfWorkFlowOperationOK(String method, VnfWorkflowRelationRequest vnfWorkflowRelationRequest) throws IOException {
830 return vnfWorkFlowOperation(method, vnfWorkflowRelationRequest, HttpStatus.OK);
833 private Response vnfWorkFlowOperation(String method, VnfWorkflowRelationRequest vnfWorkflowRelationRequest, HttpStatus exceptedHttpStatus) throws IOException {
834 WebTarget webTarget = client.target(uri).path(CHANGE_MANAGEMENT + "/" + VNF_WORKFLOW_RELATION);
835 Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE).method(method, Entity.json(vnfWorkflowRelationRequest));
836 TestUtils.assertHttpStatus(vnfWorkflowRelationRequest, webTarget, response, exceptedHttpStatus);
840 @SuppressWarnings("SameParameterValue")
841 private List<WorkflowsDetail> generateWorkflowsDetails(int size) {
842 List<WorkflowsDetail> workflowsDetails = new ArrayList<>(size);
843 for (int i = 0; i < size; i++) {
844 workflowsDetails.add(i, generateRandomWorkflowsDetail());
846 return workflowsDetails;
849 private WorkflowsDetail generateRandomWorkflowsDetail() {
850 String workflow = WORKFLOWS.get(random.nextInt(WORKFLOWS.size()));
851 VnfDetails vnfDetails = generateRandomVnfDetails();
852 return new WorkflowsDetail(vnfDetails, workflow);
855 static public class VnfIds {
856 public String serviceInstanceId;
857 public String vnfInstanceId;
858 public String vnfName;
861 this.serviceInstanceId = UUID.randomUUID().toString();
862 this.vnfInstanceId = UUID.randomUUID().toString();
863 this.vnfName = "VidVnf";