From 9bd821d6a2b49dacb7286d58f11d5cd1cc7e0aa2 Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Mon, 2 Mar 2020 16:17:36 -0500 Subject: Fix path issues A&AI tenant query is prepending the target entity with "/", but it should not. Fixed it. Modified A&AI and SO actors to get path prefixes from parameters. Fixed a bug in an A&AI simulator response (extra "}" at the end. Issue-ID: POLICY-2349 Signed-off-by: Jim Hahn Change-Id: I71f8b1e5fb8a4bd29b4f616a7757d366c7d58127 --- .../actor/aai/AaiCustomQueryOperation.java | 39 +++++++++++++++++----- .../controlloop/actor/aai/AaiGetOperation.java | 36 ++++++++++++++++---- .../actor/aai/AaiCustomQueryOperationTest.java | 17 ++++++---- .../controlloop/actor/aai/AaiGetOperationTest.java | 9 +++-- .../actor.aai/src/test/resources/service.yaml | 2 +- 5 files changed, 78 insertions(+), 25 deletions(-) (limited to 'models-interactions/model-actors/actor.aai/src') diff --git a/models-interactions/model-actors/actor.aai/src/main/java/org/onap/policy/controlloop/actor/aai/AaiCustomQueryOperation.java b/models-interactions/model-actors/actor.aai/src/main/java/org/onap/policy/controlloop/actor/aai/AaiCustomQueryOperation.java index 613b6689d..5b4aa0527 100644 --- a/models-interactions/model-actors/actor.aai/src/main/java/org/onap/policy/controlloop/actor/aai/AaiCustomQueryOperation.java +++ b/models-interactions/model-actors/actor.aai/src/main/java/org/onap/policy/controlloop/actor/aai/AaiCustomQueryOperation.java @@ -21,8 +21,11 @@ package org.onap.policy.controlloop.actor.aai; import java.util.Map; +import java.util.Map.Entry; import java.util.concurrent.CompletableFuture; import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation.Builder; +import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import lombok.Getter; @@ -54,6 +57,7 @@ public class AaiCustomQueryOperation extends HttpOperation { public static final String RESOURCE_LINK = "resource-link"; public static final String RESULT_DATA = "result-data"; + // TODO make this configurable private static final String PREFIX = "/aai/v16"; @Getter @@ -89,21 +93,38 @@ public class AaiCustomQueryOperation extends HttpOperation { @Override protected CompletableFuture startOperationAsync(int attempt, OperationOutcome outcome) { - Map request = makeRequest(); + final Map request = makeRequest(); + Map headers = makeHeaders(); - Entity> entity = Entity.entity(request, MediaType.APPLICATION_JSON); + StringBuilder str = new StringBuilder(getClient().getBaseUrl()); - Map headers = makeHeaders(); + String path = getPath(); + WebTarget web = getClient().getWebTarget().path(path); + str.append(path); + + web = addQuery(web, str, "?", "format", "resource"); + + Builder webldr = web.request(); + for (Entry header : headers.entrySet()) { + webldr.header(header.getKey(), header.getValue()); + } - headers.put("Accept", MediaType.APPLICATION_JSON); - String url = makeUrl(); + String url = str.toString(); logMessage(EventType.OUT, CommInfrastructure.REST, url, request); - // @formatter:off - return handleResponse(outcome, url, - callback -> getClient().put(callback, makePath(), entity, headers)); - // @formatter:on + Entity> entity = Entity.entity(request, MediaType.APPLICATION_JSON); + + return handleResponse(outcome, url, callback -> webldr.async().put(entity, callback)); + } + + private WebTarget addQuery(WebTarget web, StringBuilder str, String separator, String name, String value) { + str.append(separator); + str.append(name); + str.append('='); + str.append(value); + + return web.queryParam(name, value); } /** diff --git a/models-interactions/model-actors/actor.aai/src/main/java/org/onap/policy/controlloop/actor/aai/AaiGetOperation.java b/models-interactions/model-actors/actor.aai/src/main/java/org/onap/policy/controlloop/actor/aai/AaiGetOperation.java index 408c1a0b1..4c4124189 100644 --- a/models-interactions/model-actors/actor.aai/src/main/java/org/onap/policy/controlloop/actor/aai/AaiGetOperation.java +++ b/models-interactions/model-actors/actor.aai/src/main/java/org/onap/policy/controlloop/actor/aai/AaiGetOperation.java @@ -21,8 +21,11 @@ package org.onap.policy.controlloop.actor.aai; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.CompletableFuture; +import javax.ws.rs.client.Invocation.Builder; +import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.onap.policy.aai.AaiConstants; @@ -92,14 +95,35 @@ public class AaiGetOperation extends HttpOperation { Map headers = makeHeaders(); headers.put("Accept", MediaType.APPLICATION_JSON); - String url = makeUrl(); + + StringBuilder str = new StringBuilder(getClient().getBaseUrl()); + + String path = getPath(); + WebTarget web = getClient().getWebTarget().path(path); + str.append(path); + + web = addQuery(web, str, "?", "search-node-type", "vserver"); + web = addQuery(web, str, "&", "filter", "vserver-name:EQUALS:" + params.getTargetEntity()); + + Builder webldr = web.request(); + for (Entry header : headers.entrySet()) { + webldr.header(header.getKey(), header.getValue()); + } + + String url = str.toString(); logMessage(EventType.OUT, CommInfrastructure.REST, url, null); - // @formatter:off - return handleResponse(outcome, url, - callback -> getClient().get(callback, makePath(), headers)); - // @formatter:on + return handleResponse(outcome, url, callback -> webldr.async().get(callback)); + } + + private WebTarget addQuery(WebTarget web, StringBuilder str, String separator, String name, String value) { + str.append(separator); + str.append(name); + str.append('='); + str.append(value); + + return web.queryParam(name, value); } @Override @@ -109,7 +133,7 @@ public class AaiGetOperation extends HttpOperation { @Override public String makePath() { - return (getPath() + "/" + params.getTargetEntity()); + return (getPath() + params.getTargetEntity()); } /** diff --git a/models-interactions/model-actors/actor.aai/src/test/java/org/onap/policy/controlloop/actor/aai/AaiCustomQueryOperationTest.java b/models-interactions/model-actors/actor.aai/src/test/java/org/onap/policy/controlloop/actor/aai/AaiCustomQueryOperationTest.java index 78ffc50e0..c24e45db7 100644 --- a/models-interactions/model-actors/actor.aai/src/test/java/org/onap/policy/controlloop/actor/aai/AaiCustomQueryOperationTest.java +++ b/models-interactions/model-actors/actor.aai/src/test/java/org/onap/policy/controlloop/actor/aai/AaiCustomQueryOperationTest.java @@ -38,6 +38,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; import javax.ws.rs.client.Entity; +import javax.ws.rs.client.InvocationCallback; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -109,11 +110,12 @@ public class AaiCustomQueryOperationTest extends BasicAaiOperation future2 = oper.start(); @@ -131,13 +133,14 @@ public class AaiCustomQueryOperationTest extends BasicAaiOperation future2 = oper.start(); @@ -157,17 +160,18 @@ public class AaiCustomQueryOperationTest extends BasicAaiOperation request = new TreeMap<>(entityCaptor.getValue().getEntity()); @@ -176,12 +180,13 @@ public class AaiCustomQueryOperationTest extends BasicAaiOperation future2 = oper.start(); diff --git a/models-interactions/model-actors/actor.aai/src/test/java/org/onap/policy/controlloop/actor/aai/AaiGetOperationTest.java b/models-interactions/model-actors/actor.aai/src/test/java/org/onap/policy/controlloop/actor/aai/AaiGetOperationTest.java index 4681d9ef4..13560ccf3 100644 --- a/models-interactions/model-actors/actor.aai/src/test/java/org/onap/policy/controlloop/actor/aai/AaiGetOperationTest.java +++ b/models-interactions/model-actors/actor.aai/src/test/java/org/onap/policy/controlloop/actor/aai/AaiGetOperationTest.java @@ -30,6 +30,7 @@ import static org.mockito.Mockito.when; import java.util.Map; import java.util.concurrent.CompletableFuture; +import javax.ws.rs.client.InvocationCallback; import org.junit.Before; import org.junit.Test; import org.onap.policy.aai.AaiConstants; @@ -69,13 +70,14 @@ public class AaiGetOperationTest extends BasicAaiOperation { } @Test + @SuppressWarnings("unchecked") public void testStartOperationAsync_testStartQueryAsync_testPostProcessResponse() throws Exception { // return a map in the reply Map reply = Map.of(INPUT_FIELD, TEXT); when(rawResponse.readEntity(String.class)).thenReturn(new StandardCoder().encode(reply)); - when(client.get(any(), any(), any())).thenAnswer(provideResponse(rawResponse)); + when(webAsync.get(any(InvocationCallback.class))).thenAnswer(provideResponse(rawResponse)); CompletableFuture future2 = oper.startOperationAsync(1, outcome); assertFalse(future2.isDone()); @@ -95,12 +97,13 @@ public class AaiGetOperationTest extends BasicAaiOperation { * Tests startOperationAsync() when there's a failure. */ @Test + @SuppressWarnings("unchecked") public void testStartOperationAsyncFailure() throws Exception { when(rawResponse.getStatus()).thenReturn(500); when(rawResponse.readEntity(String.class)).thenReturn(""); - when(client.get(any(), any(), any())).thenAnswer(provideResponse(rawResponse)); + when(webAsync.get(any(InvocationCallback.class))).thenAnswer(provideResponse(rawResponse)); CompletableFuture future2 = oper.startOperationAsync(1, outcome); assertFalse(future2.isDone()); @@ -121,7 +124,7 @@ public class AaiGetOperationTest extends BasicAaiOperation { @Test public void testMakePath() { - assertEquals(PATH + "/" + TARGET_ENTITY, oper.makePath()); + assertEquals(PATH + TARGET_ENTITY, oper.makePath()); } @Test diff --git a/models-interactions/model-actors/actor.aai/src/test/resources/service.yaml b/models-interactions/model-actors/actor.aai/src/test/resources/service.yaml index 9f6561de0..d0c11be7b 100644 --- a/models-interactions/model-actors/actor.aai/src/test/resources/service.yaml +++ b/models-interactions/model-actors/actor.aai/src/test/resources/service.yaml @@ -21,7 +21,7 @@ httpClients: - clientName: my-client hostname: localhost port: 80 - basePath: base-url + basePath: base-url/ managed: true actors: AAI: -- cgit 1.2.3-korg