From 2c847e0855b316c162c9fd31456fdf8e338a5dba Mon Sep 17 00:00:00 2001 From: Pamela Dragosh Date: Fri, 22 Mar 2019 14:12:52 -0400 Subject: Adding optimization application finish guard Created Optimization application and created a translator for it. The translator makes an assumption that OOF wants to query on policyScope and policyType properties. Rearranged some of the test code for re-usability. Guard policies are now creating for frequency limiter and min max. Probably could use some clean up. Upgraded to xacml 2.0.1 to include a fix for handling null attribute values. Added some code to test missing values. Issue-ID: POLICY-1273 Change-Id: Ia3dbfa992bbe0cbb5aa294c38aa2aff430a3230a Signed-off-by: Pamela Dragosh --- applications/monitoring/pom.xml | 9 - .../application/monitoring/MonitoringRequest.java | 78 ------ .../monitoring/MonitoringPdpApplicationTest.java | 298 +++++++++------------ .../resources/vDNS.policy.decision.payload.json | 0 .../monitoring/src/test/resources/xacml.properties | 8 - 5 files changed, 124 insertions(+), 269 deletions(-) delete mode 100644 applications/monitoring/src/main/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringRequest.java delete mode 100644 applications/monitoring/src/test/resources/vDNS.policy.decision.payload.json (limited to 'applications/monitoring') diff --git a/applications/monitoring/pom.xml b/applications/monitoring/pom.xml index 018c3722..d477bee7 100644 --- a/applications/monitoring/pom.xml +++ b/applications/monitoring/pom.xml @@ -33,15 +33,6 @@ This modules contains applications that implement policy-types for XACML PDP. - - com.google.code.gson - gson - - - org.onap.policy.common - common-parameters - ${policy.common.version} - org.onap.policy.xacml-pdp.applications common diff --git a/applications/monitoring/src/main/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringRequest.java b/applications/monitoring/src/main/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringRequest.java deleted file mode 100644 index ce0bd3f2..00000000 --- a/applications/monitoring/src/main/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringRequest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * ONAP Policy Decision Models - * ================================================================================ - * 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. - * ============LICENSE_END========================================================= - */ - -package org.onap.policy.xacml.pdp.application.monitoring; - -import com.att.research.xacml.std.annotations.XACMLAction; -import com.att.research.xacml.std.annotations.XACMLRequest; -import com.att.research.xacml.std.annotations.XACMLResource; -import com.att.research.xacml.std.annotations.XACMLSubject; - -import java.util.Map; -import java.util.Map.Entry; - -import org.onap.policy.models.decisions.concepts.DecisionRequest; - -@XACMLRequest(ReturnPolicyIdList = true) -public class MonitoringRequest { - - @XACMLSubject(includeInResults = true) - String onapName = "DCAE"; - - @XACMLResource(includeInResults = true) - String resource = "onap.policies.Monitoring"; - - @XACMLAction() - String action = "configure"; - - - /** - * Parses the DecisionRequest into a MonitoringRequest. - * - * @param decisionRequest Input DecisionRequest - * @return MonitoringRequest - */ - public static MonitoringRequest createInstance(DecisionRequest decisionRequest) { - MonitoringRequest request = new MonitoringRequest(); - request.onapName = decisionRequest.getOnapName(); - request.action = decisionRequest.getAction(); - - Map resources = decisionRequest.getResource(); - for (Entry entry : resources.entrySet()) { - if ("policy-id".equals(entry.getKey())) { - // - // TODO handle lists of policies - // - request.resource = entry.getValue().toString(); - continue; - } - if ("policy-type".equals(entry.getKey())) { - // - // TODO handle lists of policies - // - request.resource = entry.getValue().toString(); - } - } - // - // TODO handle a bad incoming request. Do that here? - // - return request; - } -} diff --git a/applications/monitoring/src/test/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringPdpApplicationTest.java b/applications/monitoring/src/test/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringPdpApplicationTest.java index d3624a64..4af4bac4 100644 --- a/applications/monitoring/src/test/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringPdpApplicationTest.java +++ b/applications/monitoring/src/test/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringPdpApplicationTest.java @@ -23,20 +23,11 @@ package org.onap.policy.xacml.pdp.application.monitoring; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatCode; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; - -import com.att.research.xacml.util.XACMLProperties; -import com.google.common.io.Files; -import com.google.gson.Gson; import java.io.File; import java.io.FileInputStream; -import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -46,19 +37,22 @@ import java.util.ServiceLoader; 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.models.decisions.serialization.DecisionRequestMessageBodyHandler; -import org.onap.policy.models.decisions.serialization.DecisionResponseMessageBodyHandler; -import org.onap.policy.pdp.xacml.application.common.ToscaPolicyConversionException; import org.onap.policy.pdp.xacml.application.common.XacmlApplicationServiceProvider; +import org.onap.policy.pdp.xacml.application.common.XacmlPolicyUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.yaml.snakeyaml.Yaml; +@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class MonitoringPdpApplicationTest { private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringPdpApplicationTest.class); @@ -67,210 +61,166 @@ public class MonitoringPdpApplicationTest { private static XacmlApplicationServiceProvider service; private static DecisionRequest requestSinglePolicy; - private static Gson gsonDecisionRequest; - private static Gson gsonDecisionResponse; + private static StandardCoder gson = new StandardCoder(); @ClassRule public static final TemporaryFolder policyFolder = new TemporaryFolder(); /** - * Load a test engine. + * 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() { - assertThatCode(() -> { - // - // Create our Gson builder - // - gsonDecisionRequest = new DecisionRequestMessageBodyHandler().getGson(); - gsonDecisionResponse = new DecisionResponseMessageBodyHandler().getGson(); - // - // Load Single Decision Request - // - requestSinglePolicy = gsonDecisionRequest.fromJson( - TextFileUtils - .getTextFileAsString("../../main/src/test/resources/decisions/decision.single.input.json"), - DecisionRequest.class); - // - // Copy all the properties and root policies to the temporary folder - // - try (InputStream is = new FileInputStream("src/test/resources/xacml.properties")) { - // - // Load it in - // - properties.load(is); - propertiesFile = policyFolder.newFile("xacml.properties"); - // - // Copy the root policies - // - for (String root : XACMLProperties.getRootPolicyIDs(properties)) { - // - // Get a file - // - Path rootPath = Paths.get(properties.getProperty(root + ".file")); - LOGGER.debug("Root file {} {}", rootPath, rootPath.getFileName()); - // - // Construct new file name - // - File newRootPath = policyFolder.newFile(rootPath.getFileName().toString()); - // - // Copy it - // - Files.copy(rootPath.toFile(), newRootPath); - assertThat(newRootPath).exists(); - // - // Point to where the new policy is in the temp dir - // - properties.setProperty(root + ".file", newRootPath.getAbsolutePath()); - } - try (OutputStream os = new FileOutputStream(propertiesFile.getAbsolutePath())) { - properties.store(os, ""); - assertThat(propertiesFile).exists(); - } - } - // - // Load service - // - ServiceLoader applicationLoader = - ServiceLoader.load(XacmlApplicationServiceProvider.class); - // - // Iterate through them - I could store the object as - // XacmlApplicationServiceProvider pointer. + public static void setup() throws Exception { + // + // Load Single Decision Request + // + requestSinglePolicy = gson.decode( + TextFileUtils + .getTextFileAsString("../../main/src/test/resources/decisions/decision.single.input.json"), + DecisionRequest.class); + // + // Setup our temporary folder + // + XacmlPolicyUtils.FileCreator myCreator = (String filename) -> policyFolder.newFile(filename); + propertiesFile = XacmlPolicyUtils.copyXacmlPropertiesContents("src/test/resources/xacml.properties", + properties, myCreator); + // + // Load XacmlApplicationServiceProvider service + // + ServiceLoader applicationLoader = + ServiceLoader.load(XacmlApplicationServiceProvider.class); + // + // Look for our class instance and save it + // + StringBuilder strDump = new StringBuilder("Loaded applications:" + System.lineSeparator()); + Iterator iterator = applicationLoader.iterator(); + while (iterator.hasNext()) { + XacmlApplicationServiceProvider application = iterator.next(); // - // Try this later. + // Is it our service? // - StringBuilder strDump = new StringBuilder("Loaded applications:" + System.lineSeparator()); - Iterator iterator = applicationLoader.iterator(); - while (iterator.hasNext()) { - XacmlApplicationServiceProvider application = iterator.next(); + if (application instanceof MonitoringPdpApplication) { // - // Is it our service? + // Should be the first and only one // - if (application instanceof MonitoringPdpApplication) { - // - // 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()); + assertThat(service).isNull(); + service = application; } - LOGGER.debug("{}", strDump); - // - // Tell it to initialize based on the properties file - // we just built for it. - // - service.initialize(propertiesFile.toPath().getParent()); - // - // Make sure there's an application name - // - assertThat(service.applicationName()).isNotEmpty(); - // - // Ensure it has the supported policy types and - // can support the correct policy types. - // - assertThat(service.canSupportPolicyType("onap.Monitoring", "1.0.0")).isTrue(); - assertThat(service.canSupportPolicyType("onap.Monitoring", "1.5.0")).isTrue(); - assertThat(service.canSupportPolicyType("onap.policies.monitoring.foobar", "1.0.1")).isTrue(); - assertThat(service.canSupportPolicyType("onap.foobar", "1.0.0")).isFalse(); - assertThat(service.supportedPolicyTypes()).contains("onap.Monitoring"); - // - // Ensure it supports decisions - // - assertThat(service.actionDecisionsSupported()).contains("configure"); - }).doesNotThrowAnyException(); + strDump.append(application.applicationName()); + strDump.append(" supports "); + strDump.append(application.supportedPolicyTypes()); + strDump.append(System.lineSeparator()); + } + LOGGER.debug("{}", strDump); + // + // Tell it to initialize based on the properties file + // we just built for it. + // + service.initialize(propertiesFile.toPath().getParent()); } @Test - public void testNoPolicies() { + public void test1Basics() { // - // Make a simple decision - NO policies are loaded + // Make sure there's an application name // - assertThatCode(() -> { - // - // Ask for a decision - // - DecisionResponse response = service.makeDecision(requestSinglePolicy); - LOGGER.info("Decision {}", response); + assertThat(service.applicationName()).isNotEmpty(); + // + // Ensure it has the supported policy types and + // can support the correct policy types. + // + assertThat(service.canSupportPolicyType("onap.Monitoring", "1.0.0")).isTrue(); + assertThat(service.canSupportPolicyType("onap.Monitoring", "1.5.0")).isTrue(); + assertThat(service.canSupportPolicyType("onap.policies.monitoring.foobar", "1.0.1")).isTrue(); + assertThat(service.canSupportPolicyType("onap.foobar", "1.0.0")).isFalse(); + assertThat(service.supportedPolicyTypes()).contains("onap.Monitoring"); + // + // Ensure it supports decisions + // + assertThat(service.actionDecisionsSupported()).contains("configure"); + } - assertThat(response).isNotNull(); - assertThat(response.getErrorMessage()).isNullOrEmpty(); - assertThat(response.getPolicies().size()).isEqualTo(0); + @Test + public void test2NoPolicies() { + // + // Ask for a decision + // + DecisionResponse response = service.makeDecision(requestSinglePolicy); + LOGGER.info("Decision {}", response); - }).doesNotThrowAnyException(); + assertThat(response).isNotNull(); + assertThat(response.getPolicies().size()).isEqualTo(0); } @SuppressWarnings("unchecked") @Test - public void testvDnsPolicy() { + public void test3AddvDnsPolicy() throws IOException, CoderException { // // Now load the vDNS Policy - make sure // the pdp can support it and have it load // into the PDP. // - assertThatCode(() -> { - try (InputStream is = new FileInputStream("src/test/resources/vDNS.policy.input.yaml")) { - Yaml yaml = new Yaml(); - Map toscaObject = yaml.load(is); - List policies = (List) toscaObject.get("policies"); - // - // What we should really do is split the policies out from the ones that - // are not supported to ones that are. And then load these. + try (InputStream is = new FileInputStream("src/test/resources/vDNS.policy.input.yaml")) { + // + // Have yaml parse it + // + Yaml yaml = new Yaml(); + Map toscaObject = yaml.load(is); + List policies = (List) toscaObject.get("policies"); + // + // Sanity check to ensure the policy type and version are supported + // + for (Object policyObject : policies) { // - // In another future review.... + // Get the contents // - for (Object policyObject : policies) { + Map policyContents = (Map) policyObject; + for (Entry entrySet : policyContents.entrySet()) { + LOGGER.info("Entry set {}", entrySet.getKey()); + Map policyDefinition = (Map) entrySet.getValue(); // - // Get the contents + // Find the type and make sure the engine supports it // - Map policyContents = (Map) policyObject; - for (Entry entrySet : policyContents.entrySet()) { - LOGGER.info("Entry set {}", entrySet.getKey()); - Map policyDefinition = (Map) entrySet.getValue(); - // - // Find the type and make sure the engine supports it - // - assertThat(policyDefinition.containsKey("type")).isTrue(); - assertThat(service.canSupportPolicyType( - policyDefinition.get("type").toString(), - policyDefinition.get("version").toString())) - .isTrue(); - } + assertThat(policyDefinition.containsKey("type")).isTrue(); + assertThat(service.canSupportPolicyType( + policyDefinition.get("type").toString(), + policyDefinition.get("version").toString())) + .isTrue(); } - // - // Just go ahead and load them all for now - // - // Assuming all are supported etc. - // - service.loadPolicies(toscaObject); - // - // Ask for a decision - // - DecisionResponse response = service.makeDecision(requestSinglePolicy); - LOGGER.info("Decision {}", response); - - assertThat(response).isNotNull(); - assertThat(response.getPolicies().size()).isEqualTo(1); - // - // Dump it out as Json - // - LOGGER.info(gsonDecisionResponse.toJson(response)); } - }).doesNotThrowAnyException(); + // + // Load the policies + // + service.loadPolicies(toscaObject); + // + // Ask for a decision + // + DecisionResponse response = service.makeDecision(requestSinglePolicy); + LOGGER.info("Decision {}", response); + + assertThat(response).isNotNull(); + assertThat(response.getPolicies().size()).isEqualTo(1); + // + // Dump it out as Json + // + LOGGER.info(gson.encode(response)); + } } @Test - public void testBadPolicies() { + public void test4BadPolicies() { + /* + * + * THESE TEST SHOULD BE MOVED INTO THE API PROJECT + * // // No need for service, just test some of the methods // for bad policies // MonitoringPdpApplication onapPdpEngine = new MonitoringPdpApplication(); - /* assertThatExceptionOfType(ToscaPolicyConversionException.class).isThrownBy(() -> { try (InputStream is = new FileInputStream("src/test/resources/test.monitoring.policy.missingmetadata.yaml")) { diff --git a/applications/monitoring/src/test/resources/vDNS.policy.decision.payload.json b/applications/monitoring/src/test/resources/vDNS.policy.decision.payload.json deleted file mode 100644 index e69de29b..00000000 diff --git a/applications/monitoring/src/test/resources/xacml.properties b/applications/monitoring/src/test/resources/xacml.properties index 9b5330dc..56a92d69 100644 --- a/applications/monitoring/src/test/resources/xacml.properties +++ b/applications/monitoring/src/test/resources/xacml.properties @@ -19,14 +19,6 @@ xacml.att.functionDefinitionFactory=com.att.research.xacmlatt.pdp.std.StdFunctio # xacml.att.policyFinderFactory=org.onap.policy.pdp.xacml.application.common.OnapPolicyFinderFactory -# -# NOTE: If you are testing against a RESTful PDP, then the PDP must be configured with the -# policies and PIP configuration as defined below. Otherwise, this is the configuration that -# the embedded PDP uses. -# - -policytypes=onap.Monitoring, onap.policies.monitoring.cdap.tca.hi.lo.app - # Policies to load # xacml.rootPolicies=monitoring -- cgit 1.2.3-korg