diff options
Diffstat (limited to 'applications/guard')
11 files changed, 214 insertions, 96 deletions
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<ToscaPolicyTypeIdentifier> supportedPolicyTypes = new ArrayList<>(); @@ -47,7 +46,8 @@ public class GuardPdpApplication extends StdXacmlApplicationServiceProvider { private CoordinationGuardTranslator coordinationTranslator = new CoordinationGuardTranslator(); - /** Constructor. + /** + * Constructor. * */ public GuardPdpApplication() { @@ -58,6 +58,9 @@ public class GuardPdpApplication extends StdXacmlApplicationServiceProvider { "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<String, Object> properties) { + protected TargetType generateTargetType(Map<String, Object> 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<String, Object> 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<Object>) 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/main/resources/META-INF/persistence.xml b/applications/guard/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index e01447e6..00000000 --- a/applications/guard/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - ============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. - ============LICENSE_END========================================================= - --> - -<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd" version="1.0"> - - <persistence-unit name="OperationsHistoryPU" transaction-type="RESOURCE_LOCAL"> - <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> - <class>org.onap.policy.pdp.xacml.application.common.OnapOperationsHistoryDbao</class> - <properties> - <property name="javax.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver" /> - <property name="javax.persistence.jdbc.url" value="jdbc:mariadb://policydb:3306/policy" /> - <property name="javax.persistence.jdbc.user" value="policy_user" /> - <property name="javax.persistence.jdbc.password" value="policy_user" /> - <property name="javax.persistence.schema-generation.database.action" value="create" /> - <property name="eclipselink.ddl-generation" value="create-or-extend-tables" /> - <property name="eclipselink.ddl-generation.output-mode" value="database" /> - <property name="eclipselink.logging.level" value="INFO" /> - </properties> - </persistence-unit> - -</persistence> -
\ No newline at end of file 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<DecisionResponse, Response> 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<DecisionResponse, Response> 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( @@ -225,6 +228,10 @@ public class GuardPdpApplicationTest { 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( "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", "1.0.1"))).isFalse(); @@ -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<DecisionResponse, Response> 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<String, Object>)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 @@ <properties> <property name="eclipselink.ddl-generation" value="create-tables" /> <property name="eclipselink.logging.level" value="FINE" /> - <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> - <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> - <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:testdb;DATABASE_TO_UPPER=FALSE" /> - <property name="javax.persistence.jdbc.user" value="policy" /> - <property name="javax.persistence.jdbc.password" value="P01icY" /> + <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> <property name="javax.persistence.schema-generation.create-source" value="script"/> - <property name="javax.persistence.schema-generation.create-script-source" value="META-INF/createtest.sql"/> </properties> </persistence-unit> 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 |