aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--controlloop/common/eventmanager/pom.xml1
-rw-r--r--controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopOperationManager.java106
-rw-r--r--controlloop/common/eventmanager/src/main/resources/META-INF/persistence.xml40
-rw-r--r--controlloop/common/guard/src/main/java/org/onap/policy/guard/PIPEngineGetHistory.java226
-rw-r--r--controlloop/templates/template.demo/pom.xml12
-rw-r--r--controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/AaiSimulatorTest.java10
-rw-r--r--controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/ControlLoopXacmlGuardTest.java169
-rw-r--r--controlloop/templates/template.demo/src/test/resources/META-INF/persistence.xml22
8 files changed, 348 insertions, 238 deletions
diff --git a/controlloop/common/eventmanager/pom.xml b/controlloop/common/eventmanager/pom.xml
index 318d39fbc..44086a68d 100644
--- a/controlloop/common/eventmanager/pom.xml
+++ b/controlloop/common/eventmanager/pom.xml
@@ -124,5 +124,6 @@
<version>1.1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
+
</dependencies>
</project>
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 94b6e1618..3c264ab24 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
@@ -7,9 +7,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -33,30 +33,30 @@ import org.onap.policy.appc.Response;
import org.onap.policy.appc.ResponseCode;
import org.onap.policy.appclcm.LCMResponseWrapper;
import org.onap.policy.controlloop.ControlLoopEvent;
+import org.onap.policy.controlloop.ControlLoopException;
import org.onap.policy.controlloop.ControlLoopOperation;
import org.onap.policy.controlloop.VirtualControlLoopEvent;
-import org.onap.policy.controlloop.ControlLoopException;
-import org.onap.policy.controlloop.policy.Policy;
-import org.onap.policy.controlloop.policy.PolicyResult;
import org.onap.policy.controlloop.actor.appc.APPCActorServiceProvider;
import org.onap.policy.controlloop.actor.vfc.VFCActorServiceProvider;
+import org.onap.policy.controlloop.policy.Policy;
+import org.onap.policy.controlloop.policy.PolicyResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.onap.policy.controlloop.actor.appclcm.AppcLcmActorServiceProvider;
public class ControlLoopOperationManager implements Serializable {
-
+
/**
- *
+ *
*/
private static final long serialVersionUID = -3773199283624595410L;
private static final Logger logger = LoggerFactory.getLogger(ControlLoopOperationManager.class);
@Override
public String toString() {
- return "ControlLoopOperationManager [onset=" + (onset != null ? onset.requestID : "null") + ", policy="
+ return "ControlLoopOperationManager [onset=" + (onset != null ? onset.requestID : "null") + ", policy="
+ (policy != null ? policy.getId() : "null") + ", attempts=" + attempts
- + ", policyResult=" + policyResult
+ + ", policyResult=" + policyResult
+ ", currentOperation=" + currentOperation + ", operationHistory=" + operationHistory
+ "]";
}
@@ -94,17 +94,17 @@ public class ControlLoopOperationManager implements Serializable {
public ControlLoopOperation operation = new ControlLoopOperation();
public PolicyResult policyResult = null;
public int attempt = 0;
-
+
@Override
public String toString() {
return "Operation [attempt=" + attempt + ", policyResult=" + policyResult + ", operation=" + operation
+ "]";
}
}
-
+
private String guardApprovalStatus = "NONE";//"NONE", "PERMIT", "DENY"
private Object operationRequest;
-
+
public Object getOperationRequest() {
return operationRequest;
}
@@ -115,14 +115,14 @@ public class ControlLoopOperationManager implements Serializable {
public void setGuardApprovalStatus(String guardApprovalStatus) {
this.guardApprovalStatus = guardApprovalStatus;
}
-
-
- public ControlLoopOperationManager(/*ATTControlLoopEvent*/ControlLoopEvent onset, Policy policy, ControlLoopEventManager em) throws ControlLoopException {
+
+
+ public ControlLoopOperationManager(ControlLoopEvent onset, Policy policy, ControlLoopEventManager em) throws ControlLoopException {
this.onset = onset;
this.policy = policy;
this.guardApprovalStatus = "NONE";
this.eventManager = em;
-
+
//
// Let's make a sanity check
//
@@ -141,7 +141,7 @@ public class ControlLoopOperationManager implements Serializable {
throw new ControlLoopException("ControlLoopEventManager: policy has an unknown actor.");
}
}
-
+
public Object startOperation(/*VirtualControlLoopEvent*/ControlLoopEvent onset) {
//
// They shouldn't call us if we currently running something
@@ -198,13 +198,13 @@ public class ControlLoopOperationManager implements Serializable {
//
switch (policy.getActor()) {
case "APPC":
- /*
- * If the recipe is ModifyConfig, a legacy APPC
+ /*
+ * If the recipe is ModifyConfig, a legacy APPC
* request is constructed. Otherwise an LCMRequest
* is constructed.
*/
if ("ModifyConfig".equalsIgnoreCase(policy.getRecipe())) {
-
+
this.operationRequest = APPCActorServiceProvider.constructRequest((VirtualControlLoopEvent)onset, operation.operation, this.policy);
}
else {
@@ -229,7 +229,7 @@ public class ControlLoopOperationManager implements Serializable {
}
return null;
}
-
+
public PolicyResult onResponse(Object response) {
//
// Which response is it?
@@ -316,9 +316,9 @@ public class ControlLoopOperationManager implements Serializable {
}
}
else if (response instanceof LCMResponseWrapper) {
-
+
LCMResponseWrapper dmaapResponse = (LCMResponseWrapper) response;
-
+
/*
* Parse out the operation attempt using the subrequestid
*/
@@ -326,13 +326,13 @@ public class ControlLoopOperationManager implements Serializable {
if (operationAttempt == null) {
this.completeOperation(operationAttempt, "Policy was unable to parse APP-C SubRequestID (it was null).", PolicyResult.FAILURE_EXCEPTION);
}
-
+
/*
- * Process the APPCLCM response to see what PolicyResult
+ * Process the APPCLCM response to see what PolicyResult
* should be returned
*/
AbstractMap.SimpleEntry<PolicyResult, String> result = AppcLcmActorServiceProvider.processResponse(dmaapResponse);
-
+
if (result.getKey() != null) {
this.completeOperation(operationAttempt, result.getValue(), result.getKey());
if (PolicyResult.FAILURE_TIMEOUT.equals(this.policyResult)) {
@@ -344,7 +344,7 @@ public class ControlLoopOperationManager implements Serializable {
}
return null;
}
-
+
public Integer getOperationTimeout() {
//
// Sanity check
@@ -356,7 +356,7 @@ public class ControlLoopOperationManager implements Serializable {
logger.debug("getOperationTimeout returning {}", this.policy.getTimeout());
return this.policy.getTimeout();
}
-
+
public String getOperationTimeoutString(int defaultTimeout) {
Integer to = this.getOperationTimeout();
if (to == null || to == 0) {
@@ -364,11 +364,11 @@ public class ControlLoopOperationManager implements Serializable {
}
return to.toString() + "s";
}
-
+
public PolicyResult getOperationResult() {
return this.policyResult;
}
-
+
public String getOperationMessage() {
if (this.currentOperation != null && this.currentOperation.operation != null) {
return this.currentOperation.operation.toMessage();
@@ -378,7 +378,7 @@ public class ControlLoopOperationManager implements Serializable {
}
return null;
}
-
+
public String getOperationMessage(String guardResult) {
if (this.currentOperation != null && this.currentOperation.operation != null) {
return this.currentOperation.operation.toMessage()+ ", Guard result: " + guardResult;
@@ -388,7 +388,7 @@ public class ControlLoopOperationManager implements Serializable {
}
return null;
}
-
+
public String getOperationHistory() {
if (this.currentOperation != null && this.currentOperation.operation != null) {
return this.currentOperation.operation.toHistory();
@@ -398,23 +398,23 @@ public class ControlLoopOperationManager implements Serializable {
}
return null;
}
-
+
public LinkedList<ControlLoopOperation> getHistory() {
LinkedList<ControlLoopOperation> history = new LinkedList<ControlLoopOperation>();
for (Operation op : this.operationHistory) {
history.add(new ControlLoopOperation(op.operation));
-
+
}
return history;
}
-
+
public void setOperationHasTimedOut() {
//
//
//
this.completeOperation(this.attempts, "Operation timed out", PolicyResult.FAILURE_TIMEOUT);
}
-
+
public void setOperationHasGuardDeny() {
//
//
@@ -469,11 +469,11 @@ public class ControlLoopOperationManager implements Serializable {
//
return true;
}
-
+
public boolean isOperationRunning() {
return (this.currentOperation != null);
}
-
+
private boolean isRetriesMaxedOut() {
if (policy.getRetry() == null || policy.getRetry() == 0) {
//
@@ -484,19 +484,23 @@ public class ControlLoopOperationManager implements Serializable {
}
return (this.attempts > policy.getRetry());
}
-
+
private void storeOperationInDataBase(){
-
+
+ String OpsHistPU = System.getProperty("OperationsHistoryPU");
+ if(OpsHistPU == null || !OpsHistPU.equals("TestOperationsHistoryPU")){
+ OpsHistPU = "OperationsHistoryPU";
+ }
EntityManager em;
try{
- em = Persistence.createEntityManagerFactory("OperationsHistoryPU").createEntityManager();//emf.createEntityManager();
+ em = Persistence.createEntityManagerFactory(OpsHistPU).createEntityManager();
}catch(Exception e){
logger.error("storeOperationInDataBase threw: ", e);
- return;
+ return;
}
-
- OperationsHistoryDbEntry newEntry = new OperationsHistoryDbEntry();
-
+
+ OperationsHistoryDbEntry newEntry = new OperationsHistoryDbEntry();
+
newEntry.closedLoopName = this.onset.closedLoopControlName;
newEntry.requestId = this.onset.requestID.toString();
newEntry.actor = this.currentOperation.operation.actor;
@@ -507,17 +511,17 @@ public class ControlLoopOperationManager implements Serializable {
newEntry.endtime = new Timestamp(this.currentOperation.operation.end.toEpochMilli());
newEntry.message = this.currentOperation.operation.message;
newEntry.outcome = this.currentOperation.operation.outcome;
-
+
em.getTransaction().begin();
em.persist(newEntry);
em.getTransaction().commit();
-
+
em.close();
}
-
-
+
+
private void completeOperation(Integer attempt, String message, PolicyResult result) {
if (attempt == null) {
logger.debug("attempt cannot be null (i.e. subRequestID)");
@@ -556,7 +560,7 @@ public class ControlLoopOperationManager implements Serializable {
}
}
logger.debug("Could not find associated operation");
-
+
}
-
+
}
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 f007c4951..27c64b60a 100644
--- a/controlloop/common/eventmanager/src/main/resources/META-INF/persistence.xml
+++ b/controlloop/common/eventmanager/src/main/resources/META-INF/persistence.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="UTF-8" ?>
-<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
- 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>
- <!-- <jar-file>packedEntity.jar</jar-file>-->
- <class>org.onap.policy.controlloop.eventmanager.OperationsHistoryDbEntry</class>
- <properties>
- <property name="eclipselink.ddl-generation" value="create-tables"/>
- <property name="javax.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver" />
- <!-- <property name="javax.persistence.jdbc.url" value="jdbc:mariadb://localhost:7779/policy"/>-->
- <property name="javax.persistence.jdbc.url" value="jdbc:mariadb://localhost:3306/policy"/>
- <property name="javax.persistence.jdbc.user" value="root"/>
- <property name="javax.persistence.jdbc.password" value="aaaa"/>
- <property name="eclipselink.logging.level" value="INFO" />
- </properties>
- </persistence-unit>
-
+<persistence version="2.1"
+ xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
+
+ <persistence-unit name="OperationsHistoryPU"
+ transaction-type="RESOURCE_LOCAL">
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+ <!-- <jar-file>packedEntity.jar</jar-file> -->
+ <class>org.onap.policy.controlloop.eventmanager.OperationsHistoryDbEntry</class>
+ <properties>
+ <property name="eclipselink.ddl-generation" value="create-tables" />
+ <property name="javax.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver" />
+ <property name="javax.persistence.jdbc.url" value="jdbc:mariadb://localhost:3306/policy" />
+ <property name="javax.persistence.jdbc.user" value="root" />
+ <property name="javax.persistence.jdbc.password" value="aaaa" />
+ <property name="eclipselink.logging.level" value="WARNING" />
+ </properties>
+ </persistence-unit>
+
+
</persistence>
diff --git a/controlloop/common/guard/src/main/java/org/onap/policy/guard/PIPEngineGetHistory.java b/controlloop/common/guard/src/main/java/org/onap/policy/guard/PIPEngineGetHistory.java
index 9382203d1..d35726a64 100644
--- a/controlloop/common/guard/src/main/java/org/onap/policy/guard/PIPEngineGetHistory.java
+++ b/controlloop/common/guard/src/main/java/org/onap/policy/guard/PIPEngineGetHistory.java
@@ -7,9 +7,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,7 +21,9 @@
package org.onap.policy.guard;
import java.math.BigInteger;
+import java.sql.Timestamp;
import java.util.Collection;
+import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Properties;
@@ -33,56 +35,59 @@ import javax.persistence.NonUniqueResultException;
import javax.persistence.Persistence;
import javax.persistence.Query;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.att.research.xacml.api.Attribute;
+import com.att.research.xacml.api.AttributeValue;
+import com.att.research.xacml.api.Identifier;
import com.att.research.xacml.api.pip.PIPException;
import com.att.research.xacml.api.pip.PIPFinder;
import com.att.research.xacml.api.pip.PIPRequest;
import com.att.research.xacml.api.pip.PIPResponse;
import com.att.research.xacml.std.IdentifierImpl;
import com.att.research.xacml.std.StdMutableAttribute;
+import com.att.research.xacml.std.datatypes.DataTypes;
import com.att.research.xacml.std.pip.StdMutablePIPResponse;
import com.att.research.xacml.std.pip.StdPIPRequest;
import com.att.research.xacml.std.pip.StdPIPResponse;
import com.att.research.xacml.std.pip.engines.StdConfigurableEngine;
-import 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.std.datatypes.DataTypes;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class PIPEngineGetHistory extends StdConfigurableEngine{
+ private interface DateUtil{
+ public long getMs();
+ public DateUtil init(String sqlValUnit) throws Exception;
+ }
-
private static final Logger logger = LoggerFactory.getLogger(PIPEngineGetHistory.class);
-
+
public static final String DEFAULT_DESCRIPTION = "PIP for retrieving Operations History from DB";
-
+
//
// Base issuer string. The issuer in the policy will also contain time window information
// E.g., "com:att:research:xacml:guard:historydb:tw:10:min"
//
public static final String DEFAULT_ISSUER = "com:att:research:xacml:guard:historydb";
-
+
private static final PIPRequest PIP_REQUEST_ACTOR = new StdPIPRequest(
- new IdentifierImpl("urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"),
- new IdentifierImpl("urn:oasis:names:tc:xacml:1.0:actor:actor-id"),
+ new IdentifierImpl("urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"),
+ new IdentifierImpl("urn:oasis:names:tc:xacml:1.0:actor:actor-id"),
new IdentifierImpl("http://www.w3.org/2001/XMLSchema#string"));
-
+
private static final PIPRequest PIP_REQUEST_RECIPE = new StdPIPRequest(
- new IdentifierImpl("urn:oasis:names:tc:xacml:3.0:attribute-category:action"),
- new IdentifierImpl("urn:oasis:names:tc:xacml:1.0:operation:operation-id"),
+ new IdentifierImpl("urn:oasis:names:tc:xacml:3.0:attribute-category:action"),
+ new IdentifierImpl("urn:oasis:names:tc:xacml:1.0:operation:operation-id"),
new IdentifierImpl("http://www.w3.org/2001/XMLSchema#string"));
-
+
private static final PIPRequest PIP_REQUEST_TARGET = new StdPIPRequest(
- new IdentifierImpl("urn:oasis:names:tc:xacml:3.0:attribute-category:resource"),
- new IdentifierImpl("urn:oasis:names:tc:xacml:1.0:target:target-id"),
+ new IdentifierImpl("urn:oasis:names:tc:xacml:3.0:attribute-category:resource"),
+ new IdentifierImpl("urn:oasis:names:tc:xacml:1.0:target:target-id"),
new IdentifierImpl("http://www.w3.org/2001/XMLSchema#string"));
-
+
private void addIntegerAttribute(StdMutablePIPResponse stdPIPResponse, Identifier category, Identifier attributeId, int value, PIPRequest pipRequest) {
AttributeValue<BigInteger> attributeValue = null;
try {
@@ -95,14 +100,14 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
}
}
-
-
+
+
public PIPEngineGetHistory() {
super();
// TODO Auto-generated constructor stub
}
-
-
+
+
@Override
public Collection<PIPRequest> attributesRequired() {
@@ -120,7 +125,7 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
public PIPResponse getAttributes(PIPRequest pipRequest, PIPFinder pipFinder) throws PIPException {
// TODO Auto-generated method stub
logger.debug("Entering FeqLimiter PIP");
-
+
/*
* First check to see if the issuer is set and then match it
*/
@@ -139,7 +144,7 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
return StdPIPResponse.PIP_RESPONSE_EMPTY;
}
}
-
+
String[] s1 = string.split("tw:");
String[] s2 = s1[1].split(":");
String timeWindowVal = s2[0];// number [of minutes, hours, days...]
@@ -148,24 +153,24 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
String actor = getActor(pipFinder).iterator().next();
String operation = getRecipe(pipFinder).iterator().next();
String target = getTarget(pipFinder).iterator().next();
-
+
String timeWindow = timeWindowVal + " " + timeWindowScale;
-
+
logger.debug("Going to query DB about: {} {} {} {}", actor, operation, target, timeWindow);
int countFromDB = getCountFromDB(actor, operation, target, timeWindow);
-
+
StdMutablePIPResponse stdPIPResponse = new StdMutablePIPResponse();
-
+
this.addIntegerAttribute(stdPIPResponse,
- new IdentifierImpl("urn:oasis:names:tc:xacml:3.0:attribute-category:resource"),
- new IdentifierImpl("com:att:research:xacml:test:sql:resource:operations:count"),
+ new IdentifierImpl("urn:oasis:names:tc:xacml:3.0:attribute-category:resource"),
+ new IdentifierImpl("com:att:research:xacml:test:sql:resource:operations:count"),
countFromDB,
pipRequest);
-
+
return new StdPIPResponse(stdPIPResponse);
}
-
-
+
+
@Override
public void configure(String id, Properties properties) throws PIPException {
super.configure(id, properties);
@@ -178,33 +183,35 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
}
}
-
-
+
+
private PIPResponse getAttribute(PIPRequest pipRequest, PIPFinder pipFinder) {
PIPResponse pipResponse = null;
try {
pipResponse = pipFinder.getMatchingAttributes(pipRequest, this);
- if ((pipResponse != null)
- && (pipResponse.getStatus() != null)
- && (!pipResponse.getStatus().isOk())) {
+ if (pipResponse != null) {
+ if (pipResponse.getStatus() != null && !pipResponse.getStatus().isOk()) {
logger.warn("Error retrieving {}: {}", pipRequest.getAttributeId().stringValue(), pipResponse.getStatus().toString());
pipResponse = null;
- }
- if ((pipResponse != null)
- && (pipResponse.getAttributes() != null)
- && (pipResponse.getAttributes().isEmpty())) {
+ }
+ if (pipResponse.getAttributes() != null && pipResponse.getAttributes().isEmpty()) {
logger.warn("Error retrieving {}: {}", pipRequest.getAttributeId().stringValue(), pipResponse.getStatus().toString());
logger.warn("Error retrieving {}: {}", pipRequest.getAttributeId().stringValue(), pipResponse.getStatus());
pipResponse = null;
}
+ if (pipResponse.getAttributes() != null && pipResponse.getAttributes().isEmpty()) {
+ logger.warn("Error retrieving {}: {}", pipRequest.getAttributeId().stringValue(), pipResponse.getStatus());
+ pipResponse = null;
+ }
+ }
} catch (PIPException ex) {
logger.error("getAttribute threw:", ex);
}
return pipResponse;
}
-
-
+
+
private Set<String> getActor(PIPFinder pipFinder) {
/*
* Get the AT&T UID from either the subject id or the attuid property
@@ -213,7 +220,7 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
if (pipResponseATTUID == null) {
return null;
}
-
+
/*
* Iterate over all of the returned results and do the LDAP requests
*/
@@ -230,7 +237,7 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
}
}
}
-
+
return setATTUIDs;
}
@@ -242,7 +249,7 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
if (pipResponseATTUID == null) {
return null;
}
-
+
/*
* Iterate over all of the returned results and do the LDAP requests
*/
@@ -259,11 +266,11 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
}
}
}
-
+
return setATTUIDs;
}
-
-
+
+
private Set<String> getTarget(PIPFinder pipFinder) {
/*
* Get the AT&T UID from either the subject id or the attuid property
@@ -272,7 +279,7 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
if (pipResponseATTUID == null) {
return null;
}
-
+
/*
* Iterate over all of the returned results and do the LDAP requests
*/
@@ -289,32 +296,93 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
}
}
}
-
+
return setATTUIDs;
}
-
+
private static int getCountFromDB(String actor, String operation, String target, String timeWindow){
-
- EntityManager em;
+
+ EntityManager em = null;
+ String OpsHistPU = System.getProperty("OperationsHistoryPU");
+ if(OpsHistPU == null || !OpsHistPU.equals("TestOperationsHistoryPU")){
+ OpsHistPU = "OperationsHistoryPU";
+ }
try{
- em = Persistence.createEntityManagerFactory("OperationsHistoryPU").createEntityManager();
- }catch(Exception e){
- logger.error("getCountFromDB threw: ", e);
+ em = Persistence.createEntityManagerFactory(OpsHistPU).createEntityManager();
+ }catch(Exception ex){
+ logger.error("PIP thread got Exception. Can't connect to Operations History DB -- {}", OpsHistPU);
+ logger.error("getCountFromDB threw: ", ex);
+ }
+
+ DateUtil dateUtil = new DateUtil(){
+ private long ms = 0;
+ private double multiplier = 0;
+
+ @Override
+ public DateUtil init(String sqlValUnit) throws Exception{
+ String[] split = sqlValUnit.split(" ");
+ if(split.length != 2){
+ throw new Exception("Invalid Value Unit pair for SQL");
+ }
+
+ ms = Long.parseLong(split[0]);
+
+ if("SECOND".compareToIgnoreCase(split[1]) == 0){
+ multiplier = 1000;
+ }
+ else if("MINUTE".compareToIgnoreCase(split[1]) == 0){
+ multiplier = 60000;
+ }
+ else if("HOUR".compareToIgnoreCase(split[1]) == 0){
+ multiplier = 3.6e+6;
+ }
+ else if("DAY".compareToIgnoreCase(split[1]) == 0){
+ multiplier = 8.64e+7;
+ }
+ else if("WEEK".compareToIgnoreCase(split[1]) == 0){
+ multiplier = 6.048e+8;
+ }
+ else if("MONTH".compareToIgnoreCase(split[1]) == 0){
+ multiplier = 2.628e+9;
+ }
+ else if("QUARTER".compareToIgnoreCase(split[1]) == 0){
+ multiplier = 2.628e+9 * 3;
+ }
+ else if("YEAR".compareToIgnoreCase(split[1]) == 0){
+ multiplier = 3.154e+10;
+ }
+ else{
+ logger.error("{} not supported", split[1]);
+ }
+
+ ms *= multiplier;
+ return this;
+ }
+ public long getMs(){
+ return ms;
+ }
+ };
+
+ long now = new Date().getTime();
+ long diff;
+ try {
+ diff = now - dateUtil.init(timeWindow).getMs();
+ } catch (Exception ex) {
+ System.err.println("PIP thread got Exception " + ex.getLocalizedMessage());
return -1;
}
-
+
String sql = "select count(*) as count from operationshistory10 where outcome<>'Failure_Guard'"
- + " and actor=:actor"
- + " and operation=:operation"
- + " and target=:target"
- + " and endtime between date_sub(now(),interval :timeWindow) and now()";
-
- Query nq = em.createNativeQuery(sql);
- nq = nq.setParameter("actor", actor);
- nq = nq.setParameter("operation", operation);
- nq = nq.setParameter("target", target);
- nq = nq.setParameter("timeWindow", timeWindow);
-
+ + " and actor= ?"
+ + " and operation= ?"
+ + " and target= ?"
+ + " and endtime between '" + new Timestamp(diff) + "' and '" + new Timestamp(now) + "'";
+
+ Query nq = em.createNativeQuery(sql);
+ nq.setParameter(1, actor);
+ nq.setParameter(2, operation);
+ nq.setParameter(3, target);
+
int ret = -1;
try{
ret = ((Number)nq.getSingleResult()).intValue();
@@ -323,12 +391,12 @@ public class PIPEngineGetHistory extends StdConfigurableEngine{
logger.error("getCountFromDB threw: ", ex);
return -1;
}
-
+
em.close();
-
- return ret;
-
+
+ return ret;
+
}
-} \ No newline at end of file
+}
diff --git a/controlloop/templates/template.demo/pom.xml b/controlloop/templates/template.demo/pom.xml
index 5436b5ebd..eb85f7fdc 100644
--- a/controlloop/templates/template.demo/pom.xml
+++ b/controlloop/templates/template.demo/pom.xml
@@ -7,9 +7,9 @@
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
-
+
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -197,5 +197,11 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <version>[1.4.186,)</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
-</project> \ No newline at end of file
+</project>
diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/AaiSimulatorTest.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/AaiSimulatorTest.java
index 71c6e3a29..3bddbc50d 100644
--- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/AaiSimulatorTest.java
+++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/AaiSimulatorTest.java
@@ -7,9 +7,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -35,7 +35,7 @@ import org.onap.policy.aai.AAINQF199.AAINQF199Response;
import org.onap.policy.drools.http.server.HttpServletServer;
public class AaiSimulatorTest {
-
+
@BeforeClass
public static void setUpSimulator() {
try {
@@ -44,12 +44,12 @@ public class AaiSimulatorTest {
fail(e.getMessage());
}
}
-
+
@AfterClass
public static void tearDownSimulator() {
HttpServletServer.factory.destroy();
}
-
+
@Test
public void testGet() {
AAIGETResponse response = AAINQF199Manager.getQuery("http://localhost:6666", "testUser", "testPass", UUID.randomUUID(), "5e49ca06-2972-4532-9ed4-6d071588d792");
diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/ControlLoopXacmlGuardTest.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/ControlLoopXacmlGuardTest.java
index 8c0b99462..d1fa4fc10 100644
--- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/ControlLoopXacmlGuardTest.java
+++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/ControlLoopXacmlGuardTest.java
@@ -7,9 +7,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -34,7 +34,6 @@ import java.util.UUID;
import org.junit.AfterClass;
import org.junit.BeforeClass;
-import org.junit.Ignore;
import org.junit.Test;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.FactHandle;
@@ -44,7 +43,6 @@ import org.onap.policy.appclcm.LCMResponse;
import org.onap.policy.appclcm.LCMResponseWrapper;
import org.onap.policy.controlloop.ControlLoopEventStatus;
import org.onap.policy.controlloop.ControlLoopNotificationType;
-
import org.onap.policy.controlloop.VirtualControlLoopEvent;
import org.onap.policy.controlloop.VirtualControlLoopNotification;
import org.onap.policy.controlloop.policy.ControlLoopPolicy;
@@ -54,7 +52,7 @@ import org.onap.policy.drools.impl.PolicyEngineJUnitImpl;
import org.onap.policy.guard.PolicyGuard;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-//import org.onap.policy.controlloop.policy.guard.ControlLoopGuard;
+
public class ControlLoopXacmlGuardTest {
@@ -66,32 +64,42 @@ public class ControlLoopXacmlGuardTest {
fail(e.getMessage());
}
}
-
+
@AfterClass
public static void tearDownSimulator() {
HttpServletServer.factory.destroy();
}
-
+
private static final Logger logger = LoggerFactory.getLogger(ControlLoopXacmlGuardTest.class);
+ private static final String OPSHISTPUPROP = "OperationsHistoryPU";
+ @BeforeClass
+ public static void setPUProp(){
+ System.setProperty(OPSHISTPUPROP, "TestOperationsHistoryPU");
+ }
+ @AfterClass
+ public static void restorePUProp(){
+ System.setProperty(OPSHISTPUPROP, OPSHISTPUPROP);
+ }
+
@Test
public void test() {
try {
- this.runTest("src/main/resources/ControlLoop_Template_xacml_guard.drl",
+ this.runTest("src/main/resources/ControlLoop_Template_xacml_guard.drl",
"src/test/resources/yaml/policy_ControlLoop_Service123.yaml",
- "service=Service123;resource=Res123;type=operational",
- "CL_SERV123_8888",
+ "service=Service123;resource=Res123;type=operational",
+ "CL_SERV123_8888",
"org.onap.closed_loop.Service123:VNFS:0.0.1");
} catch (IOException e) {
e.printStackTrace();
fail(e.getMessage());
}
}
-
- public void runTest(String droolsTemplate,
- String yamlFile,
- String policyScope,
- String policyName,
+
+ public void runTest(String droolsTemplate,
+ String yamlFile,
+ String policyScope,
+ String policyName,
String policyVersion) throws IOException {
//
// Pull info from the yaml
@@ -105,20 +113,21 @@ public class ControlLoopXacmlGuardTest {
//
// Build a container
//
- final KieSession kieSession = Util.buildContainer(droolsTemplate,
- pair.a.getControlLoop().getControlLoopName(),
- policyScope,
- policyName,
- policyVersion,
+ final KieSession kieSession = Util.buildContainer(droolsTemplate,
+ pair.a.getControlLoop().getControlLoopName(),
+ policyScope,
+ policyName,
+ policyVersion,
URLEncoder.encode(pair.b, "UTF-8"));
-
-
+
+
+
logger.debug("============");
logger.debug(URLEncoder.encode(pair.b, "UTF-8"));
logger.debug("============");
-
+
final PolicyEngineJUnitImpl engine = (PolicyEngineJUnitImpl) kieSession.getGlobal("Engine");
-
+
//
// Initial fire of rules
//
@@ -132,17 +141,17 @@ public class ControlLoopXacmlGuardTest {
@Override
public void run() {
try {
-
-
+
+
//
// Let's use a unique ID for the request and
// a unique trigger source.
//
UUID requestID = UUID.randomUUID();
String triggerSourceName = "foobartriggersource36";
-
+
Object obj = null;
-
+
sendGoodEvents(kieSession, pair.a, requestID, triggerSourceName);
obj = engine.subscribe("UEB", "POLICY-CL-MGT");
assertNotNull(obj);
@@ -151,9 +160,9 @@ public class ControlLoopXacmlGuardTest {
//
// Give the control loop a little time to acquire the lock and publish the request
//
- Thread.sleep(2000);
-
-
+ Thread.sleep(4000);
+
+
// "About to query Guard" notification (Querying about Restart)
obj = engine.subscribe("UEB", "POLICY-CL-MGT");
assertNotNull(obj);
@@ -161,18 +170,18 @@ public class ControlLoopXacmlGuardTest {
logger.debug("Rule: {} Message {}", ((VirtualControlLoopNotification)obj).policyName, ((VirtualControlLoopNotification)obj).message);
assertTrue(obj instanceof VirtualControlLoopNotification);
assertTrue(((VirtualControlLoopNotification)obj).notification.equals(ControlLoopNotificationType.OPERATION));
-
- Thread.sleep(2000);
+
+ Thread.sleep(4000);
// "Response from Guard" notification
obj = engine.subscribe("UEB", "POLICY-CL-MGT");
assertNotNull(obj);
logger.debug("Rule: {} Message {}", ((VirtualControlLoopNotification)obj).policyName, ((VirtualControlLoopNotification)obj).message);
assertTrue(obj instanceof VirtualControlLoopNotification);
assertTrue(((VirtualControlLoopNotification)obj).notification.equals(ControlLoopNotificationType.OPERATION));
-
-
+
+
if(true == ((VirtualControlLoopNotification)obj).message.contains("Guard result: Deny")){
-
+
// "About to query Guard" notification (Querying about Rebuild)
obj = engine.subscribe("UEB", "POLICY-CL-MGT");
assertNotNull(obj);
@@ -180,19 +189,19 @@ public class ControlLoopXacmlGuardTest {
logger.debug("Rule: {} Message", ((VirtualControlLoopNotification)obj).policyName, ((VirtualControlLoopNotification)obj).message);
assertTrue(obj instanceof VirtualControlLoopNotification);
assertTrue(((VirtualControlLoopNotification)obj).notification.equals(ControlLoopNotificationType.OPERATION));
-
- Thread.sleep(2000);
-
+
+ Thread.sleep(4000);
+
// "Response from Guard" notification
obj = engine.subscribe("UEB", "POLICY-CL-MGT");
assertNotNull(obj);
logger.debug("Rule: {} Message {}", ((VirtualControlLoopNotification)obj).policyName, ((VirtualControlLoopNotification)obj).message);
assertTrue(obj instanceof VirtualControlLoopNotification);
assertTrue(((VirtualControlLoopNotification)obj).notification.equals(ControlLoopNotificationType.OPERATION));
-
-
+
+
if(true == ((VirtualControlLoopNotification)obj).message.contains("Guard result: Deny")){
-
+
// "About to query Guard" notification (Querying about Migrate)
obj = engine.subscribe("UEB", "POLICY-CL-MGT");
assertNotNull(obj);
@@ -200,25 +209,25 @@ public class ControlLoopXacmlGuardTest {
logger.debug("Rule: {} Message {}", ((VirtualControlLoopNotification)obj).policyName, ((VirtualControlLoopNotification)obj).message);
assertTrue(obj instanceof VirtualControlLoopNotification);
assertTrue(((VirtualControlLoopNotification)obj).notification.equals(ControlLoopNotificationType.OPERATION));
-
- Thread.sleep(2000);
-
+
+ Thread.sleep(4000);
+
// "Response from Guard" notification
obj = engine.subscribe("UEB", "POLICY-CL-MGT");
assertNotNull(obj);
logger.debug("Rule: " + ((VirtualControlLoopNotification)obj).policyName +" Message: " + ((VirtualControlLoopNotification)obj).message);
assertTrue(obj instanceof VirtualControlLoopNotification);
assertTrue(((VirtualControlLoopNotification)obj).notification.equals(ControlLoopNotificationType.OPERATION));
-
-
+
+
if(true == ((VirtualControlLoopNotification)obj).message.contains("Guard result: Deny")){
//All the 3 operations were Denied by Guard
- Thread.sleep(30000);
-
- }
+ Thread.sleep(60000);
+
+ }
}
}
-
+
//
// In case one of the operations was permitted by Guard
//
@@ -228,16 +237,16 @@ public class ControlLoopXacmlGuardTest {
logger.debug("Rule: {} Message {}", ((VirtualControlLoopNotification)obj).policyName, ((VirtualControlLoopNotification)obj).message);
assertTrue(obj instanceof VirtualControlLoopNotification);
assertTrue(((VirtualControlLoopNotification)obj).notification.equals(ControlLoopNotificationType.OPERATION));
-
- Thread.sleep(500);
-
+
+ Thread.sleep(1000);
+
obj = engine.subscribe("UEB", "APPC-CL");
assertNotNull(obj);
assertTrue(obj instanceof LCMRequestWrapper);
LCMRequestWrapper dmaapRequest = (LCMRequestWrapper) obj;
LCMRequest appcRequest = dmaapRequest.getBody();
assertTrue(appcRequest.getCommonHeader().getSubRequestId().equals("1"));
-
+
logger.debug("\n============ APP-C Got request!!! ===========\n");
//
// Ok - let's simulate ACCEPT
@@ -246,8 +255,8 @@ public class ControlLoopXacmlGuardTest {
//
// now wait for it to finish
//
- Thread.sleep(500);
-
+ Thread.sleep(1000);
+
//
// Now we are going to success it
//
@@ -260,7 +269,7 @@ public class ControlLoopXacmlGuardTest {
//
// Give it some time to process
//
- Thread.sleep(2000);
+ Thread.sleep(4000);
//
// Insert the abatement event
//
@@ -268,16 +277,16 @@ public class ControlLoopXacmlGuardTest {
//
// now wait for it to finish
//
- Thread.sleep(15000);
+ Thread.sleep(15000);
//
// Ensure they released the lock
//
assertFalse(PolicyGuard.isLocked(TargetType.VM, triggerSourceName, requestID));
-
+
}
-
-
-
+
+
+
} catch (InterruptedException e) {
logger.error("Test thread got InterruptedException ", e.getLocalizedMessage());
} catch (AssertionError e) {
@@ -289,7 +298,7 @@ public class ControlLoopXacmlGuardTest {
}
kieSession.halt();
}
-
+
}).start();
//
// Start firing rules
@@ -303,17 +312,17 @@ public class ControlLoopXacmlGuardTest {
// See if there is anything left in memory
//
assertEquals(1, kieSession.getFactCount());
-
+
for (FactHandle handle : kieSession.getFactHandles()) {
Object fact = kieSession.getObject(handle);
assertEquals("", "org.onap.policy.controlloop.Params", fact.getClass().getName());
}
kieSession.dispose();
}
-
-
-
+
+
+
public static void dumpFacts(KieSession kieSession) {
logger.debug("Fact Count: {}", kieSession.getFactCount());
for (FactHandle handle : kieSession.getFactHandles()) {
@@ -336,7 +345,7 @@ public class ControlLoopXacmlGuardTest {
event.closedLoopEventStatus = ControlLoopEventStatus.ABATED;
kieSession.insert(event);
}
-
+
protected void sendGoodEvents(KieSession kieSession, ControlLoopPolicy policy, UUID requestID, String triggerSourceName) throws InterruptedException {
VirtualControlLoopEvent event = new VirtualControlLoopEvent();
event.closedLoopControlName = policy.getControlLoop().getControlLoopName();
@@ -350,10 +359,10 @@ public class ControlLoopXacmlGuardTest {
event.AAI.put("vserver.vserver-name", "testGenericVnfName");
event.closedLoopEventStatus = ControlLoopEventStatus.ONSET;
kieSession.insert(event);
- Thread.sleep(1000);
-
+ Thread.sleep(2000);
+
}
-
+
protected void sendBadEvents(KieSession kieSession, ControlLoopPolicy policy, UUID requestID, String triggerSourceName) throws InterruptedException {
//
// Insert a bad Event
@@ -361,13 +370,13 @@ public class ControlLoopXacmlGuardTest {
VirtualControlLoopEvent event = new VirtualControlLoopEvent();
event.closedLoopControlName = policy.getControlLoop().getControlLoopName();
kieSession.insert(event);
- Thread.sleep(250);
+ Thread.sleep(500);
//
// add the request id
//
event.requestID = requestID;
kieSession.insert(event);
- Thread.sleep(250);
+ Thread.sleep(500);
//
// add some aai
//
@@ -376,35 +385,35 @@ public class ControlLoopXacmlGuardTest {
event.AAI.put("vserver.selflink", "bar");
event.AAI.put("vserver.vserver-name", "vmfoo");
kieSession.insert(event);
- Thread.sleep(250);
+ Thread.sleep(500);
//
// set a valid status
//
event.closedLoopEventStatus = ControlLoopEventStatus.ONSET;
kieSession.insert(event);
- Thread.sleep(250);
+ Thread.sleep(500);
//
// add a trigger sourcename
//
kieSession.insert(event);
- Thread.sleep(250);
+ Thread.sleep(500);
//
// add is closed-loop-disabled
//
event.AAI.put("vserver.is-closed-loop-disabled", "true");
kieSession.insert(event);
- Thread.sleep(250);
+ Thread.sleep(500);
//
// now enable
//
event.AAI.put("vserver.is-closed-loop-disabled", "false");
kieSession.insert(event);
- Thread.sleep(250);
+ Thread.sleep(500);
//
// Add target, but bad.
//
event.target = "VM_BLAH";
kieSession.insert(event);
- Thread.sleep(250);
+ Thread.sleep(500);
}
}
diff --git a/controlloop/templates/template.demo/src/test/resources/META-INF/persistence.xml b/controlloop/templates/template.demo/src/test/resources/META-INF/persistence.xml
new file mode 100644
index 000000000..c3740d0b2
--- /dev/null
+++ b/controlloop/templates/template.demo/src/test/resources/META-INF/persistence.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence version="2.1"
+ xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
+
+ <!-- In-mem DB for junit -->
+ <persistence-unit name="TestOperationsHistoryPU"
+ transaction-type="RESOURCE_LOCAL">
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+ <class>org.onap.policy.controlloop.eventmanager.OperationsHistoryDbEntry</class>
+ <properties>
+ <property name="eclipselink.ddl-generation" value="create-tables" />
+ <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
+ <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
+ <property name="javax.persistence.jdbc.user" value="sa" />
+ <property name="javax.persistence.jdbc.password" value="" />
+ <property name="eclipselink.logging.level" value="ALL" />
+ </properties>
+ </persistence-unit>
+
+
+</persistence>