diff options
Diffstat (limited to 'controlloop/common')
26 files changed, 243 insertions, 2057 deletions
diff --git a/controlloop/common/controller-frankfurt/src/test/resources/config/frankfurt-http-client.properties b/controlloop/common/controller-frankfurt/src/test/resources/config/frankfurt-http-client.properties index 3558195d4..1e3e88cec 100644 --- a/controlloop/common/controller-frankfurt/src/test/resources/config/frankfurt-http-client.properties +++ b/controlloop/common/controller-frankfurt/src/test/resources/config/frankfurt-http-client.properties @@ -43,7 +43,6 @@ http.client.services.SO.managed=true http.client.services.SO.host=localhost http.client.services.SO.port=6667 http.client.services.SO.contextUriPath= -http.client.services.SO.serialization.provider=org.onap.policy.common.gson.GsonMessageBodyHandler http.client.services.VFC.managed=true http.client.services.VFC.host=localhost diff --git a/controlloop/common/controller-usecases/src/test/resources/META-INF/persistence.xml b/controlloop/common/controller-usecases/src/test/resources/META-INF/persistence.xml index 8caed2e01..5589713be 100644 --- a/controlloop/common/controller-usecases/src/test/resources/META-INF/persistence.xml +++ b/controlloop/common/controller-usecases/src/test/resources/META-INF/persistence.xml @@ -1,43 +1,43 @@ -<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ============LICENSE_START=======================================================
- drools-applications
- ================================================================================
- Copyright (C) 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.
- ============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">
-
- <!-- In-mem DB for junit -->
- <persistence-unit name="OperationsHistoryPUTest" 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="INFO" />
- <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>
+<?xml version="1.0" encoding="UTF-8"?> +<!-- + ============LICENSE_START======================================================= + drools-applications + ================================================================================ + Copyright (C) 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. + ============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"> + + <!-- In-mem DB for junit --> + <persistence-unit name="OperationsHistoryPUTest" transaction-type="RESOURCE_LOCAL"> + <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> + + <class>org.onap.policy.guard.OperationsHistory</class> + + <properties> + <property name="eclipselink.ddl-generation" value="create-tables" /> + <property name="eclipselink.logging.level" value="INFO" /> + <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/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 diff --git a/controlloop/common/eventmanager/pom.xml b/controlloop/common/eventmanager/pom.xml index 00e3c79df..aa4f8e8bb 100644 --- a/controlloop/common/eventmanager/pom.xml +++ b/controlloop/common/eventmanager/pom.xml @@ -105,11 +105,6 @@ </dependency> <dependency> <groupId>org.onap.policy.drools-applications.controlloop.common</groupId> - <artifactId>database</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.onap.policy.drools-applications.controlloop.common</groupId> <artifactId>guard</artifactId> <version>${project.version}</version> <scope>provided</scope> @@ -134,6 +129,11 @@ </dependency> <dependency> <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId> + <artifactId>guard</artifactId> + <version>${policy.models.version}</version> + </dependency> + <dependency> + <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId> <artifactId>vfc</artifactId> <version>${policy.models.version}</version> <scope>provided</scope> diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java index 2a5e64d97..d0c19ba67 100644 --- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java +++ b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java @@ -64,8 +64,8 @@ import org.onap.policy.controlloop.actor.vfc.VfcActorServiceProvider; import org.onap.policy.controlloop.policy.Policy; import org.onap.policy.controlloop.policy.PolicyResult; import org.onap.policy.controlloop.policy.TargetType; -import org.onap.policy.database.operationshistory.Dbao; import org.onap.policy.drools.system.PolicyEngineConstants; +import org.onap.policy.guard.OperationsHistory; import org.onap.policy.guard.Util; import org.onap.policy.sdnc.SdncResponse; import org.onap.policy.sdnr.PciResponseWrapper; @@ -1093,7 +1093,7 @@ public class ControlLoopOperationManager implements Serializable { return; } - Dbao newEntry = new Dbao(); + OperationsHistory newEntry = new OperationsHistory(); newEntry.setClosedLoopName(this.onset.getClosedLoopControlName()); newEntry.setRequestId(this.onset.getRequestId().toString()); diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2.java index 3f7aca6e0..5141b7100 100644 --- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2.java +++ b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2.java @@ -43,12 +43,15 @@ import org.onap.policy.aai.AaiCqResponse; import org.onap.policy.controlloop.ControlLoopOperation; import org.onap.policy.controlloop.ControlLoopResponse; import org.onap.policy.controlloop.VirtualControlLoopEvent; +import org.onap.policy.controlloop.actor.guard.GuardActorServiceProvider; +import org.onap.policy.controlloop.actor.sdnr.SdnrActorServiceProvider; import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome; import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; import org.onap.policy.controlloop.actorserviceprovider.pipeline.PipelineUtil; import org.onap.policy.controlloop.policy.Policy; import org.onap.policy.controlloop.policy.PolicyResult; +import org.onap.policy.sdnr.PciMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,7 +67,7 @@ public class ControlLoopOperationManager2 implements Serializable { private static final String CL_TIMEOUT_ACTOR = "-CL-TIMEOUT-"; public static final String LOCK_ACTOR = "LOCK"; public static final String LOCK_OPERATION = "Lock"; - private static final String GUARD_ACTOR = "GUARD"; + private static final String GUARD_ACTOR = GuardActorServiceProvider.NAME; public static final String VSERVER_VSERVER_NAME = "vserver.vserver-name"; public static final String GENERIC_VNF_VNF_NAME = "generic-vnf.vnf-name"; public static final String GENERIC_VNF_VNF_ID = "generic-vnf.vnf-id"; @@ -212,7 +215,7 @@ public class ControlLoopOperationManager2 implements Serializable { policyResult = outcome.getResult(); clOperation = outcome.toControlLoopOperation(); clOperation.setTarget(policy.getTarget().toString()); - clResponse = outcome.getControlLoopResponse(); + clResponse = makeControlLoopResponse(outcome); if (outcome.getEnd() == null) { clOperation.setOutcome("Started"); @@ -478,6 +481,7 @@ public class ControlLoopOperationManager2 implements Serializable { case CL_TIMEOUT_ACTOR: state = State.CONTROL_LOOP_TIMEOUT; + processAbort(outcome, PolicyResult.FAILURE, "Control loop timed out"); break; case LOCK_ACTOR: @@ -487,7 +491,7 @@ public class ControlLoopOperationManager2 implements Serializable { storeFailureInDataBase(outcome, PolicyResult.FAILURE_GUARD, "Operation denied by Lock"); } else { state = State.LOCK_LOST; - storeFailureInDataBase(outcome, PolicyResult.FAILURE, "Operation aborted by Lock"); + processAbort(outcome, PolicyResult.FAILURE, "Operation aborted by Lock"); } break; @@ -515,7 +519,7 @@ public class ControlLoopOperationManager2 implements Serializable { */ state = (outcome.getResult() == PolicyResult.SUCCESS ? State.OPERATION_SUCCESS : State.OPERATION_FAILURE); - controlLoopResponse = makeControlLoopResponse(outcome.getControlLoopResponse()); + controlLoopResponse = makeControlLoopResponse(outcome); if (!operationHistory.isEmpty() && operationHistory.peekLast().getClOperation().getEnd() == null) { operationHistory.removeLast(); } @@ -531,18 +535,46 @@ public class ControlLoopOperationManager2 implements Serializable { } /** - * Makes a control loop response. + * Processes an operation abort, updating the DB record, if an operation has been + * started. * - * @param source original control loop response or {@code null} - * @return a new control loop response, or {@code null} none is required + * @param outcome operation outcome + * @param result result to put into the DB + * @param message message to put into the DB */ - protected ControlLoopResponse makeControlLoopResponse(ControlLoopResponse source) { - if (source != null) { - return source; + private void processAbort(OperationOutcome outcome, PolicyResult result, String message) { + if (operationHistory.isEmpty() || operationHistory.peekLast().getClOperation().getEnd() != null) { + // last item was not a "start" operation + + // NOTE: do NOT generate control loop response since operation was not started + + storeFailureInDataBase(outcome, result, message); + return; } + // last item was a "start" operation - replace it with a failure + final Operation operOrig = operationHistory.removeLast(); + + // use start time from the operation, itself + if (operOrig != null && operOrig.getClOperation() != null) { + outcome.setStart(operOrig.getClOperation().getStart()); + } + + controlLoopResponse = makeControlLoopResponse(outcome); + + storeFailureInDataBase(outcome, result, message); + } + + /** + * Makes a control loop response. + * + * @param outcome operation outcome + * @return a new control loop response, or {@code null} if none is required + */ + protected ControlLoopResponse makeControlLoopResponse(OperationOutcome outcome) { + // only generate response for certain actors. - if (!actor.equals("SDNR")) { + if (outcome == null || !actor.equals(SdnrActorServiceProvider.NAME)) { return null; } @@ -557,6 +589,11 @@ public class ControlLoopOperationManager2 implements Serializable { clRsp.setRequestId(event.getRequestId()); clRsp.setVersion(event.getVersion()); + PciMessage msg = outcome.getResponse(); + if (msg != null && msg.getBody() != null && msg.getBody().getOutput() != null) { + clRsp.setPayload(msg.getBody().getOutput().getPayload()); + } + return clRsp; } diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/ophistory/OperationHistoryDataManagerImpl.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/ophistory/OperationHistoryDataManagerImpl.java index 2b67865bf..741ce20f8 100644 --- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/ophistory/OperationHistoryDataManagerImpl.java +++ b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/ophistory/OperationHistoryDataManagerImpl.java @@ -39,7 +39,7 @@ import org.onap.policy.common.utils.jpa.EntityMgrCloser; import org.onap.policy.common.utils.jpa.EntityTransCloser; import org.onap.policy.controlloop.ControlLoopOperation; import org.onap.policy.controlloop.VirtualControlLoopEvent; -import org.onap.policy.database.operationshistory.Dbao; +import org.onap.policy.guard.OperationsHistory; import org.onap.policy.guard.Util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -261,15 +261,15 @@ public class OperationHistoryDataManagerImpl implements OperationHistoryDataMana logger.info("store operation history record for {}", event.getRequestId()); - List<Dbao> results = - entityMgr.createQuery("select e from Dbao e" + List<OperationsHistory> results = + entityMgr.createQuery("select e from OperationsHistory e" + " where e.closedLoopName= ?1" + " and e.requestId= ?2" + " and e.subrequestId= ?3" + " and e.actor= ?4" + " and e.operation= ?5" + " and e.target= ?6", - Dbao.class) + OperationsHistory.class) .setParameter(1, event.getClosedLoopControlName()) .setParameter(2, record.getRequestId()) .setParameter(3, operation.getSubRequestId()) @@ -282,7 +282,7 @@ public class OperationHistoryDataManagerImpl implements OperationHistoryDataMana logger.warn("unexpected operation history record count {} for {}", results.size(), event.getRequestId()); } - Dbao entry = (results.isEmpty() ? new Dbao() : results.get(0)); + OperationsHistory entry = (results.isEmpty() ? new OperationsHistory() : results.get(0)); entry.setClosedLoopName(event.getClosedLoopControlName()); entry.setRequestId(record.getRequestId()); diff --git a/controlloop/common/eventmanager/src/main/resources/META-INF/persistence.xml b/controlloop/common/eventmanager/src/main/resources/META-INF/persistence.xml index 210e22f27..c3c633674 100644 --- a/controlloop/common/eventmanager/src/main/resources/META-INF/persistence.xml +++ b/controlloop/common/eventmanager/src/main/resources/META-INF/persistence.xml @@ -3,7 +3,7 @@ ============LICENSE_START======================================================= drools-applications ================================================================================ - Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved. + Copyright (C) 2018-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. @@ -26,7 +26,7 @@ transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> - <class>org.onap.policy.database.operationshistory.Dbao</class> + <class>org.onap.policy.guard.OperationsHistory</class> <properties> <property name="eclipselink.ddl-generation" value="create-or-extend-tables" /> diff --git a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2Test.java b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2Test.java index be8b70b13..90fdccabb 100644 --- a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2Test.java +++ b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager2Test.java @@ -70,6 +70,9 @@ import org.onap.policy.controlloop.policy.Policy; import org.onap.policy.controlloop.policy.PolicyResult; import org.onap.policy.controlloop.policy.Target; import org.onap.policy.controlloop.policy.TargetType; +import org.onap.policy.sdnr.PciBody; +import org.onap.policy.sdnr.PciMessage; +import org.onap.policy.sdnr.PciResponse; public class ControlLoopOperationManager2Test { private static final UUID REQ_ID = UUID.randomUUID(); @@ -240,7 +243,7 @@ public class ControlLoopOperationManager2Test { } /** - * Tests start() when the control loop times out. + * Tests start() when the control loop times out before the operation starts. */ @Test public void testStartClTimeout_testHandleTimeout() throws InterruptedException { @@ -276,8 +279,8 @@ public class ControlLoopOperationManager2Test { // should have called update() for operation-start, but not for any nextStep() verify(mgrctx).updated(mgr); - // should not have tried to store anything in the DB - verify(dataMgr, never()).store(any(), any(), any(), any()); + // should have added a record to the DB + verify(dataMgr).store(any(), any(), any(), any()); } @Test @@ -345,12 +348,21 @@ public class ControlLoopOperationManager2Test { @Test public void testMakeControlLoopResponse() { - // should always return its input, if non-null - ControlLoopResponse resp = new ControlLoopResponse(); - assertSame(resp, mgr.makeControlLoopResponse(resp)); + final OperationOutcome outcome = new OperationOutcome(); + PciMessage msg = new PciMessage(); + outcome.setResponse(msg); + + PciBody body = new PciBody(); + msg.setBody(body); + + PciResponse output = new PciResponse(); + body.setOutput(output); + + output.setPayload("my-payload"); + // not an SDNR action - should return null - assertNull(mgr.makeControlLoopResponse(null)); + assertNull(mgr.makeControlLoopResponse(outcome)); /* * now work with SDNR actor @@ -358,15 +370,26 @@ public class ControlLoopOperationManager2Test { policy.setActor("SDNR"); mgr = new ControlLoopOperationManager2(mgrctx, context, policy, executor); - // should still return its input, if non-null - resp = new ControlLoopResponse(); - assertSame(resp, mgr.makeControlLoopResponse(resp)); + // should return null for a null input + assertNull(mgr.makeControlLoopResponse(null)); - // should generate a response - resp = mgr.makeControlLoopResponse(null); - assertNotNull(resp); - assertEquals(REQ_ID, resp.getRequestId()); - assertNull(resp.getPayload()); + // should generate a response, with a payload + checkResp(outcome, "my-payload"); + + /* + * these should generate a response, with null payload + */ + output.setPayload(null); + checkResp(outcome, null); + + body.setOutput(null); + checkResp(outcome, null); + + msg.setBody(null); + checkResp(outcome, null); + + outcome.setResponse(null); + checkResp(outcome, null); } @Test @@ -977,6 +1000,13 @@ public class ControlLoopOperationManager2Test { target.setType(TargetType.VNF); } + private void checkResp(OperationOutcome outcome, String expectedPayload) { + ControlLoopResponse resp = mgr.makeControlLoopResponse(outcome); + assertNotNull(resp); + assertEquals(REQ_ID, resp.getRequestId()); + assertEquals(expectedPayload, resp.getPayload()); + } + private void verifyDb(int nrecords, PolicyResult expectedResult, String expectedMsg) { ArgumentCaptor<String> entityCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor<ControlLoopOperation> opCaptor = ArgumentCaptor.forClass(ControlLoopOperation.class); diff --git a/controlloop/common/eventmanager/src/test/resources/META-INF/persistence.xml b/controlloop/common/eventmanager/src/test/resources/META-INF/persistence.xml index 4d47751bf..917f8aad3 100644 --- a/controlloop/common/eventmanager/src/test/resources/META-INF/persistence.xml +++ b/controlloop/common/eventmanager/src/test/resources/META-INF/persistence.xml @@ -1,43 +1,43 @@ -<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ============LICENSE_START=======================================================
- drools-applications
- ================================================================================
- 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=========================================================
- -->
-<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">
-
- <!-- In-mem DB for junit -->
- <persistence-unit name="OperationsHistoryPUTest" 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="INFO" />
- <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>
+<?xml version="1.0" encoding="UTF-8"?> +<!-- + ============LICENSE_START======================================================= + drools-applications + ================================================================================ + Copyright (C) 2018-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. + ============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"> + + <!-- In-mem DB for junit --> + <persistence-unit name="OperationsHistoryPUTest" transaction-type="RESOURCE_LOCAL"> + <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> + + <class>org.onap.policy.guard.OperationsHistory</class> + + <properties> + <property name="eclipselink.ddl-generation" value="create-tables" /> + <property name="eclipselink.logging.level" value="INFO" /> + <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/feature-controlloop-management/src/main/feature/config/SO-http-client.properties b/controlloop/common/feature-controlloop-management/src/main/feature/config/SO-http-client.properties index a331ca1a9..3b71fd474 100644 --- a/controlloop/common/feature-controlloop-management/src/main/feature/config/SO-http-client.properties +++ b/controlloop/common/feature-controlloop-management/src/main/feature/config/SO-http-client.properties @@ -25,4 +25,3 @@ http.client.services.SO.port=${envd:SO_PORT} http.client.services.SO.userName=${envd:SO_USERNAME} http.client.services.SO.password=${envd:SO_PASSWORD} http.client.services.SO.contextUriPath=${envd:SO_CONTEXT_URI} -http.client.services.SO.serialization.provider=org.onap.policy.common.gson.GsonMessageBodyHandler diff --git a/controlloop/common/guard/src/main/java/org/onap/policy/guard/CallGuardTask.java b/controlloop/common/guard/src/main/java/org/onap/policy/guard/CallGuardTask.java index 611dd2d8b..0331b7aab 100644 --- a/controlloop/common/guard/src/main/java/org/onap/policy/guard/CallGuardTask.java +++ b/controlloop/common/guard/src/main/java/org/onap/policy/guard/CallGuardTask.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * guard * ================================================================================ - * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-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. @@ -24,7 +24,6 @@ import java.util.HashSet; import java.util.Set; import java.util.UUID; import java.util.function.Supplier; - import org.drools.core.WorkingMemory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/controlloop/common/guard/src/main/resources/META-INF/persistence.xml b/controlloop/common/guard/src/main/resources/META-INF/persistence.xml index fa75ef268..cf7e28190 100644 --- a/controlloop/common/guard/src/main/resources/META-INF/persistence.xml +++ b/controlloop/common/guard/src/main/resources/META-INF/persistence.xml @@ -3,14 +3,14 @@ ============LICENSE_START======================================================= drools-applications ================================================================================ - Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved. + Copyright (C) 2018-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. @@ -22,11 +22,11 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> - + <persistence-unit name="OperationsHistoryPU" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> - <class>org.onap.policy.database.operationshistory.Dbao</class> + <class>org.onap.policy.guard.OperationsHistory</class> <properties> <property name="eclipselink.ddl-generation" value="create-tables"/> @@ -39,5 +39,5 @@ <property name="javax.persistence.schema-generation.create-source" value="metadata"/> </properties> </persistence-unit> - + </persistence> diff --git a/controlloop/common/guard/src/test/resources/META-INF/persistence.xml b/controlloop/common/guard/src/test/resources/META-INF/persistence.xml index b6d80e099..8e8be4ed2 100644 --- a/controlloop/common/guard/src/test/resources/META-INF/persistence.xml +++ b/controlloop/common/guard/src/test/resources/META-INF/persistence.xml @@ -1,43 +1,43 @@ -<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ============LICENSE_START=======================================================
- drools-applications
- ================================================================================
- 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=========================================================
- -->
-<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">
-
- <!-- In-mem DB for junit -->
- <persistence-unit name="OperationsHistoryPUTest"
- 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>
+<?xml version="1.0" encoding="UTF-8"?> +<!-- + ============LICENSE_START======================================================= + drools-applications + ================================================================================ + Copyright (C) 2018-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. + ============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"> + + <!-- In-mem DB for junit --> + <persistence-unit name="OperationsHistoryPUTest" + transaction-type="RESOURCE_LOCAL"> + <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> + + <class>org.onap.policy.guard.OperationsHistory</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/pom.xml b/controlloop/common/pom.xml index 6fc0654f4..4b5c5ece7 100644 --- a/controlloop/common/pom.xml +++ b/controlloop/common/pom.xml @@ -33,7 +33,6 @@ <artifactId>drools-applications-common</artifactId> <modules> - <module>database</module> <module>guard</module> <module>coordination</module> <module>eventmanager</module> |