From 1e39c988604c9ffb8efc38ef3cf4d635b202c7b9 Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Fri, 29 May 2020 11:59:53 -0400 Subject: 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 --- controlloop/common/database/pom.xml | 96 ------- .../org/onap/policy/database/ToscaDictionary.java | 140 ---------- .../CountRecentOperationsPip.java | 200 -------------- .../policy/database/operationshistory/Dbao.java | 79 ------ .../operationshistory/GetOperationOutcomePip.java | 133 ---------- .../org/onap/policy/database/std/StdOnapPip.java | 249 ------------------ .../CountRecentOperationsPipTest.java | 288 --------------------- .../GetOperationOutcomePipTest.java | 273 ------------------- .../org/onap/policy/database/std/DbaoTest.java | 70 ----- .../onap/policy/database/std/StdOnapPipTest.java | 268 ------------------- .../src/test/resources/META-INF/persistence.xml | 43 --- .../database/src/test/resources/test.properties | 38 --- 12 files changed, 1877 deletions(-) delete mode 100644 controlloop/common/database/pom.xml delete mode 100644 controlloop/common/database/src/main/java/org/onap/policy/database/ToscaDictionary.java delete mode 100644 controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/CountRecentOperationsPip.java delete mode 100644 controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/Dbao.java delete mode 100644 controlloop/common/database/src/main/java/org/onap/policy/database/operationshistory/GetOperationOutcomePip.java delete mode 100644 controlloop/common/database/src/main/java/org/onap/policy/database/std/StdOnapPip.java delete mode 100644 controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/CountRecentOperationsPipTest.java delete mode 100644 controlloop/common/database/src/test/java/org/onap/policy/database/operationshistory/GetOperationOutcomePipTest.java delete mode 100644 controlloop/common/database/src/test/java/org/onap/policy/database/std/DbaoTest.java delete mode 100644 controlloop/common/database/src/test/java/org/onap/policy/database/std/StdOnapPipTest.java delete mode 100644 controlloop/common/database/src/test/resources/META-INF/persistence.xml delete mode 100644 controlloop/common/database/src/test/resources/test.properties (limited to 'controlloop/common/database') 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 @@ - - - 4.0.0 - - - org.onap.policy.drools-applications.controlloop.common - drools-applications-common - 1.7.0-SNAPSHOT - - - database - - - - com.att.research.xacml - xacml-pdp - 2.0.1 - provided - - - org.projectlombok - lombok - provided - - - com.h2database - h2 - test - - - org.onap.policy.drools-pdp - policy-management - ${version.policy.drools-pdp} - provided - - - - - - maven-checkstyle-plugin - - - onap-java-style - - check - - process-sources - - - onap-checkstyle/onap-java-style.xml - - ${project.build.sourceDirectory} - true - true - true - - - true - true - warning - - - - - - org.onap.oparent - checkstyle - ${oparent.version} - compile - - - - - - 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 TIME_WINDOW_SCALES = Collections - .unmodifiableSet(new HashSet<>(Arrays.asList("minute", "hour", "day", "week", "month", "year"))); - - public CountRecentOperationsPip() { - super(); - } - - @Override - public Collection 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 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 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 NOT 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> 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 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 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", 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 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> 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 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> 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 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> 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 makeAttr(String value) { - @SuppressWarnings("unchecked") - AttributeValue 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 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 @@ - - - - - - - org.eclipse.persistence.jpa.PersistenceProvider - - org.onap.policy.database.operationshistory.Dbao - - - - - - - - - - - - - - - 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 -- cgit 1.2.3-korg