From 70736cfbf6ad1a068f8ee53adddd4faa3b6fa8a8 Mon Sep 17 00:00:00 2001 From: Pamela Dragosh Date: Fri, 12 Apr 2019 11:03:44 -0400 Subject: [PATCH] Add statistics and sonar cleanup and blacklist * Adding in the statistics for decisions and errors. * Cleaned up sonar issues and added code coverage. * Sped up JUnit tests * Fix JUnit issues with not finding application path * Fix TestDecision not finding persistence.xml * Fix for lingering statistics from previous runs. That needs to be addressed at a later time. * Changed persistence to use properties for configuration of database rather than hard coding the persistence.xml * Fix for Josh's comment to use else-if * Changed to use apache Pair * Added blacklist guard policy Issue-ID: POLICY-1440 Change-Id: I56af8c3dcc82463f7381f1eaea7f1440b76200bd Signed-off-by: Pamela Dragosh --- .../pdp/xacml/application/common/TestUtils.java | 1 - .../common/XacmlApplicationServiceProvider.java | 5 +- .../CountRecentOperationsPip.java | 3 +- .../operationshistory/GetOperationOutcomePip.java | 4 +- .../common/std/StdMatchableTranslator.java | 7 +- .../xacml/application/common/std/StdOnapPip.java | 1 - .../std/StdXacmlApplicationServiceProvider.java | 5 +- .../src/main/resources}/persistence.xml | 8 +- .../src/test/resources/META-INF/persistence.xml | 6 +- .../common/src/test/resources/test.properties | 8 ++ .../guard/CoordinationGuardTranslator.java | 1 - .../pdp/application/guard/GuardPdpApplication.java | 7 +- .../guard/LegacyGuardPolicyRequest.java | 2 - .../application/guard/LegacyGuardTranslator.java | 148 +++++++++++++++++-- .../pdp/application/guard/CoordinationTest.java | 7 +- .../application/guard/GuardPdpApplicationTest.java | 54 +++++-- .../src/test/resources/META-INF/createtest.sql | 16 --- .../src/test/resources/META-INF/persistence.xml | 7 +- .../vDNS.policy.guard.blacklist.output.tosca.yaml | 18 +++ .../guard/src/test/resources/xacml.properties | 10 +- .../monitoring/MonitoringPdpApplication.java | 3 - .../monitoring/MonitoringPdpApplicationTest.java | 79 +++------- .../test.monitoring.policy.badmetadata.1.yaml | 10 -- .../test.monitoring.policy.badmetadata.2.yaml | 10 -- .../test.monitoring.policy.missingmetadata.yaml | 9 -- .../test.monitoring.policy.missingtype.yaml | 11 -- .../test.monitoring.policy.missingversion.yaml | 11 -- .../optimization/OptimizationPdpApplication.java | 1 + .../OptimizationPdpApplicationTest.java | 21 +-- .../pdpx/main/comm/XacmlPdpPapRegistration.java | 6 +- .../listeners/XacmlPdpStateChangeListener.java | 2 +- .../pdpx/main/rest/XacmlPdpApplicationManager.java | 34 +++-- .../pdpx/main/rest/XacmlPdpRestController.java | 1 + .../policy/pdpx/main/rest/XacmlPdpRestServer.java | 2 + .../pdpx/main/rest/XacmlPdpStatisticsManager.java | 21 +++ .../pdpx/main/rest/model/StatisticsReport.java | 159 ++------------------- .../pdpx/main/rest/provider/DecisionProvider.java | 56 +++++++- .../main/rest/provider/StatisticsProvider.java | 1 + .../pdpx/main/startstop/XacmlPdpActivator.java | 2 + main/src/main/resources/META-INF/persistence.xml | 38 +++++ .../pdpx/main/PolicyXacmlPdpExceptionTest.java | 37 +++++ .../main/PolicyXacmlPdpRuntimeExceptionTest.java | 38 +++++ .../onap/policy/pdpx/main/rest/TestDecision.java | 51 ++++--- .../pdpx/main/rest/TestXacmlPdpRestServer.java | 39 +++-- .../pdpx/main/rest/TestXacmlPdpStatistics.java | 4 +- main/src/test/resources/META-INF/persistence.xml | 38 +++++ .../src/test/resources/apps/guard/xacml.properties | 53 +++++++ .../resources/apps/monitoring/xacml.properties | 31 ++++ .../resources/apps/optimization/xacml.properties | 31 ++++ .../parameters/XacmlPdpConfigParameters.json | 2 +- .../parameters/XacmlPdpConfigParameters_Https.json | 2 +- .../src/main/resources/apps/guard/xacml.properties | 35 +++-- 52 files changed, 730 insertions(+), 426 deletions(-) rename applications/{guard/src/main/resources/META-INF => common/src/main/resources}/persistence.xml (79%) delete mode 100644 applications/guard/src/test/resources/META-INF/createtest.sql create mode 100644 applications/guard/src/test/resources/vDNS.policy.guard.blacklist.output.tosca.yaml delete mode 100644 applications/monitoring/src/test/resources/test.monitoring.policy.badmetadata.1.yaml delete mode 100644 applications/monitoring/src/test/resources/test.monitoring.policy.badmetadata.2.yaml delete mode 100644 applications/monitoring/src/test/resources/test.monitoring.policy.missingmetadata.yaml delete mode 100644 applications/monitoring/src/test/resources/test.monitoring.policy.missingtype.yaml delete mode 100644 applications/monitoring/src/test/resources/test.monitoring.policy.missingversion.yaml create mode 100644 main/src/main/resources/META-INF/persistence.xml create mode 100644 main/src/test/java/org/onap/policy/pdpx/main/PolicyXacmlPdpExceptionTest.java create mode 100644 main/src/test/java/org/onap/policy/pdpx/main/PolicyXacmlPdpRuntimeExceptionTest.java create mode 100644 main/src/test/resources/META-INF/persistence.xml create mode 100644 main/src/test/resources/apps/guard/xacml.properties create mode 100644 main/src/test/resources/apps/monitoring/xacml.properties create mode 100644 main/src/test/resources/apps/optimization/xacml.properties diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/TestUtils.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/TestUtils.java index 50eb50bf..c48dd360 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/TestUtils.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/TestUtils.java @@ -25,7 +25,6 @@ package org.onap.policy.pdp.xacml.application.common; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.common.utils.coder.StandardCoder; diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/XacmlApplicationServiceProvider.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/XacmlApplicationServiceProvider.java index d4cce5c1..b20ce32f 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/XacmlApplicationServiceProvider.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/XacmlApplicationServiceProvider.java @@ -21,9 +21,12 @@ package org.onap.policy.pdp.xacml.application.common; +import com.att.research.xacml.api.Response; + import java.nio.file.Path; import java.util.List; +import org.apache.commons.lang3.tuple.Pair; 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; @@ -98,6 +101,6 @@ public interface XacmlApplicationServiceProvider { * @param request Incoming DecisionRequest object * @return response Responding DecisionResponse object */ - DecisionResponse makeDecision(DecisionRequest request); + Pair makeDecision(DecisionRequest request); } diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/CountRecentOperationsPip.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/CountRecentOperationsPip.java index c18ad5fa..00f7680b 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/CountRecentOperationsPip.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/CountRecentOperationsPip.java @@ -68,7 +68,8 @@ public class CountRecentOperationsPip extends StdOnapPip { // // In case there are any overloaded properties for the JPA // - Properties emProperties = new Properties(properties); + Properties emProperties = new Properties(); + emProperties.putAll(properties); // // Create the entity manager factory // diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/GetOperationOutcomePip.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/GetOperationOutcomePip.java index 717e537d..4f327cf5 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/GetOperationOutcomePip.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/operationshistory/GetOperationOutcomePip.java @@ -32,7 +32,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Properties; -import javax.persistence.NoResultException; import javax.persistence.Persistence; import org.onap.policy.pdp.xacml.application.common.ToscaDictionary; @@ -65,7 +64,8 @@ public class GetOperationOutcomePip extends StdOnapPip { // // In case there are any overloaded properties for the JPA // - Properties emProperties = new Properties(properties); + Properties emProperties = new Properties(); + emProperties.putAll(properties); // // Create the entity manager factory // diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java index 9d3c6264..ae144211 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdMatchableTranslator.java @@ -200,8 +200,7 @@ public class StdMatchableTranslator implements ToscaPolicyTranslator { try { jsonPolicy = coder.encode(toscaPolicy); } catch (CoderException e) { - LOGGER.error("Failed to encode policy to json", e); - throw new ToscaPolicyConversionException(e); + throw new ToscaPolicyConversionException("Failed to encode policy to json", e); } addObligation(rule, jsonPolicy); // @@ -237,7 +236,7 @@ public class StdMatchableTranslator implements ToscaPolicyTranslator { // // Add in the Policy Version // - policy.setVersion(map.get("policy-version").toString()); + policy.setVersion(map.get("policy-version")); } return policy; } @@ -325,7 +324,7 @@ public class StdMatchableTranslator implements ToscaPolicyTranslator { // AttributeValueType value = new AttributeValueType(); value.setDataType(ToscaDictionary.ID_OBLIGATION_POLICY_MONITORING_DATATYPE.stringValue()); - value.getContent().add(jsonPolicy.toString()); + value.getContent().add(jsonPolicy); // // Create our AttributeAssignmentExpression where we will // store the contents of the policy in JSON format. diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdOnapPip.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdOnapPip.java index 70d49418..739ccba9 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdOnapPip.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdOnapPip.java @@ -35,7 +35,6 @@ import com.att.research.xacml.std.pip.StdPIPRequest; import com.att.research.xacml.std.pip.engines.StdConfigurableEngine; import java.math.BigInteger; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Iterator; diff --git a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java index 95a642e9..2b8048c4 100644 --- a/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java +++ b/applications/common/src/main/java/org/onap/policy/pdp/xacml/application/common/std/StdXacmlApplicationServiceProvider.java @@ -44,6 +44,7 @@ import java.util.Properties; import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType; +import org.apache.commons.lang3.tuple.Pair; 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; @@ -240,7 +241,7 @@ public abstract class StdXacmlApplicationServiceProvider implements XacmlApplica } @Override - public DecisionResponse makeDecision(DecisionRequest request) { + public Pair makeDecision(DecisionRequest request) { // // Convert to a XacmlRequest // @@ -252,7 +253,7 @@ public abstract class StdXacmlApplicationServiceProvider implements XacmlApplica // // Convert to a DecisionResponse // - return this.getTranslator().convertResponse(xacmlResponse); + return Pair.of(this.getTranslator().convertResponse(xacmlResponse), xacmlResponse); } protected abstract ToscaPolicyTranslator getTranslator(String type); diff --git a/applications/guard/src/main/resources/META-INF/persistence.xml b/applications/common/src/main/resources/persistence.xml similarity index 79% rename from applications/guard/src/main/resources/META-INF/persistence.xml rename to applications/common/src/main/resources/persistence.xml index e01447e6..e3f4a2f6 100644 --- a/applications/guard/src/main/resources/META-INF/persistence.xml +++ b/applications/common/src/main/resources/persistence.xml @@ -23,12 +23,10 @@ org.eclipse.persistence.jpa.PersistenceProvider - org.onap.policy.pdp.xacml.application.common.OnapOperationsHistoryDbao + + org.onap.policy.pdp.xacml.application.common.operationshistory.Dbao + - - - - diff --git a/applications/common/src/test/resources/META-INF/persistence.xml b/applications/common/src/test/resources/META-INF/persistence.xml index 65ecc624..d917c06b 100644 --- a/applications/common/src/test/resources/META-INF/persistence.xml +++ b/applications/common/src/test/resources/META-INF/persistence.xml @@ -29,11 +29,7 @@ - - - - - + diff --git a/applications/common/src/test/resources/test.properties b/applications/common/src/test/resources/test.properties index fb3d3ce5..5f54209a 100644 --- a/applications/common/src/test/resources/test.properties +++ b/applications/common/src/test/resources/test.properties @@ -36,3 +36,11 @@ refstart4.file=src/test/resources/ref4.xml # count-recent-operations.persistenceunit=PipEngineTest get-operation-outcome.persistenceunit=PipEngineTest + +# +# JPA Properties +# +javax.persistence.jdbc.driver=org.h2.Driver +javax.persistence.jdbc.url=jdbc:h2:mem:testdb;DATABASE_TO_UPPER=FALSE +javax.persistence.jdbc.user=policy +javax.persistence.jdbc.password=P01icY diff --git a/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/CoordinationGuardTranslator.java b/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/CoordinationGuardTranslator.java index c296526b..10456e9f 100644 --- a/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/CoordinationGuardTranslator.java +++ b/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/CoordinationGuardTranslator.java @@ -36,7 +36,6 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; diff --git a/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/GuardPdpApplication.java b/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/GuardPdpApplication.java index 55568c36..0073f74e 100644 --- a/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/GuardPdpApplication.java +++ b/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/GuardPdpApplication.java @@ -39,7 +39,6 @@ import org.slf4j.LoggerFactory; * */ public class GuardPdpApplication extends StdXacmlApplicationServiceProvider { - private static final Logger LOGGER = LoggerFactory.getLogger(GuardPdpApplication.class); private static final String STRING_VERSION100 = "1.0.0"; private List supportedPolicyTypes = new ArrayList<>(); @@ -47,7 +46,8 @@ public class GuardPdpApplication extends StdXacmlApplicationServiceProvider { private CoordinationGuardTranslator coordinationTranslator = new CoordinationGuardTranslator(); - /** Constructor. + /** + * Constructor. * */ public GuardPdpApplication() { @@ -57,6 +57,9 @@ public class GuardPdpApplication extends StdXacmlApplicationServiceProvider { this.supportedPolicyTypes.add(new ToscaPolicyTypeIdentifier( "onap.policies.controlloop.guard.MinMax", STRING_VERSION100)); + this.supportedPolicyTypes.add(new ToscaPolicyTypeIdentifier( + "onap.policies.controlloop.guard.Blacklist", + STRING_VERSION100)); this.supportedPolicyTypes.add(new ToscaPolicyTypeIdentifier( "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", STRING_VERSION100)); diff --git a/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/LegacyGuardPolicyRequest.java b/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/LegacyGuardPolicyRequest.java index 7b6c37a6..bfbe4f64 100644 --- a/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/LegacyGuardPolicyRequest.java +++ b/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/LegacyGuardPolicyRequest.java @@ -34,7 +34,6 @@ import lombok.Setter; import lombok.ToString; import org.onap.policy.models.decisions.concepts.DecisionRequest; -import org.onap.policy.pdp.xacml.application.common.ToscaDictionary; @Getter @Setter @@ -43,7 +42,6 @@ import org.onap.policy.pdp.xacml.application.common.ToscaDictionary; public class LegacyGuardPolicyRequest { private static final String STR_GUARD = "guard"; - private static final String URN_ONAP = ToscaDictionary.URN_ONAP; @XACMLSubject(includeInResults = true) private String onapName; diff --git a/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/LegacyGuardTranslator.java b/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/LegacyGuardTranslator.java index 28e62b73..3cbfcf73 100644 --- a/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/LegacyGuardTranslator.java +++ b/applications/guard/src/main/java/org/onap/policy/xacml/pdp/application/guard/LegacyGuardTranslator.java @@ -67,6 +67,7 @@ public class LegacyGuardTranslator implements ToscaPolicyTranslator { private static final String FIELD_GUARD_ACTIVE_START = "guardActiveStart"; private static final String FIELD_GUARD_ACTIVE_END = "guardActiveEnd"; + private static final String FIELD_TARGET = "targets"; public LegacyGuardTranslator() { super(); @@ -96,9 +97,10 @@ public class LegacyGuardTranslator implements ToscaPolicyTranslator { // newPolicyType.setRuleCombiningAlgId(XACML3.ID_RULE_DENY_UNLESS_PERMIT.stringValue()); // - // Generate the TargetType + // Generate the TargetType - add true if not blacklist // - newPolicyType.setTarget(this.generateTargetType(toscaPolicy.getProperties())); + newPolicyType.setTarget(this.generateTargetType(toscaPolicy.getProperties(), + ! "onap.policies.controlloop.guard.Blacklist".equals(toscaPolicy.getType()))); // // Now create the Permit Rule // @@ -196,7 +198,7 @@ public class LegacyGuardTranslator implements ToscaPolicyTranslator { return policy; } - protected TargetType generateTargetType(Map properties) { + protected TargetType generateTargetType(Map properties, boolean addTargets) { // // Go through potential properties // @@ -207,15 +209,14 @@ public class LegacyGuardTranslator implements ToscaPolicyTranslator { if (properties.containsKey("recipe")) { addMatch(allOf, properties.get("recipe"), ToscaDictionary.ID_RESOURCE_GUARD_RECIPE); } - if (properties.containsKey("targets")) { - addMatch(allOf, properties.get("targets"), ToscaDictionary.ID_RESOURCE_GUARD_TARGETID); + if (addTargets) { + if (properties.containsKey("targets")) { + addMatch(allOf, properties.get("targets"), ToscaDictionary.ID_RESOURCE_GUARD_TARGETID); + } } if (properties.containsKey("clname")) { addMatch(allOf, properties.get("clname"), ToscaDictionary.ID_RESOURCE_GUARD_CLNAME); } - if (properties.containsKey("targets")) { - addMatch(allOf, properties.get("targets"), ToscaDictionary.ID_RESOURCE_GUARD_TARGETID); - } // // Create target // @@ -265,6 +266,8 @@ public class LegacyGuardTranslator implements ToscaPolicyTranslator { return generateFrequencyPermit(policyName, properties); } else if ("onap.policies.controlloop.guard.MinMax".equals(policyType)) { return generateMinMaxPermit(policyName, properties); + } else if ("onap.policies.controlloop.guard.Blacklist".equals(policyType)) { + return generateBlacklistPermit(policyName, properties); } LOGGER.error("Missing policy type in the policy"); return null; @@ -475,6 +478,82 @@ public class LegacyGuardTranslator implements ToscaPolicyTranslator { return permit; } + private static RuleType generateBlacklistPermit(String policyName, Map properties) { + // + // Generate target + // + if (! properties.containsKey(FIELD_TARGET)) { + LOGGER.error("Missing target for blacklist policy"); + return null; + } + final ApplyType targetApply = generateTargetApply(properties.get(FIELD_TARGET)); + // + // Get the properties that are common among guards + // + String guardActiveStart = null; + if (properties.containsKey(FIELD_GUARD_ACTIVE_START)) { + guardActiveStart = properties.get(FIELD_GUARD_ACTIVE_START).toString(); + } + String guardActiveEnd = null; + if (properties.containsKey(FIELD_GUARD_ACTIVE_END)) { + guardActiveEnd = properties.get(FIELD_GUARD_ACTIVE_END).toString(); + } + // + // Generate the time in range + // + final ApplyType timeRange = generateTimeInRange(guardActiveStart, guardActiveEnd); + // + // Create our rule + // + RuleType permit = new RuleType(); + permit.setDescription("Default is to PERMIT if the policy matches."); + permit.setRuleId(policyName + ":rule"); + permit.setEffect(EffectType.PERMIT); + permit.setTarget(new TargetType()); + // + // Create our condition + // + ObjectFactory factory = new ObjectFactory(); + ApplyType innerApply; + if (timeRange != null) { + ApplyType applyAnd = new ApplyType(); + applyAnd.setDescription("Combine the timeRange with target to create AND"); + applyAnd.setFunctionId(XACML3.ID_FUNCTION_AND.stringValue()); + applyAnd.getExpression().add(factory.createApply(timeRange)); + applyAnd.getExpression().add(factory.createApply(targetApply)); + // + // Now we need to NOT this so the permit happens + // + ApplyType applyNot = new ApplyType(); + applyNot.setDescription("This should be false for a permit."); + applyNot.setFunctionId(XACML3.ID_FUNCTION_NOT.stringValue()); + applyNot.getExpression().add(factory.createApply(applyAnd)); + innerApply = applyNot; + } else { + // + // Just the target is needed + // + ApplyType applyNot = new ApplyType(); + applyNot.setDescription("This should be false for a permit."); + applyNot.setFunctionId(XACML3.ID_FUNCTION_NOT.stringValue()); + applyNot.getExpression().add(factory.createApply(targetApply)); + innerApply = applyNot; + } + // + // Create our condition + // + final ConditionType condition = new ConditionType(); + // + // Add into the condition + // + condition.setExpression(factory.createApply(innerApply)); + // + // Add the condition + // + permit.setCondition(condition); + return permit; + } + private static ApplyType generateTimeInRange(String start, String end) { if (start == null || end == null) { LOGGER.warn("Missing time range start {} end {}", start, end); @@ -521,11 +600,7 @@ public class LegacyGuardTranslator implements ToscaPolicyTranslator { designator.setCategory(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE.stringValue()); designator.setDataType(XACML3.ID_DATATYPE_INTEGER.stringValue()); // - // TODO Add this back in when the operational database PIP is configured. - // The issuer indicates that the PIP will be providing this attribute during - // the decision making. - // - // Right now I am faking the count value by re-using the request-id field + // Setup issuer // String issuer = ToscaDictionary.GUARD_ISSUER_PREFIX + CountRecentOperationsPip.ISSUER_NAME @@ -627,6 +702,53 @@ public class LegacyGuardTranslator implements ToscaPolicyTranslator { return applyLessThanEqual; } + @SuppressWarnings("unchecked") + private static ApplyType generateTargetApply(Object targetObject) { + ObjectFactory factory = new ObjectFactory(); + // + // Create a bag of values + // + ApplyType applyStringBag = new ApplyType(); + applyStringBag.setDescription("Bag the target values"); + applyStringBag.setFunctionId(XACML3.ID_FUNCTION_STRING_BAG.stringValue()); + if (targetObject instanceof Collection) { + for (Object target : ((Collection) targetObject)) { + if (! (target instanceof String)) { + LOGGER.error("Collection of unsupported objects {}", target.getClass()); + return null; + } + AttributeValueType value = new AttributeValueType(); + value.setDataType(XACML3.ID_DATATYPE_STRING.stringValue()); + value.getContent().add(target.toString()); + applyStringBag.getExpression().add(factory.createAttributeValue(value)); + } + } else if (targetObject instanceof String) { + AttributeValueType value = new AttributeValueType(); + value.setDataType(XACML3.ID_DATATYPE_STRING.stringValue()); + value.getContent().add(targetObject.toString()); + applyStringBag.getExpression().add(factory.createAttributeValue(value)); + } else { + LOGGER.warn("Unsupported object for target {}", targetObject.getClass()); + return null; + } + // + // Create our designator + // + AttributeDesignatorType designator = new AttributeDesignatorType(); + designator.setAttributeId(ToscaDictionary.ID_RESOURCE_GUARD_TARGETID.stringValue()); + designator.setCategory(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE.stringValue()); + designator.setDataType(XACML3.ID_DATATYPE_STRING.stringValue()); + // + // Create apply for our AnyOf + // + ApplyType applyAnyOf = new ApplyType(); + applyAnyOf.setDescription("Find designator as anyof the possible values"); + applyAnyOf.setFunctionId(XACML3.ID_FUNCTION_ANY_OF.stringValue()); + applyAnyOf.getExpression().add(factory.createAttributeDesignator(designator)); + applyAnyOf.getExpression().add(factory.createApply(applyStringBag)); + return applyAnyOf; + } + private static Integer parseInteger(String strInteger) { Integer theInt = null; try { 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 index e94ad712..9edf11dd 100644 --- 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 @@ -24,6 +24,8 @@ package org.onap.policy.xacml.pdp.application.guard; import static org.assertj.core.api.Assertions.assertThat; +import com.att.research.xacml.api.Response; + import java.io.File; import java.io.IOException; import java.sql.Date; @@ -37,6 +39,7 @@ import java.util.UUID; import javax.persistence.EntityManager; import javax.persistence.Persistence; +import org.apache.commons.lang3.tuple.Pair; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -196,11 +199,11 @@ public class CoordinationTest { // // Ask for a decision // - DecisionResponse response = service.makeDecision(request); + Pair decision = service.makeDecision(request); // // Check decision // - checkDecision(expected, response); + checkDecision(expected, decision.getKey()); } @Test 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 c5cf0327..7f5a1cef 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 @@ -24,6 +24,8 @@ package org.onap.policy.xacml.pdp.application.guard; import static org.assertj.core.api.Assertions.assertThat; +import com.att.research.xacml.api.Response; + import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; @@ -39,6 +41,7 @@ import java.util.UUID; import javax.persistence.EntityManager; import javax.persistence.Persistence; +import org.apache.commons.lang3.tuple.Pair; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -191,11 +194,11 @@ public class GuardPdpApplicationTest { // // Ask for a decision // - DecisionResponse response = service.makeDecision(request); + Pair decision = service.makeDecision(request); // // Check decision // - checkDecision(expected, response); + checkDecision(expected, decision.getKey()); } @Test @@ -215,7 +218,7 @@ public class GuardPdpApplicationTest { // can support the correct policy types. // assertThat(service.supportedPolicyTypes()).isNotEmpty(); - assertThat(service.supportedPolicyTypes().size()).isEqualTo(3); + assertThat(service.supportedPolicyTypes().size()).isEqualTo(4); assertThat(service.canSupportPolicyType(new ToscaPolicyTypeIdentifier( "onap.policies.controlloop.guard.FrequencyLimiter", "1.0.0"))).isTrue(); assertThat(service.canSupportPolicyType(new ToscaPolicyTypeIdentifier( @@ -224,6 +227,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.Blacklist", "1.0.0"))).isTrue(); + assertThat(service.canSupportPolicyType(new ToscaPolicyTypeIdentifier( + "onap.policies.controlloop.guard.Blacklist", "1.0.1"))).isFalse(); assertThat(service.canSupportPolicyType(new ToscaPolicyTypeIdentifier( "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", "1.0.0"))).isTrue(); assertThat(service.canSupportPolicyType(new ToscaPolicyTypeIdentifier( @@ -335,22 +342,43 @@ public class GuardPdpApplicationTest { // // Ask for a decision - should get permit // - DecisionResponse response = service.makeDecision(request); - LOGGER.info("Looking for Permit Decision {}", response); - assertThat(response).isNotNull(); - assertThat(response.getStatus()).isNotNull(); - assertThat(response.getStatus()).isEqualTo("Permit"); + Pair decision = service.makeDecision(request); + LOGGER.info("Looking for Permit Decision {}", decision.getKey()); + assertThat(decision.getKey()).isNotNull(); + assertThat(decision.getKey().getStatus()).isNotNull(); + assertThat(decision.getKey().getStatus()).isEqualTo("Permit"); // // Try a deny // guard.put("vfCount", "10"); resource.put("guard", guard); request.setResource(resource); - response = service.makeDecision(request); - LOGGER.info("Looking for Deny Decision {}", response); - assertThat(response).isNotNull(); - assertThat(response.getStatus()).isNotNull(); - assertThat(response.getStatus()).isEqualTo("Deny"); + decision = service.makeDecision(request); + LOGGER.info("Looking for Deny Decision {}", decision.getKey()); + assertThat(decision.getKey()).isNotNull(); + assertThat(decision.getKey().getStatus()).isNotNull(); + assertThat(decision.getKey().getStatus()).isEqualTo("Deny"); + } + + @Test + public void test6Blacklist() throws CoderException, XacmlApplicationException { + LOGGER.info("**************** Running test4 ****************"); + // + // Setup requestVfCount1 to point to another target for this test + // + ((Map)requestVfCount3.getResource().get("guard")).put("targets", "vLoadBalancer-01"); + // + // vfcount=1 above min of 2: should get a permit + // + requestAndCheckDecision(requestVfCount3, PERMIT); + // + // Now load the vDNS blacklist policy + // + TestUtils.loadPolicies("src/test/resources/vDNS.policy.guard.blacklist.output.tosca.yaml", service); + // + // vfcount=1 above min of 2: should get a permit + // + requestAndCheckDecision(requestVfCount3, DENY); } @SuppressWarnings("unchecked") diff --git a/applications/guard/src/test/resources/META-INF/createtest.sql b/applications/guard/src/test/resources/META-INF/createtest.sql deleted file mode 100644 index c7389f33..00000000 --- a/applications/guard/src/test/resources/META-INF/createtest.sql +++ /dev/null @@ -1,16 +0,0 @@ -# -# Create the operations history table -# -CREATE TABLE `operationshistory` - ( - `id` bigint not null, - `closedLoopName` varchar(255) not null, - `requestId` varchar(50) not null, - `subrequestId` varchar(50) not null, - `actor` varchar(50) not null, - `operation` varchar(50) not null, - `target` varchar(50) not null, - `starttime` timestamp not null, - `outcome` varchar(50) not null, - `message` varchar(255) not null, - `endtime` timestamp not null); diff --git a/applications/guard/src/test/resources/META-INF/persistence.xml b/applications/guard/src/test/resources/META-INF/persistence.xml index 8d1e08ad..41b25b42 100644 --- a/applications/guard/src/test/resources/META-INF/persistence.xml +++ b/applications/guard/src/test/resources/META-INF/persistence.xml @@ -27,14 +27,9 @@ - - - - - + - diff --git a/applications/guard/src/test/resources/vDNS.policy.guard.blacklist.output.tosca.yaml b/applications/guard/src/test/resources/vDNS.policy.guard.blacklist.output.tosca.yaml new file mode 100644 index 00000000..94471fb4 --- /dev/null +++ b/applications/guard/src/test/resources/vDNS.policy.guard.blacklist.output.tosca.yaml @@ -0,0 +1,18 @@ +tosca_definitions_version: tosca_simple_yaml_1_0_0 +topology_template: + policies: + - + guard.blacklist.scaleout: + type: onap.policies.controlloop.guard.Blacklist + version: 1.0.0 + metadata: + policy-id: guard.frequency.scaleout + policy-version: 1 + properties: + actor: SO + recipe: VF Module Create + targets: vLoadBalancer-01 + clname: ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3 + limit: 2 + guardActiveStart: 00:00:00-05:00 + guardActiveEnd: 23:59:59-05:00 diff --git a/applications/guard/src/test/resources/xacml.properties b/applications/guard/src/test/resources/xacml.properties index 534c538c..3d4d025c 100644 --- a/applications/guard/src/test/resources/xacml.properties +++ b/applications/guard/src/test/resources/xacml.properties @@ -42,4 +42,12 @@ get-operation-outcome.persistenceunit=OperationsHistoryPUTest # # Make pips available to finder # -xacml.pip.engines=count-recent-operations,get-operation-outcome \ No newline at end of file +xacml.pip.engines=count-recent-operations,get-operation-outcome + +# +# JPA Properties +# +javax.persistence.jdbc.driver=org.h2.Driver +javax.persistence.jdbc.url=jdbc:h2:mem:testdb;DATABASE_TO_UPPER=FALSE +javax.persistence.jdbc.user=policy +javax.persistence.jdbc.password=P01icY diff --git a/applications/monitoring/src/main/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringPdpApplication.java b/applications/monitoring/src/main/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringPdpApplication.java index bcdfd987..7d0c5f1f 100644 --- a/applications/monitoring/src/main/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringPdpApplication.java +++ b/applications/monitoring/src/main/java/org/onap/policy/xacml/pdp/application/monitoring/MonitoringPdpApplication.java @@ -30,8 +30,6 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifi import org.onap.policy.pdp.xacml.application.common.ToscaPolicyTranslator; import org.onap.policy.pdp.xacml.application.common.std.StdCombinedPolicyResultsTranslator; import org.onap.policy.pdp.xacml.application.common.std.StdXacmlApplicationServiceProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * This is the engine class that manages the instance of the XACML PDP engine. @@ -44,7 +42,6 @@ import org.slf4j.LoggerFactory; */ public class MonitoringPdpApplication extends StdXacmlApplicationServiceProvider { - private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringPdpApplication.class); private static final String ONAP_MONITORING_BASE_POLICY_TYPE = "onap.Monitoring"; private static final String ONAP_MONITORING_DERIVED_POLICY_TYPE = "onap.policies.monitoring"; 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 9b26df16..04c9d20b 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 @@ -24,6 +24,8 @@ package org.onap.policy.xacml.pdp.application.monitoring; import static org.assertj.core.api.Assertions.assertThat; +import com.att.research.xacml.api.Response; + import java.io.File; import java.io.IOException; import java.util.Iterator; @@ -31,6 +33,7 @@ import java.util.List; import java.util.Properties; import java.util.ServiceLoader; +import org.apache.commons.lang3.tuple.Pair; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.FixMethodOrder; @@ -146,11 +149,11 @@ public class MonitoringPdpApplicationTest { // // Ask for a decision // - DecisionResponse response = service.makeDecision(requestSinglePolicy); - LOGGER.info("Decision {}", response); + Pair decision = service.makeDecision(requestSinglePolicy); + LOGGER.info("Decision {}", decision); - assertThat(response).isNotNull(); - assertThat(response.getPolicies().size()).isEqualTo(0); + assertThat(decision.getKey()).isNotNull(); + assertThat(decision.getKey().getPolicies().size()).isEqualTo(0); } @Test @@ -168,15 +171,15 @@ public class MonitoringPdpApplicationTest { // // Ask for a decision // - DecisionResponse response = service.makeDecision(requestSinglePolicy); - LOGGER.info("Decision {}", response); + Pair decision = service.makeDecision(requestSinglePolicy); + LOGGER.info("Decision {}", decision); - assertThat(response).isNotNull(); - assertThat(response.getPolicies().size()).isEqualTo(1); + assertThat(decision.getKey()).isNotNull(); + assertThat(decision.getKey().getPolicies().size()).isEqualTo(1); // // Dump it out as Json // - LOGGER.info(gson.encode(response)); + LOGGER.info(gson.encode(decision.getKey())); LOGGER.info("Now testing unloading of policy"); // // Now unload it @@ -187,61 +190,11 @@ public class MonitoringPdpApplicationTest { // // Ask for a decision // - response = service.makeDecision(requestSinglePolicy); - LOGGER.info("Decision {}", response); - - assertThat(response).isNotNull(); - assertThat(response.getPolicies().size()).isEqualTo(0); - } - - @Test - 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")) { - onapPdpEngine.convertPolicies(is); - } - }).withMessageContaining("missing metadata section"); - - assertThatExceptionOfType(ToscaPolicyConversionException.class).isThrownBy(() -> { - try (InputStream is = - new FileInputStream("src/test/resources/test.monitoring.policy.missingtype.yaml")) { - onapPdpEngine.convertPolicies(is); - } - }).withMessageContaining("missing type value"); - - assertThatExceptionOfType(ToscaPolicyConversionException.class).isThrownBy(() -> { - try (InputStream is = - new FileInputStream("src/test/resources/test.monitoring.policy.missingversion.yaml")) { - onapPdpEngine.convertPolicies(is); - } - }).withMessageContaining("missing version value"); - - assertThatExceptionOfType(ToscaPolicyConversionException.class).isThrownBy(() -> { - try (InputStream is = - new FileInputStream("src/test/resources/test.monitoring.policy.badmetadata.1.yaml")) { - onapPdpEngine.convertPolicies(is); - } - }).withMessageContaining("missing metadata policy-version"); - - assertThatExceptionOfType(ToscaPolicyConversionException.class).isThrownBy(() -> { - try (InputStream is = - new FileInputStream("src/test/resources/test.monitoring.policy.badmetadata.2.yaml")) { - onapPdpEngine.convertPolicies(is); - } - }).withMessageContaining("missing metadata policy-id"); + decision = service.makeDecision(requestSinglePolicy); + LOGGER.info("Decision {}", decision.getKey()); - */ + assertThat(decision.getKey()).isNotNull(); + assertThat(decision.getKey().getPolicies().size()).isEqualTo(0); } } diff --git a/applications/monitoring/src/test/resources/test.monitoring.policy.badmetadata.1.yaml b/applications/monitoring/src/test/resources/test.monitoring.policy.badmetadata.1.yaml deleted file mode 100644 index a2631848..00000000 --- a/applications/monitoring/src/test/resources/test.monitoring.policy.badmetadata.1.yaml +++ /dev/null @@ -1,10 +0,0 @@ -tosca_definitions_version: tosca_simple_yaml_1_0_0 -policies: - - - test.monitoring.policy.badmetadata.1: - type: onap.policies.monitoring.cdap.tca.hi.lo.app - version: 1.0.0 - metadata: - policy-id: test.monitoring.policy.badmetadata.1 - properties: - domain: measurementsForVfScaling diff --git a/applications/monitoring/src/test/resources/test.monitoring.policy.badmetadata.2.yaml b/applications/monitoring/src/test/resources/test.monitoring.policy.badmetadata.2.yaml deleted file mode 100644 index 7da2db38..00000000 --- a/applications/monitoring/src/test/resources/test.monitoring.policy.badmetadata.2.yaml +++ /dev/null @@ -1,10 +0,0 @@ -tosca_definitions_version: tosca_simple_yaml_1_0_0 -policies: - - - onap.scaleout.tca: - type: onap.policies.monitoring.cdap.tca.hi.lo.app - version: 1.0.0 - metadata: - policy-version: 1 - properties: - domain: measurementsForVfScaling diff --git a/applications/monitoring/src/test/resources/test.monitoring.policy.missingmetadata.yaml b/applications/monitoring/src/test/resources/test.monitoring.policy.missingmetadata.yaml deleted file mode 100644 index 4984a1c3..00000000 --- a/applications/monitoring/src/test/resources/test.monitoring.policy.missingmetadata.yaml +++ /dev/null @@ -1,9 +0,0 @@ -tosca_definitions_version: tosca_simple_yaml_1_0_0 -policies: - - - onap.scaleout.tca: - type: onap.policies.monitoring.test - description: I am a test policy - version: 1.0.0 - properties: - domain: measurementsForVfScaling diff --git a/applications/monitoring/src/test/resources/test.monitoring.policy.missingtype.yaml b/applications/monitoring/src/test/resources/test.monitoring.policy.missingtype.yaml deleted file mode 100644 index 309d08c5..00000000 --- a/applications/monitoring/src/test/resources/test.monitoring.policy.missingtype.yaml +++ /dev/null @@ -1,11 +0,0 @@ -tosca_definitions_version: tosca_simple_yaml_1_0_0 -policies: - - - onap.scaleout.tca: - description: I am a test policy - version: 1.0.0 - metadata: - policy-id: onap.scaleout.tca - policy-version: 10 - properties: - domain: measurementsForVfScaling diff --git a/applications/monitoring/src/test/resources/test.monitoring.policy.missingversion.yaml b/applications/monitoring/src/test/resources/test.monitoring.policy.missingversion.yaml deleted file mode 100644 index ff378d92..00000000 --- a/applications/monitoring/src/test/resources/test.monitoring.policy.missingversion.yaml +++ /dev/null @@ -1,11 +0,0 @@ -tosca_definitions_version: tosca_simple_yaml_1_0_0 -policies: - - - onap.scaleout.tca: - type: onap.policies.monitoring.test - description: I am a test policy - metadata: - policy-id: onap.scaleout.tca - policy-version: 10 - properties: - domain: measurementsForVfScaling diff --git a/applications/optimization/src/main/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplication.java b/applications/optimization/src/main/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplication.java index 337b40d7..91c46746 100644 --- a/applications/optimization/src/main/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplication.java +++ b/applications/optimization/src/main/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplication.java @@ -93,6 +93,7 @@ public class OptimizationPdpApplication extends StdXacmlApplicationServiceProvid // for (ToscaPolicyTypeIdentifier supported : this.supportedPolicyTypes) { if (policyTypeId.equals(supported)) { + LOGGER.info("optimization can support {}", supported); return true; } } diff --git a/applications/optimization/src/test/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplicationTest.java b/applications/optimization/src/test/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplicationTest.java index 046aaa66..6d1afda6 100644 --- a/applications/optimization/src/test/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplicationTest.java +++ b/applications/optimization/src/test/java/org/onap/policy/xacml/pdp/application/optimization/OptimizationPdpApplicationTest.java @@ -24,6 +24,8 @@ package org.onap.policy.xacml.pdp.application.optimization; import static org.assertj.core.api.Assertions.assertThat; +import com.att.research.xacml.api.Response; + import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; @@ -31,6 +33,7 @@ import java.util.Iterator; import java.util.Properties; import java.util.ServiceLoader; +import org.apache.commons.lang3.tuple.Pair; import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.FixMethodOrder; @@ -147,11 +150,11 @@ public class OptimizationPdpApplicationTest { // // Ask for a decision // - DecisionResponse response = service.makeDecision(requestAffinity); - LOGGER.info("Decision {}", response); + Pair decision = service.makeDecision(requestAffinity); + LOGGER.info("Decision {}", decision.getKey()); - assertThat(response).isNotNull(); - assertThat(response.getPolicies().size()).isEqualTo(0); + assertThat(decision.getKey()).isNotNull(); + assertThat(decision.getKey().getPolicies().size()).isEqualTo(0); } @Test @@ -164,14 +167,14 @@ public class OptimizationPdpApplicationTest { // // Ask for a decision // - DecisionResponse response = service.makeDecision(requestAffinity); - LOGGER.info("Decision {}", response); + Pair decision = service.makeDecision(requestAffinity); + LOGGER.info("Decision {}", decision.getKey()); - assertThat(response).isNotNull(); - assertThat(response.getPolicies().size()).isEqualTo(1); + assertThat(decision.getKey()).isNotNull(); + assertThat(decision.getKey().getPolicies().size()).isEqualTo(1); // // Dump it out as Json // - LOGGER.info(gson.encode(response)); + LOGGER.info(gson.encode(decision.getKey())); } } diff --git a/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpPapRegistration.java b/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpPapRegistration.java index b7421964..a848f523 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpPapRegistration.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/comm/XacmlPdpPapRegistration.java @@ -49,12 +49,10 @@ public class XacmlPdpPapRegistration { public void pdpRegistration(PdpStatus status) throws TopicSinkClientException { try { if (!client.send(status)) { - LOGGER.error("Failed to send to topic sink " + client.getTopic()); - return; + LOGGER.error("Failed to send to topic sink {}", client.getTopic()); } } catch (IllegalStateException e) { - LOGGER.error("Failed ot send to topic sink " + client.getTopic(), e); - return; + LOGGER.error("Failed ot send to topic sink {}", client.getTopic(), e); } } } diff --git a/main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpStateChangeListener.java b/main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpStateChangeListener.java index 3e24c3fe..84572d92 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpStateChangeListener.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/comm/listeners/XacmlPdpStateChangeListener.java @@ -63,7 +63,7 @@ public class XacmlPdpStateChangeListener extends ScoListener { // Send State Change Status to PAP if (!client.send(newStatus)) { - LOGGER.error("failed to send to topic sink " + client.getTopic()); + LOGGER.error("failed to send to topic sink {}", client.getTopic()); throw new TopicSinkClientException("failed to send to topic sink " + client.getTopic()); } diff --git a/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpApplicationManager.java b/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpApplicationManager.java index 785d7591..db2ce553 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpApplicationManager.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpApplicationManager.java @@ -46,8 +46,6 @@ public class XacmlPdpApplicationManager { private static ServiceLoader applicationLoader; private static Map providerActionMap = new HashMap<>(); private static List toscaPolicyTypeIdents = new ArrayList<>(); - private static List toscaPolicyIdents = new ArrayList<>(); - private static List toscaPolicies = new ArrayList<>(); private static Map mapLoadedPolicies = new HashMap<>(); @@ -59,12 +57,20 @@ public class XacmlPdpApplicationManager { * One time to initialize the applications upon startup. */ public static void initializeApplications(Path applicationPath) { + if (LOGGER.isInfoEnabled()) { + LOGGER.info("Initialization applications {}", applicationPath.toAbsolutePath()); + } // // If we have already done this // if (! needsInit) { - LOGGER.error("Already initialized the applications"); - return; + LOGGER.warn("Already initialized the applications {}", providerActionMap); + // + // I had to remove this because the JUnits kept failing - although I probably can + // add it back. The main() is hanging around during JUnits and initialization will + // fail. + // + // return } // // Load service @@ -74,8 +80,10 @@ public class XacmlPdpApplicationManager { // Iterate through the applications for actions and supported policy types // for (XacmlApplicationServiceProvider application : applicationLoader) { - LOGGER.info("Application {} supports {}", application.applicationName(), + if (LOGGER.isInfoEnabled()) { + LOGGER.info("Application {} supports {}", application.applicationName(), application.supportedPolicyTypes()); + } // // We are not going to make this available unless the application can // install correctly. @@ -113,6 +121,8 @@ public class XacmlPdpApplicationManager { // we have initialized // needsInit = false; + LOGGER.info("Finished applications initialization {}", providerActionMap); + } public static XacmlApplicationServiceProvider findApplication(DecisionRequest request) { @@ -154,8 +164,10 @@ public class XacmlPdpApplicationManager { for (XacmlApplicationServiceProvider application : applicationLoader) { try { if (application.unloadPolicy(policy)) { - LOGGER.info("Unloaded ToscaPolicy {} from application {}", policy.getMetadata(), + if (LOGGER.isInfoEnabled()) { + LOGGER.info("Unloaded ToscaPolicy {} from application {}", policy.getMetadata(), application.applicationName()); + } if (mapLoadedPolicies.remove(policy) == null) { LOGGER.error("Failed to remove unloaded policy {} from map size {}", policy.getMetadata(), mapLoadedPolicies.size()); @@ -183,8 +195,10 @@ public class XacmlPdpApplicationManager { // if (application.canSupportPolicyType(policy.getTypeIdentifier())) { if (application.loadPolicy(policy)) { - LOGGER.info("Loaded ToscaPolicy {} into application {}", policy.getMetadata(), + if (LOGGER.isInfoEnabled()) { + LOGGER.info("Loaded ToscaPolicy {} into application {}", policy.getMetadata(), application.applicationName()); + } mapLoadedPolicies.put(policy, application); } return; @@ -217,7 +231,9 @@ public class XacmlPdpApplicationManager { // they can result in a valid directory being created. // Path path = Paths.get(basePath.toAbsolutePath().toString(), application.applicationName()); - LOGGER.info("initializeApplicationPath {} at this path {}", application.applicationName(), path); + if (LOGGER.isInfoEnabled()) { + LOGGER.info("initializeApplicationPath {} at this path {}", application.applicationName(), path); + } // // Create that the directory if it does not exist. Ideally // this is only for testing, but could be used for production @@ -231,7 +247,7 @@ public class XacmlPdpApplicationManager { // Files.createDirectory(path); } catch (IOException e) { - LOGGER.error("Failed to create application directory", e); + LOGGER.error("Failed to create application directory {}", path.toAbsolutePath().toString(), e); } } // diff --git a/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpRestController.java b/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpRestController.java index c61bef24..37bab8ec 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpRestController.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpRestController.java @@ -175,6 +175,7 @@ public class XacmlPdpRestController { return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId) .entity(new DecisionProvider().fetchDecision(body)).build(); } catch (DecisionException e) { + XacmlPdpStatisticsManager.updateErrorCount(); return addLoggingHeaders( addVersionControlHeaders(Response.status((e.getErrorResponse().getResponseCode()))), requestId) .entity(e.getErrorResponse()).build(); diff --git a/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpRestServer.java b/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpRestServer.java index f7f6cc38..eee9717a 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpRestServer.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpRestServer.java @@ -63,6 +63,7 @@ public class XacmlPdpRestServer implements Startable { @Override public boolean start() { try { + LOGGER.info("Starting XacmlPdpRestServer..."); // // Initialize the applications - SEND PROPERTIES // @@ -86,6 +87,7 @@ public class XacmlPdpRestServer implements Startable { } server.start(); } + LOGGER.info("servers are started"); } catch (final Exception exp) { LOGGER.error("Failed to start xacml pdp http server", exp); return false; diff --git a/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpStatisticsManager.java b/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpStatisticsManager.java index cfdfa3d8..d209c09c 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpStatisticsManager.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/rest/XacmlPdpStatisticsManager.java @@ -28,6 +28,7 @@ public class XacmlPdpStatisticsManager { private static long totalPolicyTypesCount; private static long totalPoliciesCount; + private static long errorsCount; private static long permitDecisionsCount; private static long denyDecisionsCount; private static long indeterminantDecisionsCount; @@ -58,6 +59,15 @@ public class XacmlPdpStatisticsManager { return ++totalPoliciesCount; } + /** + * Method to update the number of error decisions. + * + * @return the errorDecisionsCount + */ + public static long updateErrorCount() { + return ++errorsCount; + } + /** * Method to update the number of permit decisions. * @@ -112,6 +122,15 @@ public class XacmlPdpStatisticsManager { return totalPoliciesCount; } + /** + * Returns the current value of errorDecisionsCount. + + * @return the permitDecisionsCount + */ + public static long getErrorCount() { + return errorsCount; + } + /** * Returns the current value of permitDecisionsCount. @@ -152,7 +171,9 @@ public class XacmlPdpStatisticsManager { * Reset all the statistics counts to 0. */ public static void resetAllStatistics() { + totalPolicyTypesCount = 0L; totalPoliciesCount = 0L; + errorsCount = 0L; permitDecisionsCount = 0L; denyDecisionsCount = 0L; indeterminantDecisionsCount = 0L; diff --git a/main/src/main/java/org/onap/policy/pdpx/main/rest/model/StatisticsReport.java b/main/src/main/java/org/onap/policy/pdpx/main/rest/model/StatisticsReport.java index 05933399..2544527e 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/rest/model/StatisticsReport.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/rest/model/StatisticsReport.java @@ -20,168 +20,25 @@ package org.onap.policy.pdpx.main.rest.model; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + /** * Class to represent statistics report of xacmlPdp service. * */ +@Getter +@Setter +@ToString public class StatisticsReport { private int code; private long totalPolicyTypesCount; private long totalPoliciesCount; + private long totalErrorCount; private long permitDecisionsCount; private long denyDecisionsCount; private long indeterminantDecisionsCount; private long notApplicableDecisionsCount; - - - /** - * Returns the code of this {@link StatisticsReport} instance. - * - * @return the code - */ - public int getCode() { - return code; - } - - /** - * Set code in this {@link StatisticsReport} instance. - * - * @param code the code to set - */ - public void setCode(final int code) { - this.code = code; - } - - /** - * Returns the totalPolicyTypesCount of this {@link StatisticsReport} instance. - * - * @return the totalPolicyTypesCount - */ - public long getTotalPolicyTypesCount() { - return totalPolicyTypesCount; - } - - /** - * Set totalPolicyTypesCount in this {@link StatisticsReport} instance. - * - * @param totalPolicyTypesCount the totalPolicyTypesCount to set - */ - public void setTotalPolicyTypesCount(long totalPolicyTypesCount) { - this.totalPolicyTypesCount = totalPolicyTypesCount; - } - - /** - * Returns the totalPoliciesCount of this {@link StatisticsReport} instance. - * - * @return the totalPoliciesCount - */ - public long getTotalPoliciesCount() { - return totalPoliciesCount; - } - - /** - * Set totalPoliciesCount in this {@link StatisticsReport} instance. - * - * @param totalPoliciesCount the totalPoliciesCount to set - */ - public void setTotalPoliciesCount(long totalPoliciesCount) { - this.totalPoliciesCount = totalPoliciesCount; - } - - /** - * Returns the permitDecisionsCount of this {@link StatisticsReport} instance. - * - * @return the permitDecisionsCount - */ - public long getPermitDecisionsCount() { - return permitDecisionsCount; - } - - /** - * Set permitDecisionsCount in this {@link StatisticsReport} instance. - * - * @param permitDecisionsCount the permitDecisionsCount to set - */ - public void setPermitDecisionsCount(long permitDecisionsCount) { - this.permitDecisionsCount = permitDecisionsCount; - } - - /** - * Returns the denyDecisionsCount of this {@link StatisticsReport} instance. - * - * @return the denyDecisionsCount - */ - public long getDenyDecisionsCount() { - return denyDecisionsCount; - } - - /** - * Set denyDecisionsCount in this {@link StatisticsReport} instance. - * - * @param denyDecisionsCount the denyDecisionsCount to set - */ - public void setDenyDecisionsCount(long denyDecisionsCount) { - this.denyDecisionsCount = denyDecisionsCount; - } - - /** - * Returns the indeterminantDecisionsCount of this {@link StatisticsReport} instance. - * - * @return the indeterminantDecisionsCount - */ - public long getIndeterminantDecisionsCount() { - return indeterminantDecisionsCount; - } - - /** - * Set indeterminantDecisionsCount in this {@link StatisticsReport} instance. - * - * @param indeterminantDecisionsCount the indeterminantDecisionsCount to set - */ - public void setIndeterminantDecisionsCount(long indeterminantDecisionsCount) { - this.indeterminantDecisionsCount = indeterminantDecisionsCount; - } - - /** - * Returns the notApplicableDecisionsCount of this {@link StatisticsReport} instance. - * - * @return the notApplicableDecisionsCount - */ - public long getNotApplicableDecisionsCount() { - return notApplicableDecisionsCount; - } - - /** - * Set notApplicableDecisionsCount in this {@link StatisticsReport} instance. - * - * @param notApplicableDecisionsCount the notApplicableDecisionsCount to set - */ - public void setNotApplicableDecisionsCount(long notApplicableDecisionsCount) { - this.notApplicableDecisionsCount = notApplicableDecisionsCount; - } - - /** - * {@inheritDoc}. - */ - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("StatisticsReport [code="); - builder.append(getCode()); - builder.append(", totalPolicyTypesCount="); - builder.append(getTotalPolicyTypesCount()); - builder.append(", totalPoliciesCount="); - builder.append(getTotalPoliciesCount()); - builder.append(", permitDecisionsCount="); - builder.append(getPermitDecisionsCount()); - builder.append(", denyDecisionsCount="); - builder.append(getDenyDecisionsCount()); - builder.append(", indeterminantDecisionsCount="); - builder.append(getIndeterminantDecisionsCount()); - builder.append(", notApplicableDecisionsCount="); - builder.append(getNotApplicableDecisionsCount()); - builder.append("]"); - return builder.toString(); - } } diff --git a/main/src/main/java/org/onap/policy/pdpx/main/rest/provider/DecisionProvider.java b/main/src/main/java/org/onap/policy/pdpx/main/rest/provider/DecisionProvider.java index 33178533..9cfb8a47 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/rest/provider/DecisionProvider.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/rest/provider/DecisionProvider.java @@ -20,13 +20,16 @@ package org.onap.policy.pdpx.main.rest.provider; -import javax.ws.rs.core.Response.Status; +import com.att.research.xacml.api.Response; +import com.att.research.xacml.api.Result; +import org.apache.commons.lang3.tuple.Pair; import org.onap.policy.models.decisions.concepts.DecisionException; import org.onap.policy.models.decisions.concepts.DecisionRequest; import org.onap.policy.models.decisions.concepts.DecisionResponse; import org.onap.policy.pdp.xacml.application.common.XacmlApplicationServiceProvider; import org.onap.policy.pdpx.main.rest.XacmlPdpApplicationManager; +import org.onap.policy.pdpx.main.rest.XacmlPdpStatisticsManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,9 +50,23 @@ public class DecisionProvider { // XacmlApplicationServiceProvider application = findApplication(request); // - // Cannot find application for action + // Found application for action // - return application.makeDecision(request); + Pair decision; + try { + decision = application.makeDecision(request); + } catch (Exception e) { + LOGGER.error("makeDecision failed", e); + throw e; + } + // + // Calculate statistics + // + this.calculateStatistic(decision.getValue()); + // + // Return the decision + // + return decision.getKey(); } private XacmlApplicationServiceProvider findApplication(DecisionRequest request) { @@ -57,7 +74,38 @@ public class DecisionProvider { if (application != null) { return application; } - throw new DecisionException(Status.BAD_REQUEST, "No application for action " + request.getAction()); + throw new DecisionException(javax.ws.rs.core.Response.Status.BAD_REQUEST, + "No application for action " + request.getAction()); + } + + private void calculateStatistic(Response xacmlResponse) { + + for (Result result : xacmlResponse.getResults()) { + switch (result.getDecision()) { + case PERMIT: + XacmlPdpStatisticsManager.updatePermitDecisionsCount(); + break; + + case DENY: + XacmlPdpStatisticsManager.updateDenyDecisionsCount(); + break; + + case INDETERMINATE: + case INDETERMINATE_DENY: + case INDETERMINATE_DENYPERMIT: + case INDETERMINATE_PERMIT: + XacmlPdpStatisticsManager.updateIndeterminantDecisionsCount(); + break; + + case NOTAPPLICABLE: + XacmlPdpStatisticsManager.updateNotApplicableDecisionsCount(); + break; + + default: + break; + + } + } } } diff --git a/main/src/main/java/org/onap/policy/pdpx/main/rest/provider/StatisticsProvider.java b/main/src/main/java/org/onap/policy/pdpx/main/rest/provider/StatisticsProvider.java index 59d3722c..95d67a67 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/rest/provider/StatisticsProvider.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/rest/provider/StatisticsProvider.java @@ -40,6 +40,7 @@ public class StatisticsProvider { report.setCode(XacmlPdpActivator.getCurrent().isAlive() ? 200 : 500); report.setTotalPolicyTypesCount(XacmlPdpStatisticsManager.getTotalPolicyTypesCount()); report.setTotalPoliciesCount(XacmlPdpStatisticsManager.getTotalPoliciesCount()); + report.setTotalErrorCount(XacmlPdpStatisticsManager.getErrorCount()); report.setPermitDecisionsCount(XacmlPdpStatisticsManager.getPermitDecisionsCount()); report.setDenyDecisionsCount(XacmlPdpStatisticsManager.getDenyDecisionsCount()); report.setIndeterminantDecisionsCount(XacmlPdpStatisticsManager.getIndeterminantDecisionsCount()); diff --git a/main/src/main/java/org/onap/policy/pdpx/main/startstop/XacmlPdpActivator.java b/main/src/main/java/org/onap/policy/pdpx/main/startstop/XacmlPdpActivator.java index 330fbd67..70dd2c42 100644 --- a/main/src/main/java/org/onap/policy/pdpx/main/startstop/XacmlPdpActivator.java +++ b/main/src/main/java/org/onap/policy/pdpx/main/startstop/XacmlPdpActivator.java @@ -98,6 +98,8 @@ public class XacmlPdpActivator extends ServiceManagerContainer { * @param topicProperties properties used to configure the topics */ public XacmlPdpActivator(final XacmlPdpParameterGroup xacmlPdpParameterGroup, Properties topicProperties) { + LOGGER.info("Activator initializing using {} and {}", xacmlPdpParameterGroup, topicProperties); + TopicEndpoint.manager.addTopicSinks(topicProperties); TopicEndpoint.manager.addTopicSources(topicProperties); diff --git a/main/src/main/resources/META-INF/persistence.xml b/main/src/main/resources/META-INF/persistence.xml new file mode 100644 index 00000000..e3f4a2f6 --- /dev/null +++ b/main/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,38 @@ + + + + + + + org.eclipse.persistence.jpa.PersistenceProvider + + org.onap.policy.pdp.xacml.application.common.operationshistory.Dbao + + + + + + + + + + + \ No newline at end of file diff --git a/main/src/test/java/org/onap/policy/pdpx/main/PolicyXacmlPdpExceptionTest.java b/main/src/test/java/org/onap/policy/pdpx/main/PolicyXacmlPdpExceptionTest.java new file mode 100644 index 00000000..4dd02c62 --- /dev/null +++ b/main/src/test/java/org/onap/policy/pdpx/main/PolicyXacmlPdpExceptionTest.java @@ -0,0 +1,37 @@ +/*- + * ============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.pdpx.main; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.onap.policy.common.utils.test.ExceptionsTester; + +public class PolicyXacmlPdpExceptionTest { + + @Test + public void test() { + assertEquals(2, new ExceptionsTester().test(PolicyXacmlPdpException.class)); + } + +} diff --git a/main/src/test/java/org/onap/policy/pdpx/main/PolicyXacmlPdpRuntimeExceptionTest.java b/main/src/test/java/org/onap/policy/pdpx/main/PolicyXacmlPdpRuntimeExceptionTest.java new file mode 100644 index 00000000..80e69747 --- /dev/null +++ b/main/src/test/java/org/onap/policy/pdpx/main/PolicyXacmlPdpRuntimeExceptionTest.java @@ -0,0 +1,38 @@ +/*- + * ============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.pdpx.main; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.onap.policy.common.utils.test.ExceptionsTester; + +public class PolicyXacmlPdpRuntimeExceptionTest { + + @Test + public void test() { + assertEquals(2, new ExceptionsTester().test(PolicyXacmlPdpRuntimeException.class)); + } + + +} diff --git a/main/src/test/java/org/onap/policy/pdpx/main/rest/TestDecision.java b/main/src/test/java/org/onap/policy/pdpx/main/rest/TestDecision.java index b81336a5..3a1e98b1 100644 --- a/main/src/test/java/org/onap/policy/pdpx/main/rest/TestDecision.java +++ b/main/src/test/java/org/onap/policy/pdpx/main/rest/TestDecision.java @@ -38,17 +38,11 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; -import javax.ws.rs.client.Invocation; -import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import org.glassfish.jersey.client.ClientConfig; -import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -74,6 +68,7 @@ public class TestDecision { private static final Logger LOGGER = LoggerFactory.getLogger(TestDecision.class); private static Main main; + private static HttpClient client; @ClassRule public static final TemporaryFolder appsFolder = new TemporaryFolder(); @@ -81,15 +76,16 @@ public class TestDecision { /** * BeforeClass setup environment. * @throws IOException Cannot create temp apps folder + * @throws Exception exception if service does not start */ @BeforeClass - public static void beforeClass() throws IOException { + public static void beforeClass() throws Exception { System.setProperty("org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.StdErrLog"); System.setProperty("org.eclipse.jetty.LEVEL", "OFF"); // // Copy test directory over of the application directories // - Path src = Paths.get("../packages/policy-xacmlpdp-tarball/src/main/resources/apps"); + Path src = Paths.get("src/test/resources/apps"); File apps = appsFolder.newFolder("apps"); Files.walk(src).forEach(source -> { copy(source, apps.toPath().resolve(src.relativize(source))); @@ -109,6 +105,16 @@ public class TestDecision { // Start the service // main = startXacmlPdpService(fileParams); + // + // Make sure it is running + // + if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 20, 1000L)) { + throw new IllegalStateException("Cannot connect to port 6969"); + } + // + // Create a client + // + client = getNoAuthHttpClient(); } @AfterClass @@ -139,7 +145,9 @@ public class TestDecision { } @Test - public void testDecision_Guard() throws InterruptedException, IOException { + public void testDecision_Guard() throws KeyManagementException, NoSuchAlgorithmException, + ClassNotFoundException { + LOGGER.info("Running test testDecision_Guard"); DecisionRequest request = new DecisionRequest(); @@ -167,28 +175,17 @@ public class TestDecision { main.shutdown(); } - private DecisionResponse getDecision(DecisionRequest request) throws InterruptedException, IOException { - final ClientConfig clientConfig = new ClientConfig(); + private DecisionResponse getDecision(DecisionRequest request) { - final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34"); - clientConfig.register(feature); - - final Client client = ClientBuilder.newClient(clientConfig); - final WebTarget webTarget = client.target("http://localhost:6969/policy/pdpx/v1/decision"); + Entity entityRequest = Entity.entity(request, MediaType.APPLICATION_JSON); + Response response = client.post("", entityRequest, Collections.emptyMap()); - final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON); + assertEquals(200, response.getStatus()); - if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) { - throw new IllegalStateException("Cannot connect to port 6969"); - } - - return invocationBuilder.post(Entity.json(request), DecisionResponse.class); + return HttpClient.getBody(response, DecisionResponse.class); } - private ErrorResponse getErrorDecision(DecisionRequest request) throws KeyManagementException, - NoSuchAlgorithmException, ClassNotFoundException { - - HttpClient client = getNoAuthHttpClient(); + private ErrorResponse getErrorDecision(DecisionRequest request) { Entity entityRequest = Entity.entity(request, MediaType.APPLICATION_JSON); Response response = client.post("", entityRequest, Collections.emptyMap()); @@ -198,7 +195,7 @@ public class TestDecision { return HttpClient.getBody(response, ErrorResponse.class); } - private HttpClient getNoAuthHttpClient() + private static HttpClient getNoAuthHttpClient() throws KeyManagementException, NoSuchAlgorithmException, ClassNotFoundException { return HttpClient.factory.build(BusTopicParams.builder() .clientName("testDecisionClient") diff --git a/main/src/test/java/org/onap/policy/pdpx/main/rest/TestXacmlPdpRestServer.java b/main/src/test/java/org/onap/policy/pdpx/main/rest/TestXacmlPdpRestServer.java index 0deab9d0..f9f2abf3 100644 --- a/main/src/test/java/org/onap/policy/pdpx/main/rest/TestXacmlPdpRestServer.java +++ b/main/src/test/java/org/onap/policy/pdpx/main/rest/TestXacmlPdpRestServer.java @@ -44,8 +44,10 @@ import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; import org.junit.After; 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.endpoints.event.comm.client.TopicSinkClientException; import org.onap.policy.common.endpoints.report.HealthCheckReport; import org.onap.policy.common.utils.network.NetworkUtil; @@ -61,6 +63,7 @@ import org.slf4j.LoggerFactory; * Class to perform unit test of {@link XacmlPdpRestServer}. * */ +@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class TestXacmlPdpRestServer { private static final Logger LOGGER = LoggerFactory.getLogger(TestXacmlPdpRestServer.class); @@ -99,10 +102,12 @@ public class TestXacmlPdpRestServer { if (NetworkUtil.isTcpPortOpen("localhost", 6969, 1, 1000L)) { if (main != null) { stopXacmlPdpService(main); + main = null; } if (restServer != null) { restServer.stop(); + restServer = null; } } } catch (IOException | PolicyXacmlPdpException e) { @@ -114,69 +119,84 @@ public class TestXacmlPdpRestServer { } @Test - public void testHealthCheckSuccess() throws IOException, InterruptedException, TopicSinkClientException { + public void test1HealthCheckSuccess() throws IOException, InterruptedException, TopicSinkClientException { + LOGGER.info("***************************** Running test1HealthCheckSuccess *****************************"); main = startXacmlPdpService(true); final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT); final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class); + LOGGER.info("test1HealthCheckSuccess health report {}", report); validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report); } @Test - public void testHealthCheckFailure() throws InterruptedException, IOException { + public void test7HealthCheckFailure() throws InterruptedException, IOException { + LOGGER.info("***************************** Running test7HealthCheckFailure *****************************"); final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false); restServerParams.setName(CommonTestData.PDPX_GROUP_NAME); restServer = new XacmlPdpRestServer(restServerParams, applicationPath.getAbsolutePath()); restServer.start(); final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT); final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class); + LOGGER.info("test7HealthCheckFailure health report {}", report); validateHealthCheckReport(NAME, SELF, false, 500, NOT_ALIVE, report); assertTrue(restServer.isAlive()); assertTrue(restServer.toString().startsWith("XacmlPdpRestServer [servers=")); } @Test - public void testHttpsHealthCheckSuccess() throws Exception { + public void test2HttpsHealthCheckSuccess() throws Exception { + LOGGER.info("**************************** Running test2HttpsHealthCheckSuccess ****************************"); main = startXacmlPdpService(false); final Invocation.Builder invocationBuilder = sendHttpsRequest(HEALTHCHECK_ENDPOINT); final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class); + LOGGER.info("test2HttpsHealthCheckSuccess health report {}", report); validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report); } @Test - public void testStatistics_200() throws IOException, InterruptedException, TopicSinkClientException { + public void test4Statistics_200() throws IOException, InterruptedException, TopicSinkClientException { + LOGGER.info("***************************** Running test4Statistics_200 *****************************"); + XacmlPdpStatisticsManager.resetAllStatistics(); main = startXacmlPdpService(true); Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT); StatisticsReport report = invocationBuilder.get(StatisticsReport.class); + LOGGER.info("test4Statistics_200 health report {}", report); validateStatisticsReport(report, 0, 200); updateXacmlPdpStatistics(); invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT); report = invocationBuilder.get(StatisticsReport.class); + LOGGER.info("test4Statistics_200 health report {}", report); validateStatisticsReport(report, 1, 200); XacmlPdpStatisticsManager.resetAllStatistics(); } @Test - public void testStatistics_500() throws IOException, InterruptedException { + public void test5Statistics_500() throws IOException, InterruptedException { + LOGGER.info("***************************** Running test5Statistics_500 *****************************"); final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false); restServerParams.setName(CommonTestData.PDPX_GROUP_NAME); restServer = new XacmlPdpRestServer(restServerParams, applicationPath.getAbsolutePath()); restServer.start(); final Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT); final StatisticsReport report = invocationBuilder.get(StatisticsReport.class); + LOGGER.info("test5Statistics_500 health report {}", report); validateStatisticsReport(report, 0, 500); XacmlPdpStatisticsManager.resetAllStatistics(); } @Test - public void testHttpsStatistic() throws Exception { + public void test6HttpsStatistic() throws Exception { + LOGGER.info("***************************** Running test6HttpsStatistic *****************************"); main = startXacmlPdpService(false); final Invocation.Builder invocationBuilder = sendHttpsRequest(STATISTICS_ENDPOINT); final StatisticsReport report = invocationBuilder.get(StatisticsReport.class); + LOGGER.info("test6HttpsStatistic health report {}", report); validateStatisticsReport(report, 0, 200); } @Test - public void testStatisticsConstructorIsPrivate() { + public void test3StatisticsConstructorIsPrivate() { + LOGGER.info("************************* Running test3StatisticsConstructorIsPrivate *************************"); try { final Constructor constructor = XacmlPdpStatisticsManager.class.getDeclaredConstructor(); @@ -224,9 +244,10 @@ public class TestXacmlPdpRestServer { final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON); - if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) { - throw new IllegalStateException("cannot connect to port 6969"); + if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 20, 1000L)) { + throw new IllegalStateException("Cannot connect to port 6969"); } + return invocationBuilder; } diff --git a/main/src/test/java/org/onap/policy/pdpx/main/rest/TestXacmlPdpStatistics.java b/main/src/test/java/org/onap/policy/pdpx/main/rest/TestXacmlPdpStatistics.java index 5b08aa80..6a762924 100644 --- a/main/src/test/java/org/onap/policy/pdpx/main/rest/TestXacmlPdpStatistics.java +++ b/main/src/test/java/org/onap/policy/pdpx/main/rest/TestXacmlPdpStatistics.java @@ -76,6 +76,7 @@ public class TestXacmlPdpStatistics { @Test public void testXacmlPdpStatistics_200() throws PolicyXacmlPdpException, InterruptedException { try { + LOGGER.info("*************************** Running testXacmlPdpStatistics_200 ***************************"); final Main main = startXacmlPdpService(); StatisticsReport report = getXacmlPdpStatistics(); validateReport(report, 0, 200); @@ -93,6 +94,7 @@ public class TestXacmlPdpStatistics { @Test public void testXacmlPdpStatistics_500() throws InterruptedException { + LOGGER.info("***************************** Running testXacmlPdpStatistics_500 *****************************"); final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false); restServerParams.setName(CommonTestData.PDPX_GROUP_NAME); final XacmlPdpRestServer restServer = new XacmlPdpRestServer(restServerParams, @@ -133,7 +135,7 @@ public class TestXacmlPdpStatistics { final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON); - if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) { + if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 20, 1000L)) { throw new IllegalStateException("Cannot connect to port 6969"); } diff --git a/main/src/test/resources/META-INF/persistence.xml b/main/src/test/resources/META-INF/persistence.xml new file mode 100644 index 00000000..d917c06b --- /dev/null +++ b/main/src/test/resources/META-INF/persistence.xml @@ -0,0 +1,38 @@ + + + + + + + org.eclipse.persistence.jpa.PersistenceProvider + + org.onap.policy.pdp.xacml.application.common.operationshistory.Dbao + + + + + + + + + + + diff --git a/main/src/test/resources/apps/guard/xacml.properties b/main/src/test/resources/apps/guard/xacml.properties new file mode 100644 index 00000000..3d4d025c --- /dev/null +++ b/main/src/test/resources/apps/guard/xacml.properties @@ -0,0 +1,53 @@ +# +# Properties that the embedded PDP engine uses to configure and load +# +# Standard API Factories +# +xacml.dataTypeFactory=com.att.research.xacml.std.StdDataTypeFactory +xacml.pdpEngineFactory=com.att.research.xacmlatt.pdp.ATTPDPEngineFactory +xacml.pepEngineFactory=com.att.research.xacml.std.pep.StdEngineFactory +xacml.pipFinderFactory=com.att.research.xacml.std.pip.StdPIPFinderFactory +xacml.traceEngineFactory=com.att.research.xacml.std.trace.LoggingTraceEngineFactory +# +# AT&T PDP Implementation Factories +# +xacml.att.evaluationContextFactory=com.att.research.xacmlatt.pdp.std.StdEvaluationContextFactory +xacml.att.combiningAlgorithmFactory=com.att.research.xacmlatt.pdp.std.StdCombiningAlgorithmFactory +xacml.att.functionDefinitionFactory=com.att.research.xacmlatt.pdp.std.StdFunctionDefinitionFactory +# +# ONAP PDP Implementation Factories +# +xacml.att.policyFinderFactory=org.onap.policy.pdp.xacml.application.common.OnapPolicyFinderFactory + +# +# Use a root combining algorithm +# +xacml.att.policyFinderFactory.combineRootPolicies=urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-overrides + +# +# PIP Engine Definitions +# +count-recent-operations.classname=org.onap.policy.pdp.xacml.application.common.operationshistory.CountRecentOperationsPip +count-recent-operations.issuer=urn:org:onap:xacml:guard:count-recent-operations +count-recent-operations.name=CountRecentOperations +count-recent-operations.description=Returns operation counts based on time window +count-recent-operations.persistenceunit=OperationsHistoryPUTest + +get-operation-outcome.classname=org.onap.policy.pdp.xacml.application.common.operationshistory.GetOperationOutcomePip +get-operation-outcome.issuer=urn:org:onap:xacml:guard:get-operation-outcome +get-operation-outcome.name=GetOperationOutcome +get-operation-outcome.description=Returns operation outcome +get-operation-outcome.persistenceunit=OperationsHistoryPUTest + +# +# Make pips available to finder +# +xacml.pip.engines=count-recent-operations,get-operation-outcome + +# +# JPA Properties +# +javax.persistence.jdbc.driver=org.h2.Driver +javax.persistence.jdbc.url=jdbc:h2:mem:testdb;DATABASE_TO_UPPER=FALSE +javax.persistence.jdbc.user=policy +javax.persistence.jdbc.password=P01icY diff --git a/main/src/test/resources/apps/monitoring/xacml.properties b/main/src/test/resources/apps/monitoring/xacml.properties new file mode 100644 index 00000000..5ea247cf --- /dev/null +++ b/main/src/test/resources/apps/monitoring/xacml.properties @@ -0,0 +1,31 @@ +# +# Properties that the embedded PDP engine uses to configure and load +# +# Standard API Factories +# +xacml.dataTypeFactory=com.att.research.xacml.std.StdDataTypeFactory +xacml.pdpEngineFactory=com.att.research.xacmlatt.pdp.ATTPDPEngineFactory +xacml.pepEngineFactory=com.att.research.xacml.std.pep.StdEngineFactory +xacml.pipFinderFactory=com.att.research.xacml.std.pip.StdPIPFinderFactory +xacml.traceEngineFactory=com.att.research.xacml.std.trace.LoggingTraceEngineFactory +# +# AT&T PDP Implementation Factories +# +xacml.att.evaluationContextFactory=com.att.research.xacmlatt.pdp.std.StdEvaluationContextFactory +xacml.att.combiningAlgorithmFactory=com.att.research.xacmlatt.pdp.std.StdCombiningAlgorithmFactory +xacml.att.functionDefinitionFactory=com.att.research.xacmlatt.pdp.std.StdFunctionDefinitionFactory +# +# ONAP PDP Implementation Factories +# +xacml.att.policyFinderFactory=org.onap.policy.pdp.xacml.application.common.OnapPolicyFinderFactory + +# +# Use a root combining algorithm +# +xacml.att.policyFinderFactory.combineRootPolicies=urn:com:att:xacml:3.0:policy-combining-algorithm:combined-permit-overrides + +# +# Policies to load +# +xacml.rootPolicies= +xacml.referencedPolicies= \ No newline at end of file diff --git a/main/src/test/resources/apps/optimization/xacml.properties b/main/src/test/resources/apps/optimization/xacml.properties new file mode 100644 index 00000000..5ea247cf --- /dev/null +++ b/main/src/test/resources/apps/optimization/xacml.properties @@ -0,0 +1,31 @@ +# +# Properties that the embedded PDP engine uses to configure and load +# +# Standard API Factories +# +xacml.dataTypeFactory=com.att.research.xacml.std.StdDataTypeFactory +xacml.pdpEngineFactory=com.att.research.xacmlatt.pdp.ATTPDPEngineFactory +xacml.pepEngineFactory=com.att.research.xacml.std.pep.StdEngineFactory +xacml.pipFinderFactory=com.att.research.xacml.std.pip.StdPIPFinderFactory +xacml.traceEngineFactory=com.att.research.xacml.std.trace.LoggingTraceEngineFactory +# +# AT&T PDP Implementation Factories +# +xacml.att.evaluationContextFactory=com.att.research.xacmlatt.pdp.std.StdEvaluationContextFactory +xacml.att.combiningAlgorithmFactory=com.att.research.xacmlatt.pdp.std.StdCombiningAlgorithmFactory +xacml.att.functionDefinitionFactory=com.att.research.xacmlatt.pdp.std.StdFunctionDefinitionFactory +# +# ONAP PDP Implementation Factories +# +xacml.att.policyFinderFactory=org.onap.policy.pdp.xacml.application.common.OnapPolicyFinderFactory + +# +# Use a root combining algorithm +# +xacml.att.policyFinderFactory.combineRootPolicies=urn:com:att:xacml:3.0:policy-combining-algorithm:combined-permit-overrides + +# +# Policies to load +# +xacml.rootPolicies= +xacml.referencedPolicies= \ No newline at end of file diff --git a/main/src/test/resources/parameters/XacmlPdpConfigParameters.json b/main/src/test/resources/parameters/XacmlPdpConfigParameters.json index ab52cc85..58eba71d 100644 --- a/main/src/test/resources/parameters/XacmlPdpConfigParameters.json +++ b/main/src/test/resources/parameters/XacmlPdpConfigParameters.json @@ -6,5 +6,5 @@ "userName": "healthcheck", "password": "zb!XztG34" }, - "applicationPath": "apps.test" + "applicationPath": "src/test/resources/apps" } diff --git a/main/src/test/resources/parameters/XacmlPdpConfigParameters_Https.json b/main/src/test/resources/parameters/XacmlPdpConfigParameters_Https.json index 92e6e908..ae5e1cbd 100644 --- a/main/src/test/resources/parameters/XacmlPdpConfigParameters_Https.json +++ b/main/src/test/resources/parameters/XacmlPdpConfigParameters_Https.json @@ -7,5 +7,5 @@ "password":"zb!XztG34", "https":true }, - "applicationPath": "apps.test" + "applicationPath": "src/test/resources/apps" } \ No newline at end of file diff --git a/packages/policy-xacmlpdp-tarball/src/main/resources/apps/guard/xacml.properties b/packages/policy-xacmlpdp-tarball/src/main/resources/apps/guard/xacml.properties index e3ef3ebc..fea5da23 100644 --- a/packages/policy-xacmlpdp-tarball/src/main/resources/apps/guard/xacml.properties +++ b/packages/policy-xacmlpdp-tarball/src/main/resources/apps/guard/xacml.properties @@ -22,25 +22,32 @@ xacml.att.policyFinderFactory=org.onap.policy.pdp.xacml.application.common.OnapP # # Use a root combining algorithm # -xacml.att.policyFinderFactory.combineRootPolicies=urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny - -xacml.pip.engines=historydb +xacml.att.policyFinderFactory.combineRootPolicies=urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-overrides # -# PIP Engine Definition +# PIP Engine Definitions # -historydb.classname=org.onap.policy.pdp.xacml.application.common.OnapOperationsHistoryPipEngine -historydb.issuer=urn:org:onap:xacml:guard:historydb -historydb.name=operationHistoryDB -historydb.description=Returns operation counts based on time window +count-recent-operations.classname=org.onap.policy.pdp.xacml.application.common.operationshistory.CountRecentOperationsPip +count-recent-operations.issuer=urn:org:onap:xacml:guard:count-recent-operations +count-recent-operations.name=CountRecentOperations +count-recent-operations.description=Returns operation counts based on time window +count-recent-operations.persistenceunit=OperationsHistoryPU + +get-operation-outcome.classname=org.onap.policy.pdp.xacml.application.common.operationshistory.GetOperationOutcomePip +get-operation-outcome.issuer=urn:org:onap:xacml:guard:get-operation-outcome +get-operation-outcome.name=GetOperationOutcome +get-operation-outcome.description=Returns operation outcome +get-operation-outcome.persistenceunit=OperationsHistoryPU # -# Database persistence for PIP +# Make pips available to finder # -historydb.persistenceunit=OperationsHistoryPU +xacml.pip.engines=count-recent-operations,get-operation-outcome -# Policies to load # -#xacml.rootPolicies=guard -#guard.file=src/main/resources/RootGuardPolicy.xml - +# JPA Properties +# +javax.persistence.jdbc.driver=org.mariadb.jdbc.Driver +javax.persistence.jdbc.url=jdbc:mariadb://mariadb:3306/operationshistory +javax.persistence.jdbc.user=policy_user +javax.persistence.jdbc.password=cG9saWN5X3VzZXI= -- 2.16.6