Cleanup PIP/Database-related code. 11/85011/2
authorJoshua Reich <jreich@research.att.com>
Wed, 10 Apr 2019 20:38:59 +0000 (13:38 -0700)
committerPamela Dragosh <pdragosh@research.att.com>
Thu, 11 Apr 2019 11:28:52 +0000 (07:28 -0400)
Ensure database schema/naming consistent across repos.
Ensure PIP implementation consistent across repos.
Cleanup unused imports and made sure licenses are ok.

Issue-ID: POLICY-1471
Change-Id: I20a325fe3e66e6ae400e603ec366315aea716993
Signed-off-by: Joshua Reich <jreich@research.att.com>
Signed-off-by: Pamela Dragosh <pdragosh@research.att.com>
42 files changed:
controlloop/common/database/pom.xml [new file with mode: 0644]
controlloop/common/database/src/main/java/org/onap/policy/database/ToscaDictionary.java [new file with mode: 0644]
controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/CountRecentOperationsPip.java [new file with mode: 0644]
controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/Dbao.java [new file with mode: 0644]
controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/GetOperationOutcomePip.java [new file with mode: 0644]
controlloop/common/database/src/main/java/org/onap/policy/database/std/StdOnapPip.java [new file with mode: 0644]
controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/CountRecentOperationsPipTest.java [new file with mode: 0644]
controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/GetOperationOutcomePipTest.java [new file with mode: 0644]
controlloop/common/database/src/test/resources/META-INF/persistence.xml [new file with mode: 0644]
controlloop/common/database/src/test/resources/test.properties [new file with mode: 0644]
controlloop/common/eventmanager/pom.xml
controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java
controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/OperationsHistoryDbEntry.java [deleted file]
controlloop/common/eventmanager/src/main/resources/META-INF/persistence.xml
controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManagerTest.java
controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/OperationsHistoryDbEntryTest.java [deleted file]
controlloop/common/eventmanager/src/test/resources/META-INF/persistence.xml
controlloop/common/guard/src/main/java/org/onap/policy/guard/PipEngineGetHistory.java [deleted file]
controlloop/common/guard/src/main/java/org/onap/policy/guard/PipEngineGetStatus.java [deleted file]
controlloop/common/guard/src/main/java/org/onap/policy/guard/PolicyGuardXacmlHelper.java
controlloop/common/guard/src/main/java/org/onap/policy/guard/PolicyGuardXacmlRequestAttributes.java
controlloop/common/guard/src/main/java/org/onap/policy/guard/Util.java
controlloop/common/guard/src/test/java/org/onap/policy/guard/PipEngineGetHistoryTest.java [deleted file]
controlloop/common/guard/src/test/java/org/onap/policy/guard/PipEngineGetStatusTest.java [deleted file]
controlloop/common/guard/src/test/java/org/onap/policy/guard/PolicyGuardXacmlHelperTest.java
controlloop/common/guard/src/test/resources/META-INF/persistence.xml
controlloop/common/guard/src/test/resources/blacklist_template.xml
controlloop/common/guard/src/test/resources/frequency_limiter_template.xml
controlloop/common/pom.xml
controlloop/templates/template.demo.clc/pom.xml
controlloop/templates/template.demo.clc/src/main/java/org/onap/policy/guard/PolicyGuardXacmlHelperEmbedded.java
controlloop/templates/template.demo.clc/src/main/resources/coordination/prototype/firstBlocksSecond.xml
controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/SupportUtil.java
controlloop/templates/template.demo.clc/src/test/resources/META-INF/persistence.xml
controlloop/templates/template.demo.clc/src/test/resources/properties/prototype/xacml_guard_clc.properties
controlloop/templates/template.demo/pom.xml
controlloop/templates/template.demo/src/main/resources/blacklist_template.xml
controlloop/templates/template.demo/src/main/resources/frequency_limiter_template.xml
controlloop/templates/template.demo/src/main/resources/frequency_limiter_template_old.xml
controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/SupportUtil.java
controlloop/templates/template.demo/src/test/resources/META-INF/persistence.xml
controlloop/templates/template.demo/src/test/resources/xacml/xacml_guard.properties

