aboutsummaryrefslogtreecommitdiffstats
path: root/applications/guard/src/test/java/org
diff options
context:
space:
mode:
authorJoshua Reich <jreich@research.att.com>2019-04-08 09:41:36 -0700
committerJoshua Reich <jreich@research.att.com>2019-04-11 16:50:54 -0700
commitfca3dd7b4bdc33b579750004c9d3bc163d20a2a7 (patch)
treed82b7935f724cd2370789bb77c3bab036ec85147 /applications/guard/src/test/java/org
parent4013653daa38a7fe1b9ffcae02e27d0bc411ac8f (diff)
Add Control Loop Coordination policy.
Refactor code to support multiple pip engines. Add pip engine for outcome. Modify LegacyGuardTranslator to use coordination translator's convertPolicy function when processing coordination guard. This version of convertPolicy intentionally uses string replacement on template-like xacml coordination guard to enable future support for API-based creation of new coordination guard types. Bug fixes and code cleanup. * Unused imports, sonar problems. * Consolidation of getAttribute method * Only use TypedQuery for Pips Issue-ID: POLICY-1471 Change-Id: I4e9365b7f23bee96cf438dad44feda97c65f6ecc Signed-off-by: Joshua Reich <jreich@research.att.com> Signed-off-by: Pamela Dragosh <pdragosh@research.att.com>
Diffstat (limited to 'applications/guard/src/test/java/org')
-rw-r--r--applications/guard/src/test/java/org/onap/policy/xacml/pdp/application/guard/CoordinationTest.java298
-rw-r--r--applications/guard/src/test/java/org/onap/policy/xacml/pdp/application/guard/GuardPdpApplicationTest.java34
2 files changed, 321 insertions, 11 deletions
diff --git a/applications/guard/src/test/java/org/onap/policy/xacml/pdp/application/guard/CoordinationTest.java b/applications/guard/src/test/java/org/onap/policy/xacml/pdp/application/guard/CoordinationTest.java
new file mode 100644
index 00000000..e94ad712
--- /dev/null
+++ b/applications/guard/src/test/java/org/onap/policy/xacml/pdp/application/guard/CoordinationTest.java
@@ -0,0 +1,298 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * 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.xacml.pdp.application.guard;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.File;
+import java.io.IOException;
+import java.sql.Date;
+import java.time.Instant;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.ServiceLoader;
+import java.util.UUID;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Persistence;
+
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runners.MethodSorters;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.resources.TextFileUtils;
+import org.onap.policy.models.decisions.concepts.DecisionRequest;
+import org.onap.policy.models.decisions.concepts.DecisionResponse;
+import org.onap.policy.pdp.xacml.application.common.TestUtils;
+import org.onap.policy.pdp.xacml.application.common.XacmlApplicationException;
+import org.onap.policy.pdp.xacml.application.common.XacmlApplicationServiceProvider;
+import org.onap.policy.pdp.xacml.application.common.XacmlPolicyUtils;
+import org.onap.policy.pdp.xacml.application.common.operationshistory.CountRecentOperationsPip;
+import org.onap.policy.pdp.xacml.application.common.operationshistory.Dbao;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class CoordinationTest {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CoordinationTest.class);
+ private static Properties properties = new Properties();
+ private static File propertiesFile;
+ private static XacmlApplicationServiceProvider service;
+ private static DecisionRequest requestCl1Node1;
+ private static DecisionRequest requestCl1Node2;
+ private static DecisionRequest requestCl2Node1;
+ private static DecisionRequest requestCl2Node2;
+ private static StandardCoder gson = new StandardCoder();
+ private static EntityManager em;
+ private static final String DENY = "Deny";
+ private static final String PERMIT = "Permit";
+ private static final String OPEN = "Success";
+ private static final String CLOSE = "Closed";
+
+
+ @ClassRule
+ public static final TemporaryFolder policyFolder = new TemporaryFolder();
+
+ /**
+ * Copies the xacml.properties and policies files into
+ * temporary folder and loads the service provider saving
+ * instance of provider off for other tests to use.
+ */
+ @BeforeClass
+ public static void setup() throws Exception {
+ LOGGER.info("Setting up class");
+ //
+ // Setup our temporary folder
+ //
+ XacmlPolicyUtils.FileCreator myCreator = (String filename) -> policyFolder.newFile(filename);
+ propertiesFile = XacmlPolicyUtils.copyXacmlPropertiesContents("src/test/resources/xacml.properties",
+ properties, myCreator);
+ //
+ // Load service
+ //
+ ServiceLoader<XacmlApplicationServiceProvider> applicationLoader =
+ ServiceLoader.load(XacmlApplicationServiceProvider.class);
+ //
+ // Find the guard service application and save for use in all the tests
+ //
+ StringBuilder strDump = new StringBuilder("Loaded applications:" + System.lineSeparator());
+ Iterator<XacmlApplicationServiceProvider> iterator = applicationLoader.iterator();
+ while (iterator.hasNext()) {
+ XacmlApplicationServiceProvider application = iterator.next();
+ //
+ // Is it our service?
+ //
+ if (application instanceof GuardPdpApplication) {
+ //
+ // Should be the first and only one
+ //
+ assertThat(service).isNull();
+ service = application;
+ }
+ strDump.append(application.applicationName());
+ strDump.append(" supports ");
+ strDump.append(application.supportedPolicyTypes());
+ strDump.append(System.lineSeparator());
+ }
+ LOGGER.info("{}", strDump);
+ //
+ // Tell it to initialize based on the properties file
+ // we just built for it.
+ //
+ service.initialize(propertiesFile.toPath().getParent());
+ //
+ // Load Decision Requests
+ //
+ requestCl1Node1 = gson.decode(
+ TextFileUtils.getTextFileAsString(
+ "src/test/resources/requests/coordination.cl.1.node.1.json"),
+ DecisionRequest.class);
+ requestCl2Node1 = gson.decode(
+ TextFileUtils.getTextFileAsString(
+ "src/test/resources/requests/coordination.cl.2.node.1.json"),
+ DecisionRequest.class);
+ requestCl1Node2 = gson.decode(
+ TextFileUtils.getTextFileAsString(
+ "src/test/resources/requests/coordination.cl.1.node.2.json"),
+ DecisionRequest.class);
+ requestCl2Node2 = gson.decode(
+ TextFileUtils.getTextFileAsString(
+ "src/test/resources/requests/coordination.cl.2.node.2.json"),
+ DecisionRequest.class);
+ //
+ // Create EntityManager for manipulating DB
+ //
+ String persistenceUnit = CountRecentOperationsPip.ISSUER_NAME + ".persistenceunit";
+ em = Persistence.createEntityManagerFactory(
+ CoordinationTest.properties.getProperty(persistenceUnit), properties)
+ .createEntityManager();
+ }
+
+ /**
+ * Clears the database before each test.
+ *
+ */
+ @Before
+ public void startClean() throws Exception {
+ em.getTransaction().begin();
+ em.createQuery("DELETE FROM Dbao").executeUpdate();
+ em.getTransaction().commit();
+ }
+
+ /**
+ * Check that decision matches expectation.
+ *
+ * @param expected from the response
+ * @param response received
+ *
+ **/
+ public void checkDecision(String expected, DecisionResponse response) throws CoderException {
+ LOGGER.info("Looking for {} Decision", expected);
+ assertThat(response).isNotNull();
+ assertThat(response.getStatus()).isNotNull();
+ assertThat(response.getStatus()).isEqualTo(expected);
+ //
+ // Dump it out as Json
+ //
+ LOGGER.info(gson.encode(response));
+ }
+
+ /**
+ * Request a decision and check that it matches expectation.
+ *
+ * @param request to send to Xacml PDP
+ * @param expected from the response
+ *
+ **/
+ public void requestAndCheckDecision(DecisionRequest request, String expected) throws CoderException {
+ //
+ // Ask for a decision
+ //
+ DecisionResponse response = service.makeDecision(request);
+ //
+ // Check decision
+ //
+ checkDecision(expected, response);
+ }
+
+ @Test
+ public void test1() throws CoderException, IOException, XacmlApplicationException {
+ LOGGER.info("**************** Running test1 ****************");
+ //
+ // Now load the test coordination policy - make sure
+ // the pdp can support it and have it load
+ // into the PDP.
+ //
+ TestUtils.loadPolicies("src/test/resources/test.policy.guard.coordination.firstBlocksSecond.tosca.yaml",
+ service);
+ //
+ // cl1 doesn't have open action: cl2 should get permit
+ //
+ requestAndCheckDecision(requestCl2Node1, PERMIT);
+ //
+ // Open cl2 on node1
+ //
+ insertOperationEvent(requestCl2Node1, OPEN);
+ //
+ // Under current coordination policy cl1 always can go
+ //
+ requestAndCheckDecision(requestCl1Node1, PERMIT);
+ //
+ // Open cl1 on node1
+ //
+ insertOperationEvent(requestCl1Node1, OPEN);
+ //
+ // Close cl2 on node1
+ //
+ insertOperationEvent(requestCl2Node1, CLOSE);
+ //
+ // Try cl2 again, cl1 has open action on node1: should get deny
+ //
+ requestAndCheckDecision(requestCl2Node1, DENY);
+ //
+ // Close cl1 on node1
+ //
+ insertOperationEvent(requestCl1Node1, CLOSE);
+ //
+ // Under current coordination policy cl1 always can go
+ //
+ requestAndCheckDecision(requestCl1Node1, PERMIT);
+ //
+ // Open cl1 on node1
+ //
+ insertOperationEvent(requestCl1Node1, OPEN);
+ //
+ // Try cl2 on node2, cl1 only open on node1: should get permit
+ //
+ requestAndCheckDecision(requestCl2Node2, PERMIT);
+ //
+ // Open cl2 on node2
+ //
+ insertOperationEvent(requestCl2Node2, OPEN);
+ //
+ // Try cl2 on node1, cl1 open on node1: should get DENY
+ //
+ requestAndCheckDecision(requestCl2Node1, DENY);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void insertOperationEvent(DecisionRequest request, String outcome) {
+ //
+ // Get the properties
+ //
+ Map<String, Object> properties = (Map<String, Object>) request.getResource().get("guard");
+ //
+ // Add an entry
+ //
+ Dbao newEntry = new Dbao();
+ newEntry.setActor(properties.get("actor").toString());
+ newEntry.setOperation(properties.get("recipe").toString());
+ newEntry.setClosedLoopName(properties.get("clname").toString());
+ newEntry.setOutcome(outcome);
+ newEntry.setStarttime(Date.from(Instant.now().minusMillis(20000)));
+ newEntry.setEndtime(Date.from(Instant.now()));
+ newEntry.setRequestId(UUID.randomUUID().toString());
+ newEntry.setTarget(properties.get("target").toString());
+ em.getTransaction().begin();
+ em.persist(newEntry);
+ em.getTransaction().commit();
+ }
+
+ /**
+ * Close the entity manager.
+ */
+ @AfterClass
+ public static void cleanup() throws Exception {
+ if (em != null) {
+ em.close();
+ }
+ }
+}
diff --git a/applications/guard/src/test/java/org/onap/policy/xacml/pdp/application/guard/GuardPdpApplicationTest.java b/applications/guard/src/test/java/org/onap/policy/xacml/pdp/application/guard/GuardPdpApplicationTest.java
index 17917af0..c5cf0327 100644
--- a/applications/guard/src/test/java/org/onap/policy/xacml/pdp/application/guard/GuardPdpApplicationTest.java
+++ b/applications/guard/src/test/java/org/onap/policy/xacml/pdp/application/guard/GuardPdpApplicationTest.java
@@ -53,11 +53,12 @@ import org.onap.policy.common.utils.resources.TextFileUtils;
import org.onap.policy.models.decisions.concepts.DecisionRequest;
import org.onap.policy.models.decisions.concepts.DecisionResponse;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
-import org.onap.policy.pdp.xacml.application.common.OnapOperationsHistoryDbao;
import org.onap.policy.pdp.xacml.application.common.TestUtils;
import org.onap.policy.pdp.xacml.application.common.XacmlApplicationException;
import org.onap.policy.pdp.xacml.application.common.XacmlApplicationServiceProvider;
import org.onap.policy.pdp.xacml.application.common.XacmlPolicyUtils;
+import org.onap.policy.pdp.xacml.application.common.operationshistory.CountRecentOperationsPip;
+import org.onap.policy.pdp.xacml.application.common.operationshistory.Dbao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -85,7 +86,7 @@ public class GuardPdpApplicationTest {
* instance of provider off for other tests to use.
*/
@BeforeClass
- public static void setUp() throws Exception {
+ public static void setup() throws Exception {
LOGGER.info("Setting up class");
//
// Setup our temporary folder
@@ -131,21 +132,22 @@ public class GuardPdpApplicationTest {
//
requestVfCount1 = gson.decode(
TextFileUtils.getTextFileAsString(
- "../../main/src/test/resources/decisions/decision.guard.vfCount.1.input.json"),
+ "src/test/resources/requests/guard.vfCount.1.json"),
DecisionRequest.class);
requestVfCount3 = gson.decode(
TextFileUtils.getTextFileAsString(
- "../../main/src/test/resources/decisions/decision.guard.vfCount.3.input.json"),
+ "src/test/resources/requests/guard.vfCount.3.json"),
DecisionRequest.class);
requestVfCount6 = gson.decode(
TextFileUtils.getTextFileAsString(
- "../../main/src/test/resources/decisions/decision.guard.vfCount.6.input.json"),
+ "src/test/resources/requests/guard.vfCount.6.json"),
DecisionRequest.class);
//
// Create EntityManager for manipulating DB
//
+ String persistenceUnit = CountRecentOperationsPip.ISSUER_NAME + ".persistenceunit";
em = Persistence.createEntityManagerFactory(
- GuardPdpApplicationTest.properties.getProperty("historydb.persistenceunit"), properties)
+ GuardPdpApplicationTest.properties.getProperty(persistenceUnit), properties)
.createEntityManager();
}
@@ -156,7 +158,7 @@ public class GuardPdpApplicationTest {
@Before
public void startClean() throws Exception {
em.getTransaction().begin();
- em.createQuery("DELETE FROM OnapOperationsHistoryDbao").executeUpdate();
+ em.createQuery("DELETE FROM Dbao").executeUpdate();
em.getTransaction().commit();
}
@@ -213,7 +215,7 @@ public class GuardPdpApplicationTest {
// can support the correct policy types.
//
assertThat(service.supportedPolicyTypes()).isNotEmpty();
- assertThat(service.supportedPolicyTypes().size()).isEqualTo(2);
+ assertThat(service.supportedPolicyTypes().size()).isEqualTo(3);
assertThat(service.canSupportPolicyType(new ToscaPolicyTypeIdentifier(
"onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0"))).isTrue();
assertThat(service.canSupportPolicyType(new ToscaPolicyTypeIdentifier(
@@ -222,6 +224,10 @@ public class GuardPdpApplicationTest {
"onap.policies.controlloop.guard.MinMax", "1.0.0"))).isTrue();
assertThat(service.canSupportPolicyType(new ToscaPolicyTypeIdentifier(
"onap.policies.controlloop.guard.MinMax", "1.0.1"))).isFalse();
+ assertThat(service.canSupportPolicyType(new ToscaPolicyTypeIdentifier(
+ "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", "1.0.0"))).isTrue();
+ assertThat(service.canSupportPolicyType(new ToscaPolicyTypeIdentifier(
+ "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", "1.0.1"))).isFalse();
assertThat(service.canSupportPolicyType(new ToscaPolicyTypeIdentifier("onap.foo", "1.0.1"))).isFalse();
}
@@ -357,10 +363,10 @@ public class GuardPdpApplicationTest {
//
// Add an entry
//
- OnapOperationsHistoryDbao newEntry = new OnapOperationsHistoryDbao();
+ Dbao newEntry = new Dbao();
newEntry.setActor(properties.get("actor").toString());
newEntry.setOperation(properties.get("recipe").toString());
- newEntry.setClName(properties.get("clname").toString());
+ newEntry.setClosedLoopName(properties.get("clname").toString());
newEntry.setOutcome("SUCCESS");
newEntry.setStarttime(Date.from(Instant.now().minusMillis(20000)));
newEntry.setEndtime(Date.from(Instant.now()));
@@ -372,8 +378,14 @@ public class GuardPdpApplicationTest {
em.getTransaction().commit();
}
+ /**
+ * Close the entity manager.
+ */
@AfterClass
public static void cleanup() throws Exception {
- em.close();
+ if (em != null) {
+ em.close();
+ }
}
+
}