summaryrefslogtreecommitdiffstats
path: root/applications/common/src
diff options
context:
space:
mode:
authorJim Hahn <jrh3@att.com>2019-08-28 15:20:18 -0400
committerJim Hahn <jrh3@att.com>2019-08-30 12:07:32 -0400
commit98873e8c202426b9d74d9460ebd30b57fa4c7eb7 (patch)
treedb56b53965c37b36008c99c49acf9e5d079c2fbf /applications/common/src
parent30b9aa0d2e2e6b954e2ce25537d7d7ca81d3a5a4 (diff)
Get policy type from policy-api
Added a class to retrieve a policy type from the policy-api. Updated property files to include parameters that are needed to configure it. Updates per review comments: - change PolicyApi to PolicyApiCaller - use HttpClientFactory - removed superfluous constructors from exception classes - changed parameters to use RestServerParameters instead of BusTopicParams Change-Id: I8aad6ca5a733c8ad9cc983496e745ebe7400dd17 Issue-ID: POLICY-1911 Signed-off-by: Jim Hahn <jrh3@att.com>
Diffstat (limited to 'applications/common/src')
-rw-r--r--applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/NotFoundException.java41
-rw-r--r--applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/PolicyApiCaller.java106
-rw-r--r--applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/PolicyApiException.java40
-rw-r--r--applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/ExceptionTest.java37
-rw-r--r--applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/PolicyApiCallerTest.java201
5 files changed, 425 insertions, 0 deletions
diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/NotFoundException.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/NotFoundException.java
new file mode 100644
index 00000000..260d16f2
--- /dev/null
+++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/NotFoundException.java
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pdp.xacml.application.common;
+
+/**
+ * Exception indicating that the data of interest was not found when querying the
+ * policy-api.
+ */
+public class NotFoundException extends PolicyApiException {
+ private static final long serialVersionUID = 1L;
+
+ public NotFoundException(String message) {
+ super(message);
+ }
+
+ public NotFoundException(Throwable cause) {
+ super(cause);
+ }
+
+ public NotFoundException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/PolicyApiCaller.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/PolicyApiCaller.java
new file mode 100644
index 00000000..9d47517a
--- /dev/null
+++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/PolicyApiCaller.java
@@ -0,0 +1,106 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pdp.xacml.application.common;
+
+import java.net.HttpURLConnection;
+import javax.ws.rs.core.Response;
+import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams;
+import org.onap.policy.common.endpoints.http.client.HttpClient;
+import org.onap.policy.common.endpoints.http.client.HttpClientConfigException;
+import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance;
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
+import org.onap.policy.common.gson.GsonMessageBodyHandler;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Methods to access policy-api via REST service calls.
+ */
+public class PolicyApiCaller {
+ private static Logger logger = LoggerFactory.getLogger(PolicyApiCaller.class);
+
+ private static final String POLICY_TYPE_URI = "/policy/api/v1/policytypes/";
+ private static final String POLICY_TYPE_VERSION_URI = "/versions/";
+
+ private final HttpClient httpClient;
+
+ /**
+ * Constructs the object.
+ *
+ * @param params target specification
+ * @throws PolicyApiException if an error occurs
+ */
+ public PolicyApiCaller(RestServerParameters params) throws PolicyApiException {
+ BusTopicParams busParams = new BusTopicParams();
+ busParams.setClientName("policy-api");
+ busParams.setHostname(params.getHost());
+ busParams.setManaged(false);
+ busParams.setPassword(params.getPassword());
+ busParams.setPort(params.getPort());
+ busParams.setSerializationProvider(GsonMessageBodyHandler.class.getName());
+ busParams.setUseHttps(params.isHttps());
+ busParams.setUserName(params.getUserName());
+
+ try {
+ httpClient = makeClient(busParams);
+ } catch (HttpClientConfigException e) {
+ throw new PolicyApiException("connection to host: " + busParams.getHostname(), e);
+ }
+ }
+
+ /**
+ * Gets a policy type from policy-api.
+ *
+ * @param type policy type of interest
+ * @return the desired policy type
+ * @throws PolicyApiException if an error occurs
+ */
+ public ToscaPolicyType getPolicyType(ToscaPolicyTypeIdentifier type) throws PolicyApiException {
+
+ try {
+ Response resp = httpClient
+ .get(POLICY_TYPE_URI + type.getName() + POLICY_TYPE_VERSION_URI + type.getVersion());
+
+ switch (resp.getStatus()) {
+ case HttpURLConnection.HTTP_OK:
+ return resp.readEntity(ToscaPolicyType.class);
+ case HttpURLConnection.HTTP_NOT_FOUND:
+ logger.warn("policy-api not found {}", resp);
+ throw new NotFoundException(type.toString());
+ default:
+ logger.warn("policy-api request error {}", resp);
+ throw new PolicyApiException(type.toString());
+ }
+
+ } catch (RuntimeException e) {
+ logger.warn("policy-api connection error");
+ throw new PolicyApiException(type.toString(), e);
+ }
+ }
+
+ // these methods may be overridden by junit tests
+
+ protected HttpClient makeClient(BusTopicParams busParams) throws HttpClientConfigException {
+ return HttpClientFactoryInstance.getClientFactory().build(busParams);
+ }
+}
diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/PolicyApiException.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/PolicyApiException.java
new file mode 100644
index 00000000..380bd19a
--- /dev/null
+++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/PolicyApiException.java
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pdp.xacml.application.common;
+
+/**
+ * Exception occurring while accessing the policy-api.
+ */
+public class PolicyApiException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ public PolicyApiException(String message) {
+ super(message);
+ }
+
+ public PolicyApiException(Throwable cause) {
+ super(cause);
+ }
+
+ public PolicyApiException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/ExceptionTest.java b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/ExceptionTest.java
new file mode 100644
index 00000000..63c6b246
--- /dev/null
+++ b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/ExceptionTest.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pdp.xacml.application.common;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.onap.policy.common.utils.test.ExceptionsTester;
+
+public class ExceptionTest {
+
+ @Test
+ public void test() {
+ ExceptionsTester tester = new ExceptionsTester();
+
+ assertEquals(3, tester.test(PolicyApiException.class));
+ assertEquals(3, tester.test(NotFoundException.class));
+ }
+}
diff --git a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/PolicyApiCallerTest.java b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/PolicyApiCallerTest.java
new file mode 100644
index 00000000..6e7ec7c8
--- /dev/null
+++ b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/PolicyApiCallerTest.java
@@ -0,0 +1,201 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pdp.xacml.application.common;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.util.Properties;
+import java.util.UUID;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams;
+import org.onap.policy.common.endpoints.http.client.HttpClient;
+import org.onap.policy.common.endpoints.http.client.HttpClientConfigException;
+import org.onap.policy.common.endpoints.http.server.HttpServletServer;
+import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance;
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
+import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
+import org.onap.policy.common.gson.GsonMessageBodyHandler;
+import org.onap.policy.common.utils.network.NetworkUtil;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PolicyApiCallerTest {
+ private static final String MY_TYPE = "my-type";
+
+ private static final String MY_VERSION = "1.0.0";
+
+ private static final Logger logger = LoggerFactory.getLogger(PolicyApiCallerTest.class);
+
+ private static final String CLIENT_NAME = "policy-api";
+ private static final String NOT_A_TYPE = "other-type";
+ private static final String INVALID_TYPE = "invalid";
+ private static final String UNKNOWN_TYPE = "unknown";
+
+ private static int port;
+ private static RestServerParameters clientParams;
+
+ private PolicyApiCaller api;
+
+ /**
+ * Initializes {@link #clientParams} and starts a simple REST server to handle the
+ * test requests.
+ *
+ * @throws IOException if an error occurs
+ */
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ port = NetworkUtil.allocPort();
+
+ clientParams = mock(RestServerParameters.class);
+ when(clientParams.getHost()).thenReturn("localhost");
+ when(clientParams.getPort()).thenReturn(port);
+
+ Properties props = new Properties();
+ props.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES, CLIENT_NAME);
+
+ final String svcpfx =
+ PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + CLIENT_NAME;
+
+ props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, clientParams.getHost());
+ props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX,
+ Integer.toString(clientParams.getPort()));
+ props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_REST_CLASSES_SUFFIX,
+ ApiRestController.class.getName());
+ props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true");
+ props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_HTTPS_SUFFIX, "false");
+ props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_AAF_SUFFIX, "false");
+ props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_SERIALIZATION_PROVIDER,
+ GsonMessageBodyHandler.class.getName());
+
+ HttpServletServerFactoryInstance.getServerFactory().build(props).forEach(HttpServletServer::start);
+
+ assertTrue(NetworkUtil.isTcpPortOpen(clientParams.getHost(), clientParams.getPort(), 100, 100));
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() {
+ HttpServletServerFactoryInstance.getServerFactory().destroy();
+ }
+
+ /**
+ * Resets {@link #clientParams} and populates {@link #api}.
+ *
+ * @throws PolicyApiException if an error occurs
+ */
+ @Before
+ public void setUp() throws PolicyApiException {
+ when(clientParams.getPort()).thenReturn(port);
+
+ api = new PolicyApiCaller(clientParams);
+ }
+
+ @Test
+ public void testPolicyApi() {
+ assertThatThrownBy(() -> new PolicyApiCaller(clientParams) {
+ @Override
+ protected HttpClient makeClient(BusTopicParams busParams) throws HttpClientConfigException {
+ throw new HttpClientConfigException("expected exception");
+ }
+ }).isInstanceOf(PolicyApiException.class);
+ }
+
+ @Test
+ public void testGetPolicyType() throws Exception {
+
+ assertNotNull(api.getPolicyType(new ToscaPolicyTypeIdentifier(MY_TYPE, MY_VERSION)));
+
+ assertThatThrownBy(() -> api.getPolicyType(new ToscaPolicyTypeIdentifier(INVALID_TYPE, MY_VERSION)))
+ .isInstanceOf(PolicyApiException.class);
+
+ assertThatThrownBy(() -> api.getPolicyType(new ToscaPolicyTypeIdentifier(UNKNOWN_TYPE, MY_VERSION)))
+ .isInstanceOf(NotFoundException.class);
+
+ assertThatThrownBy(() -> api.getPolicyType(new ToscaPolicyTypeIdentifier(NOT_A_TYPE, MY_VERSION)))
+ .isInstanceOf(PolicyApiException.class);
+
+ // connect to a port that has no server
+ when(clientParams.getPort()).thenReturn(NetworkUtil.allocPort());
+ api = new PolicyApiCaller(clientParams);
+
+ assertThatThrownBy(() -> api.getPolicyType(new ToscaPolicyTypeIdentifier(MY_TYPE, MY_VERSION)))
+ .isInstanceOf(PolicyApiException.class);
+ }
+
+ /**
+ * Simple REST server to handle test requests.
+ */
+
+ @Path("/policy/api/v1")
+ @Produces({"application/json", "application/yaml"})
+ @Consumes({"application/json", "application/yaml"})
+ public static class ApiRestController {
+
+ /**
+ * Retrieves the specified version of a particular policy type.
+ *
+ * @param policyTypeId ID of desired policy type
+ * @param versionId version of desired policy type
+ * @param requestId optional request ID
+ *
+ * @return the Response object containing the results of the API operation
+ */
+ @GET
+ @Path("/policytypes/{policyTypeId}/versions/{versionId}")
+ public Response getSpecificVersionOfPolicyType(@PathParam("policyTypeId") String policyTypeId,
+ @PathParam("versionId") String versionId, @HeaderParam("X-ONAP-RequestID") UUID requestId) {
+
+ assertEquals(MY_VERSION, versionId);
+
+ switch (policyTypeId) {
+ case UNKNOWN_TYPE:
+ logger.info("request for unknown policy type");
+ return Response.status(Response.Status.NOT_FOUND).build();
+ case INVALID_TYPE:
+ logger.info("invalid request for policy type");
+ return Response.status(Response.Status.BAD_REQUEST).build();
+ case NOT_A_TYPE:
+ logger.info("invalid request for policy type");
+ return Response.status(Response.Status.OK).entity("string-type").build();
+ default:
+ logger.info("request for policy type={} version={}", policyTypeId, versionId);
+ return Response.status(Response.Status.OK).entity(new ToscaPolicyType()).build();
+ }
+ }
+ }
+}