diff --git a/controlloop/common/database/pom.xml b/controlloop/common/database/pom.xml
new file mode 100644 (file)
index 0000000..b2b07da
--- /dev/null
@@ -0,0 +1,103 @@
+<!--
+  ============LICENSE_START=======================================================
+  drools-applications
+  ================================================================================
+  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=========================================================
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
+    <artifactId>common</artifactId>
+    <version>1.4.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>database</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.att.research.xacml</groupId>
+      <artifactId>xacml-pdp</artifactId>
+      <version>2.0.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.h2database</groupId>
+      <artifactId>h2</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-pdp</groupId>
+      <artifactId>policy-management</artifactId>
+      <version>${version.policy.drools-pdp}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-checkstyle-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>onap-java-style</id>
+                        <goals>
+                            <goal>check</goal>
+                        </goals>
+                        <phase>process-sources</phase>
+                        <configuration>
+                            <!-- Use Google Java Style Guide:
+                            https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml
+                            with minor changes -->
+                            <configLocation>onap-checkstyle/onap-java-style.xml</configLocation>
+                            <!-- <sourceDirectory> is needed so that checkstyle ignores the generated sources directory -->
+                            <sourceDirectory>${project.build.sourceDirectory}</sourceDirectory>
+                            <includeResources>true</includeResources>
+                            <includeTestSourceDirectory>true</includeTestSourceDirectory>
+                            <includeTestResources>true</includeTestResources>
+                            <excludes>
+                            </excludes>
+                            <consoleOutput>true</consoleOutput>
+                            <failsOnViolation>true</failsOnViolation>
+                            <violationSeverity>warning</violationSeverity>
+                        </configuration>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.onap.oparent</groupId>
+                        <artifactId>checkstyle</artifactId>
+                        <version>${oparent.version}</version>
+                        <scope>compile</scope>
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/controlloop/common/database/src/main/java/org/onap/policy/database/ToscaDictionary.java b/controlloop/common/database/src/main/java/org/onap/policy/database/ToscaDictionary.java
new file mode 100644 (file)
index 0000000..b04a5b4
--- /dev/null
@@ -0,0 +1,140 @@
+/*-
+ * ============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.database;
+
+import com.att.research.xacml.api.Identifier;
+import com.att.research.xacml.api.XACML3;
+import com.att.research.xacml.std.IdentifierImpl;
+
+public final class ToscaDictionary {
+
+    /*
+     * These are the ID's for various TOSCA Policy Types we are supporting in the Applications.
+     */
+    public static final String URN_ONAP = "urn:org:onap";
+    public static final Identifier ID_URN_ONAP =
+            new IdentifierImpl(URN_ONAP);
+
+    public static final Identifier ID_RESOURCE_POLICY_ID =
+            XACML3.ID_RESOURCE_RESOURCE_ID;
+
+    public static final Identifier ID_RESOURCE_POLICY_TYPE =
+            new IdentifierImpl(ID_URN_ONAP, "policy-type");
+
+    public static final Identifier ID_RESOURCE_POLICY_TYPE_VERSION =
+            new IdentifierImpl(ID_URN_ONAP, "policy-type-version");
+
+    /*
+     * These ID's are for identifying Subjects
+     */
+
+    public static final Identifier ID_SUBJECT_ONAP_NAME =
+            XACML3.ID_SUBJECT_SUBJECT_ID;
+
+    public static final Identifier ID_SUBJECT_ONAP_COMPONENT =
+            new IdentifierImpl(ID_URN_ONAP, "onap-component");
+
+    public static final Identifier ID_SUBJECT_ONAP_INSTANCE =
+            new IdentifierImpl(ID_URN_ONAP, "onap-instance");
+
+    /*
+     * These 2 ID's are for Optimization policies
+     */
+
+    public static final Identifier ID_RESOURCE_POLICY_SCOPE_PROPERTY =
+            new IdentifierImpl(ID_URN_ONAP, "policy-scope-property");
+
+    public static final Identifier ID_RESOURCE_POLICY_TYPE_PROPERTY =
+            new IdentifierImpl(ID_URN_ONAP, "policy-type-property");
+
+    /*
+     * These ID's are for Legacy Guard Policies
+     */
+    public static final Identifier ID_RESOURCE_GUARD_ACTOR =
+            new IdentifierImpl(ID_URN_ONAP, "guard:actor:actor-id");
+    public static final Identifier ID_RESOURCE_GUARD_RECIPE =
+            new IdentifierImpl(ID_URN_ONAP, "guard:operation:operation-id");
+    public static final Identifier ID_RESOURCE_GUARD_CLNAME =
+            new IdentifierImpl(ID_URN_ONAP, "guard:clname:clname-id");
+    public static final Identifier ID_RESOURCE_GUARD_TARGETID =
+            new IdentifierImpl(ID_URN_ONAP, "guard:target:target-id");
+    public static final Identifier ID_SUBJECT_GUARD_REQUESTID =
+            new IdentifierImpl(ID_URN_ONAP, "guard:request:request-id");
+    public static final Identifier ID_RESOURCE_GUARD_VFCOUNT =
+            new IdentifierImpl(ID_URN_ONAP, "guard:target:vf-count");
+    public static final Identifier ID_RESOURCE_GUARD_MIN =
+            new IdentifierImpl(ID_URN_ONAP, "guard:target:min");
+    public static final Identifier ID_RESOURCE_GUARD_MAX =
+            new IdentifierImpl(ID_URN_ONAP, "guard:target:max");
+
+    /*
+     * This id specifically for guard is provided by the
+     * operational history database PIP.
+     */
+    public static final String GUARD_OPERATIONCOUNT = "guard:operation:operation-count";
+    public static final Identifier ID_RESOURCE_GUARD_OPERATIONCOUNT =
+            new IdentifierImpl(ID_URN_ONAP, GUARD_OPERATIONCOUNT);
+
+    public static final String GUARD_OPERATIONOUTCOME = "guard:operation:operation-outcome";
+    public static final Identifier ID_RESOURCE_GUARD_OPERATIONOUTCOME =
+            new IdentifierImpl(ID_URN_ONAP, GUARD_OPERATIONOUTCOME);
+
+    public static final String GUARD_ISSUER_PREFIX = URN_ONAP + ":xacml:guard:";
+
+    /*
+     * This id is specifically for advice returned from guard
+     */
+    public static final Identifier ID_ADVICE_GUARD =
+            new IdentifierImpl(ID_URN_ONAP, "guard:advice");
+    public static final Identifier ID_ADVICE_GUARD_REQUESTID =
+            new IdentifierImpl(ID_URN_ONAP, "guard:advice:request-id");
+
+    /*
+     * Obligation specific ID's
+     */
+
+    public static final Identifier ID_OBLIGATION_REST_BODY =
+            new IdentifierImpl(ID_URN_ONAP, "rest:body");
+
+    public static final Identifier ID_OBLIGATION_POLICY_MONITORING =
+            new IdentifierImpl(ID_URN_ONAP, ":obligation:monitoring");
+
+    public static final Identifier ID_OBLIGATION_POLICY_MONITORING_CONTENTS =
+            new IdentifierImpl(ID_URN_ONAP, ":obligation:monitoring:contents");
+
+    public static final Identifier ID_OBLIGATION_POLICY_MONITORING_CATEGORY =
+            XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE;
+
+    public static final Identifier ID_OBLIGATION_POLICY_MONITORING_DATATYPE =
+            XACML3.ID_DATATYPE_STRING;
+
+    public static final Identifier ID_OBLIGATION_MONITORING_ISSUER =
+            new IdentifierImpl(ID_URN_ONAP, "issuer:monitoring");
+
+
+
+    private ToscaDictionary() {
+        super();
+    }
+
+}
diff --git a/controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/CountRecentOperationsPip.java b/controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/CountRecentOperationsPip.java
new file mode 100644 (file)
index 0000000..1f73ed3
--- /dev/null
@@ -0,0 +1,231 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.database.operationshistory;
+
+import com.att.research.xacml.api.XACML3;
+import com.att.research.xacml.api.pip.PIPException;
+import com.att.research.xacml.api.pip.PIPFinder;
+import com.att.research.xacml.api.pip.PIPRequest;
+import com.att.research.xacml.api.pip.PIPResponse;
+import com.att.research.xacml.std.pip.StdMutablePIPResponse;
+import com.att.research.xacml.std.pip.StdPIPResponse;
+import com.google.common.base.Strings;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Properties;
+import javax.persistence.Persistence;
+import org.onap.policy.database.ToscaDictionary;
+import org.onap.policy.database.std.StdOnapPip;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class CountRecentOperationsPip extends StdOnapPip {
+    public static final String ISSUER_NAME = "count-recent-operations";
+    private static Logger logger = LoggerFactory.getLogger(CountRecentOperationsPip.class);
+
+    public CountRecentOperationsPip() {
+        super();
+    }
+
+    @Override
+    public Collection<PIPRequest> attributesRequired() {
+        return Arrays.asList(PIP_REQUEST_ACTOR, PIP_REQUEST_RECIPE, PIP_REQUEST_TARGET);
+    }
+
+    @Override
+    public void configure(String id, Properties properties) throws PIPException {
+        super.configure(id, properties);
+        //
+        // Create our entity manager
+        //
+        em = null;
+        try {
+            //
+            // In case there are any overloaded properties for the JPA
+            //
+            Properties emProperties = new Properties(properties);
+            //
+            // Create the entity manager factory
+            //
+            em = Persistence.createEntityManagerFactory(
+                    properties.getProperty(ISSUER_NAME + ".persistenceunit"),
+                    emProperties).createEntityManager();
+        } catch (Exception e) {
+            logger.error("Persistence failed {} operations history db {}", e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * getAttributes.
+     *
+     * @param pipRequest the request
+     * @param pipFinder the pip finder
+     * @return PIPResponse
+     */
+    @Override
+    public PIPResponse getAttributes(PIPRequest pipRequest, PIPFinder pipFinder) throws PIPException {
+        logger.debug("getAttributes requesting attribute {} of type {} for issuer {}",
+                pipRequest.getAttributeId(), pipRequest.getDataTypeId(), pipRequest.getIssuer());
+        //
+        // Determine if the issuer is correct
+        //
+        if (Strings.isNullOrEmpty(pipRequest.getIssuer())) {
+            logger.debug("issuer is null - returning empty response");
+            //
+            // We only respond to ourself as the issuer
+            //
+            return StdPIPResponse.PIP_RESPONSE_EMPTY;
+        }
+        if (! pipRequest.getIssuer().startsWith(ToscaDictionary.GUARD_ISSUER_PREFIX)) {
+            logger.debug("Issuer does not start with guard");
+            //
+            // We only respond to ourself as the issuer
+            //
+            return StdPIPResponse.PIP_RESPONSE_EMPTY;
+        }
+        //
+        // Parse out the issuer which denotes the time window
+        // Eg: any-prefix:tw:10:minute
+        //
+        String[] s1 = pipRequest.getIssuer().split("tw:");
+        String[] s2 = s1[1].split(":");
+        int timeWindowVal = Integer.parseInt(s2[0]);
+        String timeWindowScale = s2[1];
+        //
+        // Grab other attribute values
+        //
+        String actor = getActor(pipFinder);
+        String operation = getRecipe(pipFinder);
+        String target = getTarget(pipFinder);
+        String timeWindow = timeWindowVal + " " + timeWindowScale;
+        logger.info("Going to query DB about: actor {} operation {} target {} time window {}",
+                actor, operation, target, timeWindow);
+        //
+        // Sanity check
+        //
+        if (actor == null || operation == null || target == null) {
+            //
+            // See if we have all the values
+            //
+            logger.error("missing attributes return empty");
+            return StdPIPResponse.PIP_RESPONSE_EMPTY;
+        }
+        //
+        // Ok do the database query
+        //
+        int operationCount = doDatabaseQuery(actor, operation, target, timeWindowVal, timeWindowScale);
+        //
+        // Create and return PipResponse
+        //
+        StdMutablePIPResponse pipResponse    = new StdMutablePIPResponse();
+        this.addIntegerAttribute(pipResponse,
+                XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE,
+                ToscaDictionary.ID_RESOURCE_GUARD_OPERATIONCOUNT,
+                operationCount,
+                pipRequest);
+        return new StdPIPResponse(pipResponse);
+    }
+
+    private int doDatabaseQuery(String actor, String operation, String target, int timeWindowVal,
+            String timeWindowScale) {
+        logger.info("Querying operations history for {} {} {} {} {}",
+                actor, operation, target, timeWindowVal, timeWindowScale);
+        if (em == null) {
+            logger.error("No EntityManager available");
+            return -1;
+        }
+        //
+        // Compute the time window
+        //
+        if (! "minute".equalsIgnoreCase(timeWindowScale)
+            && ! "hour".equalsIgnoreCase(timeWindowScale)
+            && ! "day".equalsIgnoreCase(timeWindowScale)
+            && ! "week".equalsIgnoreCase(timeWindowScale)
+            && ! "month".equalsIgnoreCase(timeWindowScale)
+            && ! "year".equalsIgnoreCase(timeWindowScale)) {
+            //
+            // Unsupported
+            //
+            logger.error("Unsupported time window scale value {}", timeWindowScale);
+            //
+            // Throw an exception instead?
+            //
+            return -1;
+        }
+        //
+        // Do the query
+        //
+        Object result = null;
+        try {
+            //
+            // Set up query --- operationshistory is magic, should fix sometime
+            //
+            String strQuery = "select count(*) as numops from operationshistory"
+                + " where outcome<>'Failure_Guard'"
+                + " and actor=?"
+                + " and operation=?"
+                + " and target=?"
+                + " and endtime between"
+                + " TIMESTAMPADD(?, ?, CURRENT_TIMESTAMP)"
+                + " and CURRENT_TIMESTAMP";
+            //
+            // We are expecting a single result
+            //
+            result = em.createNativeQuery(strQuery)
+                .setParameter(1, actor)
+                .setParameter(2, operation)
+                .setParameter(3, target)
+                .setParameter(4, timeWindowScale)
+                .setParameter(5, timeWindowVal * -1)
+                .getSingleResult();
+        } catch (Exception e) {
+            logger.error("Named query failed ", e);
+        }
+        //
+        // Check our query results
+        //
+        if (result != null) {
+            //
+            // Success let's see what JPA returned to us
+            //
+            logger.info("operations query returned {}", result);
+            //
+            // Should get back a long
+            //
+            if (result instanceof Long) {
+                return ((Long) result).intValue();
+            }
+            //
+            // We shouldn't really get this result, but just
+            // in case we'll do the dirty work of parsing the
+            // string representation of the object.
+            //
+            return Integer.parseInt(result.toString());
+        }
+        //
+        // We get here if we didn't get a result. Should
+        // we propagate back an exception?
+        //
+        return -1;
+    }
+
+}
diff --git a/controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/Dbao.java b/controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/Dbao.java
new file mode 100644 (file)
index 0000000..e1c4846
--- /dev/null
@@ -0,0 +1,78 @@
+/*-
+ * ============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.database.operationshistory;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import lombok.Data;
+
+@Entity
+@Table(name = "operationshistory")
+@Data
+public class Dbao implements Serializable {
+
+    private static final long serialVersionUID = -551420180714993577L;
+
+    @Id
+    @GeneratedValue
+    @Column(name = "id")
+    private Long id;
+
+    @Column(name = "closedLoopName", length = 255)
+    private String closedLoopName;
+
+    @Column(name = "requestId", length = 50)
+    private String requestId;
+
+    @Column(name = "subrequestId", length = 50)
+    private String subrequestId;
+
+    @Column(name = "actor", length = 50)
+    private String actor;
+
+    @Column(name = "operation", length = 50)
+    private String operation;
+
+    @Column(name = "target", length = 50)
+    private String target;
+
+    @Column(name = "starttime")
+    private Date starttime;
+
+    @Column(name = "outcome", length = 50)
+    private String outcome;
+
+    @Column(name = "message", length = 255)
+    private String message;
+
+    @Column(name = "endtime")
+    private Date endtime;
+
+}
diff --git a/controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/GetOperationOutcomePip.java b/controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/GetOperationOutcomePip.java
new file mode 100644 (file)
index 0000000..01b0709
--- /dev/null
@@ -0,0 +1,156 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.database.operationshistory;
+
+import com.att.research.xacml.api.XACML3;
+import com.att.research.xacml.api.pip.PIPException;
+import com.att.research.xacml.api.pip.PIPFinder;
+import com.att.research.xacml.api.pip.PIPRequest;
+import com.att.research.xacml.api.pip.PIPResponse;
+import com.att.research.xacml.std.pip.StdMutablePIPResponse;
+import com.att.research.xacml.std.pip.StdPIPResponse;
+import com.google.common.base.Strings;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Properties;
+import javax.persistence.NoResultException;
+import javax.persistence.Persistence;
+import org.onap.policy.database.ToscaDictionary;
+import org.onap.policy.database.std.StdOnapPip;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetOperationOutcomePip extends StdOnapPip {
+    public static final String ISSUER_NAME = "get-operation-outcome";
+    private static Logger logger = LoggerFactory.getLogger(GetOperationOutcomePip.class);
+
+    public GetOperationOutcomePip() {
+        super();
+    }
+
+    @Override
+    public Collection<PIPRequest> attributesRequired() {
+        return Arrays.asList(PIP_REQUEST_TARGET);
+    }
+
+    @Override
+    public void configure(String id, Properties properties) throws PIPException {
+        super.configure(id, properties);
+        //
+        // Create our entity manager
+        //
+        em = null;
+        try {
+            //
+            // In case there are any overloaded properties for the JPA
+            //
+            Properties emProperties = new Properties(properties);
+            //
+            // Create the entity manager factory
+            //
+            em = Persistence.createEntityManagerFactory(
+                    properties.getProperty(ISSUER_NAME + ".persistenceunit"),
+                    emProperties).createEntityManager();
+        } catch (Exception e) {
+            logger.error("Persistence failed {} operations history db {}", e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * getAttributes.
+     *
+     * @param pipRequest the request
+     * @param pipFinder the pip finder
+     * @return PIPResponse
+     */
+    @Override
+    public PIPResponse getAttributes(PIPRequest pipRequest, PIPFinder pipFinder) throws PIPException {
+        logger.debug("getAttributes requesting attribute {} of type {} for issuer {}",
+                pipRequest.getAttributeId(), pipRequest.getDataTypeId(), pipRequest.getIssuer());
+        //
+        // Determine if the issuer is correct
+        //
+        if (Strings.isNullOrEmpty(pipRequest.getIssuer())) {
+            logger.debug("issuer is null - returning empty response");
+            //
+            // We only respond to ourself as the issuer
+            //
+            return StdPIPResponse.PIP_RESPONSE_EMPTY;
+        }
+        if (! pipRequest.getIssuer().startsWith(ToscaDictionary.GUARD_ISSUER_PREFIX)) {
+            logger.debug("Issuer does not start with guard");
+            //
+            // We only respond to ourself as the issuer
+            //
+            return StdPIPResponse.PIP_RESPONSE_EMPTY;
+        }
+        //
+        // Parse out the issuer which denotes the time window
+        // Eg: any-prefix:clname:some-controlloop-name
+        //
+        String[] s1 = pipRequest.getIssuer().split("clname:");
+        String clname = s1[1];
+        String target = null;
+        target = getTarget(pipFinder);
+
+        logger.debug("Going to query DB about: clname={}, target={}", clname, target);
+        String outcome = doDatabaseQuery(clname, target);
+        logger.debug("Query result is: {}", outcome);
+
+        StdMutablePIPResponse pipResponse = new StdMutablePIPResponse();
+        this.addStringAttribute(pipResponse,
+                XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE,
+                ToscaDictionary.ID_RESOURCE_GUARD_OPERATIONOUTCOME,
+                outcome,
+                pipRequest);
+        return new StdPIPResponse(pipResponse);
+    }
+
+    private String doDatabaseQuery(String clname, String target) {
+        logger.info("Querying operations history for {} {} {} {} {}",
+                    clname, target);
+        //
+        // Do the query
+        //
+        Object result = null;
+        try {
+            //
+            // We are expecting a single result
+            //
+            result = em.createQuery("select e.outcome from Dbao e"
+                                    + " where e.closedLoopName= ?1"
+                                    + " and e.target= ?2"
+                                    + " order by e.endtime desc")
+                .setParameter(1, clname)
+                .setParameter(2, target)
+                .setMaxResults(1)
+                .getSingleResult();
+        } catch (NoResultException ex) {
+            logger.debug("NoResultException for getSingleResult()", ex);
+        } catch (Exception ex) {
+            logger.error("doDatabaseQuery threw an exception", ex);
+        }
+        //
+        // Check our query results
+        //
+        logger.info("operations query returned {}", result);
+        return (String) result;
+    }
+}
diff --git a/controlloop/common/database/src/main/java/org/onap/policy/database/std/StdOnapPip.java b/controlloop/common/database/src/main/java/org/onap/policy/database/std/StdOnapPip.java
new file mode 100644 (file)
index 0000000..a947273
--- /dev/null
@@ -0,0 +1,195 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.database.std;
+
+import com.att.research.xacml.api.Attribute;
+import com.att.research.xacml.api.AttributeValue;
+import com.att.research.xacml.api.Identifier;
+import com.att.research.xacml.api.XACML3;
+import com.att.research.xacml.api.pip.PIPException;
+import com.att.research.xacml.api.pip.PIPFinder;
+import com.att.research.xacml.api.pip.PIPRequest;
+import com.att.research.xacml.api.pip.PIPResponse;
+import com.att.research.xacml.std.StdMutableAttribute;
+import com.att.research.xacml.std.datatypes.DataTypes;
+import com.att.research.xacml.std.pip.StdMutablePIPResponse;
+import com.att.research.xacml.std.pip.StdPIPRequest;
+import com.att.research.xacml.std.pip.engines.StdConfigurableEngine;
+import java.math.BigInteger;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Properties;
+import javax.persistence.EntityManager;
+import org.onap.policy.database.ToscaDictionary;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public abstract class StdOnapPip extends StdConfigurableEngine {
+    protected static Logger logger = LoggerFactory.getLogger(StdOnapPip.class);
+
+    protected static final PIPRequest PIP_REQUEST_ACTOR   = new StdPIPRequest(
+            XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE,
+            ToscaDictionary.ID_RESOURCE_GUARD_ACTOR,
+            XACML3.ID_DATATYPE_STRING);
+
+    protected static final PIPRequest PIP_REQUEST_RECIPE  = new StdPIPRequest(
+            XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE,
+            ToscaDictionary.ID_RESOURCE_GUARD_RECIPE,
+            XACML3.ID_DATATYPE_STRING);
+
+    protected static final PIPRequest PIP_REQUEST_TARGET  = new StdPIPRequest(
+            XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE,
+            ToscaDictionary.ID_RESOURCE_GUARD_TARGETID,
+            XACML3.ID_DATATYPE_STRING);
+
+    protected Properties properties;
+    protected EntityManager em;
+
+    public StdOnapPip() {
+        super();
+    }
+
+    @Override
+    public Collection<PIPRequest> attributesProvided() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public void configure(String id, Properties properties) throws PIPException {
+        super.configure(id, properties);
+        logger.debug("Configuring historyDb PIP {}", properties);
+        this.properties = properties;
+    }
+
+    protected String getActor(PIPFinder pipFinder) {
+        //
+        // Get the actor value
+        //
+        PIPResponse pipResponse = this.getAttribute(PIP_REQUEST_ACTOR, pipFinder);
+        if (pipResponse == null) {
+            logger.error("Need actor attribute which is not found");
+            return null;
+        }
+        //
+        // Find the actor
+        //
+        return findFirstAttributeValue(pipResponse);
+    }
+
+    protected String getRecipe(PIPFinder pipFinder) {
+        //
+        // Get the actor value
+        //
+        PIPResponse pipResponse = this.getAttribute(PIP_REQUEST_RECIPE, pipFinder);
+        if (pipResponse == null) {
+            logger.error("Need recipe attribute which is not found");
+            return null;
+        }
+        //
+        // Find the actor
+        //
+        return findFirstAttributeValue(pipResponse);
+    }
+
+    protected String getTarget(PIPFinder pipFinder) {
+        //
+        // Get the actor value
+        //
+        PIPResponse pipResponse = this.getAttribute(PIP_REQUEST_TARGET, pipFinder);
+        if (pipResponse == null) {
+            logger.error("Need target attribute which is not found");
+            return null;
+        }
+        //
+        // Find the actor
+        //
+        return findFirstAttributeValue(pipResponse);
+    }
+
+    protected PIPResponse getAttribute(PIPRequest pipRequest, PIPFinder pipFinder) {
+        PIPResponse pipResponse = null;
+        try {
+            pipResponse = pipFinder.getMatchingAttributes(pipRequest, this);
+            if (pipResponse.getStatus() != null && !pipResponse.getStatus().isOk()) {
+                if (logger.isInfoEnabled()) {
+                    logger.info("get attribute error retrieving {}: {}", pipRequest.getAttributeId().stringValue(),
+                        pipResponse.getStatus());
+                }
+                pipResponse = null;
+            }
+            if (pipResponse != null && pipResponse.getAttributes().isEmpty()) {
+                if (logger.isInfoEnabled()) {
+                    logger.info("No value for {}", pipRequest.getAttributeId().stringValue());
+                }
+                pipResponse = null;
+            }
+        } catch (PIPException ex) {
+            logger.error("PIPException getting subject-id attribute: " + ex.getMessage(), ex);
+        }
+        return pipResponse;
+    }
+
+    protected String findFirstAttributeValue(PIPResponse pipResponse) {
+        for (Attribute attribute: pipResponse.getAttributes()) {
+            Iterator<AttributeValue<String>> iterAttributeValues    = attribute.findValues(DataTypes.DT_STRING);
+            if (iterAttributeValues != null) {
+                while (iterAttributeValues.hasNext()) {
+                    String value   = iterAttributeValues.next().getValue();
+                    if (value != null) {
+                        return value;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    protected void addIntegerAttribute(StdMutablePIPResponse stdPipResponse, Identifier category,
+            Identifier attributeId, int value, PIPRequest pipRequest) {
+        AttributeValue<BigInteger> attributeValue   = null;
+        try {
+            attributeValue  = DataTypes.DT_INTEGER.createAttributeValue(value);
+        } catch (Exception e) {
+            logger.error("Failed to convert {} to integer {}", value, e);
+        }
+        if (attributeValue != null) {
+            stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
+                    pipRequest.getIssuer(), false));
+        }
+    }
+
+    protected void addStringAttribute(StdMutablePIPResponse stdPipResponse, Identifier category, Identifier attributeId,
+            String value, PIPRequest pipRequest) {
+        AttributeValue<String> attributeValue = null;
+        try {
+            attributeValue = DataTypes.DT_STRING.createAttributeValue(value);
+        } catch (Exception ex) {
+            logger.error("Failed to convert {} to an AttributeValue<String>", value, ex);
+        }
+        if (attributeValue != null) {
+            stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
+                    pipRequest.getIssuer(), false));
+        }
+    }
+
+}
diff --git a/controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/CountRecentOperationsPipTest.java b/controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/CountRecentOperationsPipTest.java
new file mode 100644 (file)
index 0000000..e3cb17f
--- /dev/null
@@ -0,0 +1,160 @@
+/*-
+ * ============LICENSE_START=======================================================
+  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.database.operationshistory;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.FileInputStream;
+import java.lang.reflect.Method;
+import java.sql.Date;
+import java.time.Instant;
+
+import java.util.Properties;
+import java.util.UUID;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Persistence;
+import javax.persistence.Query;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CountRecentOperationsPipTest {
+    private static final Logger LOGGER = LoggerFactory.getLogger(CountRecentOperationsPipTest.class);
+    private static CountRecentOperationsPip pipEngine;
+
+    private static EntityManager em;
+
+    /**
+     * Create an instance of our engine and also the persistence
+     * factory.
+     *
+     * @throws Exception connectivity issues
+     */
+    @BeforeClass
+    public static void setup() throws Exception {
+        LOGGER.info("Setting up PIP Testing");
+        //
+        // Create instance
+        //
+        pipEngine = new CountRecentOperationsPip();
+        //
+        // Load our test properties to use
+        //
+        Properties properties = new Properties();
+        try (FileInputStream is = new FileInputStream("src/test/resources/test.properties")) {
+            properties.load(is);
+        }
+        //
+        // Configure it using properties
+        //
+        pipEngine.configure("issuer", properties);
+        LOGGER.info("PIP configured now creating our entity manager");
+        LOGGER.info("properties {}", properties);
+        //
+        // Connect to in-mem db
+        //
+        String persistenceUnit = CountRecentOperationsPip.ISSUER_NAME + ".persistenceunit";
+        LOGGER.info("persistenceunit {}", persistenceUnit);
+        em = Persistence.createEntityManagerFactory(properties.getProperty(persistenceUnit), properties)
+                .createEntityManager();
+        //
+        //
+        //
+        LOGGER.info("Configured own entity manager", em.toString());
+    }
+
+    private Dbao createEntry(String cl, String target, String outcome) {
+        //
+        // Create entry
+        //
+        Dbao newEntry = new Dbao();
+        newEntry.setClosedLoopName(cl);
+        newEntry.setTarget(target);
+        newEntry.setOutcome(outcome);
+        newEntry.setActor("Controller");
+        newEntry.setOperation("operationA");
+        newEntry.setStarttime(Date.from(Instant.now().minusMillis(20000)));
+        newEntry.setEndtime(Date.from(Instant.now()));
+        newEntry.setRequestId(UUID.randomUUID().toString());
+        return newEntry;
+    }
+
+    @Test
+    public void testGetCountFromDb() throws Exception {
+        //
+        // Use reflection to run getCountFromDB
+        //
+        Method method = CountRecentOperationsPip.class.getDeclaredMethod("doDatabaseQuery",
+                                                                            String.class,
+                                                                            String.class,
+                                                                            String.class,
+                                                                            int.class,
+                                                                            String.class);
+        method.setAccessible(true);
+        //
+        // create entry
+        //
+        Dbao newEntry = createEntry("cl-foobar-1", "vnf-1", "SUCCESS");
+        //
+        // Test pipEngine
+        //
+        int count = (int) method.invoke(pipEngine, newEntry.getActor(), newEntry.getOperation(), newEntry.getTarget(),
+                1, "HOUR");
+        //
+        // No entries yet
+        //
+        assertEquals(0, count);
+        //
+        // Add entry
+        //
+        em.getTransaction().begin();
+        em.persist(newEntry);
+        em.getTransaction().commit();
+        //
+        // Directly check ground truth
+        //
+        Query queryCount = em.createNativeQuery("select count(*) as numops from operationshistory")
+                .setParameter(1, 1);
+        LOGGER.info("{} entries", queryCount.getSingleResult());
+        //
+        // Test pipEngine
+        //
+        count = (int) method.invoke(pipEngine, newEntry.getActor(), newEntry.getOperation(), newEntry.getTarget(),
+                1, "HOUR");
+        //
+        // Should count 1 entry now
+        //
+        assertEquals(1, count);
+    }
+
+    /**
+     * Close the entity manager.
+     */
+    @AfterClass
+    public static void cleanup() {
+        if (em != null) {
+            em.close();
+        }
+    }
+
+}
diff --git a/controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/GetOperationOutcomePipTest.java b/controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/GetOperationOutcomePipTest.java
new file mode 100644 (file)
index 0000000..7e7258c
--- /dev/null
@@ -0,0 +1,154 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.database.operationshistory;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.FileInputStream;
+import java.lang.reflect.Method;
+import java.sql.Date;
+import java.time.Instant;
+import java.util.Properties;
+import java.util.UUID;
+import javax.persistence.EntityManager;
+import javax.persistence.Persistence;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class GetOperationOutcomePipTest {
+    private static final Logger LOGGER = LoggerFactory.getLogger(GetOperationOutcomePipTest.class);
+    private static GetOperationOutcomePip pipEngine;
+
+    private static EntityManager em;
+
+    /**
+     * Create an instance of our engine and also the persistence
+     * factory.
+     *
+     * @throws Exception connectivity issues
+     */
+    @BeforeClass
+    public static void setup() throws Exception {
+        LOGGER.info("Setting up PIP Testing");
+        //
+        // Create instance
+        //
+        pipEngine = new GetOperationOutcomePip();
+        //
+        // Load our test properties to use
+        //
+        Properties properties = new Properties();
+        try (FileInputStream is = new FileInputStream("src/test/resources/test.properties")) {
+            properties.load(is);
+        }
+        //
+        // Configure it using properties
+        //
+        pipEngine.configure("issuer", properties);
+        LOGGER.info("PIP configured now creating our entity manager");
+        LOGGER.info("properties {}", properties);
+        //
+        // Connect to in-mem db
+        //
+        String persistenceUnit = GetOperationOutcomePip.ISSUER_NAME + ".persistenceunit";
+        LOGGER.info("persistenceunit {}", persistenceUnit);
+        em = Persistence.createEntityManagerFactory(properties.getProperty(persistenceUnit), properties)
+            .createEntityManager();
+        //
+        //
+        //
+        LOGGER.info("Configured own entity manager", em.toString());
+    }
+
+    private void insertEntry(String cl, String target, String outcome) {
+        //
+        // Create entry
+        //
+        Dbao newEntry = new Dbao();
+        newEntry.setClosedLoopName(cl);
+        newEntry.setTarget(target);
+        newEntry.setOutcome(outcome);
+        newEntry.setActor("Controller");
+        newEntry.setOperation("operationA");
+        newEntry.setStarttime(Date.from(Instant.now().minusMillis(20000)));
+        newEntry.setEndtime(Date.from(Instant.now()));
+        newEntry.setRequestId(UUID.randomUUID().toString());
+        //
+        // Add entry
+        //
+        em.getTransaction().begin();
+        em.persist(newEntry);
+        em.getTransaction().commit();
+    }
+
+
+    @Test
+    public void testGetOutcomeFromDb() throws Exception {
+        //
+        // Use reflection to run getCountFromDB
+        //
+        Method method = GetOperationOutcomePip.class.getDeclaredMethod("doDatabaseQuery",
+                                                                       String.class,
+                                                                       String.class);
+        method.setAccessible(true);
+        //
+        // Insert entry
+        //
+        insertEntry("testcl1", "testtarget1", "1");
+        //
+        // Test pipEngine
+        //
+        String outcome = (String) method.invoke(pipEngine, "testcl1", "testtarget1");
+        //
+        // outcome should be "1"
+        //
+        assertEquals("1", outcome);
+        //
+        // Insert more entries
+        //
+        insertEntry("testcl1", "testtarget1", "2");
+        insertEntry("testcl2", "testtarget2", "3");
+        insertEntry("testcl1", "testtarget2", "4");
+        //
+        // Test pipEngine
+        //
+        outcome = (String) method.invoke(pipEngine, "testcl1", "testtarget1");
+        assertEquals("2", outcome);
+
+        outcome = (String) method.invoke(pipEngine, "testcl2", "testtarget2");
+        assertEquals("3", outcome);
+
+        outcome = (String) method.invoke(pipEngine, "testcl1", "testtarget2");
+        assertEquals("4", outcome);
+    }
+
+    /**
+     * Close the entity manager.
+     */
+    @AfterClass
+    public static void cleanup() {
+        if (em != null) {
+            em.close();
+        }
+    }
+
+}
diff --git a/controlloop/common/database/src/test/resources/META-INF/persistence.xml b/controlloop/common/database/src/test/resources/META-INF/persistence.xml
new file mode 100644 (file)
index 0000000..0c49d94
--- /dev/null
@@ -0,0 +1,42 @@
+<?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="PipEngineTest" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.database.operationshistory.Dbao</class>
+
+        <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="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
+            <property name="javax.persistence.schema-generation.create-source" value="metadata"/>
+        </properties>
+    </persistence-unit>
+
+</persistence>
diff --git a/controlloop/common/database/src/test/resources/test.properties b/controlloop/common/database/src/test/resources/test.properties
new file mode 100644 (file)
index 0000000..fb3d3ce
--- /dev/null
@@ -0,0 +1,38 @@
+#
+# 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
+
+#
+#
+#
+xacml.rootPolicies=rootstart
+rootstart.file=src/test/resources/root.xml
+
+xacml.referencedPolicies=refstart1,refstart2,refstart3,refstart4
+refstart1.file=src/test/resources/ref1.xml
+refstart2.file=src/test/resources/ref2.xml
+refstart3.file=src/test/resources/ref3.xml
+refstart4.file=src/test/resources/ref4.xml
+
+#
+# Database persistence for PIP
+#
+count-recent-operations.persistenceunit=PipEngineTest
+get-operation-outcome.persistenceunit=PipEngineTest
index 55a6e40..fb18945 100644 (file)
@@ -8,9 +8,9 @@
   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.
       <version>${policy.models.version}</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
+      <artifactId>database</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
     <dependency>
       <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
       <artifactId>guard</artifactId>
index 7bd0a0e..dfd2a1a 100644 (file)
@@ -50,6 +50,7 @@ import org.onap.policy.controlloop.actor.so.SoActorServiceProvider;
 import org.onap.policy.controlloop.actor.vfc.VfcActorServiceProvider;
 import org.onap.policy.controlloop.policy.Policy;
 import org.onap.policy.controlloop.policy.PolicyResult;
+import org.onap.policy.database.operationshistory.Dbao;
 import org.onap.policy.drools.system.PolicyEngine;
 import org.onap.policy.guard.Util;
 import org.onap.policy.sdnc.SdncResponse;
@@ -909,7 +910,7 @@ public class ControlLoopOperationManager implements Serializable {
 
 
         String opsHistPu = System.getProperty("OperationsHistoryPU");
-        if (!"TestOperationsHistoryPU".equals(opsHistPu)) {
+        if (!"OperationsHistoryPUTest".equals(opsHistPu)) {
             opsHistPu = "OperationsHistoryPU";
         } else {
             props.clear();
@@ -922,7 +923,7 @@ public class ControlLoopOperationManager implements Serializable {
             return;
         }
 
-        OperationsHistoryDbEntry newEntry = new OperationsHistoryDbEntry();
+        Dbao newEntry = new Dbao();
 
         newEntry.setClosedLoopName(this.onset.getClosedLoopControlName());
         newEntry.setRequestId(this.onset.getRequestId().toString());
diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/OperationsHistoryDbEntry.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/OperationsHistoryDbEntry.java
deleted file mode 100644 (file)
index 002f391..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * controlloop
- * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.controlloop.eventmanager;
-
-import java.io.Serializable;
-import java.sql.Timestamp;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "operationshistory10")
-public class OperationsHistoryDbEntry implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @Id
-    @GeneratedValue
-    @Column(name = "ROWID")
-    public long rowid;
-
-    @Column(name = "CLNAME")
-    private String closedLoopName;
-
-    private String requestId;
-    private String actor;
-    private String operation;
-    private String target;
-    private Timestamp starttime;
-    private Timestamp endtime;
-    private String subrequestId;
-    private String outcome;
-    private String message;
-
-    public long getRowid() {
-        return rowid;
-    }
-
-    public void setRowid(long rowid) {
-        this.rowid = rowid;
-    }
-
-    public String getClosedLoopName() {
-        return closedLoopName;
-    }
-
-    public void setClosedLoopName(String closedLoopName) {
-        this.closedLoopName = closedLoopName;
-    }
-
-    public String getRequestId() {
-        return requestId;
-    }
-
-    public void setRequestId(String requestId) {
-        this.requestId = requestId;
-    }
-
-    public String getActor() {
-        return actor;
-    }
-
-    public void setActor(String actor) {
-        this.actor = actor;
-    }
-
-    public String getOperation() {
-        return operation;
-    }
-
-    public void setOperation(String operation) {
-        this.operation = operation;
-    }
-
-    public String getTarget() {
-        return target;
-    }
-
-    public void setTarget(String target) {
-        this.target = target;
-    }
-
-    public Timestamp getStarttime() {
-        return starttime;
-    }
-
-    public void setStarttime(Timestamp starttime) {
-        this.starttime = starttime;
-    }
-
-    public Timestamp getEndtime() {
-        return endtime;
-    }
-
-    public void setEndtime(Timestamp endtime) {
-        this.endtime = endtime;
-    }
-
-    public String getSubrequestId() {
-        return subrequestId;
-    }
-
-    public void setSubrequestId(String subrequestId) {
-        this.subrequestId = subrequestId;
-    }
-
-    public String getOutcome() {
-        return outcome;
-    }
-
-    public void setOutcome(String outcome) {
-        this.outcome = outcome;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-}
-
-
index 644b0d9..210e22f 100644 (file)
@@ -3,14 +3,14 @@
   ============LICENSE_START=======================================================
   drools-applications
   ================================================================================
-  Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+  Copyright (C) 2018-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.
@@ -25,8 +25,9 @@
  <persistence-unit name="OperationsHistoryPU"
   transaction-type="RESOURCE_LOCAL">
   <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
-  <!-- <jar-file>packedEntity.jar</jar-file> -->
-  <class>org.onap.policy.controlloop.eventmanager.OperationsHistoryDbEntry</class>
+
+  <class>org.onap.policy.database.operationshistory.Dbao</class>
+
   <properties>
    <property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
    <property name="javax.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver" />
index 82da603..d8533c7 100644 (file)
@@ -106,7 +106,7 @@ public class ControlLoopOperationManagerTest {
 
     private static int getCount() {
         // Create a query for number of items in DB
-        String sql = "select count(*) as count from operationshistory10";
+        String sql = "select count(*) as count from operationshistory";
         Query nq = em.createNativeQuery(sql);
 
         int numEvents = -1;
@@ -133,7 +133,7 @@ public class ControlLoopOperationManagerTest {
         }
         
         // Set PU
-        System.setProperty("OperationsHistoryPU", "TestOperationsHistoryPU");
+        System.setProperty("OperationsHistoryPU", "OperationsHistoryPUTest");
 
         // Enter dummy props to avoid nullPointerException
         PolicyEngine.manager.setEnvironmentProperty(org.onap.policy.guard.Util.ONAP_KEY_URL, "a");
@@ -141,7 +141,7 @@ public class ControlLoopOperationManagerTest {
         PolicyEngine.manager.setEnvironmentProperty(org.onap.policy.guard.Util.ONAP_KEY_PASS, "c");
 
         // Connect to in-mem db
-        emf = Persistence.createEntityManagerFactory("TestOperationsHistoryPU");
+        emf = Persistence.createEntityManagerFactory("OperationsHistoryPUTest");
         em = emf.createEntityManager();
     }
 
@@ -802,7 +802,7 @@ public class ControlLoopOperationManagerTest {
 
         assertEquals(PolicyResult.FAILURE, clom.onResponse(soRw));
 
-        System.setProperty("OperationsHistoryPU", "TestOperationsHistoryPU");
+        System.setProperty("OperationsHistoryPU", "OperationsHistoryPUTest");
         assertEquals(PolicyResult.FAILURE, clom.onResponse(soRw));
     }    
 
@@ -899,7 +899,7 @@ public class ControlLoopOperationManagerTest {
         assertFalse(clom.isOperationRunning());
         assertEquals(1, clom.getHistory().size());
 
-        System.setProperty("OperationsHistoryPU", "TestOperationsHistoryPU");
+        System.setProperty("OperationsHistoryPU", "OperationsHistoryPUTest");
         assertEquals(PolicyResult.FAILURE, clom.onResponse(soRw));
         
         clom = Serializer.roundTrip(clom);
diff --git a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/OperationsHistoryDbEntryTest.java b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/OperationsHistoryDbEntryTest.java
deleted file mode 100644 (file)
index db22ce1..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * eventmanager
- * ================================================================================
- * Copyright (C) 2018 Ericsson. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.controlloop.eventmanager;
-
-import static org.junit.Assert.assertEquals;
-
-import java.sql.Timestamp;
-import java.util.UUID;
-
-import org.junit.Test;
-
-public class OperationsHistoryDbEntryTest {
-
-    @Test
-    public void testOperationsHistoryDbEntry() {
-        OperationsHistoryDbEntry entry = new OperationsHistoryDbEntry();
-
-        String actor = "Dorothy";
-        entry.setActor(actor);
-        assertEquals(actor, entry.getActor());
-
-        String closedLoopName = "GoToOz";
-        entry.setClosedLoopName(closedLoopName);
-        assertEquals(closedLoopName, entry.getClosedLoopName());
-
-        Timestamp endtime = new Timestamp(System.currentTimeMillis());
-        entry.setEndtime(endtime);
-        assertEquals(endtime, entry.getEndtime());
-
-        String message = "I Want to go Home";
-        entry.setMessage(message);
-        assertEquals(message, entry.getMessage());
-
-        String operation = "Get Home";
-        entry.setOperation(operation);
-        assertEquals(operation, entry.getOperation());
-
-        String outcome = "Back in Kansas";
-        entry.setOutcome(outcome);
-        assertEquals(outcome, entry.getOutcome());
-
-        String requestId = UUID.randomUUID().toString();
-        entry.setRequestId(requestId);
-        assertEquals(requestId, entry.getRequestId());
-
-        long rowid = 12345;
-        entry.setRowid(rowid);
-        assertEquals(rowid, entry.getRowid());
-
-        Timestamp starttime = new Timestamp(endtime.getTime() - 100);
-        entry.setStarttime(starttime);
-        assertEquals(starttime, entry.getStarttime());
-
-        String subrequestId = "12321";
-        entry.setSubrequestId(subrequestId);
-        assertEquals(subrequestId, entry.getSubrequestId());
-
-        String target = "WizardOfOz";
-        entry.setTarget(target);
-        assertEquals(target, entry.getTarget());
-    }
-}
index 1c2eb12..e1aa93f 100644 (file)
@@ -1,38 +1,43 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  ============LICENSE_START=======================================================
-  drools-applications
-  ================================================================================
-  Copyright (C) 2018 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" version="2.0">
-    <persistence-unit name="TestOperationsHistoryPU" transaction-type="RESOURCE_LOCAL">
-        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
-
-        <class>org.onap.policy.controlloop.eventmanager.OperationsHistoryDbEntry</class>
-        
-        <properties>
-          <property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
-          <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
-          <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
-          <property name="javax.persistence.jdbc.user" value="sa" />
-          <property name="javax.persistence.jdbc.password" value="" />
-          <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
-          <property name="eclipselink.ddl-generation.output-mode" value="database"/>
-          <property name="eclipselink.logging.level"  value="INFO" />
-        </properties>
-    </persistence-unit>
-</persistence>
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!--\r
+  ============LICENSE_START=======================================================\r
+  drools-applications\r
+  ================================================================================\r
+  Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.\r
+  ================================================================================\r
+  Licensed under the Apache License, Version 2.0 (the "License");\r
+  you may not use this file except in compliance with the License.\r
+  You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+  Unless required by applicable law or agreed to in writing, software\r
+  distributed under the License is distributed on an "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  See the License for the specific language governing permissions and\r
+  limitations under the License.\r
+  ============LICENSE_END=========================================================\r
+  -->\r
+<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">\r
+\r
+    <!-- In-mem DB for junit -->\r
+    <persistence-unit name="OperationsHistoryPUTest"\r
+        transaction-type="RESOURCE_LOCAL">\r
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>\r
+\r
+       <class>org.onap.policy.database.operationshistory.Dbao</class>\r
+\r
+        <properties>\r
+            <property name="eclipselink.ddl-generation" value="create-tables" />\r
+            <property name="eclipselink.logging.level" value="FINE" />\r
+           <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>\r
+            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />\r
+            <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:testdb;DATABASE_TO_UPPER=FALSE" />\r
+            <property name="javax.persistence.jdbc.user" value="policy" />\r
+            <property name="javax.persistence.jdbc.password" value="P01icY" />\r
+            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>\r
+            <property name="javax.persistence.schema-generation.create-source" value="metadata"/>\r
+        </properties>\r
+    </persistence-unit>\r
+\r
+</persistence>\r
diff --git a/controlloop/common/guard/src/main/java/org/onap/policy/guard/PipEngineGetHistory.java b/controlloop/common/guard/src/main/java/org/onap/policy/guard/PipEngineGetHistory.java
deleted file mode 100644 (file)
index 37c4e4c..0000000
+++ /dev/null
@@ -1,405 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * guard
- * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.guard;
-
-import com.att.research.xacml.api.Attribute;
-import com.att.research.xacml.api.AttributeValue;
-import com.att.research.xacml.api.Identifier;
-import com.att.research.xacml.api.pip.PIPException;
-import com.att.research.xacml.api.pip.PIPFinder;
-import com.att.research.xacml.api.pip.PIPRequest;
-import com.att.research.xacml.api.pip.PIPResponse;
-import com.att.research.xacml.std.IdentifierImpl;
-import com.att.research.xacml.std.StdMutableAttribute;
-import com.att.research.xacml.std.datatypes.DataTypes;
-import com.att.research.xacml.std.pip.StdMutablePIPResponse;
-import com.att.research.xacml.std.pip.StdPIPRequest;
-import com.att.research.xacml.std.pip.StdPIPResponse;
-import com.att.research.xacml.std.pip.engines.StdConfigurableEngine;
-
-import java.math.BigInteger;
-import java.sql.Timestamp;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.Set;
-
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.NonUniqueResultException;
-import javax.persistence.Persistence;
-import javax.persistence.Query;
-
-import org.onap.policy.drools.system.PolicyEngine;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PipEngineGetHistory extends StdConfigurableEngine {
-    private static final Logger logger = LoggerFactory.getLogger(PipEngineGetHistory.class);
-
-    //
-    // Base issuer string. The issuer in the policy will also contain time window information
-    // E.g., "com:att:research:xacml:guard:historydb:tw:10:min"
-    //
-    public static final String DEFAULT_ISSUER = "com:att:research:xacml:guard:historydb";
-    public static final String DEFAULT_DESCRIPTION = "PIP for retrieving Operations History from DB";
-
-    private static final String XML_SCHEMA_STRING = "http://www.w3.org/2001/XMLSchema#string";
-
-    private static final String XACML_SUBJECT_CATEGORY_ACCESS_SUBJECT =
-            "urn:oasis:names:tc:xacml:1.0:subject-category:access-subject";
-    private static final String XACML_ACTOR_ACTOR_ID = "urn:oasis:names:tc:xacml:1.0:actor:actor-id";
-    private static final String XACML_ATTRIBUTE_CATEGORY_ACTION =
-            "urn:oasis:names:tc:xacml:3.0:attribute-category:action";
-    private static final String XACML_OPERATION_OPERATION_ID = "urn:oasis:names:tc:xacml:1.0:operation:operation-id";
-    private static final String XACML_ATTRIBUTE_CATEGORY_RESOURCE =
-            "urn:oasis:names:tc:xacml:3.0:attribute-category:resource";
-    private static final String XACML_TARGET_TARGET_ID = "urn:oasis:names:tc:xacml:1.0:target:target-id";
-    private static final String XACML_TEST_SQL_RESOURCE_OPERATIONS_COUNT =
-            "com:att:research:xacml:test:sql:resource:operations:count";
-
-    private static final PIPRequest PIP_REQUEST_ACTOR =
-            new StdPIPRequest(new IdentifierImpl(XACML_SUBJECT_CATEGORY_ACCESS_SUBJECT),
-                    new IdentifierImpl(XACML_ACTOR_ACTOR_ID), new IdentifierImpl(XML_SCHEMA_STRING));
-
-    private static final PIPRequest PIP_REQUEST_RECIPE =
-            new StdPIPRequest(new IdentifierImpl(XACML_ATTRIBUTE_CATEGORY_ACTION),
-                    new IdentifierImpl(XACML_OPERATION_OPERATION_ID), new IdentifierImpl(XML_SCHEMA_STRING));
-
-    private static final PIPRequest PIP_REQUEST_TARGET =
-            new StdPIPRequest(new IdentifierImpl(XACML_ATTRIBUTE_CATEGORY_RESOURCE),
-                    new IdentifierImpl(XACML_TARGET_TARGET_ID), new IdentifierImpl(XML_SCHEMA_STRING));
-
-    public PipEngineGetHistory() {
-        super();
-    }
-
-    @Override
-    public Collection<PIPRequest> attributesRequired() {
-        return Collections.emptySet();
-    }
-
-    @Override
-    public Collection<PIPRequest> attributesProvided() {
-        return Collections.emptySet();
-    }
-
-    @Override
-    public PIPResponse getAttributes(PIPRequest pipRequest, PIPFinder pipFinder) throws PIPException {
-        logger.debug("Entering FeqLimiter PIP");
-
-        /*
-         * First check to see if the issuer is set and then match it
-         */
-        String string;
-        if ((string = pipRequest.getIssuer()) == null) {
-
-            logger.debug("No issuer in the request...");
-            logger.debug("FeqLimiter PIP - No issuer in the request!");
-            return StdPIPResponse.PIP_RESPONSE_EMPTY;
-        } else {
-            // Notice, we are checking here for the base issuer prefix.
-            if (!string.contains(this.getIssuer())) {
-                logger.debug("Requested issuer '{}' does not match {}", string, getIssuer());
-                logger.debug("FeqLimiter PIP - Issuer {}  does not match with: {}", string, this.getIssuer());
-                return StdPIPResponse.PIP_RESPONSE_EMPTY;
-            }
-        }
-
-        String[] s1 = string.split("tw:");
-        String[] s2 = s1[1].split(":");
-        String timeWindowVal = s2[0];// number [of minutes, hours, days...]
-        String timeWindowScale = s2[1];// e.g., minute, hour, day, week, month, year
-
-        String actor = null;
-        String operation = null;
-        String target = null;
-        try {
-            actor = getActor(pipFinder).iterator().next();
-            operation = getRecipe(pipFinder).iterator().next();
-            target = getTarget(pipFinder).iterator().next();
-        } catch (Exception e) {
-            logger.debug("could not retrieve actor, operation, or target from PIP finder", e);
-            return StdPIPResponse.PIP_RESPONSE_EMPTY;
-        }
-
-        String timeWindow = timeWindowVal + " " + timeWindowScale;
-
-        logger.debug("Going to query DB about: {} {} {} {}", actor, operation, target, timeWindow);
-        int countFromDb = getCountFromDb(actor, operation, target, timeWindow);
-
-        StdMutablePIPResponse stdPipResponse = new StdMutablePIPResponse();
-
-        this.addIntegerAttribute(stdPipResponse, new IdentifierImpl(XACML_ATTRIBUTE_CATEGORY_RESOURCE),
-                new IdentifierImpl(XACML_TEST_SQL_RESOURCE_OPERATIONS_COUNT), countFromDb, pipRequest);
-
-        return new StdPIPResponse(stdPipResponse);
-    }
-
-    @Override
-    public void configure(String id, Properties properties) throws PIPException {
-        super.configure(id, properties);
-
-        if (this.getDescription() == null) {
-            this.setDescription(DEFAULT_DESCRIPTION);
-        }
-        if (this.getIssuer() == null) {
-            this.setIssuer(DEFAULT_ISSUER);
-        }
-    }
-
-    private PIPResponse getAttribute(PIPRequest pipRequest, PIPFinder pipFinder) {
-        PIPResponse pipResponse = null;
-
-        try {
-            pipResponse = pipFinder.getMatchingAttributes(pipRequest, this);
-        } catch (PIPException ex) {
-            logger.error("getAttribute threw:", ex);
-            return null;
-        }
-        if (pipResponse == null) {
-            return null;
-        }
-        if (pipResponse.getStatus() != null && !pipResponse.getStatus().isOk()) {
-            if (logger.isWarnEnabled()) {
-                logger.warn("PIP response error {}: {}", pipRequest.getAttributeId().stringValue(),
-                        pipResponse.getStatus());
-            }
-            return null;
-        }
-        if (pipResponse.getAttributes() != null && pipResponse.getAttributes().isEmpty()) {
-            if (logger.isWarnEnabled()) {
-                logger.warn("No attributes in POP response {}: {}", pipRequest.getAttributeId().stringValue(),
-                        pipResponse.getStatus());
-            }
-            return null;
-        }
-        return pipResponse;
-    }
-
-    private Set<String> getActor(PIPFinder pipFinder) {
-        /*
-         * Get the AT&T UID from either the subject id or the attuid property
-         */
-        PIPResponse pipResponseAttUid = this.getAttribute(PIP_REQUEST_ACTOR, pipFinder);
-        if (pipResponseAttUid == null) {
-            return new HashSet<>();
-        }
-
-        /*
-         * Iterate over all of the returned results and do the LDAP requests
-         */
-        Collection<Attribute> listAttUids = pipResponseAttUid.getAttributes();
-        Set<String> setAttUids = new HashSet<>();
-        for (Attribute attributeAttUid : listAttUids) {
-            Iterator<AttributeValue<String>> iterAttributeValues = attributeAttUid.findValues(DataTypes.DT_STRING);
-            if (iterAttributeValues != null) {
-                while (iterAttributeValues.hasNext()) {
-                    String attuid = iterAttributeValues.next().getValue();
-                    if (attuid != null) {
-                        setAttUids.add(attuid);
-                    }
-                }
-            }
-        }
-
-        return setAttUids;
-    }
-
-    private Set<String> getRecipe(PIPFinder pipFinder) {
-        /*
-         * Get the AT&T UID from either the subject id or the attuid property
-         */
-        PIPResponse pipResponseAttUid = this.getAttribute(PIP_REQUEST_RECIPE, pipFinder);
-        if (pipResponseAttUid == null) {
-            return new HashSet<>();
-        }
-
-        /*
-         * Iterate over all of the returned results and do the LDAP requests
-         */
-        Collection<Attribute> listAttUids = pipResponseAttUid.getAttributes();
-        Set<String> setAttUids = new HashSet<>();
-        for (Attribute attributeAttUid : listAttUids) {
-            Iterator<AttributeValue<String>> iterAttributeValues = attributeAttUid.findValues(DataTypes.DT_STRING);
-            if (iterAttributeValues != null) {
-                while (iterAttributeValues.hasNext()) {
-                    String attuid = iterAttributeValues.next().getValue();
-                    if (attuid != null) {
-                        setAttUids.add(attuid);
-                    }
-                }
-            }
-        }
-
-        return setAttUids;
-    }
-
-    private void addIntegerAttribute(StdMutablePIPResponse stdPipResponse, Identifier category, Identifier attributeId,
-            int value, PIPRequest pipRequest) {
-        AttributeValue<BigInteger> attributeValue = null;
-        try {
-            attributeValue = DataTypes.DT_INTEGER.createAttributeValue(value);
-        } catch (Exception ex) {
-            logger.error("Failed to convert {} to an AttributeValue<Boolean>", value, ex);
-        }
-        if (attributeValue != null) {
-            stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
-                    pipRequest.getIssuer()/* this.getIssuer() */, false));
-        }
-    }
-
-    private Set<String> getTarget(PIPFinder pipFinder) {
-        /*
-         * Get the AT&T UID from either the subject id or the attuid property
-         */
-        PIPResponse pipResponseAttUid = this.getAttribute(PIP_REQUEST_TARGET, pipFinder);
-        if (pipResponseAttUid == null) {
-            return new HashSet<>();
-        }
-
-        /*
-         * Iterate over all of the returned results and do the LDAP requests
-         */
-        Collection<Attribute> listAttUids = pipResponseAttUid.getAttributes();
-        Set<String> setAttUids = new HashSet<>();
-        for (Attribute attributeAttUid : listAttUids) {
-            Iterator<AttributeValue<String>> iterAttributeValues = attributeAttUid.findValues(DataTypes.DT_STRING);
-            if (iterAttributeValues != null) {
-                while (iterAttributeValues.hasNext()) {
-                    String attuid = iterAttributeValues.next().getValue();
-                    if (attuid != null) {
-                        setAttUids.add(attuid);
-                    }
-                }
-            }
-        }
-
-        return setAttUids;
-    }
-
-    private static int getCountFromDb(String actor, String operation, String target, String timeWindow) {
-        // DB Properties
-        Properties props = new Properties();
-        props.put(Util.ECLIPSE_LINK_KEY_URL, PolicyEngine.manager.getEnvironmentProperty(Util.ONAP_KEY_URL));
-        props.put(Util.ECLIPSE_LINK_KEY_USER, PolicyEngine.manager.getEnvironmentProperty(Util.ONAP_KEY_USER));
-        props.put(Util.ECLIPSE_LINK_KEY_PASS, PolicyEngine.manager.getEnvironmentProperty(Util.ONAP_KEY_PASS));
-
-
-        EntityManager em = null;
-        String opsHistPu = System.getProperty("OperationsHistoryPU");
-        if (!"TestOperationsHistoryPU".equals(opsHistPu)) {
-            opsHistPu = "OperationsHistoryPU";
-        } else {
-            props.clear();
-        }
-
-        try {
-            em = Persistence.createEntityManagerFactory(opsHistPu, props).createEntityManager();
-        } catch (Exception ex) {
-            logger.error("PIP thread got Exception. Can't connect to Operations History DB -- {}", opsHistPu);
-            logger.error("getCountFromDb threw: ", ex);
-            return -1;
-        }
-
-        long now = new Date().getTime();
-        long diff;
-        try {
-            diff = now - getMsFromTimeWindow(timeWindow);
-        } catch (Exception ex) {
-            logger.error("PIP thread got Exception ", ex);
-            return -1;
-        }
-
-        StringBuilder sqlBuilder = new StringBuilder();
-        sqlBuilder.append("select count(*) as count from operationshistory10 where outcome<>'Failure_Guard'");
-        sqlBuilder.append(" and actor= ?");
-        sqlBuilder.append(" and operation= ?");
-        sqlBuilder.append(" and target= ?");
-        sqlBuilder.append(" and endtime between '");
-        sqlBuilder.append(new Timestamp(diff));
-        sqlBuilder.append("' and '");
-        sqlBuilder.append(new Timestamp(now));
-        sqlBuilder.append('\'');
-
-        Query nq = em.createNativeQuery(sqlBuilder.toString());
-        nq.setParameter(1, actor);
-        nq.setParameter(2, operation);
-        nq.setParameter(3, target);
-
-        int ret = -1;
-        try {
-            ret = ((Number) nq.getSingleResult()).intValue();
-        } catch (NoResultException | NonUniqueResultException ex) {
-            logger.error("getCountFromDb threw: ", ex);
-            return -1;
-        }
-
-        em.close();
-
-        return ret;
-    }
-
-    /**
-     * Get the Millisecond time from a time window string.
-     * 
-     * @param timeWindow the time window string to parse
-     * @return the millisecond time from the time window string
-     * @throws PIPException On invalid time window strings
-     */
-    private static long getMsFromTimeWindow(String timeWindowString) throws PIPException {
-        long ms = 0;
-        double multiplier = 0;
-
-        String[] split = timeWindowString.split(" ");
-        if (split.length != 2) {
-            throw new PIPException("Invalid Value Unit pair for SQL");
-        }
-
-        ms = Long.parseLong(split[0]);
-
-        if ("SECOND".compareToIgnoreCase(split[1]) == 0) {
-            multiplier = 1000;
-        } else if ("MINUTE".compareToIgnoreCase(split[1]) == 0) {
-            multiplier = 60000;
-        } else if ("HOUR".compareToIgnoreCase(split[1]) == 0) {
-            multiplier = 3.6e+6;
-        } else if ("DAY".compareToIgnoreCase(split[1]) == 0) {
-            multiplier = 8.64e+7;
-        } else if ("WEEK".compareToIgnoreCase(split[1]) == 0) {
-            multiplier = 6.048e+8;
-        } else if ("MONTH".compareToIgnoreCase(split[1]) == 0) {
-            multiplier = 2.628e+9;
-        } else if ("QUARTER".compareToIgnoreCase(split[1]) == 0) {
-            multiplier = 2.628e+9 * 3;
-        } else if ("YEAR".compareToIgnoreCase(split[1]) == 0) {
-            multiplier = 3.154e+10;
-        } else {
-            logger.error("{} not supported", split[1]);
-        }
-
-        ms *= multiplier;
-        return ms;
-    }
-}
diff --git a/controlloop/common/guard/src/main/java/org/onap/policy/guard/PipEngineGetStatus.java b/controlloop/common/guard/src/main/java/org/onap/policy/guard/PipEngineGetStatus.java
deleted file mode 100644 (file)
index b61ab5d..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * guard
- * ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.guard;
-
-import com.att.research.xacml.api.Attribute;
-import com.att.research.xacml.api.AttributeValue;
-import com.att.research.xacml.api.Identifier;
-import com.att.research.xacml.api.pip.PIPException;
-import com.att.research.xacml.api.pip.PIPFinder;
-import com.att.research.xacml.api.pip.PIPRequest;
-import com.att.research.xacml.api.pip.PIPResponse;
-import com.att.research.xacml.std.IdentifierImpl;
-import com.att.research.xacml.std.StdMutableAttribute;
-import com.att.research.xacml.std.datatypes.DataTypes;
-import com.att.research.xacml.std.pip.StdMutablePIPResponse;
-import com.att.research.xacml.std.pip.StdPIPRequest;
-import com.att.research.xacml.std.pip.StdPIPResponse;
-import com.att.research.xacml.std.pip.engines.StdConfigurableEngine;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.Set;
-
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.NoResultException;
-import javax.persistence.Persistence;
-import javax.persistence.Query;
-
-import org.onap.policy.drools.system.PolicyEngine;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PipEngineGetStatus extends StdConfigurableEngine {
-    private static final Logger logger = LoggerFactory.getLogger(PipEngineGetStatus.class);
-
-    //
-    // Base issuer string. The issuer in the policy will contain the operations
-    // E.g., "org:onap:policy:guard:status:clname:testcl"
-    //
-    public static final String DEFAULT_ISSUER = "org:onap:policy:guard:status";
-    public static final String DEFAULT_DESCRIPTION = "PIP for retrieving Operation Status from DB";
-
-    private static final String XML_SCHEMA_STRING = "http://www.w3.org/2001/XMLSchema#string";
-
-    private static final String XACML_ATTRIBUTE_CATEGORY_RESOURCE =
-            "urn:oasis:names:tc:xacml:3.0:attribute-category:resource";
-    private static final String XACML_TARGET_TARGET_ID = "urn:oasis:names:tc:xacml:1.0:target:target-id";
-    private static final String XACML_TEST_SQL_RESOURCE_OPERATIONS_STATUS =
-            "com:att:research:xacml:test:sql:resource:operations:status";
-
-    private static final PIPRequest PIP_REQUEST_TARGET =
-            new StdPIPRequest(new IdentifierImpl(XACML_ATTRIBUTE_CATEGORY_RESOURCE),
-                    new IdentifierImpl(XACML_TARGET_TARGET_ID), new IdentifierImpl(XML_SCHEMA_STRING));
-
-    public PipEngineGetStatus() {
-        super();
-    }
-
-    @Override
-    public Collection<PIPRequest> attributesRequired() {
-        return Collections.emptySet();
-    }
-
-    @Override
-    public Collection<PIPRequest> attributesProvided() {
-        return Collections.emptySet();
-    }
-
-    @Override
-    public PIPResponse getAttributes(PIPRequest pipRequest, PIPFinder pipFinder) throws PIPException {
-        logger.debug("Entering Status PIP");
-
-        /*
-         * First check to see if the issuer is set and then match it
-         */
-        String issuer;
-        if ((issuer = pipRequest.getIssuer()) == null) {
-
-            logger.debug("No issuer in the request...");
-            logger.debug("Status PIP - No issuer in the request!");
-            return StdPIPResponse.PIP_RESPONSE_EMPTY;
-         
-        } else if (!issuer.contains(this.getIssuer())) {
-            // Notice, we are checking here for the base issuer prefix.
-            logger.debug("Requested issuer '{}' does not match {}", issuer, getIssuer());
-            logger.debug("Status PIP - Issuer {}  does not match with: {}", issuer, this.getIssuer());
-            return StdPIPResponse.PIP_RESPONSE_EMPTY;
-        }
-
-        String[] s1 = issuer.split("clname:");
-        String clname = s1[1];
-        String target = null;
-        try {
-            target = getTarget(pipFinder).iterator().next();
-        } catch (Exception e) {
-            logger.debug("could not retrieve target from PIP finder", e);
-            return StdPIPResponse.PIP_RESPONSE_EMPTY;
-        }
-
-        logger.debug("Going to query DB about: clname={}, target={}", clname, target);
-        String statusFromDb = getStatusFromDb(clname, target);
-
-        StdMutablePIPResponse stdPipResponse = new StdMutablePIPResponse();
-
-        this.addStringAttribute(stdPipResponse, new IdentifierImpl(XACML_ATTRIBUTE_CATEGORY_RESOURCE),
-                new IdentifierImpl(XACML_TEST_SQL_RESOURCE_OPERATIONS_STATUS), statusFromDb, pipRequest);
-
-        return new StdPIPResponse(stdPipResponse);
-    }
-
-    @Override
-    public void configure(String id, Properties properties) throws PIPException {
-        super.configure(id, properties);
-
-        if (this.getDescription() == null) {
-            this.setDescription(DEFAULT_DESCRIPTION);
-        }
-        if (this.getIssuer() == null) {
-            this.setIssuer(DEFAULT_ISSUER);
-        }
-    }
-
-    private PIPResponse getAttribute(PIPRequest pipRequest, PIPFinder pipFinder) {
-        PIPResponse pipResponse = null;
-        
-        try {
-            pipResponse = pipFinder.getMatchingAttributes(pipRequest, this);
-        } catch (PIPException ex) {
-            logger.error("getAttribute threw", ex);
-            return null;
-        }
-        if (pipResponse == null) {
-            return null;
-        }
-        if (pipResponse.getStatus() != null && !pipResponse.getStatus().isOk()) {
-            logger.warn("PIP response error {}: {}", pipRequest.getAttributeId().stringValue(),
-                        pipResponse.getStatus());
-            return null;
-        }
-        if (pipResponse.getAttributes() != null && pipResponse.getAttributes().isEmpty()) {
-            logger.warn("No attributes in POP response {}: {}", pipRequest.getAttributeId().stringValue(),
-                        pipResponse.getStatus());
-            return null;
-        }
-        return pipResponse;
-    }
-
-    private void addStringAttribute(StdMutablePIPResponse stdPipResponse, Identifier category, Identifier attributeId,
-            String value, PIPRequest pipRequest) {
-        AttributeValue<String> attributeValue = null;
-        try {
-            attributeValue = DataTypes.DT_STRING.createAttributeValue(value);
-        } catch (Exception ex) {
-            logger.error("Failed to convert {} to an AttributeValue<String>", value, ex);
-        }
-        if (attributeValue != null) {
-            stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
-                    pipRequest.getIssuer()/* this.getIssuer() */, false));
-        }
-    }
-
-    private Set<String> getTarget(PIPFinder pipFinder) {
-        /*
-         * Get the UID from either the subject id or the uid property
-         */
-        PIPResponse pipResponseUid = this.getAttribute(PIP_REQUEST_TARGET, pipFinder);
-        if (pipResponseUid == null) {
-            return new HashSet<>();
-        }
-
-        /*
-         * Iterate over all of the returned results and do the LDAP requests
-         */
-        Collection<Attribute> listUids = pipResponseUid.getAttributes();
-        Set<String> setUids = new HashSet<>();
-        for (Attribute attributeUid : listUids) {
-            Iterator<AttributeValue<String>> iterAttributeValues = attributeUid.findValues(DataTypes.DT_STRING);
-            if (iterAttributeValues == null) {
-                continue;
-            }
-            while (iterAttributeValues.hasNext()) {
-                String uid = iterAttributeValues.next().getValue();
-                if (uid == null) {
-                    continue;
-                }
-                setUids.add(uid);
-            }
-        }
-        return setUids;
-    }
-
-    private static String getStatusFromDb(String clname, String target) {
-        //
-        // DB Properties
-        //
-        Properties props = new Properties();
-        try {
-            props.put(Util.ECLIPSE_LINK_KEY_URL, PolicyEngine.manager.getEnvironmentProperty(Util.ONAP_KEY_URL));
-            props.put(Util.ECLIPSE_LINK_KEY_USER, PolicyEngine.manager.getEnvironmentProperty(Util.ONAP_KEY_USER));
-            props.put(Util.ECLIPSE_LINK_KEY_PASS, PolicyEngine.manager.getEnvironmentProperty(Util.ONAP_KEY_PASS));
-        } catch (NullPointerException e) {
-            logger.error("getStatusFromDb: when setting properties", e);
-        }
-        //
-        // Set opsHistPu to the correct value and clear properties if necessary.
-        //
-        String opsHistPu = System.getProperty("OperationsHistoryPU");
-        if (!"TestOperationsHistoryPU".equals(opsHistPu)) {
-            opsHistPu = "OperationsHistoryPU";
-        } else {
-            props.clear();
-        }
-        //
-        // Set up the EntityManager
-        //
-        EntityManagerFactory emf = null;
-        EntityManager em = null;
-        try {
-            emf = Persistence.createEntityManagerFactory(opsHistPu, props);
-        } catch (Exception ex) {
-            logger.error("PIP thread got Exception. Can't connect to Operations History DB -- {}", opsHistPu);
-            logger.error("getStatusFromDb threw", ex);
-            return null;
-        }
-        try {
-            em = emf.createEntityManager();
-        } catch (Exception ex) {
-            logger.error("PIP thread got Exception. Problem creating EntityManager");
-            logger.error("getStatusFromDb threw", ex);
-            emf.close();
-            return null;
-        } 
-        //
-        // Create the query
-        //
-        String sql = "select outcome from operationshistory10 where"
-            + " clname= ?"
-            + " and target= ?"
-            + " order by endtime desc limit 1";
-        Query nq = em.createNativeQuery(sql);
-        nq.setParameter(1, clname);
-        nq.setParameter(2, target);
-        logger.debug("SQL query: {}, {}, {}", sql, clname, target);
-        //
-        // Run the query
-        //
-        String ret = null;
-        try {
-            ret = ((String)nq.getSingleResult());
-        } catch (NoResultException ex) {
-            logger.debug("NoResultException for getSingleResult()", ex);
-            ret = "NO_MATCHING_ENTRY";
-        } catch (Exception ex) {
-            logger.error("getStatusFromDB threw an exception", ex);
-        }
-        if (ret != null) {
-            logger.debug("SQL query result: {}", ret);
-        }
-        //
-        // Clean up and return the result
-        //
-        try {
-            em.close();
-        } catch (Exception ex) {
-            logger.error("getStatusFromDB threw an exception", ex);
-        }
-        try {
-            emf.close();
-        } catch (Exception ex) {
-            logger.error("getStatusFromDB threw an exception", ex);
-        }
-        return ret;
-    }
-}
index 8b4c832..6d1fd31 100644 (file)
@@ -242,11 +242,11 @@ public class PolicyGuardXacmlHelper {
             while (itAttr.hasNext()) {
                 Attribute currentAttr = itAttr.next();
                 String attributeId = currentAttr.getAttributeId().stringValue();
-                if ("urn:oasis:names:tc:xacml:1.0:request:request-id".equals(attributeId)) {
+                if ("urn:org:onap:guard:request:request-id".equals(attributeId)) {
                     Iterator<AttributeValue<?>> itValues = currentAttr.getValues().iterator();
                     reqIdFromXacmlResponse = UUID.fromString(itValues.next().getValue().toString());
                 }
-                if ("urn:oasis:names:tc:xacml:1.0:operation:operation-id".equals(attributeId)) {
+                if ("urn:org:onap:guard:operation:operation-id".equals(attributeId)) {
                     Iterator<AttributeValue<?>> itValues = currentAttr.getValues().iterator();
                     operationFromXacmlResponse = itValues.next().getValue().toString();
                 }
index da03add..c888f94 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -28,27 +28,27 @@ import com.att.research.xacml.std.annotations.XACMLSubject;
 @XACMLRequest(ReturnPolicyIdList = true, CombinedDecision = true)
 public class PolicyGuardXacmlRequestAttributes {
 
-    @XACMLSubject(includeInResults = true, attributeId = "urn:oasis:names:tc:xacml:1.0:clname:clname-id")
+    @XACMLSubject(includeInResults = true, attributeId = "urn:org:onap:guard:clname:clname-id")
     String clnameId;
 
-    @XACMLSubject(includeInResults = true, attributeId = "urn:oasis:names:tc:xacml:1.0:actor:actor-id")
+    @XACMLSubject(includeInResults = true, attributeId = "urn:org:onap:guard:actor:actor-id")
     String actorId;
 
-    @XACMLAction(includeInResults = true, attributeId = "urn:oasis:names:tc:xacml:1.0:operation:operation-id")
+    @XACMLAction(includeInResults = true, attributeId = "urn:org:onap:guard:operation:operation-id")
     String operationId;
 
-    @XACMLResource(includeInResults = true, attributeId = "urn:oasis:names:tc:xacml:1.0:target:target-id")
+    @XACMLResource(includeInResults = true, attributeId = "urn:org:onap:guard:target:target-id")
     String targetId;
 
-    @XACMLResource(includeInResults = true, attributeId = "urn:oasis:names:tc:xacml:1.0:request:request-id")
+    @XACMLResource(includeInResults = true, attributeId = "urn:org:onap:guard:request:request-id")
     String requestId;
 
-    @XACMLResource(includeInResults = true, attributeId = "urn:oasis:names:tc:xacml:1.0:request:vf-count")
+    @XACMLResource(includeInResults = true, attributeId = "urn:org:onap:guard:request:vf-count")
     Integer vfCount;
 
     /**
      * Construct an instance.
-     * 
+     *
      * @param clnameId the control loop Id
      * @param actorId the actor Id
      * @param operationId the operation Id
index d159bd4..6298774 100644 (file)
@@ -69,7 +69,7 @@ public final class Util {
      * Junit props
      */
     protected static final String PU_KEY = "OperationsHistoryPU";
-    protected static final String JUNITPU = "TestOperationsHistoryPU";
+    protected static final String JUNITPU = "OperationsHistoryPUTest";
 
     private static final Logger logger = LoggerFactory.getLogger(Util.class);
 
diff --git a/controlloop/common/guard/src/test/java/org/onap/policy/guard/PipEngineGetHistoryTest.java b/controlloop/common/guard/src/test/java/org/onap/policy/guard/PipEngineGetHistoryTest.java
deleted file mode 100644 (file)
index 288c6ca..0000000
+++ /dev/null
@@ -1,437 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * guard
- * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.guard;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import com.att.research.xacml.api.Attribute;
-import com.att.research.xacml.api.AttributeValue;
-import com.att.research.xacml.api.Identifier;
-import com.att.research.xacml.api.Status;
-import com.att.research.xacml.api.pip.PIPEngine;
-import com.att.research.xacml.api.pip.PIPException;
-import com.att.research.xacml.api.pip.PIPFinder;
-import com.att.research.xacml.api.pip.PIPRequest;
-import com.att.research.xacml.api.pip.PIPResponse;
-import com.att.research.xacml.std.IdentifierImpl;
-import com.att.research.xacml.std.StdAttribute;
-import com.att.research.xacml.std.StdAttributeValue;
-import com.att.research.xacml.std.StdStatus;
-import com.att.research.xacml.std.StdStatusCode;
-import com.att.research.xacml.std.pip.StdPIPRequest;
-import com.att.research.xacml.std.pip.StdPIPResponse;
-import com.att.research.xacml.std.pip.finders.EngineFinder;
-import com.att.research.xacml.util.FactoryException;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Properties;
-import java.util.UUID;
-
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
-import javax.persistence.Query;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.onap.policy.drools.system.PolicyEngine;
-
-public class PipEngineGetHistoryTest {
-    static PipEngineGetHistory pegh;
-    private static final String ISSUER = "issuerIntw:mid:end";
-    
-    private static EntityManagerFactory emf;
-    private static EntityManager em;
-
-    /**
-     * Set up test class.
-     */
-    @BeforeClass
-    public static void testPipEngineGetHistory() {
-        pegh = null;
-        try {
-            pegh = new PipEngineGetHistory();
-        } catch (Exception e) {
-            fail("PipEngineGetHistory constructor failed");
-        }
-
-        // Set PU
-        System.setProperty(Util.PU_KEY, Util.JUNITPU);
-
-        // Enter dummy props to avoid nullPointerException
-        PolicyEngine.manager.setEnvironmentProperty(Util.ONAP_KEY_URL, "a");
-        PolicyEngine.manager.setEnvironmentProperty(Util.ONAP_KEY_USER, "b");
-        PolicyEngine.manager.setEnvironmentProperty(Util.ONAP_KEY_PASS, "c");
-
-        // Connect to in-mem db
-        emf = Persistence.createEntityManagerFactory(Util.JUNITPU);
-        em = emf.createEntityManager();
-
-        // Create necessary table
-        String sql = "CREATE TABLE `operationshistory10` (" + "`CLNAME` varchar(255)," + "`requestID` varchar(100),"
-                + "`actor` varchar(50) ," + "`operation` varchar(50)," + "`target` varchar(50),"
-                + "`starttime` timestamp," + "`outcome` varchar(50)," + "`message` varchar(255),"
-                + "`subrequestId` varchar(100)," + "`endtime` timestamp" + ")";
-        Query nq = em.createNativeQuery(sql);
-        em.getTransaction().begin();
-        nq.executeUpdate();
-        em.getTransaction().commit();
-    }
-    
-    /**
-     * Clean up test class.
-     */
-    @AfterClass
-    public static void tearDown() {
-        String sql = "DROP TABLE `operationshistory10`";
-        Query nq = em.createNativeQuery(sql);
-        em.getTransaction().begin();
-        nq.executeUpdate();
-        em.getTransaction().commit();
-        em.close();
-        emf.close();
-    }
-
-    /**
-     * Setup method.
-     */
-    @Before
-    public void setUp() {
-        // clear the table
-        String sql = "DELETE FROM `operationshistory10`";
-        Query nq = em.createNativeQuery(sql);
-        em.getTransaction().begin();
-        nq.executeUpdate();
-        em.getTransaction().commit();
-    }
-
-    @Test
-    public void testAttributesRequired() {
-        assertTrue(pegh.attributesRequired().isEmpty());
-    }
-
-    @Test
-    public void testAttributesProvided() {
-        assertTrue(pegh.attributesProvided().isEmpty());
-    }
-
-    @Test
-    public void testGetAttributes() {
-        StdPIPRequest mockPipRequest = mock(StdPIPRequest.class);
-        EngineFinder mockPipFinder = mock(EngineFinder.class);
-
-        // Test issuer null
-        when(mockPipRequest.getIssuer()).thenReturn(null);
-        try {
-            assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pegh.getAttributes(mockPipRequest, mockPipFinder));
-        } catch (Exception e) {
-            fail("getAttributes failed");
-        }
-
-        // Test issuer not equal to our issuer
-        pegh.setIssuer(ISSUER);
-        when(mockPipRequest.getIssuer()).thenReturn("something else");
-        try {
-            assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pegh.getAttributes(mockPipRequest, mockPipFinder));
-        } catch (Exception e) {
-            fail("getAttributes failed");
-        }
-
-        // Test issuer equal to our issuer
-        when(mockPipRequest.getIssuer()).thenReturn(ISSUER);
-        try {
-            assertNotNull(pegh.getAttributes(mockPipRequest, mockPipFinder));
-        } catch (Exception e) {
-            // Normal to catch exception
-        }
-    }
-
-    @Test
-    public void testGetCountFromDb() {
-
-        // Use reflection to run getCountFromDB
-        Method method = null;
-        int count = -1;
-        try {
-            method = PipEngineGetHistory.class.getDeclaredMethod("getCountFromDb", String.class, String.class,
-                    String.class, String.class);
-            method.setAccessible(true);
-            count = (int) method.invoke(null, "actor", "op", "target", "1 MINUTE");
-        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
-                | NoSuchMethodException e) {
-            fail(e.getLocalizedMessage());
-        }
-        // No entries yet
-        assertEquals(0, count);
-
-        // Add an entry
-        String addEntry = "insert into operationshistory10 (outcome, CLNAME, actor, operation, target, endtime)"
-                + "values('success','testcl', 'actor', 'op', 'target', CURRENT_TIMESTAMP())";
-        Query nq2 = em.createNativeQuery(addEntry);
-        em.getTransaction().begin();
-        nq2.executeUpdate();
-        em.getTransaction().commit();
-
-        try {
-            count = (int) method.invoke(null, "actor", "op", "target", "1 MINUTE");
-        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
-            fail(e.getLocalizedMessage());
-        }
-        // Should count 1 entry now
-        assertEquals(1, count);
-    }
-
-    @Test
-    public void testConfigure() throws PIPException {
-        PipEngineGetHistory pegh = new PipEngineGetHistory();
-        pegh.configure("Dorothy", new Properties());
-
-        pegh.setDescription(null);
-        pegh.setIssuer(null);
-        pegh.configure("Dorothy", new Properties());
-    }
-
-    @Test
-    public void getAttributesTest() throws URISyntaxException, PIPException, FactoryException {
-        PipEngineGetHistory pegh = new PipEngineGetHistory();
-        pegh.setIssuer("Dorothy");
-
-        Identifier identifierCategory = new IdentifierImpl(new URI("http://somewhere.over.the.rainbow/category"));;
-        Identifier identifierAttribute = new IdentifierImpl(new URI("http://somewhere.over.the.rainbow/atrtribute"));;
-        Identifier identifierDataType = new IdentifierImpl(new URI("http://somewhere.over.the.rainbow/datatype"));;
-        PIPRequest pipRequest = new StdPIPRequest(identifierCategory, identifierAttribute, identifierDataType,
-                "Dorothy,tw:1000:SECOND");
-
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinder()));
-
-
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinderPipException()));
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinderResponseStatusNok()));
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinderResponseEmptyAttrs()));
-    }
-
-    @Test
-    public void timeWindowTest() throws URISyntaxException, PIPException, FactoryException {
-        PipEngineGetHistory pegh = new PipEngineGetHistory();
-        pegh.setIssuer("Dorothy");
-
-        Identifier identifierCategory = new IdentifierImpl(new URI("http://somewhere.over.the.rainbow/category"));;
-        Identifier identifierAttribute = new IdentifierImpl(new URI("http://somewhere.over.the.rainbow/atrtribute"));;
-        Identifier identifierDataType = new IdentifierImpl(new URI("http://somewhere.over.the.rainbow/datatype"));;
-
-        PIPRequest pipRequest =
-                new StdPIPRequest(identifierCategory, identifierAttribute, identifierDataType, "Dorothy,tw:100:SECOND");
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinder()));
-
-        pipRequest =
-                new StdPIPRequest(identifierCategory, identifierAttribute, identifierDataType, "Dorothy,tw:100:MINUTE");
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinder()));
-
-        pipRequest =
-                new StdPIPRequest(identifierCategory, identifierAttribute, identifierDataType, "Dorothy,tw:100:HOUR");
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinder()));
-
-        pipRequest =
-                new StdPIPRequest(identifierCategory, identifierAttribute, identifierDataType, "Dorothy,tw:100:DAY");
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinder()));
-
-        pipRequest =
-                new StdPIPRequest(identifierCategory, identifierAttribute, identifierDataType, "Dorothy,tw:100:WEEK");
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinder()));
-
-        pipRequest =
-                new StdPIPRequest(identifierCategory, identifierAttribute, identifierDataType, "Dorothy,tw:100:MONTH");
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinder()));
-
-        pipRequest = new StdPIPRequest(identifierCategory, identifierAttribute, identifierDataType,
-                "Dorothy,tw:100:QUARTER");
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinder()));
-
-        pipRequest =
-                new StdPIPRequest(identifierCategory, identifierAttribute, identifierDataType, "Dorothy,tw:100:YEAR");
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinder()));
-
-        pipRequest = new StdPIPRequest(identifierCategory, identifierAttribute, identifierDataType,
-                "Dorothy,tw:100:FORTNIGHT");
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinder()));
-
-        pipRequest = new StdPIPRequest(identifierCategory, identifierAttribute, identifierDataType,
-                "Dorothy,tw:100:FORT NIGHT");
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinder()));
-
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinderPipException()));
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinderResponseStatusNok()));
-        assertNotNull(pegh.getAttributes(pipRequest, new DummyPipFinderResponseEmptyAttrs()));
-    }
-
-    private class DummyPipFinder implements PIPFinder {
-        @Override
-        public PIPResponse getAttributes(PIPRequest pipRequest, PIPEngine exclude) throws PIPException {
-            return null;
-        }
-
-        @Override
-        public PIPResponse getAttributes(PIPRequest pipRequest, PIPEngine exclude, PIPFinder pipFinderParent)
-                throws PIPException {
-            return null;
-        }
-
-        @Override
-        public PIPResponse getMatchingAttributes(PIPRequest pipRequest, PIPEngine exclude) throws PIPException {
-            try {
-                List<Attribute> attributeList = new ArrayList<>();
-                Identifier categoryIdIn = new IdentifierImpl(new URI("http://somewhere.over.the.rainbow/category"));
-                Identifier dataTypeIdIn = new IdentifierImpl(new URI("http://www.w3.org/2001/XMLSchema#string"));
-
-                Identifier attributeIdIn0 = new IdentifierImpl(new URI(UUID.randomUUID().toString()));
-                AttributeValue<String> valueIn0 = new StdAttributeValue<String>(dataTypeIdIn, "ActorDorothy");
-                Attribute attribute0 = new StdAttribute(categoryIdIn, attributeIdIn0, valueIn0);
-                attributeList.add(attribute0);
-
-                Identifier attributeIdIn1 = new IdentifierImpl(new URI(UUID.randomUUID().toString()));
-                AttributeValue<String> valueIn1 = new StdAttributeValue<String>(dataTypeIdIn, "OperationHomeFromOZ");
-                Attribute attribute1 = new StdAttribute(categoryIdIn, attributeIdIn1, valueIn1);
-                attributeList.add(attribute1);
-
-                Identifier attributeIdIn2 = new IdentifierImpl(new URI(UUID.randomUUID().toString()));
-                AttributeValue<String> valueIn2 = new StdAttributeValue<String>(dataTypeIdIn, "TargetWickedWitch");
-                Attribute attribute2 = new StdAttribute(categoryIdIn, attributeIdIn2, valueIn2);
-                attributeList.add(attribute2);
-
-                return new StdPIPResponse(attributeList);
-            } catch (Exception e) {
-                return null;
-            }
-        }
-
-        @Override
-        public PIPResponse getMatchingAttributes(PIPRequest pipRequest, PIPEngine exclude, PIPFinder pipFinderParent)
-                throws PIPException {
-            return null;
-        }
-
-        @Override
-        public Collection<PIPEngine> getPIPEngines() {
-            return null;
-        }
-    }
-
-    private class DummyPipFinderPipException implements PIPFinder {
-        @Override
-        public PIPResponse getAttributes(PIPRequest pipRequest, PIPEngine exclude) throws PIPException {
-            return null;
-        }
-
-        @Override
-        public PIPResponse getAttributes(PIPRequest pipRequest, PIPEngine exclude, PIPFinder pipFinderParent)
-                throws PIPException {
-            return null;
-        }
-
-        @Override
-        public PIPResponse getMatchingAttributes(PIPRequest pipRequest, PIPEngine exclude) throws PIPException {
-            throw new PIPException();
-        }
-
-        @Override
-        public PIPResponse getMatchingAttributes(PIPRequest pipRequest, PIPEngine exclude, PIPFinder pipFinderParent)
-                throws PIPException {
-            return null;
-        }
-
-        @Override
-        public Collection<PIPEngine> getPIPEngines() {
-            return null;
-        }
-    }
-
-    private class DummyPipFinderResponseStatusNok implements PIPFinder {
-        @Override
-        public PIPResponse getAttributes(PIPRequest pipRequest, PIPEngine exclude) throws PIPException {
-            return null;
-        }
-
-        @Override
-        public PIPResponse getAttributes(PIPRequest pipRequest, PIPEngine exclude, PIPFinder pipFinderParent)
-                throws PIPException {
-            return null;
-        }
-
-        @Override
-        public PIPResponse getMatchingAttributes(PIPRequest pipRequest, PIPEngine exclude) throws PIPException {
-            Status status = new StdStatus(StdStatusCode.STATUS_CODE_PROCESSING_ERROR, "Processing Error");
-            return new StdPIPResponse(status);
-        }
-
-        @Override
-        public PIPResponse getMatchingAttributes(PIPRequest pipRequest, PIPEngine exclude, PIPFinder pipFinderParent)
-                throws PIPException {
-            return null;
-        }
-
-        @Override
-        public Collection<PIPEngine> getPIPEngines() {
-            return null;
-        }
-    }
-
-    private class DummyPipFinderResponseEmptyAttrs implements PIPFinder {
-        @Override
-        public PIPResponse getAttributes(PIPRequest pipRequest, PIPEngine exclude) throws PIPException {
-            return null;
-        }
-
-        @Override
-        public PIPResponse getAttributes(PIPRequest pipRequest, PIPEngine exclude, PIPFinder pipFinderParent)
-                throws PIPException {
-            return null;
-        }
-
-        @Override
-        public PIPResponse getMatchingAttributes(PIPRequest pipRequest, PIPEngine exclude) throws PIPException {
-            List<Attribute> attributeList = new ArrayList<>();
-            return new StdPIPResponse(attributeList);
-        }
-
-        @Override
-        public PIPResponse getMatchingAttributes(PIPRequest pipRequest, PIPEngine exclude, PIPFinder pipFinderParent)
-                throws PIPException {
-            return null;
-        }
-
-        @Override
-        public Collection<PIPEngine> getPIPEngines() {
-            return null;
-        }
-    }
-}
diff --git a/controlloop/common/guard/src/test/java/org/onap/policy/guard/PipEngineGetStatusTest.java b/controlloop/common/guard/src/test/java/org/onap/policy/guard/PipEngineGetStatusTest.java
deleted file mode 100644 (file)
index 5e99b06..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * guard
- * ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.guard;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import com.att.research.xacml.api.pip.PIPException;
-import com.att.research.xacml.std.pip.StdPIPRequest;
-import com.att.research.xacml.std.pip.StdPIPResponse;
-import com.att.research.xacml.std.pip.finders.EngineFinder;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Properties;
-
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
-import javax.persistence.Query;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.onap.policy.drools.system.PolicyEngine;
-
-public class PipEngineGetStatusTest {
-    static PipEngineGetStatus pegs;
-    private static final String ISSUER = "issuer:clname:testclname";
-    
-    private static EntityManagerFactory emf;
-    private static EntityManager em;
-
-    /**
-     * Set up test class.
-     */
-    @BeforeClass
-    public static void testPipEngineGetStatus() {
-        pegs = null;
-        try {
-            pegs = new PipEngineGetStatus();
-        } catch (Exception e) {
-            fail("PipEngineGetStatus constructor failed");
-        }
-
-        // Set PU
-        System.setProperty(Util.PU_KEY, Util.JUNITPU);
-
-        // Enter dummy props to avoid nullPointerException
-        PolicyEngine.manager.setEnvironmentProperty(Util.ONAP_KEY_URL, "a");
-        PolicyEngine.manager.setEnvironmentProperty(Util.ONAP_KEY_USER, "b");
-        PolicyEngine.manager.setEnvironmentProperty(Util.ONAP_KEY_PASS, "c");
-
-        // Connect to in-mem db
-        emf = Persistence.createEntityManagerFactory(Util.JUNITPU);
-        em = emf.createEntityManager();
-
-        // Create necessary table
-        String sql = "CREATE TABLE `operationshistory10` (" + "`CLNAME` varchar(255)," + "`requestID` varchar(100),"
-                + "`actor` varchar(50) ," + "`operation` varchar(50)," + "`target` varchar(50),"
-                + "`starttime` timestamp," + "`outcome` varchar(50)," + "`message` varchar(255),"
-                + "`subrequestId` varchar(100)," + "`endtime` timestamp" + ")";
-        Query nq = em.createNativeQuery(sql);
-        em.getTransaction().begin();
-        nq.executeUpdate();
-        em.getTransaction().commit();
-    }
-
-    /**
-     * Clean up test class.
-     */
-    @AfterClass
-    public static void tearDown() {
-        String sql = "DROP TABLE `operationshistory10`";
-        Query nq = em.createNativeQuery(sql);
-        em.getTransaction().begin();
-        nq.executeUpdate();
-        em.getTransaction().commit();
-        em.close();
-        emf.close();
-    }
-
-    /**
-     * Setup method.
-     */
-    @Before
-    public void setUp() {
-        // clear the table
-        String sql = "DELETE FROM `operationshistory10`";
-        Query nq = em.createNativeQuery(sql);
-        em.getTransaction().begin();
-        nq.executeUpdate();
-        em.getTransaction().commit();
-    }
-
-    @Test
-    public void testAttributesRequired() {
-        assertTrue(pegs.attributesRequired().isEmpty());
-    }
-
-    @Test
-    public void testAttributesProvided() {
-        assertTrue(pegs.attributesProvided().isEmpty());
-    }
-
-    @Test
-    public void testGetAttributes() {
-        StdPIPRequest mockPipRequest = mock(StdPIPRequest.class);
-        EngineFinder mockPipFinder = mock(EngineFinder.class);
-
-        // Test issuer null
-        when(mockPipRequest.getIssuer()).thenReturn(null);
-        try {
-            assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pegs.getAttributes(mockPipRequest, mockPipFinder));
-        } catch (Exception e) {
-            fail("getAttributes failed");
-        }
-        
-        // Test issuer not equal to our issuer
-        pegs.setIssuer(ISSUER);
-        when(mockPipRequest.getIssuer()).thenReturn("something else");
-        try {
-            assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pegs.getAttributes(mockPipRequest, mockPipFinder));
-        } catch (Exception e) {
-            fail("getAttributes failed");
-        }
-        
-        // Test issuer equal to our issuer
-        when(mockPipRequest.getIssuer()).thenReturn(ISSUER);
-        try {
-            assertNotNull(pegs.getAttributes(mockPipRequest, mockPipFinder));
-        } catch (Exception e) {
-            // Normal to catch exception
-        }
-    }
-
-    @Test
-    public void testGetStatusFromDb() {
-
-        // Use reflection to run getStatsFromDB
-        Method method = null;
-        String status = null;
-        String addEntry;
-        Query nq;
-        
-        // Add an entry
-        addEntry = "insert into operationshistory10 (outcome, CLNAME, actor, operation, target, endtime)"
-            + "values('1','testcl', 'actor', 'op', 'testtarget', CURRENT_TIMESTAMP())";
-        nq = em.createNativeQuery(addEntry);
-        em.getTransaction().begin();
-        nq.executeUpdate();
-        em.getTransaction().commit();
-
-        try {
-            method = PipEngineGetStatus.class.getDeclaredMethod("getStatusFromDb", String.class, String.class);
-            method.setAccessible(true);
-            status = (String) method.invoke(null, "testcl", "testtarget");
-        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
-                | NoSuchMethodException e) {
-            fail(e.getLocalizedMessage());
-        }
-
-        // Status should be "success"
-        assertEquals("1", status);
-
-        // Add entries
-        addEntry = "insert into operationshistory10 (outcome, CLNAME, actor, operation, target, endtime)"
-            + "values('2','testcl', 'actor', 'op', 'testtarget', CURRENT_TIMESTAMP())";
-        nq = em.createNativeQuery(addEntry);
-        em.getTransaction().begin();
-        nq.executeUpdate();
-        em.getTransaction().commit();
-
-        addEntry = "insert into operationshistory10 (outcome, CLNAME, actor, operation, target, endtime)"
-            + "values('3','testcl', 'actor', 'op', 'testtarget2', CURRENT_TIMESTAMP())";
-        nq = em.createNativeQuery(addEntry);
-        em.getTransaction().begin();
-        nq.executeUpdate();
-        em.getTransaction().commit();
-
-        addEntry = "insert into operationshistory10 (outcome, CLNAME, actor, operation, target, endtime)"
-            + "values('4','testcl2', 'actor', 'op', 'testtarget2', CURRENT_TIMESTAMP())";
-        nq = em.createNativeQuery(addEntry);
-        em.getTransaction().begin();
-        nq.executeUpdate();
-        em.getTransaction().commit();
-        
-        try {
-            method = PipEngineGetStatus.class.getDeclaredMethod("getStatusFromDb", String.class, String.class);
-            method.setAccessible(true);
-            status = (String) method.invoke(null, "testcl", "testtarget");
-        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
-                | NoSuchMethodException e) {
-            fail(e.getLocalizedMessage());
-        }
-        assertEquals("2", status);
-
-        try {
-            method = PipEngineGetStatus.class.getDeclaredMethod("getStatusFromDb", String.class, String.class);
-            method.setAccessible(true);
-            status = (String) method.invoke(null, "testcl", "testtarget2");
-        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
-                | NoSuchMethodException e) {
-            fail(e.getLocalizedMessage());
-        }
-        assertEquals("3", status);
-
-        try {
-            method = PipEngineGetStatus.class.getDeclaredMethod("getStatusFromDb", String.class, String.class);
-            method.setAccessible(true);
-            status = (String) method.invoke(null, "testcl2", "testtarget2");
-        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
-                | NoSuchMethodException e) {
-            fail(e.getLocalizedMessage());
-        }
-        assertEquals("4", status);
-    }
-
-    @Test
-    public void testConfigure() throws PIPException {
-        PipEngineGetStatus pegs = new PipEngineGetStatus();
-        pegs.configure("Dorothy", new Properties());
-
-        pegs.setDescription(null);
-        pegs.setIssuer(null);
-        pegs.configure("Dorothy", new Properties());
-    }
-
-}
index 8b007fd..6526a9c 100644 (file)
@@ -174,13 +174,13 @@ public class PolicyGuardXacmlHelperTest {
         Identifier identifierCategory = new IdentifierImpl(new URI("http://somewhere.over.the.rainbow"));
         Collection<Attribute> listAttributes = new ArrayList<>();
         Identifier categoryIdIn = new IdentifierImpl(new URI("http://somewhere.over.the.rainbow/category"));
-        Identifier attributeIdIn0 = new IdentifierImpl(new URI("urn:oasis:names:tc:xacml:1.0:request:request-id"));
+        Identifier attributeIdIn0 = new IdentifierImpl(new URI("urn:org:onap:guard:request:request-id"));
         Identifier dataTypeIdIn = new IdentifierImpl(new URI("http://somewhere.over.the.rainbow.dataType"));
         AttributeValue<String> valueIn = new StdAttributeValue<String>(dataTypeIdIn, UUID.randomUUID().toString());
         Attribute attribute0 = new StdAttribute(categoryIdIn, attributeIdIn0, valueIn);
         listAttributes.add(attribute0);
 
-        Identifier attributeIdIn1 = new IdentifierImpl(new URI("urn:oasis:names:tc:xacml:1.0:operation:operation-id"));
+        Identifier attributeIdIn1 = new IdentifierImpl(new URI("urn:org:onap:guard:operation:operation-id"));
         Attribute attribute1 = new StdAttribute(categoryIdIn, attributeIdIn1, valueIn);
         listAttributes.add(attribute1);
         attributesIn.add(new StdAttributeCategory(identifierCategory, listAttributes));
index 73b9e18..b6d80e0 100644 (file)
@@ -1,47 +1,43 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ============LICENSE_START=======================================================
-  drools-applications
-  ================================================================================
-  Copyright (C) 2018 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 version="2.1"
-    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
-
-    <!-- In-mem DB for junit -->
-    <persistence-unit name="TestOperationsHistoryPU"
-        transaction-type="RESOURCE_LOCAL">
-        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
-        <properties>
-            <property name="eclipselink.ddl-generation"
-                value="create-or-extend-tables" />
-            <property name="javax.persistence.jdbc.driver"
-                value="org.h2.Driver" />
-            <property name="javax.persistence.jdbc.url"
-                value="jdbc:h2:mem:test" />
-            <property name="javax.persistence.jdbc.user"
-                value="sa" />
-            <property name="javax.persistence.jdbc.password"
-                value="" />
-            <property name="eclipselink.logging.level"
-                value="CONFIG" />
-        </properties>
-    </persistence-unit>
-
-
-</persistence>
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!--\r
+  ============LICENSE_START=======================================================\r
+  drools-applications\r
+  ================================================================================\r
+  Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.\r
+  ================================================================================\r
+  Licensed under the Apache License, Version 2.0 (the "License");\r
+  you may not use this file except in compliance with the License.\r
+  You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+  Unless required by applicable law or agreed to in writing, software\r
+  distributed under the License is distributed on an "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  See the License for the specific language governing permissions and\r
+  limitations under the License.\r
+  ============LICENSE_END=========================================================\r
+  -->\r
+<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">\r
+\r
+    <!-- In-mem DB for junit -->\r
+    <persistence-unit name="OperationsHistoryPUTest"\r
+        transaction-type="RESOURCE_LOCAL">\r
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>\r
+\r
+        <class>org.onap.policy.database.operationshistory.Dbao</class>\r
+\r
+        <properties>\r
+            <property name="eclipselink.ddl-generation" value="create-tables" />\r
+            <property name="eclipselink.logging.level" value="FINE" />\r
+            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>\r
+            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />\r
+            <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:testdb;DATABASE_TO_UPPER=FALSE" />\r
+            <property name="javax.persistence.jdbc.user" value="policy" />\r
+            <property name="javax.persistence.jdbc.password" value="P01icY" />\r
+            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>\r
+            <property name="javax.persistence.schema-generation.create-source" value="metadata"/>\r
+        </properties>\r
+    </persistence-unit>\r
+\r
+</persistence>\r
index 590b19d..1563e4a 100644 (file)
@@ -3,7 +3,7 @@
   ============LICENSE_START=======================================================
   drools-applications
   ================================================================================
-  Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+  Copyright (C) 2018-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.
@@ -33,7 +33,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${clname}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:clname:clname-id"
+                        AttributeId="urn:org:onap:guard:clname:clname-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -45,7 +45,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${actor}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:actor:actor-id"
+                        AttributeId="urn:org:onap:guard:actor:actor-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -55,7 +55,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${recipe}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:operation:operation-id"
+                        AttributeId="urn:org:onap:guard:operation:operation-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -86,7 +86,7 @@
                 FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">
                 <AttributeDesignator
                     Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
-                    AttributeId="urn:oasis:names:tc:xacml:1.0:target:target-id"
+                    AttributeId="urn:org:onap:guard:target:target-id"
                     DataType="http://www.w3.org/2001/XMLSchema#string"
                     MustBePresent="false" />
             </Apply>
index 34aa1af..d26432f 100644 (file)
@@ -3,7 +3,7 @@
   ============LICENSE_START=======================================================
   drools-applications
   ================================================================================
-  Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+  Copyright (C) 2018-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.
@@ -34,7 +34,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${clname}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:clname:clname-id"
+                        AttributeId="urn:org:onap:guard:clname:clname-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -46,7 +46,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${actor}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:actor:actor-id"
+                        AttributeId="urn:org:onap:guard:actor:actor-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -56,7 +56,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${recipe}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:operation:operation-id"
+                        AttributeId="urn:org:onap:guard:operation:operation-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -67,7 +67,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${targets}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:target:target-id"
+                        AttributeId="urn:org:onap:guard:target:target-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
index d9165ae..397cd59 100644 (file)
@@ -32,6 +32,7 @@
   <artifactId>common</artifactId>
 
   <modules>
+    <module>database</module>
     <module>guard</module>
     <module>coordination</module>
     <module>eventmanager</module>
index 16e7e80..203d410 100644 (file)
       <version>${policy.models.version}</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
+      <artifactId>database</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
     <dependency>
       <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
       <artifactId>guard</artifactId>
index d51a862..e0cd2c9 100644 (file)
@@ -51,6 +51,7 @@ import org.json.JSONObject;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
+import org.onap.policy.database.operationshistory.Dbao;
 import org.onap.policy.drools.system.PolicyEngine;
 import org.onap.policy.guard.PolicyGuardResponse;
 import org.onap.policy.guard.PolicyGuardXacmlRequestAttributes;
@@ -311,11 +312,11 @@ public class PolicyGuardXacmlHelperEmbedded {
             while (itAttr.hasNext()) {
                 Attribute currentAttr = itAttr.next();
                 String attributeId = currentAttr.getAttributeId().stringValue();
-                if ("urn:oasis:names:tc:xacml:1.0:request:request-id".equals(attributeId)) {
+                if ("urn:org:onap:guard:request:request-id".equals(attributeId)) {
                     Iterator<AttributeValue<?>> itValues = currentAttr.getValues().iterator();
                     reqIdFromXacmlResponse = UUID.fromString(itValues.next().getValue().toString());
                 }
-                if ("urn:oasis:names:tc:xacml:1.0:operation:operation-id".equals(attributeId)) {
+                if ("urn:org:onap:guard:operation:operation-id".equals(attributeId)) {
                     Iterator<AttributeValue<?>> itValues = currentAttr.getValues().iterator();
                     operationFromXacmlResponse = itValues.next().getValue().toString();
                 }
index 54cda95..0610ba9 100644 (file)
@@ -22,9 +22,9 @@
 <!--
 # PIP Engine Definition
 #
-xacml.pip.engines=getstatus
-getstatus.classname=org.onap.policy.guard.PipEngineGetStatus
-getstatus.issuer=org:onap:policy:guard:getstatus
+xacml.pip.engines=get-operation-outcome
+get-operation-outcome.classname=org.onap.policy.database.operationshistory.GetOperationOutcomePip
+get-operation-outcome.issuer=urn:org:onap:xacml:guard:get-operation-outcome"
 -->
 
 <Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" PolicyId="urn:com:att:xacml:policy:id:son:guard:UNIQUE_ID" Version="1" RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-unless-deny">
@@ -35,7 +35,7 @@ getstatus.issuer=org:onap:policy:guard:getstatus
         <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-regexp-match">
           <!-- value to be autofilled by yaml from a xacml template -->
           <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">CONTROL_LOOP_TWO</AttributeValue>
-          <AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" AttributeId="urn:oasis:names:tc:xacml:1.0:clname:clname-id" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false"/>
+          <AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" AttributeId="urn:org:onap:guard:clname:clname-id" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false"/>
         </Match>
       </AllOf>
     </AnyOf>
@@ -54,7 +54,11 @@ getstatus.issuer=org:onap:policy:guard:getstatus
   <VariableDefinition VariableId="clc_status">
     <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">
       <!-- to be autofilled by yaml from a xacml template -->
-      <AttributeDesignator Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" AttributeId="com:att:research:xacml:test:sql:resource:operations:status" DataType="http://www.w3.org/2001/XMLSchema#string" Issuer="org:onap:policy:guard:getstatus:clname:CONTROL_LOOP_ONE" MustBePresent="false"/>
+      <AttributeDesignator Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
+                          AttributeId="urn:org:onap:guard:operation:operation-outcome"
+                          DataType="http://www.w3.org/2001/XMLSchema#string"
+                          Issuer="urn:org:onap:xacml:guard:get-operation-outcome:clname:CONTROL_LOOP_ONE"
+                          MustBePresent="false"/>
     </Apply>
   </VariableDefinition>
 </Policy>
index a9f0a04..8a8dd89 100644 (file)
@@ -325,7 +325,7 @@ public final class SupportUtil {
      *  Set the operation history properties.
      */
     public static void setPuProp() {
-        System.setProperty(OPSHISTPUPROP, "TestOperationsHistoryPU");
+        System.setProperty(OPSHISTPUPROP, "OperationsHistoryPUTest");
     }
 
     /**
@@ -337,12 +337,12 @@ public final class SupportUtil {
         //
         // Connect to in-mem db
         //
-        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TestOperationsHistoryPU");
+        EntityManagerFactory emf = Persistence.createEntityManagerFactory("OperationsHistoryPUTest");
         EntityManager em = emf.createEntityManager();
         //
         // Create query
         //
-        String sql = "select * from operationshistory10";
+        String sql = "select * from operationshistory";
         Query nq = em.createNativeQuery(sql);
         List<?> results = null;
         //
index 808cef9..e1aa93f 100644 (file)
@@ -3,14 +3,14 @@
   ============LICENSE_START=======================================================\r
   drools-applications\r
   ================================================================================\r
-  Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.\r
+  Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.\r
   ================================================================================\r
   Licensed under the Apache License, Version 2.0 (the "License");\r
   you may not use this file except in compliance with the License.\r
   You may obtain a copy of the License at\r
-  \r
+\r
        http://www.apache.org/licenses/LICENSE-2.0\r
-  \r
+\r
   Unless required by applicable law or agreed to in writing, software\r
   distributed under the License is distributed on an "AS IS" BASIS,\r
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
   limitations under the License.\r
   ============LICENSE_END=========================================================\r
   -->\r
-<persistence version="2.1"\r
-    xmlns="http://xmlns.jcp.org/xml/ns/persistence"\r
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">\r
+<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">\r
 \r
     <!-- In-mem DB for junit -->\r
-    <persistence-unit name="TestOperationsHistoryPU"\r
+    <persistence-unit name="OperationsHistoryPUTest"\r
         transaction-type="RESOURCE_LOCAL">\r
         <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>\r
-        <class>org.onap.policy.controlloop.eventmanager.OperationsHistoryDbEntry</class>\r
+\r
+       <class>org.onap.policy.database.operationshistory.Dbao</class>\r
+\r
         <properties>\r
-            <property name="eclipselink.ddl-generation"\r
-                value="create-tables" />\r
-            <property name="javax.persistence.jdbc.driver"\r
-                value="org.h2.Driver" />\r
-            <property name="javax.persistence.jdbc.url"\r
-                value="jdbc:h2:mem:test" />\r
-            <property name="javax.persistence.jdbc.user"\r
-                value="sa" />\r
-            <property name="javax.persistence.jdbc.password"\r
-                value="" />\r
-            <property name="eclipselink.logging.level"\r
-                value="CONFIG" />\r
+            <property name="eclipselink.ddl-generation" value="create-tables" />\r
+            <property name="eclipselink.logging.level" value="FINE" />\r
+           <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>\r
+            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />\r
+            <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:testdb;DATABASE_TO_UPPER=FALSE" />\r
+            <property name="javax.persistence.jdbc.user" value="policy" />\r
+            <property name="javax.persistence.jdbc.password" value="P01icY" />\r
+            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>\r
+            <property name="javax.persistence.schema-generation.create-source" value="metadata"/>\r
         </properties>\r
     </persistence-unit>\r
 \r
-\r
 </persistence>\r
index edc7651..fa9568b 100644 (file)
@@ -42,5 +42,6 @@ xacml.att.policyFinderFactory=com.att.research.xacmlatt.pdp.std.StdPolicyFinderF
 #
 
 # In case we have multiple applicable Guard policies, we will deny if any of them denies.
-#xacml.att.policyFinderFactory.combineRootPolicies=urn:com:att:xacml:3.0:policy-combining-algorithm:combined-deny-overrides
 xacml.att.policyFinderFactory.combineRootPolicies=urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny
+
+get-operation-outcome.persistenceunit=OperationsHistoryPUTest
\ No newline at end of file
index 2471f92..862fa28 100644 (file)
       <artifactId>sdnc</artifactId>
       <version>${policy.models.version}</version>
       <scope>provided</scope>
-    </dependency>    
+    </dependency>
     <dependency>
       <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
       <artifactId>events</artifactId>
       <version>${policy.models.version}</version>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
+      <artifactId>database</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
     <dependency>
       <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
       <artifactId>guard</artifactId>
       <artifactId>actor.sdnc</artifactId>
       <version>${policy.models.version}</version>
       <scope>provided</scope>
-    </dependency>    
+    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
     </dependency>
   </dependencies>
 </project>
-
index 590b19d..1563e4a 100644 (file)
@@ -3,7 +3,7 @@
   ============LICENSE_START=======================================================
   drools-applications
   ================================================================================
-  Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+  Copyright (C) 2018-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.
@@ -33,7 +33,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${clname}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:clname:clname-id"
+                        AttributeId="urn:org:onap:guard:clname:clname-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -45,7 +45,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${actor}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:actor:actor-id"
+                        AttributeId="urn:org:onap:guard:actor:actor-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -55,7 +55,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${recipe}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:operation:operation-id"
+                        AttributeId="urn:org:onap:guard:operation:operation-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -86,7 +86,7 @@
                 FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">
                 <AttributeDesignator
                     Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
-                    AttributeId="urn:oasis:names:tc:xacml:1.0:target:target-id"
+                    AttributeId="urn:org:onap:guard:target:target-id"
                     DataType="http://www.w3.org/2001/XMLSchema#string"
                     MustBePresent="false" />
             </Apply>
index 34aa1af..d26432f 100644 (file)
@@ -3,7 +3,7 @@
   ============LICENSE_START=======================================================
   drools-applications
   ================================================================================
-  Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+  Copyright (C) 2018-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.
@@ -34,7 +34,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${clname}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:clname:clname-id"
+                        AttributeId="urn:org:onap:guard:clname:clname-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -46,7 +46,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${actor}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:actor:actor-id"
+                        AttributeId="urn:org:onap:guard:actor:actor-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -56,7 +56,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${recipe}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:operation:operation-id"
+                        AttributeId="urn:org:onap:guard:operation:operation-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -67,7 +67,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${targets}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:target:target-id"
+                        AttributeId="urn:org:onap:guard:target:target-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
index b41fdb3..e1e3451 100644 (file)
@@ -3,7 +3,7 @@
   ============LICENSE_START=======================================================
   drools-applications
   ================================================================================
-  Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+  Copyright (C) 2018-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.
@@ -32,7 +32,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${actor}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:actor:actor-id"
+                        AttributeId="urn:org:onap:guard:actor:actor-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
@@ -42,7 +42,7 @@
                         DataType="http://www.w3.org/2001/XMLSchema#string">${recipe}</AttributeValue>
                     <AttributeDesignator
                         Category="urn:oasis:names:tc:xacml:3.0:attribute-category:action"
-                        AttributeId="urn:oasis:names:tc:xacml:1.0:operation:operation-id"
+                        AttributeId="urn:org:onap:guard:operation:operation-id"
                         DataType="http://www.w3.org/2001/XMLSchema#string"
                         MustBePresent="false" />
                 </Match>
index d5eb28e..3091656 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * demo
  * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-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.
@@ -341,7 +341,7 @@ public final class SupportUtil {
      *  Set the operation history properties.
      */
     public static void setPuProp() {
-        System.setProperty(OPSHISTPUPROP, "TestOperationsHistoryPU");
+        System.setProperty(OPSHISTPUPROP, "OperationsHistoryPUTest");
     }
 
     /**
index 808cef9..b6d80e0 100644 (file)
@@ -3,14 +3,14 @@
   ============LICENSE_START=======================================================\r
   drools-applications\r
   ================================================================================\r
-  Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.\r
+  Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.\r
   ================================================================================\r
   Licensed under the Apache License, Version 2.0 (the "License");\r
   you may not use this file except in compliance with the License.\r
   You may obtain a copy of the License at\r
-  \r
+\r
        http://www.apache.org/licenses/LICENSE-2.0\r
-  \r
+\r
   Unless required by applicable law or agreed to in writing, software\r
   distributed under the License is distributed on an "AS IS" BASIS,\r
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
   limitations under the License.\r
   ============LICENSE_END=========================================================\r
   -->\r
-<persistence version="2.1"\r
-    xmlns="http://xmlns.jcp.org/xml/ns/persistence"\r
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">\r
+<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">\r
 \r
     <!-- In-mem DB for junit -->\r
-    <persistence-unit name="TestOperationsHistoryPU"\r
+    <persistence-unit name="OperationsHistoryPUTest"\r
         transaction-type="RESOURCE_LOCAL">\r
         <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>\r
-        <class>org.onap.policy.controlloop.eventmanager.OperationsHistoryDbEntry</class>\r
+\r
+        <class>org.onap.policy.database.operationshistory.Dbao</class>\r
+\r
         <properties>\r
-            <property name="eclipselink.ddl-generation"\r
-                value="create-tables" />\r
-            <property name="javax.persistence.jdbc.driver"\r
-                value="org.h2.Driver" />\r
-            <property name="javax.persistence.jdbc.url"\r
-                value="jdbc:h2:mem:test" />\r
-            <property name="javax.persistence.jdbc.user"\r
-                value="sa" />\r
-            <property name="javax.persistence.jdbc.password"\r
-                value="" />\r
-            <property name="eclipselink.logging.level"\r
-                value="CONFIG" />\r
+            <property name="eclipselink.ddl-generation" value="create-tables" />\r
+            <property name="eclipselink.logging.level" value="FINE" />\r
+            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>\r
+            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />\r
+            <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:testdb;DATABASE_TO_UPPER=FALSE" />\r
+            <property name="javax.persistence.jdbc.user" value="policy" />\r
+            <property name="javax.persistence.jdbc.password" value="P01icY" />\r
+            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>\r
+            <property name="javax.persistence.schema-generation.create-source" value="metadata"/>\r
         </properties>\r
     </persistence-unit>\r
 \r
-\r
 </persistence>\r
index 0486f95..175b9d3 100644 (file)
@@ -7,9 +7,9 @@
 # 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.
@@ -48,8 +48,7 @@ xacml.att.policyFinderFactory=com.att.research.xacmlatt.pdp.std.StdPolicyFinderF
 # the embedded PDP uses.
 #
 
-# In case we have multiple applicable Guard policies, we will deny if any of them denies. 
-#xacml.att.policyFinderFactory.combineRootPolicies=urn:com:att:xacml:3.0:policy-combining-algorithm:combined-deny-overrides
+# In case we have multiple applicable Guard policies, we will deny if any of them denies.
 xacml.att.policyFinderFactory.combineRootPolicies=urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny
 
 
@@ -65,7 +64,9 @@ p5.file=src/test/resources/xacml/autogenerated_blacklist.xml
 
 # PIP Engine Definition
 #
-xacml.pip.engines=historydb
-historydb.classname=org.onap.policy.guard.PipEngineGetHistory
-historydb.issuer=com:att:research:xacml:guard:historydb
-
+xacml.pip.engines=count-recent-operations
+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