summaryrefslogtreecommitdiffstats
path: root/applications/common/src/test
diff options
context:
space:
mode:
authorPamela Dragosh <pdragosh@research.att.com>2019-08-30 15:21:05 -0400
committerPamela Dragosh <pdragosh@research.att.com>2019-09-09 15:27:30 -0400
commit85b5178017e89c815af7792826f52a90814f5dba (patch)
tree1cc49f6763f1af2cab372bb75ae6b9e5391c3ad7 /applications/common/src/test
parentdc68da3c00c0a814110e0f7529365d695bff571b (diff)
Integrate using Policy Type to find Matchable
Utilize's Jim's helper class to pull from API policy types definitions so that Xacml PDP can determine which properties are "matchable". Override initialize to set translator parameters. Utilize the metadata section of ToscaProperties to store the matchable field. Updated Matchable Request to be dynamic with respect to the incoming resource attributes. Stored the policy types as JSON. Issue-ID: POLICY-1899 Change-Id: Icff3605495b0a34ebfcdfa54346095ce2d8468a4 Signed-off-by: Pamela Dragosh <pdragosh@research.att.com>
Diffstat (limited to 'applications/common/src/test')
-rw-r--r--applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchablePolicyRequestTest.java45
-rw-r--r--applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslatorTest.java215
-rw-r--r--applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProviderTest.java12
-rw-r--r--applications/common/src/test/resources/matchable/onap.policies.Test-1.0.0.yaml38
-rw-r--r--applications/common/src/test/resources/matchable/test.policies.input.tosca.yaml23
5 files changed, 312 insertions, 21 deletions
diff --git a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchablePolicyRequestTest.java b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchablePolicyRequestTest.java
index 00c86f25..1c844621 100644
--- a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchablePolicyRequestTest.java
+++ b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchablePolicyRequestTest.java
@@ -20,14 +20,17 @@
package org.onap.policy.pdp.xacml.application.common.std;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
-import java.util.Collection;
-import java.util.Collections;
+import com.att.research.xacml.api.DataTypeException;
+import com.att.research.xacml.api.Request;
+import com.att.research.xacml.api.RequestAttributes;
+import com.att.research.xacml.api.XACML3;
+import com.att.research.xacml.std.IdentifierImpl;
+import java.util.Arrays;
+import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import org.junit.Before;
@@ -35,21 +38,24 @@ import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.onap.policy.models.decisions.concepts.DecisionRequest;
+import org.onap.policy.pdp.xacml.application.common.ToscaDictionary;
public class StdMatchablePolicyRequestTest {
private static final String ACTION = "my-action";
private static final String ONAP_NAME = "my-name";
private static final String ONAP_INSTANCE = "my-instance";
private static final String ONAP_COMPONENT = "my-component";
- private static final String POLICY_SCOPE = "my-scope";
- private static final String POLICY_TYPE = "my-type";
+ private static final String RESOURCE1 = "my-scope";
+ private static final String RESOURCE2 = "my-service";
+ private static final String RESOURCE3 = "my-geography1";
+ private static final String RESOURCE4 = "my-geography2";
@Mock
private DecisionRequest decreq;
private Map<String, Object> resources;
- private StdMatchablePolicyRequest stdreq;
+ private Request stdreq;
/**
* Initializes objects.
@@ -68,23 +74,29 @@ public class StdMatchablePolicyRequestTest {
}
@Test
- public void testCreateInstance() {
- resources.put(StdMatchablePolicyRequest.POLICY_SCOPE_KEY, 100);
- resources.put(StdMatchablePolicyRequest.POLICY_TYPE_KEY, 101);
+ public void testCreateInstance() throws IllegalAccessException, DataTypeException {
+ resources.put("resource1", RESOURCE1);
+ resources.put("resource2", RESOURCE2);
+ resources.put("resource3", Arrays.asList(RESOURCE3, RESOURCE4));
stdreq = StdMatchablePolicyRequest.createInstance(decreq);
assertNotNull(stdreq);
- assertEquals(ACTION, stdreq.getAction());
- assertEquals(ONAP_COMPONENT, stdreq.getOnapComponent());
- assertEquals(ONAP_INSTANCE, stdreq.getOnapInstance());
- assertEquals(ONAP_NAME, stdreq.getOnapName());
+ assertTrue(stdreq.getRequestAttributes(XACML3.ID_ATTRIBUTE_CATEGORY_ACTION).hasNext());
+ assertTrue(stdreq.getRequestAttributes(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT).hasNext());
+
+
+ Iterator<RequestAttributes> iterResources = stdreq.getRequestAttributes(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE);
+ assertTrue(iterResources.hasNext());
+ while (iterResources.hasNext()) {
+ RequestAttributes attrs = iterResources.next();
+ assertTrue(attrs.hasAttributes(new IdentifierImpl(ToscaDictionary.ID_RESOURCE_MATCHABLE + "resource1")));
+ }
- assertTrue(stdreq.getPolicyScopes().isEmpty());
- assertTrue(stdreq.getPolicyTypes().isEmpty());
}
+ /*
@Test
public void testCreateInstance_StringValues() {
resources.put(StdMatchablePolicyRequest.POLICY_SCOPE_KEY, POLICY_SCOPE);
@@ -117,5 +129,6 @@ public class StdMatchablePolicyRequestTest {
assertFalse(res.isEmpty());
assertEquals(POLICY_TYPE, res.iterator().next());
}
+*/
}
diff --git a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslatorTest.java b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslatorTest.java
new file mode 100644
index 00000000..3e690882
--- /dev/null
+++ b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslatorTest.java
@@ -0,0 +1,215 @@
+/*-
+ * ============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.std;
+
+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.Map;
+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 oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+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.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.network.NetworkUtil;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
+import org.onap.policy.pdp.xacml.application.common.ToscaPolicyConversionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.Yaml;
+
+public class StdMatchableTranslatorTest {
+
+ private static final Logger logger = LoggerFactory.getLogger(StdMatchableTranslatorTest.class);
+ private static final String CLIENT_NAME = "policy-api";
+ private static final StandardCoder standardCoder = new StandardCoder();
+ private static int port;
+ private static RestServerParameters clientParams;
+ private static ToscaPolicyType testPolicyType;
+
+ @ClassRule
+ public static final TemporaryFolder policyFolder = new TemporaryFolder();
+
+ /**
+ * 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 {
+ System.setProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.StdErrLog");
+ System.setProperty("org.eclipse.jetty.LEVEL", "OFF");
+ //
+ // Setup our api server simulator
+ //
+ 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));
+ //
+ // Load our test policy type
+ //
+ String policyYaml = ResourceUtils.getResourceAsString("matchable/onap.policies.Test-1.0.0.yaml");
+ Yaml yaml = new Yaml();
+ Object yamlObject = yaml.load(policyYaml);
+ String yamlAsJsonString = standardCoder.encode(yamlObject);
+ //
+ // Serialize it into a class
+ //
+ ToscaServiceTemplate serviceTemplate = standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class);
+ //
+ // Make sure all the fields are setup properly
+ //
+ JpaToscaServiceTemplate jtst = new JpaToscaServiceTemplate();
+ jtst.fromAuthorative(serviceTemplate);
+ ToscaServiceTemplate completedJtst = jtst.toAuthorative();
+ //
+ // Find the Policy Type - SHOULD only be one
+ //
+ assertEquals(1, completedJtst.getPolicyTypes().size());
+ testPolicyType = completedJtst.getPolicyTypes().get("onap.policies.Test");
+ assertNotNull(testPolicyType);
+ logger.info("Test Policy Type {}{}", System.lineSeparator(), testPolicyType);
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() {
+ HttpServletServerFactoryInstance.getServerFactory().destroy();
+ }
+
+ @Test
+ public void test() throws CoderException, ToscaPolicyConversionException {
+ //
+ // Create our translator
+ //
+ StdMatchableTranslator translator = new StdMatchableTranslator();
+ assertNotNull(translator);
+ //
+ // Set it up
+ //
+ translator.setPathForData(policyFolder.getRoot().toPath());
+ translator.setApiRestParameters(clientParams);
+ //
+ // Load policies to test
+ //
+ String policyYaml = ResourceUtils.getResourceAsString(
+ "src/test/resources/matchable/test.policies.input.tosca.yaml");
+ Yaml yaml = new Yaml();
+ Object yamlObject = yaml.load(policyYaml);
+ String yamlAsJsonString = standardCoder.encode(yamlObject);
+ //
+ // Serialize it into a class
+ //
+ ToscaServiceTemplate serviceTemplate = standardCoder.decode(yamlAsJsonString, ToscaServiceTemplate.class);
+ //
+ // Make sure all the fields are setup properly
+ //
+ JpaToscaServiceTemplate jtst = new JpaToscaServiceTemplate();
+ jtst.fromAuthorative(serviceTemplate);
+ ToscaServiceTemplate completedJtst = jtst.toAuthorative();
+ //
+ // Get the policies
+ //
+ for (Map<String, ToscaPolicy> policies : completedJtst.getToscaTopologyTemplate().getPolicies()) {
+ for (ToscaPolicy policy : policies.values()) {
+ PolicyType translatedPolicy = translator.convertPolicy(policy);
+ assertNotNull(translatedPolicy);
+ logger.info("Translated policy {} {}", System.lineSeparator(), translatedPolicy);
+ }
+ }
+ }
+
+ /**
+ * 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) {
+ logger.info("request for policy type={} version={}", policyTypeId, versionId);
+ return Response.status(Response.Status.OK).entity(testPolicyType).build();
+
+ }
+ }
+}
diff --git a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProviderTest.java b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProviderTest.java
index 8f44dedb..30419daf 100644
--- a/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProviderTest.java
+++ b/applications/common/src/test/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProviderTest.java
@@ -54,6 +54,7 @@ import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.onap.policy.common.endpoints.parameters.RestServerParameters;
import org.onap.policy.models.decisions.concepts.DecisionRequest;
import org.onap.policy.models.decisions.concepts.DecisionResponse;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
@@ -76,6 +77,7 @@ public class StdXacmlApplicationServiceProviderTest {
private static final String POLICY_NAME = "my-name";
private static final String POLICY_VERSION = "1.2.3";
private static final String POLICY_TYPE = "my-type";
+ private static final RestServerParameters apiRestParameters = new RestServerParameters();
@Mock
private ToscaPolicyTranslator trans;
@@ -162,7 +164,7 @@ public class StdXacmlApplicationServiceProviderTest {
@Test
public void testInitialize_testGetXxx() throws XacmlApplicationException {
- prov.initialize(TEMP_PATH);
+ prov.initialize(TEMP_PATH, apiRestParameters);
assertEquals(TEMP_PATH, prov.getDataPath());
assertNotNull(prov.getEngine());
@@ -173,7 +175,7 @@ public class StdXacmlApplicationServiceProviderTest {
@Test
public void testInitialize_Ex() throws XacmlApplicationException {
- assertThatThrownBy(() -> prov.initialize(new File(TEMP_DIR_NAME + "-nonExistent").toPath()))
+ assertThatThrownBy(() -> prov.initialize(new File(TEMP_DIR_NAME + "-nonExistent").toPath(), apiRestParameters))
.isInstanceOf(XacmlApplicationException.class).hasMessage("Failed to load xacml.properties");
}
@@ -196,7 +198,7 @@ public class StdXacmlApplicationServiceProviderTest {
@Test
public void testLoadPolicy_testUnloadPolicy() throws Exception {
- prov.initialize(TEMP_PATH);
+ prov.initialize(TEMP_PATH, apiRestParameters);
PROP_FILE.delete();
final Set<String> set = XACMLProperties.getRootPolicyIDs(prov.getProperties());
@@ -243,7 +245,7 @@ public class StdXacmlApplicationServiceProviderTest {
@Test
public void testUnloadPolicy_NotDeployed() throws Exception {
- prov.initialize(TEMP_PATH);
+ prov.initialize(TEMP_PATH, apiRestParameters);
assertFalse(prov.unloadPolicy(policy));
@@ -309,7 +311,7 @@ public class StdXacmlApplicationServiceProviderTest {
engineFactory = null;
prov = new MyProv();
- prov.initialize(TEMP_PATH);
+ prov.initialize(TEMP_PATH, apiRestParameters);
assertNotNull(prov.getEngine());
}
diff --git a/applications/common/src/test/resources/matchable/onap.policies.Test-1.0.0.yaml b/applications/common/src/test/resources/matchable/onap.policies.Test-1.0.0.yaml
new file mode 100644
index 00000000..089aad66
--- /dev/null
+++ b/applications/common/src/test/resources/matchable/onap.policies.Test-1.0.0.yaml
@@ -0,0 +1,38 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+policy_types:
+ onap.policies.Test:
+ derived_from: tosca.policies.Root
+ version: 1.0.0
+ properties:
+ nonmatachableString:
+ type: string
+ matchableString:
+ type: string
+ metadata:
+ matchable: true
+ nonmatachableInteger:
+ type: integer
+ metadata:
+ matchable: false
+ matachableInteger:
+ type: integer
+ metadata:
+ matchable: true
+ nonmatachableDouble:
+ type: double
+ matchableDouble:
+ type: double
+ metadata:
+ matchable: true
+ nonmatachableBoolean:
+ type: boolean
+ matachableBoolean:
+ type: boolean
+ metadata:
+ matchable: true
+ matchableListString:
+ type: list
+ metadata:
+ matchable: true
+ entry_schema:
+ type: string \ No newline at end of file
diff --git a/applications/common/src/test/resources/matchable/test.policies.input.tosca.yaml b/applications/common/src/test/resources/matchable/test.policies.input.tosca.yaml
new file mode 100644
index 00000000..434f7a97
--- /dev/null
+++ b/applications/common/src/test/resources/matchable/test.policies.input.tosca.yaml
@@ -0,0 +1,23 @@
+tosca_definitions_version: tosca_simple_yaml_1_0_0
+topology_template:
+ policies:
+ -
+ Test.policy:
+ type: onap.policies.Test
+ type_version: 1.0.0
+ version: 1.0.0
+ metadata:
+ policy-id: Test.policy
+ policy-version: 1
+ properties:
+ nonmatachableString: "I am NON matchable"
+ matchableString: "I should be matched"
+ nonmatachableInteger: 0
+ matachableInteger: 1000
+ nonmatachableDouble: 0.0
+ matchableDouble: 1.1
+ nonmatachableBoolean: false
+ matachableBoolean: true
+ matchableListString:
+ - match A
+ - match B \ No newline at end of file