Add in-mem specification in test/resources/META-INF/persistence.xml for junit. Use system properties to choose
which db to use. Removed named parameters in PIPEngineHistory.java. Change
6.3.0 versions of drools-core to 6.5.0 in pom. Make PIPEngineGetHistory
query more general. Increased sleep times in junit.
Issue-ID: POLICY-55
Change-Id: I6bc65fd88c43c4e7143f27a7e6d8666c2c4df060
Signed-off-by: Temoc Rodriguez <cr056n@att.com>
<version>1.1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
+
</dependencies>
</project>
* 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.
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
+ "]";
}
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;
}
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
//
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
//
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 {
}
return null;
}
-
+
public PolicyResult onResponse(Object response) {
//
// Which response is it?
}
}
else if (response instanceof LCMResponseWrapper) {
-
+
LCMResponseWrapper dmaapResponse = (LCMResponseWrapper) response;
-
+
/*
* Parse out the operation attempt using the subrequestid
*/
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)) {
}
return null;
}
-
+
public Integer getOperationTimeout() {
//
// Sanity check
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) {
}
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();
}
return null;
}
-
+
public String getOperationMessage(String guardResult) {
if (this.currentOperation != null && this.currentOperation.operation != null) {
return this.currentOperation.operation.toMessage()+ ", Guard result: " + guardResult;
}
return null;
}
-
+
public String getOperationHistory() {
if (this.currentOperation != null && this.currentOperation.operation != null) {
return this.currentOperation.operation.toHistory();
}
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() {
//
//
//
return true;
}
-
+
public boolean isOperationRunning() {
return (this.currentOperation != null);
}
-
+
private boolean isRetriesMaxedOut() {
if (policy.getRetry() == null || policy.getRetry() == 0) {
//
}
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;
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)");
}
}
logger.debug("Could not find associated operation");
-
+
}
-
+
}
<?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>
* 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.
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;
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 {
}
}
-
-
+
+
public PIPEngineGetHistory() {
super();
// TODO Auto-generated constructor stub
}
-
-
+
+
@Override
public Collection<PIPRequest> attributesRequired() {
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
*/
return StdPIPResponse.PIP_RESPONSE_EMPTY;
}
}
-
+
String[] s1 = string.split("tw:");
String[] s2 = s1[1].split(":");
String timeWindowVal = s2[0];// number [of minutes, hours, days...]
String 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);
}
}
-
-
+
+
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
if (pipResponseATTUID == null) {
return null;
}
-
+
/*
* Iterate over all of the returned results and do the LDAP requests
*/
}
}
}
-
+
return setATTUIDs;
}
if (pipResponseATTUID == null) {
return null;
}
-
+
/*
* Iterate over all of the returned results and do the LDAP requests
*/
}
}
}
-
+
return setATTUIDs;
}
-
-
+
+
private Set<String> getTarget(PIPFinder pipFinder) {
/*
* Get the AT&T UID from either the subject id or the attuid property
if (pipResponseATTUID == null) {
return null;
}
-
+
/*
* Iterate over all of the returned results and do the LDAP requests
*/
}
}
}
-
+
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();
logger.error("getCountFromDB threw: ", ex);
return -1;
}
-
+
em.close();
-
- return ret;
-
+
+ return ret;
+
}
-}
\ No newline at end of file
+}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
-
+
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<version>${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>
* 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.
import org.onap.policy.drools.http.server.HttpServletServer;
public class AaiSimulatorTest {
-
+
@BeforeClass
public static void setUpSimulator() {
try {
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");
* 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.
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;
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;
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 {
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
//
// 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
//
@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);
//
// 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);
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);
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);
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
//
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
//
// now wait for it to finish
//
- Thread.sleep(500);
-
+ Thread.sleep(1000);
+
//
// Now we are going to success it
//
//
// Give it some time to process
//
- Thread.sleep(2000);
+ Thread.sleep(4000);
//
// Insert the abatement event
//
//
// 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) {
}
kieSession.halt();
}
-
+
}).start();
//
// Start firing rules
// 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()) {
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();
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
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
//
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);
}
}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<persistence version="2.1"\r
+ xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">\r
+\r
+ <!-- In-mem DB for junit -->\r
+ <persistence-unit name="TestOperationsHistoryPU"\r
+ transaction-type="RESOURCE_LOCAL">\r
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>\r
+ <class>org.onap.policy.controlloop.eventmanager.OperationsHistoryDbEntry</class>\r
+ <properties>\r
+ <property name="eclipselink.ddl-generation" value="create-tables" />\r
+ <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />\r
+ <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />\r
+ <property name="javax.persistence.jdbc.user" value="sa" />\r
+ <property name="javax.persistence.jdbc.password" value="" />\r
+ <property name="eclipselink.logging.level" value="ALL" />\r
+ </properties>\r
+ </persistence-unit>\r
+\r
+\r
+</persistence>\r