summaryrefslogtreecommitdiffstats
path: root/controlloop/common/database
diff options
context:
space:
mode:
authorJim Hahn <jrh3@att.com>2020-05-29 11:59:53 -0400
committerJim Hahn <jrh3@att.com>2020-06-01 11:08:16 -0400
commit1e39c988604c9ffb8efc38ef3cf4d635b202c7b9 (patch)
tree390dc73ef150bb99dcf00577a2838a686baf8c59 /controlloop/common/database
parentd00b8ebd5b28a64ae988e7424d8feb2314a8d475 (diff)
Use OperationsHistory from models
Deleted Dbao and replaced it with the shared class in policy-models. Also had to update the queries and the persistence.xml accordingly. Note: with this change, the "database" project is no longer needed, so it was deleted. Issue-ID: POLICY-2581 Change-Id: Idfde68b28b3a27f2ee794fa477d15e0f12717373 Signed-off-by: Jim Hahn <jrh3@att.com>
Diffstat (limited to 'controlloop/common/database')
-rw-r--r--controlloop/common/database/pom.xml96
-rw-r--r--controlloop/common/database/src/main/java/org/onap/policy/database/ToscaDictionary.java140
-rw-r--r--controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/CountRecentOperationsPip.java200
-rw-r--r--controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/Dbao.java79
-rw-r--r--controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/GetOperationOutcomePip.java133
-rw-r--r--controlloop/common/database/src/main/java/org/onap/policy/database/std/StdOnapPip.java249
-rw-r--r--controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/CountRecentOperationsPipTest.java288
-rw-r--r--controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/GetOperationOutcomePipTest.java273
-rw-r--r--controlloop/common/database/src/test/java/org/onap/policy/database/std/DbaoTest.java70
-rw-r--r--controlloop/common/database/src/test/java/org/onap/policy/database/std/StdOnapPipTest.java268
-rw-r--r--controlloop/common/database/src/test/resources/META-INF/persistence.xml43
-rw-r--r--controlloop/common/database/src/test/resources/test.properties38
12 files changed, 0 insertions, 1877 deletions
diff --git a/controlloop/common/database/pom.xml b/controlloop/common/database/pom.xml
deleted file mode 100644
index 8651dc781..000000000
--- a/controlloop/common/database/pom.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-<!--
- ============LICENSE_START=======================================================
- drools-applications
- ================================================================================
- Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
- Modifications Copyright (C) 2020 Bell Canada.
- ================================================================================
- 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>drools-applications-common</artifactId>
- <version>1.7.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>database</artifactId>
-
- <dependencies>
- <dependency>
- <groupId>com.att.research.xacml</groupId>
- <artifactId>xacml-pdp</artifactId>
- <version>2.0.1</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <scope>provided</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>
- </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 -->
- <sourceDirectories>${project.build.sourceDirectory}</sourceDirectories>
- <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
deleted file mode 100644
index b04a5b4d2..000000000
--- a/controlloop/common/database/src/main/java/org/onap/policy/database/ToscaDictionary.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*-
- * ============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
deleted file mode 100644
index 7b6f13611..000000000
--- a/controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/CountRecentOperationsPip.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*-
- * ============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 java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Properties;
-import java.util.Set;
-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);
-
- private static final Set<String> TIME_WINDOW_SCALES = Collections
- .unmodifiableSet(new HashSet<>(Arrays.asList("minute", "hour", "day", "week", "month", "year")));
-
- 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, ISSUER_NAME);
- }
-
- /**
- * 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());
-
- if (isRequestInvalid(pipRequest)) {
- 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 (! TIME_WINDOW_SCALES.contains(timeWindowScale.toLowerCase())) {
- //
- // 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 (RuntimeException 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 number
- //
- if (result instanceof Number) {
- return ((Number) 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
deleted file mode 100644
index ce0adb0c7..000000000
--- a/controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/Dbao.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP
- * ================================================================================
- * Copyright (C) 2019-2020 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.Index;
-import javax.persistence.Table;
-import lombok.Data;
-
-@Entity
-@Table(name = "operationshistory",
- indexes = {@Index(name = "operationshistory_clreqid_index", columnList = "closedLoopName,requestId"),
- @Index(name = "operationshistory_target_index", columnList = "target,operation,actor")})
-@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
deleted file mode 100644
index 5a0db0501..000000000
--- a/controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/GetOperationOutcomePip.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*-
- * ============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 java.util.Arrays;
-import java.util.Collection;
-import java.util.Properties;
-import javax.persistence.NoResultException;
-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, ISSUER_NAME);
- }
-
- /**
- * 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());
-
- if (isRequestInvalid(pipRequest)) {
- 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 = getTarget(pipFinder);
- //
- // Sanity check
- //
- if (target == null) {
- //
- // See if we have all the values
- //
- logger.error("missing attributes return empty");
- return StdPIPResponse.PIP_RESPONSE_EMPTY;
- }
-
- 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
deleted file mode 100644
index ab5fc4ec7..000000000
--- a/controlloop/common/database/src/main/java/org/onap/policy/database/std/StdOnapPip.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP
- * ================================================================================
- * Copyright (C) 2019-2020 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 javax.persistence.Persistence;
-import org.apache.commons.lang3.StringUtils;
-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();
- }
-
- /**
- * Configures this object and initializes {@link #em}.
- *
- * @param id name of this engine
- * @param properties configuration properties
- * @param issuerName name of this issuer, used to identify the persistence unit
- * @throws PIPException if an error occurs
- */
- protected void configure(String id, Properties properties, String issuerName) throws PIPException {
- super.configure(id, properties);
- logger.debug("Configuring historyDb PIP {}", properties);
- this.properties = 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(issuerName + ".persistenceunit"),
- emProperties).createEntityManager();
- } catch (Exception e) {
- logger.error("Persistence failed operations history db", e);
- }
- }
-
- /**
- * Determines if a request is valid.
- *
- * @param pipRequest request to validate
- * @return {@code true} if the request is <i>NOT</i> valid, {@code false} if it is
- */
- protected boolean isRequestInvalid(PIPRequest pipRequest) {
- //
- // Determine if the issuer is correct
- //
- if (StringUtils.isBlank(pipRequest.getIssuer())) {
- logger.debug("issuer is null - returning empty response");
- //
- // We only respond to ourself as the issuer
- //
- return true;
- }
- 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 true;
- }
-
- return false;
- }
-
- 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);
- }
- return pipResponse;
- }
-
- protected String findFirstAttributeValue(PIPResponse pipResponse) {
- for (Attribute attribute : pipResponse.getAttributes()) {
- Iterator<AttributeValue<String>> iterAttributeValues = attribute.findValues(DataTypes.DT_STRING);
- if (iterAttributeValues == null) {
- continue;
- }
-
- 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) {
- try {
- AttributeValue<BigInteger> attributeValue = DataTypes.DT_INTEGER.createAttributeValue(value);
- stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
- pipRequest.getIssuer(), false));
- } catch (Exception e) {
- logger.error("Failed to convert {} to integer", value, e);
- }
- }
-
- protected void addStringAttribute(StdMutablePIPResponse stdPipResponse, Identifier category, Identifier attributeId,
- String value, PIPRequest pipRequest) {
- try {
- AttributeValue<String> attributeValue = DataTypes.DT_STRING.createAttributeValue(value);
- stdPipResponse.addAttribute(new StdMutableAttribute(category, attributeId, attributeValue,
- pipRequest.getIssuer(), false));
- } catch (Exception ex) {
- logger.error("Failed to convert {} to an AttributeValue<String>", value, ex);
- }
- }
-
-}
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
deleted file mode 100644
index 66b412028..000000000
--- a/controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/CountRecentOperationsPipTest.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*-
- * ============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 static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-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.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.StdPIPResponse;
-import java.io.FileInputStream;
-import java.sql.Date;
-import java.time.Instant;
-import java.util.Collection;
-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.database.ToscaDictionary;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class CountRecentOperationsPipTest {
- private static final String ID = "issuer";
- private static final Logger LOGGER = LoggerFactory.getLogger(CountRecentOperationsPipTest.class);
- private static final String ISSUER = ToscaDictionary.GUARD_ISSUER_PREFIX + "-my-issuer:tw:1:HOUR";
- private static final String ACTOR = "Controller";
- private static final String RECIPE = "operationA";
- private static final String TARGET = "vnf-1";
- private static final String EXPECTED_EXCEPTION = "expected exception";
-
- private static MyPip pipEngine;
- private static Properties properties;
-
- private static EntityManagerFactory emf;
- private static EntityManager em;
-
- private PIPRequest req;
-
- /**
- * Create an instance of our engine and also the persistence
- * factory.
- *
- * @throws Exception connectivity issues
- */
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- LOGGER.info("Setting up PIP Testing");
- //
- // Create instance
- //
- pipEngine = new MyPip();
- //
- // Load our test properties to use
- //
- properties = new Properties();
- try (FileInputStream is = new FileInputStream("src/test/resources/test.properties")) {
- properties.load(is);
- }
- //
- // Configure it using properties
- //
- pipEngine.configure(ID, 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);
- emf = Persistence.createEntityManagerFactory(properties.getProperty(persistenceUnit), properties);
- em = emf.createEntityManager();
- //
- //
- //
- LOGGER.info("Configured own entity manager");
- }
-
- @Before
- public void setUp() {
- req = mock(PIPRequest.class);
- when(req.getIssuer()).thenReturn(ISSUER);
- }
-
- 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(ACTOR);
- newEntry.setOperation(RECIPE);
- newEntry.setStarttime(Date.from(Instant.now().minusMillis(20000)));
- newEntry.setEndtime(Date.from(Instant.now()));
- newEntry.setRequestId(UUID.randomUUID().toString());
- return newEntry;
- }
-
- @Test
- public void testAttributesRequired() {
- assertEquals(3, pipEngine.attributesRequired().size());
- }
-
- @Test
- public void testGetAttributes_InvalidRequestInfo() throws PIPException {
- // invalid request - null issuer
- when(req.getIssuer()).thenReturn(null);
- assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pipEngine.getAttributes(req, null));
-
- /*
- * Make a valid issuer in the request, for subsequent tests.
- */
- when(req.getIssuer()).thenReturn(ISSUER);
-
- // null actor
- MyPip pip = new MyPip() {
- @Override
- protected String getActor(PIPFinder pipFinder) {
- return null;
- }
- };
- pip.configure(ID, properties);
- assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pip.getAttributes(req, null));
-
- // null recipe
- pip = new MyPip() {
- @Override
- protected String getRecipe(PIPFinder pipFinder) {
- return null;
- }
- };
- pip.configure(ID, properties);
- assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pip.getAttributes(req, null));
-
- // null target
- pip = new MyPip() {
- @Override
- protected String getTarget(PIPFinder pipFinder) {
- return null;
- }
- };
- pip.configure(ID, properties);
- assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pip.getAttributes(req, null));
- }
-
- @Test
- public void testDoDatabaseQuery() throws Exception {
-
- //
- // No entries yet
- //
- assertEquals(0, getCount(pipEngine.getAttributes(req, null)));
- //
- // Add entry
- //
- em.getTransaction().begin();
- em.persist(createEntry("cl-foobar-1", TARGET, "SUCCESS"));
- 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());
- //
- // Should count 1 entry now
- //
- assertEquals(1, getCount(pipEngine.getAttributes(req, null)));
- }
-
- @Test
- public void testDoDatabaseQuery_InvalidTimeWindow() throws Exception {
- when(req.getIssuer()).thenReturn(ISSUER + "invalid time window");
-
- assertEquals(-1, getCount(pipEngine.getAttributes(req, null)));
- }
-
- @Test
- public void testDoDatabaseQuery_NullEm() throws Exception {
- assertEquals(-1, getCount(new MyPip().getAttributes(req, null)));
- }
-
- @Test
- public void testDoDatabaseQuery_EmException() throws Exception {
- MyPip pip = new MyPip() {
- @Override
- public void configure(String id, Properties properties) throws PIPException {
- em = mock(EntityManager.class);
- when(em.createNativeQuery(any())).thenThrow(new RuntimeException(EXPECTED_EXCEPTION));
- }
- };
- pip.configure(ID, properties);
-
- assertEquals(-1, getCount(pip.getAttributes(req, null)));
- }
-
- @Test
- public void testDoDatabaseQuery_NonNumeric() throws Exception {
- MyPip pip = new MyPip() {
- @Override
- public void configure(String id, Properties properties) throws PIPException {
- em = mock(EntityManager.class);
- Query query = mock(Query.class);
- when(em.createNativeQuery(any())).thenReturn(query);
- when(query.setParameter(anyInt(), any())).thenReturn(query);
- when(query.getSingleResult()).thenReturn("200");
- }
- };
- pip.configure(ID, properties);
-
- assertEquals(200, getCount(pip.getAttributes(req, null)));
- }
-
- private int getCount(PIPResponse resp) {
- Collection<Attribute> attrs = resp.getAttributes();
- assertEquals(1, attrs.size());
-
- Attribute attr = attrs.iterator().next();
- assertEquals(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE, attr.getCategory());
- assertEquals(ToscaDictionary.ID_RESOURCE_GUARD_OPERATIONCOUNT, attr.getAttributeId());
-
- Collection<AttributeValue<?>> values = attr.getValues();
- assertEquals(1, values.size());
-
- AttributeValue<?> value = values.iterator().next();
- return ((Number) value.getValue()).intValue();
- }
-
- /**
- * Close the entity manager.
- */
- @AfterClass
- public static void cleanup() {
- if (emf != null) {
- emf.close();
- }
- }
-
- private static class MyPip extends CountRecentOperationsPip {
-
- @Override
- protected String getActor(PIPFinder pipFinder) {
- return ACTOR;
- }
-
- @Override
- protected String getRecipe(PIPFinder pipFinder) {
- return RECIPE;
- }
-
- @Override
- protected String getTarget(PIPFinder pipFinder) {
- return TARGET;
- }
- }
-}
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
deleted file mode 100644
index 5ab850722..000000000
--- a/controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/GetOperationOutcomePipTest.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*-
- * ============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 static org.junit.Assert.assertNull;
-import static org.mockito.ArgumentMatchers.anyString;
-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.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.StdPIPResponse;
-import java.io.FileInputStream;
-import java.sql.Date;
-import java.time.Instant;
-import java.util.Collection;
-import java.util.Properties;
-import java.util.UUID;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.NoResultException;
-import javax.persistence.Persistence;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.onap.policy.database.ToscaDictionary;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class GetOperationOutcomePipTest {
- private static final String ID = "issuer";
- private static final String TEST_CL1 = "testcl1";
- private static final String TEST_TARGET1 = "testtarget1";
- private static final String TEST_TARGET2 = "testtarget2";
- private static final String ACTOR = "Controller";
- private static final String RECIPE = "operationA";
- private static final String EXPECTED_EXCEPTION = "expected exception";
- private static final String ISSUER_PREFIX = ToscaDictionary.GUARD_ISSUER_PREFIX + "-my-issuer:clname:";
- private static final String ISSUER = ISSUER_PREFIX + TEST_CL1;
- private static final Logger LOGGER = LoggerFactory.getLogger(GetOperationOutcomePipTest.class);
-
- private static MyPip pipEngine;
- private static Properties properties;
-
- private static EntityManagerFactory emf;
- private static EntityManager em;
-
- private PIPRequest req;
-
- /**
- * Create an instance of our engine and also the persistence
- * factory.
- *
- * @throws Exception connectivity issues
- */
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- LOGGER.info("Setting up PIP Testing");
- //
- // Create instance
- //
- pipEngine = new MyPip(TEST_TARGET1);
- //
- // Load our test properties to use
- //
- properties = new Properties();
- try (FileInputStream is = new FileInputStream("src/test/resources/test.properties")) {
- properties.load(is);
- }
- //
- // Configure it using properties
- //
- pipEngine.configure(ID, 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);
- emf = Persistence.createEntityManagerFactory(properties.getProperty(persistenceUnit), properties);
- em = emf.createEntityManager();
- //
- //
- //
- LOGGER.info("Configured own entity manager", em.toString());
- }
-
- @Before
- public void setUp() {
- req = mock(PIPRequest.class);
- when(req.getIssuer()).thenReturn(ISSUER);
- }
-
- 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(ACTOR);
- newEntry.setOperation(RECIPE);
- 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 testAttributesRequired() {
- assertEquals(1, pipEngine.attributesRequired().size());
- }
-
- @Test
- public void testGetAttributes_InvalidRequestInfo() throws PIPException {
- // invalid request - null issuer
- when(req.getIssuer()).thenReturn(null);
- assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pipEngine.getAttributes(req, null));
-
- /*
- * Make a valid issuer in the request, for subsequent tests.
- */
- when(req.getIssuer()).thenReturn(ISSUER);
-
- // null target
- MyPip pip = new MyPip(null);
- pip.configure(ID, properties);
- assertEquals(StdPIPResponse.PIP_RESPONSE_EMPTY, pip.getAttributes(req, null));
- }
-
- @Test
- public void testDoDatabaseQuery() throws Exception {
- //
- // Insert entry
- //
- insertEntry(TEST_CL1, TEST_TARGET1, "1");
- //
- // outcome should be "1"
- //
- assertEquals("1", getOutcome(pipEngine.getAttributes(req, null)));
- //
- // Insert more entries
- //
- insertEntry(TEST_CL1, TEST_TARGET1, "2");
- insertEntry("testcl2", TEST_TARGET2, "3");
- insertEntry(TEST_CL1, TEST_TARGET2, "4");
- //
- // Test pipEngine
- //
- assertEquals("2", getOutcome(TEST_CL1, TEST_TARGET1));
-
- assertEquals("3", getOutcome("testcl2", TEST_TARGET2));
-
- assertEquals("4", getOutcome(TEST_CL1, TEST_TARGET2));
- }
-
- @Test
- public void testDoDatabaseQuery_NoResult() throws Exception {
- MyPip pip = new MyPip(TEST_TARGET1) {
- @Override
- public void configure(String id, Properties properties) throws PIPException {
- em = mock(EntityManager.class);
- when(em.createQuery(anyString())).thenThrow(new NoResultException());
- }
- };
- pip.configure(ID, properties);
-
- assertNull(getOutcome(pip.getAttributes(req, null)));
- }
-
- @Test
- public void testDoDatabaseQuery_EmException() throws Exception {
- MyPip pip = new MyPip(TEST_TARGET1) {
- @Override
- public void configure(String id, Properties properties) throws PIPException {
- em = mock(EntityManager.class);
- when(em.createQuery(anyString())).thenThrow(new RuntimeException(EXPECTED_EXCEPTION));
- }
- };
- pip.configure(ID, properties);
-
- assertEquals(null, getOutcome(pip.getAttributes(req, null)));
- }
-
- private String getOutcome(String clname, String target) throws PIPException {
- req = mock(PIPRequest.class);
- when(req.getIssuer()).thenReturn(ISSUER_PREFIX + clname);
-
- MyPip pip = new MyPip(target);
- pip.configure(ID, properties);
-
- return getOutcome(pip.getAttributes(req, null));
- }
-
- private String getOutcome(PIPResponse resp) {
- Collection<Attribute> attrs = resp.getAttributes();
- assertEquals(1, attrs.size());
-
- Attribute attr = attrs.iterator().next();
- assertEquals(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE, attr.getCategory());
- assertEquals(ToscaDictionary.ID_RESOURCE_GUARD_OPERATIONOUTCOME, attr.getAttributeId());
-
- Collection<AttributeValue<?>> values = attr.getValues();
- assertEquals(1, values.size());
-
- AttributeValue<?> value = values.iterator().next();
- return (String) value.getValue();
- }
-
- /**
- * Close the entity manager.
- */
- @AfterClass
- public static void cleanup() {
- if (emf != null) {
- emf.close();
- }
- }
-
- private static class MyPip extends GetOperationOutcomePip {
- private String target;
-
- public MyPip(String target) {
- this.target = target;
- }
-
- @Override
- protected String getActor(PIPFinder pipFinder) {
- return ACTOR;
- }
-
- @Override
- protected String getRecipe(PIPFinder pipFinder) {
- return RECIPE;
- }
-
- @Override
- protected String getTarget(PIPFinder pipFinder) {
- return target;
- }
- }
-}
diff --git a/controlloop/common/database/src/test/java/org/onap/policy/database/std/DbaoTest.java b/controlloop/common/database/src/test/java/org/onap/policy/database/std/DbaoTest.java
deleted file mode 100644
index 43c6157cf..000000000
--- a/controlloop/common/database/src/test/java/org/onap/policy/database/std/DbaoTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*-
- * ============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.std;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Date;
-import org.junit.Test;
-import org.onap.policy.database.operationshistory.Dbao;
-
-public class DbaoTest {
-
- @Test
- public void test() {
- Dbao dao = new Dbao();
-
- dao.setActor("my-actor");
- dao.setClosedLoopName("cl-name");
- Date endDate = new Date();
- dao.setEndtime(endDate);
- dao.setId(100L);
- dao.setMessage("my-message");
- dao.setOperation("my-operation");
- dao.setOutcome("my-outcome");
- dao.setRequestId("my-request");
- Date startDate = new Date(endDate.getTime() - 1);
- dao.setStarttime(startDate);
- dao.setSubrequestId("my-sub");
- dao.setTarget("my-target");
-
- assertEquals("my-actor", dao.getActor());
- assertEquals("cl-name", dao.getClosedLoopName());
- assertEquals(endDate, dao.getEndtime());
- assertEquals(100L, dao.getId().longValue());
- assertEquals("my-message", dao.getMessage());
- assertEquals("my-operation", dao.getOperation());
- assertEquals("my-outcome", dao.getOutcome());
- assertEquals("my-request", dao.getRequestId());
- assertEquals(startDate, dao.getStarttime());
- assertEquals("my-sub", dao.getSubrequestId());
- assertEquals("my-target", dao.getTarget());
-
- assertTrue(dao.toString().startsWith("Dbao"));
-
- int hc = dao.hashCode();
- dao.setId(101L);
- assertTrue(hc != dao.hashCode());
-
- assertTrue(dao.equals(dao));
- assertFalse(dao.equals(new Dbao()));
- }
-}
diff --git a/controlloop/common/database/src/test/java/org/onap/policy/database/std/StdOnapPipTest.java b/controlloop/common/database/src/test/java/org/onap/policy/database/std/StdOnapPipTest.java
deleted file mode 100644
index de186c41d..000000000
--- a/controlloop/common/database/src/test/java/org/onap/policy/database/std/StdOnapPipTest.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*-
- * ============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.std;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-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.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.datatypes.DataTypes;
-import com.att.research.xacml.std.pip.StdMutablePIPResponse;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.function.Function;
-import org.junit.Before;
-import org.junit.Test;
-import org.onap.policy.database.ToscaDictionary;
-
-public class StdOnapPipTest {
- private static final String EXPECTED_EXCEPTION = "expected exception";
- private static final String A_VALUE = "a-value";
- private static final String ISSUER = ToscaDictionary.GUARD_ISSUER_PREFIX + "-my-issuer";
-
- private MyPip pip;
- private PIPRequest req;
- private PIPFinder finder;
- private StdMutablePIPResponse resp;
-
- /**
- * Initializes mocks and populates {@link #pip}.
- */
- @Before
- public void setUp() {
- req = mock(PIPRequest.class);
- finder = mock(PIPFinder.class);
- resp = new StdMutablePIPResponse();
-
- when(req.getIssuer()).thenReturn(ISSUER);
-
- pip = new MyPip();
- }
-
- @Test
- public void testAttributesProvided() {
- assertTrue(pip.attributesProvided().isEmpty());
- }
-
- @Test
- public void testIsRequestInvalid() {
- // valid issuer
- when(req.getIssuer()).thenReturn(ISSUER);
- assertFalse(pip.isRequestInvalid(req));
-
- // invalid issuer
- when(req.getIssuer()).thenReturn("bogus-issuer");
- assertTrue(pip.isRequestInvalid(req));
-
- // null issuer
- when(req.getIssuer()).thenReturn(null);
- assertTrue(pip.isRequestInvalid(req));
- }
-
- @Test
- public void testGetActor() {
- testGetArbitraryAttribute(StdOnapPip.PIP_REQUEST_ACTOR, pip2 -> pip2.getActor(finder));
- }
-
- @Test
- public void testGetRecipe() {
- testGetArbitraryAttribute(StdOnapPip.PIP_REQUEST_RECIPE, pip2 -> pip2.getRecipe(finder));
- }
-
- @Test
- public void testGetTarget() {
- testGetArbitraryAttribute(StdOnapPip.PIP_REQUEST_TARGET, pip2 -> pip2.getTarget(finder));
- }
-
- private void testGetArbitraryAttribute(PIPRequest request, Function<StdOnapPip, String> getter) {
- // target found
- pip = new MyPip() {
- @Override
- protected PIPResponse getAttribute(PIPRequest pipRequest, PIPFinder pipFinder) {
- return resp;
- }
-
- @Override
- protected String findFirstAttributeValue(PIPResponse pipResponse) {
- return A_VALUE;
- }
- };
-
- pip = spy(pip);
-
- assertEquals(A_VALUE, getter.apply(pip));
- verify(pip).getAttribute(request, finder);
- verify(pip).findFirstAttributeValue(resp);
-
-
- // not found
- pip = new MyPip() {
- @Override
- protected PIPResponse getAttribute(PIPRequest pipRequest, PIPFinder pipFinder) {
- return null;
- }
-
- @Override
- protected String findFirstAttributeValue(PIPResponse pipResponse) {
- return A_VALUE;
- }
- };
-
- pip = spy(pip);
-
- assertNull(getter.apply(pip));
- verify(pip).getAttribute(request, finder);
- verify(pip, never()).findFirstAttributeValue(resp);
- }
-
- @Test
- public void testGetAttribute() throws PIPException {
- when(finder.getMatchingAttributes(req, pip)).thenReturn(resp);
-
- Status status = mock(Status.class);
- Identifier ident = mock(Identifier.class);
-
- when(ident.stringValue()).thenReturn("my-attr-id");
- when(req.getAttributeId()).thenReturn(ident);
-
- // status != OK
- resp.setStatus(status);
- when(status.isOk()).thenReturn(false);
- assertNull(pip.getAttribute(req, finder));
-
- // status OK, empty attributes
- resp.setStatus(status);
- when(status.isOk()).thenReturn(true);
- assertNull(pip.getAttribute(req, finder));
-
- // status OK, has attributes
- resp.setStatus(status);
- when(status.isOk()).thenReturn(true);
- resp.setAttributes(Arrays.asList(mock(Attribute.class)));
- assertSame(resp, pip.getAttribute(req, finder));
-
- // null status, has attributes
- resp.setStatus(null);
- resp.setAttributes(Arrays.asList(mock(Attribute.class)));
- assertSame(resp, pip.getAttribute(req, finder));
-
- // with exception
- when(finder.getMatchingAttributes(req, pip)).thenThrow(new PIPException());
- assertNull(pip.getAttribute(req, finder));
- }
-
- @Test
- public void testFindFirstAttributeValue() {
-
- // no attributes
- resp.setAttributes(Collections.emptyList());
- assertNull(pip.findFirstAttributeValue(resp));
-
- // attribute that returns null
- Attribute attr = mock(Attribute.class);
- resp.setAttributes(Arrays.asList(attr, attr));
- assertNull(pip.findFirstAttributeValue(resp));
-
- // attribute that returns a list of null values
- Attribute attr2 = mock(Attribute.class);
- resp.setAttributes(Arrays.asList(attr, attr2));
- List<AttributeValue<String>> lst = Arrays.asList(makeAttr(null), makeAttr(null));
- when(attr.findValues(DataTypes.DT_STRING)).thenReturn(lst.iterator());
- assertNull(pip.findFirstAttributeValue(resp));
-
- // non-null value in the middle of the list
- lst = Arrays.asList(makeAttr(null), makeAttr(A_VALUE), makeAttr(null));
- when(attr.findValues(DataTypes.DT_STRING)).thenReturn(lst.iterator());
- assertEquals(A_VALUE, pip.findFirstAttributeValue(resp));
- }
-
- private AttributeValue<String> makeAttr(String value) {
- @SuppressWarnings("unchecked")
- AttributeValue<String> attrval = mock(AttributeValue.class);
-
- when(attrval.getValue()).thenReturn(value);
-
- return attrval;
- }
-
- @Test
- public void testAddIntegerAttribute() {
- resp = spy(resp);
-
- Identifier cat = mock(Identifier.class);
- Identifier attrid = mock(Identifier.class);
-
- pip.addIntegerAttribute(resp, cat, attrid, 100, req);
-
- verify(resp).addAttribute(any());
-
- // try with exception
- doThrow(new RuntimeException(EXPECTED_EXCEPTION)).when(resp).addAttribute(any());
- pip.addIntegerAttribute(resp, cat, attrid, 100, req);
- }
-
- @Test
- public void testAddStringAttribute() {
- resp = spy(resp);
-
- Identifier cat = mock(Identifier.class);
- Identifier attrid = mock(Identifier.class);
-
- pip.addStringAttribute(resp, cat, attrid, A_VALUE, req);
-
- verify(resp).addAttribute(any());
-
- // try with exception
- doThrow(new RuntimeException(EXPECTED_EXCEPTION)).when(resp).addAttribute(any());
- pip.addStringAttribute(resp, cat, attrid, A_VALUE, req);
- }
-
- private class MyPip extends StdOnapPip {
-
- @Override
- public Collection<PIPRequest> attributesRequired() {
- return Collections.emptyList();
- }
-
- @Override
- public PIPResponse getAttributes(PIPRequest pipRequest, PIPFinder pipFinder) throws PIPException {
- return null;
- }
-
- }
-}
diff --git a/controlloop/common/database/src/test/resources/META-INF/persistence.xml b/controlloop/common/database/src/test/resources/META-INF/persistence.xml
deleted file mode 100644
index 202850d96..000000000
--- a/controlloop/common/database/src/test/resources/META-INF/persistence.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ============LICENSE_START=======================================================
- ONAP
- ================================================================================
- Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
- ================================================================================
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ============LICENSE_END=========================================================
- -->
-
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd" version="1.0">
-
- <persistence-unit name="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
deleted file mode 100644
index fb3d3ce53..000000000
--- a/controlloop/common/database/src/test/resources/test.properties
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# 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