From cdc1733ce7f53902d551a7d38c65dc23210d0b70 Mon Sep 17 00:00:00 2001 From: "Maharajh, Robby (rx2202)" Date: Mon, 4 Dec 2017 15:49:29 -0500 Subject: Add support to bulk api for patch/deletes reationships Issue-ID: AAI-534 Change-Id: I5334bb047ff1977474cd7b653e61d47ee7e99220 Signed-off-by: Maharajh, Robby (rx2202) --- .../main/java/org/onap/aai/rest/BulkConsumer.java | 2 +- .../org/onap/aai/rest/BulkProcessConsumerTest.java | 396 ++++++++++++++------- .../complex-bulk-process-delete-transactions.json | 20 ++ .../payloads/relationship/complex-bugfix.json | 16 + .../payloads/relationship/pserver-bugfix.json | 4 + .../pserver-complex-relationship-for-bulk.json | 8 + 6 files changed, 308 insertions(+), 138 deletions(-) create mode 100644 aai-resources/src/test/resources/payloads/bulk/complex-bulk-process-delete-transactions.json create mode 100644 aai-resources/src/test/resources/payloads/relationship/complex-bugfix.json create mode 100644 aai-resources/src/test/resources/payloads/relationship/pserver-bugfix.json create mode 100644 aai-resources/src/test/resources/payloads/relationship/pserver-complex-relationship-for-bulk.json (limited to 'aai-resources/src') diff --git a/aai-resources/src/main/java/org/onap/aai/rest/BulkConsumer.java b/aai-resources/src/main/java/org/onap/aai/rest/BulkConsumer.java index 5a90bc5..a973250 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/BulkConsumer.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/BulkConsumer.java @@ -378,7 +378,7 @@ public abstract class BulkConsumer extends RESTAPI { String bodyStr = gson.toJson(bodyObj); bulkOperation.setRawReq(bodyStr); - if (bulkOperation.getHttpMethod().equals(HttpMethod.PUT_EDGE)) { + if (bulkOperation.getHttpMethod().equals(HttpMethod.PUT_EDGE) || bulkOperation.getHttpMethod().equals(HttpMethod.DELETE_EDGE)) { Introspector obj; try { obj = loader.unmarshal("relationship", bodyStr, org.onap.aai.restcore.MediaType.getEnum(inputMediaType)); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessConsumerTest.java b/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessConsumerTest.java index 92d1637..8a75a96 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessConsumerTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessConsumerTest.java @@ -1,137 +1,259 @@ -/** - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - */ -package org.onap.aai.rest; - -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.when; - -import java.io.IOException; - -import javax.ws.rs.core.Response; - -import org.apache.commons.lang3.StringUtils; -import org.junit.Test; -import org.onap.aai.introspection.Version; - -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; - -public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { - - private static final EELFLogger logger = EELFManager.getInstance().getLogger(BulkProcessConsumerTest.class.getName()); - - - @Test - public void bulkAddPayloadInBulkProcessTest() throws IOException { - - when(uriInfo.getPath()).thenReturn(uri); - when(uriInfo.getPath(false)).thenReturn(uri); - - String payload = getBulkPayload("pserver-transactions"); - Response response = executeRequest(payload); - - assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 3 {\"201\":null}", 3, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); - } - - @Test - public void bulkProcessPayloadTest() throws IOException { - - when(uriInfo.getPath()).thenReturn(uri); - when(uriInfo.getPath(false)).thenReturn(uri); - - String payload = getBulkPayload("pserver-bulk-process-transactions"); - Response response = executeRequest(payload); - - assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 1 {\"201\":null}", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); - assertEquals("Contains 1 {\"404\":\"{", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"404\":\"{")); - assertEquals("Contains 1 ERR.5.4.6114", 1, StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6114")); - } - - @Test - public void bulkProcessComplexDeletePayloadTest() throws IOException { - - when(uriInfo.getPath()).thenReturn(uri); - when(uriInfo.getPath(false)).thenReturn(uri); - - String payload = getBulkPayload("complex-bulk-process-transactions"); - Response response = executeRequest(payload); - - System.out.println(response.getEntity().toString()); - assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 0 {\"201\":null}", 0, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); - assertEquals("Contains 1 {\"404\":\"{", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"404\":\"{")); - assertEquals("Contains 1 ERR.5.4.6114", 1, StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6114")); - } - - - @Test - public void bulkAddInvalidMethodTest() throws IOException { - - when(uriInfo.getPath()).thenReturn(uri); - when(uriInfo.getPath(false)).thenReturn(uri); - - String payload = getBulkPayload("pserver-transactions-invalid-method"); - Response response = executeRequest(payload); - - assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 1 {\"400\":\"{", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"400\":\"{")); - assertEquals("Contains 1 ERR.5.4.6118", 1, StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6118")); - } - - @Test - public void bulkAddThrowExceptionWhenPayloadContainsNoTransactionsTest(){ - - when(uriInfo.getPath()).thenReturn(uri); - when(uriInfo.getPath(false)).thenReturn(uri); - - String payload = "{\"transactions\":[]}"; - Response response = executeRequest(payload); - - assertEquals("Bad Request", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); - assertEquals("Contains error code", true, response.getEntity().toString().contains("ERR.5.4.6118")); - } - - @Test - public void bulkAddThrowExceptionWhenInvalidJsonTest() throws IOException { - - when(uriInfo.getPath()).thenReturn(uri); - when(uriInfo.getPath(false)).thenReturn(uri); - - String payload = "{"; - Response response = executeRequest(payload); - - assertEquals("Bad Request", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); - assertEquals("Contains error code", true, response.getEntity().toString().contains("ERR.5.4.6111")); - } - - @Override - protected BulkConsumer getConsumer(){ - return new BulkProcessConsumer(); - } - - @Override - protected String getUri() { - return "/aai/" + Version.getLatest().toString() + "/bulkprocess"; - } -} +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + */ +package org.onap.aai.rest; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.when; + +import java.io.IOException; + +import javax.ws.rs.core.Response; + +import org.apache.commons.lang3.StringUtils; +import org.json.JSONException; +import org.junit.Test; +import org.onap.aai.introspection.Version; +import org.skyscreamer.jsonassert.JSONAssert; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + +public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { + + private static final EELFLogger logger = EELFManager.getInstance().getLogger(BulkProcessConsumerTest.class.getName()); + private LegacyMoxyConsumer legacyMoxyConsumer; + + @Test + public void bulkAddPayloadInBulkProcessTest() throws IOException { + + when(uriInfo.getPath()).thenReturn(uri); + when(uriInfo.getPath(false)).thenReturn(uri); + + String payload = getBulkPayload("pserver-transactions"); + Response response = executeRequest(payload); + + assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); + assertEquals("Contains 3 {\"201\":null}", 3, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); + } + + @Test + public void bulkProcessPayloadTest() throws IOException { + + when(uriInfo.getPath()).thenReturn(uri); + when(uriInfo.getPath(false)).thenReturn(uri); + + String payload = getBulkPayload("pserver-bulk-process-transactions"); + Response response = executeRequest(payload); + + assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); + assertEquals("Contains 1 {\"201\":null}", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); + assertEquals("Contains 1 {\"404\":\"{", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"404\":\"{")); + assertEquals("Contains 1 ERR.5.4.6114", 1, StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6114")); + } + + @Test + public void bulkProcessComplexDeletePayloadTest() throws IOException { + + when(uriInfo.getPath()).thenReturn(uri); + when(uriInfo.getPath(false)).thenReturn(uri); + + String payload = getBulkPayload("complex-bulk-process-transactions"); + Response response = executeRequest(payload); + + System.out.println(response.getEntity().toString()); + assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); + assertEquals("Contains 0 {\"201\":null}", 0, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); + assertEquals("Contains 1 {\"404\":\"{", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"404\":\"{")); + assertEquals("Contains 1 ERR.5.4.6114", 1, StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6114")); + } + + @Test + public void testBulkDeletePserverAndComplexRelationship() throws IOException, JSONException { + + legacyMoxyConsumer = new LegacyMoxyConsumer(); + + String pserverData = getPayload("payloads/relationship/pserver-bugfix.json"); + String complexData = getPayload("payloads/relationship/complex-bugfix.json"); + + String hostname = "pserver-9876543210-77-jenkins"; + String physicalLocationId ="complex-987654321-77-jenkins"; + + String pserverUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); + String complexUri = String.format("cloud-infrastructure/complexes/complex/%s", physicalLocationId); + + doSetupResource(pserverUri, pserverData); + doSetupResource(complexUri, complexData); + + String complexToPserverRelationshipData = getPayload("payloads/relationship/pserver-complex-relationship-for-bulk.json"); + String complexToPserverRelationshipUri = String.format( + "cloud-infrastructure/pservers/pserver/%s/relationship-list/relationship", hostname); + + Response response = legacyMoxyConsumer.updateRelationship( + complexToPserverRelationshipData, + Version.getLatest().toString(), + complexToPserverRelationshipUri, + httpHeaders, + uriInfo, + null + ); + + assertNotNull("Response from the legacy moxy consumer returned null", response); + int code = response.getStatus(); + if(!VALID_HTTP_STATUS_CODES.contains(code)){ + System.out.println("Response Code: " + code + "\tEntity: " + response.getEntity()); + } + + assertEquals("Expected to return status created from the response", + Response.Status.OK.getStatusCode(), response.getStatus()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + + // TODO - Need to actually verify the relationship between pserver and cloud-region + + String payload = getBulkPayload("complex-bulk-process-delete-transactions"); + Response responseBulkDelete = executeRequest(payload); + + System.out.println(responseBulkDelete.getEntity().toString()); + + code = responseBulkDelete.getStatus(); + + if(!VALID_HTTP_STATUS_CODES.contains(code)){ + System.out.println("Response Code: " + code + "\tEntity: " + responseBulkDelete.getEntity()); + System.out.println("Response Code: " + code + "\tEntity: " + responseBulkDelete.getEntity()); + } + assertEquals("Expected to return status created from the response", + Response.Status.CREATED.getStatusCode(), responseBulkDelete.getStatus()); + assertEquals("Contains 0 {\"204\":null}", 1, StringUtils.countMatches(responseBulkDelete.getEntity().toString(), "{\"204\":null}")); + + } + + protected void doSetupResource(String uri, String payload) throws JSONException { + + when(uriInfo.getPath()).thenReturn(uri); + when(uriInfo.getPath(false)).thenReturn(uri); + + Response response = legacyMoxyConsumer.getLegacy( + "", + Version.getLatest().toString(), + uri, + "all", + "false", + httpHeaders, + uriInfo, + null + ); + + assertNotNull("Response from the legacy moxy consumer returned null", response); + assertEquals("Expected to not have the data already in memory", + Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); + + response = legacyMoxyConsumer.update( + payload, + Version.getLatest().toString(), + uri, + httpHeaders, + uriInfo, + null + ); + + assertNotNull("Response from the legacy moxy consumer returned null", response); + int code = response.getStatus(); + if(!VALID_HTTP_STATUS_CODES.contains(code)){ + System.out.println("Response Code: " + code + "\tEntity: " + response.getEntity()); + } + assertEquals("Expected to return status created from the response", + Response.Status.CREATED.getStatusCode(), response.getStatus()); + + queryParameters.add("depth", "10000"); + response = legacyMoxyConsumer.getLegacy( + "", + Version.getLatest().toString(), + uri, + "all", + "false", + httpHeaders, + uriInfo, + null + ); + + assertNotNull("Response from the legacy moxy consumer returned null", response); + assertEquals("Expected to return the pserver data that was just put in memory", + Response.Status.OK.getStatusCode(), response.getStatus()); + + if("".equalsIgnoreCase(payload)){ + payload = "{}"; + } + + JSONAssert.assertEquals(payload, response.getEntity().toString(), false); + } + + + @Test + public void bulkAddInvalidMethodTest() throws IOException { + + when(uriInfo.getPath()).thenReturn(uri); + when(uriInfo.getPath(false)).thenReturn(uri); + + String payload = getBulkPayload("pserver-transactions-invalid-method"); + Response response = executeRequest(payload); + + assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); + assertEquals("Contains 1 {\"400\":\"{", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"400\":\"{")); + assertEquals("Contains 1 ERR.5.4.6118", 1, StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6118")); + } + + @Test + public void bulkAddThrowExceptionWhenPayloadContainsNoTransactionsTest(){ + + when(uriInfo.getPath()).thenReturn(uri); + when(uriInfo.getPath(false)).thenReturn(uri); + + String payload = "{\"transactions\":[]}"; + Response response = executeRequest(payload); + + assertEquals("Bad Request", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + assertEquals("Contains error code", true, response.getEntity().toString().contains("ERR.5.4.6118")); + } + + @Test + public void bulkAddThrowExceptionWhenInvalidJsonTest() throws IOException { + + when(uriInfo.getPath()).thenReturn(uri); + when(uriInfo.getPath(false)).thenReturn(uri); + + String payload = "{"; + Response response = executeRequest(payload); + + assertEquals("Bad Request", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + assertEquals("Contains error code", true, response.getEntity().toString().contains("ERR.5.4.6111")); + } + + @Override + protected BulkConsumer getConsumer(){ + return new BulkProcessConsumer(); + } + + @Override + protected String getUri() { + return "/aai/" + Version.getLatest().toString() + "/bulkprocess"; + } +} diff --git a/aai-resources/src/test/resources/payloads/bulk/complex-bulk-process-delete-transactions.json b/aai-resources/src/test/resources/payloads/bulk/complex-bulk-process-delete-transactions.json new file mode 100644 index 0000000..96a4228 --- /dev/null +++ b/aai-resources/src/test/resources/payloads/bulk/complex-bulk-process-delete-transactions.json @@ -0,0 +1,20 @@ +{ + "transactions": [ + { + "delete": [ + { + "uri": "/cloud-infrastructure/pservers/pserver/pserver-9876543210-77-jenkins/relationship-list/relationship", + "body": { + "related-to": "complex", + "relationship-data": [ + { + "relationship-key": "complex.physical-location-id", + "relationship-value": "complex-987654321-77-jenkins" + } + ] + } + } + ] + } + ] +} \ No newline at end of file diff --git a/aai-resources/src/test/resources/payloads/relationship/complex-bugfix.json b/aai-resources/src/test/resources/payloads/relationship/complex-bugfix.json new file mode 100644 index 0000000..29fe3d6 --- /dev/null +++ b/aai-resources/src/test/resources/payloads/relationship/complex-bugfix.json @@ -0,0 +1,16 @@ +{ + "physical-location-id" : "complex-987654321-77-jenkins", + "physical-location-type" : "uug", + "street1" : "kDv5Ge6dr", + "city" : "KpEa5IjqY0u82", + "postal-code" : "6CRqacfEW2", + "country" : "P0ho", + "region" : "Sk2QevPYRBjT", + "ctag-pools" : { + "ctag-pool" : [ { + "target-pe" : "5dbe73c6-cedf-4e68-a7c5-699ba6d90e1d", + "availability-zone-name" : "819ec2fa-fb9f-49f0-8fd8-5feb941aad1f", + "ctag-pool-purpose" : "4TMeWI" + } ] + } +} \ No newline at end of file diff --git a/aai-resources/src/test/resources/payloads/relationship/pserver-bugfix.json b/aai-resources/src/test/resources/payloads/relationship/pserver-bugfix.json new file mode 100644 index 0000000..e78bd7a --- /dev/null +++ b/aai-resources/src/test/resources/payloads/relationship/pserver-bugfix.json @@ -0,0 +1,4 @@ +{ + "hostname" : "pserver-9876543210-77-jenkins", + "in-maint" : false +} \ No newline at end of file diff --git a/aai-resources/src/test/resources/payloads/relationship/pserver-complex-relationship-for-bulk.json b/aai-resources/src/test/resources/payloads/relationship/pserver-complex-relationship-for-bulk.json new file mode 100644 index 0000000..72982af --- /dev/null +++ b/aai-resources/src/test/resources/payloads/relationship/pserver-complex-relationship-for-bulk.json @@ -0,0 +1,8 @@ +{ + "related-to" : "complex", + "related-link" : "/aai/v11/cloud-infrastructure/complexes/complex/complex-987654321-77-jenkins", + "relationship-data" : [{ + "relationship-key" : "complex.physical-location-id", + "relationship-value" : "complex-987654321-77-jenkins" + }] +} \ No newline at end of file -- cgit 1.2.3-korg