diff options
author | Charles Cole <cc847m@att.com> | 2017-10-06 09:18:45 -0500 |
---|---|---|
committer | Charles Cole <cc847m@att.com> | 2017-10-11 16:07:04 -0500 |
commit | 777302bddf16316fb555ebc0d9f32dd2ecc0ebf4 (patch) | |
tree | 57cc8bab695c89985670760475621e4360e35c05 | |
parent | 82b577dfb36788936d1503c7fd77320536cc2d10 (diff) |
Enable junits to work with the archetype template
Control loop junits now use the actual PolicyEngine instead of a
simulation, allowing them to work with the archetype template
Issue-ID: POLICY-101
Change-Id: I910961996aaf831f4e91b7d7173d05fdfdd77683
Signed-off-by: Charles Cole <cc847m@att.com>
9 files changed, 194 insertions, 1297 deletions
diff --git a/controlloop/common/model-impl/appclcm/src/main/java/org/onap/policy/appclcm/util/Serialization.java b/controlloop/common/model-impl/appclcm/src/main/java/org/onap/policy/appclcm/util/Serialization.java index 7187ab1e7..e41fa3653 100644 --- a/controlloop/common/model-impl/appclcm/src/main/java/org/onap/policy/appclcm/util/Serialization.java +++ b/controlloop/common/model-impl/appclcm/src/main/java/org/onap/policy/appclcm/util/Serialization.java @@ -81,12 +81,27 @@ public final class Serialization { @Override public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - return Instant.parse(json.getAsString()); + return Instant.parse(json.getAsString()); } @Override public JsonElement serialize(Instant src, Type typeOfSrc, JsonSerializationContext context) { - return new JsonPrimitive(src.toString()); + return new JsonPrimitive(src.toString()); + } + + } + + public static class InstantJunitAdapter implements JsonSerializer<Instant>, JsonDeserializer<Instant> { + + @Override + public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + return Instant.ofEpochMilli(json.getAsLong()); + } + + @Override + public JsonElement serialize(Instant src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(src.toEpochMilli()); } } @@ -97,5 +112,8 @@ public final class Serialization { public static final Gson gson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting() .registerTypeAdapter(LCMRequest.class, new RequestAdapter()) .registerTypeAdapter(LCMResponse.class, new ResponseAdapter()).create(); + + public static final Gson gsonJunit = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting() + .registerTypeAdapter(Instant.class, new InstantJunitAdapter()).create(); } diff --git a/controlloop/common/model-impl/events/pom.xml b/controlloop/common/model-impl/events/pom.xml index a07bb4786..390d082c5 100644 --- a/controlloop/common/model-impl/events/pom.xml +++ b/controlloop/common/model-impl/events/pom.xml @@ -33,5 +33,11 @@ <version>2.5</version> <scope>provided</scope> </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + <scope>test</scope> + </dependency> </dependencies> </project> diff --git a/controlloop/common/model-impl/events/src/main/java/org/onap/policy/controlloop/util/Serialization.java b/controlloop/common/model-impl/events/src/main/java/org/onap/policy/controlloop/util/Serialization.java index 37b148beb..858dc82b9 100644 --- a/controlloop/common/model-impl/events/src/main/java/org/onap/policy/controlloop/util/Serialization.java +++ b/controlloop/common/model-impl/events/src/main/java/org/onap/policy/controlloop/util/Serialization.java @@ -127,5 +127,12 @@ public final class Serialization { .registerTypeAdapter(ControlLoopNotificationType.class, new notificationTypeAdapter()) .registerTypeAdapter(ControlLoopTargetType.class, new targetTypeAdapter()) .create(); + + final static public Gson gsonJunit = new GsonBuilder().disableHtmlEscaping() + .setPrettyPrinting() + .registerTypeAdapter(ZonedDateTime.class, new gsonUTCAdapter()) + .registerTypeAdapter(Instant.class, new gsonInstantAdapter()) + .registerTypeAdapter(ControlLoopTargetType.class, new targetTypeAdapter()) + .create(); } diff --git a/controlloop/templates/template.demo/src/main/resources/ControlLoop_Template_xacml_guard.drl b/controlloop/templates/template.demo/src/main/resources/ControlLoop_Template_xacml_guard.drl deleted file mode 100644 index 6916524b5..000000000 --- a/controlloop/templates/template.demo/src/main/resources/ControlLoop_Template_xacml_guard.drl +++ /dev/null @@ -1,1228 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * demo - * ================================================================================ - * Copyright (C) 2017 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.controlloop; - -import org.onap.policy.controlloop.VirtualControlLoopEvent; -import org.onap.policy.controlloop.VirtualControlLoopNotification; -import org.onap.policy.controlloop.ControlLoopEventStatus; -import org.onap.policy.controlloop.ControlLoopNotificationType; -import org.onap.policy.controlloop.ControlLoopLogger; -import org.onap.policy.controlloop.policy.PolicyResult; -import org.onap.policy.controlloop.eventmanager.ControlLoopEventManager; -import org.onap.policy.controlloop.eventmanager.ControlLoopEventManager.NEW_EVENT_STATUS; -import org.onap.policy.controlloop.eventmanager.ControlLoopOperationManager; -import org.onap.policy.appc.Request; -import org.onap.policy.appc.Response; -import org.onap.policy.appc.CommonHeader; -import org.onap.policy.appclcm.LCMRequestWrapper; -import org.onap.policy.appclcm.LCMResponseWrapper; -import org.onap.policy.appclcm.LCMRequest; -import org.onap.policy.appclcm.LCMResponse; -import org.onap.policy.appclcm.LCMCommonHeader; -import org.onap.policy.vfc.VFCRequest; -import org.onap.policy.vfc.VFCResponse; -import org.onap.policy.vfc.VFCManager; -import org.onap.policy.so.SOManager; -import org.onap.policy.so.SORequest; -import org.onap.policy.so.SORequestStatus; -import org.onap.policy.so.SORequestDetails; -import org.onap.policy.so.SOModelInfo; -import org.onap.policy.so.SOCloudConfiguration; -import org.onap.policy.so.SORequestInfo; -import org.onap.policy.so.SORequestParameters; -import org.onap.policy.so.SORelatedInstanceListElement; -import org.onap.policy.so.SORelatedInstance; -import org.onap.policy.so.SOResponse; -import org.onap.policy.controlloop.actor.so.SOActorServiceProvider; -import org.onap.policy.guard.PolicyGuard; -import org.onap.policy.guard.PolicyGuard.LockResult; -import org.onap.policy.guard.TargetLock; -import org.onap.policy.guard.GuardResult; -import org.onap.policy.guard.PolicyGuardRequest; -import org.onap.policy.guard.PolicyGuardResponse; -import org.onap.policy.guard.PolicyGuardXacmlRequestAttributes; -import com.att.research.xacml.api.pdp.PDPEngine; -import com.att.research.xacml.std.annotations.RequestParser; -import org.onap.policy.guard.PolicyGuardXacmlHelper; -import org.onap.policy.controlloop.policy.ControlLoopPolicy; -import org.onap.policy.controlloop.policy.Policy; -import java.net.URLDecoder; -import org.eclipse.persistence.exceptions.DatabaseException; - -// -// REPLACE THESE WITH PRODUCTION VERSIONS -// -import org.onap.policy.controlloop.ControlLoopLogger; -import org.onap.policy.drools.PolicyEngine; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.Constructor; - -global ControlLoopLogger Logger; -global PolicyEngine Engine; -global PDPEngine XacmlPdpEngine; - -import java.time.Instant; -import java.util.LinkedList; -import java.util.Iterator; - -declare Params - closedLoopControlName : String - controlLoopYaml : String -end - - -declare OperationTimer - closedLoopControlName : String - requestID : String - delay : String -end - -declare ControlLoopTimer - closedLoopControlName : String - requestID : String - delay : String -end - - -/* -* -* Called once and only once to insert the parameters into working memory for this Closed Loop policy. -* -*/ -rule "${policyName}.SETUP" - when - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Params params = new Params(); - params.setClosedLoopControlName("${closedLoopControlName}"); - params.setControlLoopYaml("${controlLoopYaml}"); - insert(params); - Logger.metrics("Inserted " + params); - Logger.info("------------------------------------------------------------------------------------------------"); - -end - -/* -* -* This rule responds to DCAE Events where there is no manager yet. Either it is -* the first ONSET, or a subsequent badly formed Event (i.e. Syntax error, or is-closed-loop-disabled) -* -*/ -rule "${policyName}.EVENT" - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() ) - not ( ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID ) ) - then - try { - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - // - // Check the event, because we need it to not be null when - // we create the ControlLoopEventManager. The ControlLoopEventManager - // will do extra syntax checking as well check if the closed loop is disabled. - // - if ($event.requestID == null) { - VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); - notification.notification = ControlLoopNotificationType.REJECTED; - notification.from = "policy"; - notification.message = "Missing requestID"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - // - // Let interested parties know - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - // - // Retract it from memory - // - retract($event); - } else { - // - // Create an EventManager - // - ControlLoopEventManager manager = new ControlLoopEventManager($params.getClosedLoopControlName(), $event.requestID); - // - // Determine if EventManager can actively process the event (i.e. syntax, is_closed_loop_disabled checks etc.) - // - VirtualControlLoopNotification notification = manager.activate($params.getControlLoopYaml(), $event); - notification.from = "pdp-0001-controller=controlloop"; // Engine.getInstanceName() - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - // - // Are we actively pursuing this event? - // - if (notification.notification == ControlLoopNotificationType.ACTIVE) { - // - // Insert Event Manager into memory, this will now kick off processing. - // - insert(manager); - // - // Let interested parties know - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - // - // Setup the Overall Control Loop timer - // - ControlLoopTimer clTimer = new ControlLoopTimer(); - clTimer.setClosedLoopControlName($event.closedLoopControlName); - clTimer.setRequestID($event.requestID.toString()); - clTimer.setDelay(manager.getControlLoopTimeout(1500) + "s"); - // - // Insert it - // - insert(clTimer); - } else { - // - // Let interested parties know - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - // - // Retract it from memory - // - retract($event); - } - // - // Now that the manager is inserted into Drools working memory, we'll wait for - // another rule to fire in order to continue processing. This way we can also - // then screen for additional ONSET and ABATED events for this RequestID. - // - } - } catch (Exception e) { - e.printStackTrace(); - VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); - notification.notification = ControlLoopNotificationType.REJECTED; - notification.message = "Exception occurred " + e.getMessage(); - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - // - // - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - // - // Retract the event - // - retract($event); - } -end - -/* -* -* This rule happens when we got a valid ONSET, closed loop is enabled and an Event Manager -* is now created. We can start processing the yaml specification via the Event Manager. -* -*/ -rule "${policyName}.EVENT.MANAGER" - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() ) - $manager : ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID ) - $clTimer : ControlLoopTimer ( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID.toString() ) - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - Logger.metrics($event); - Logger.metrics($manager); - Logger.metrics($clTimer); - // - // Check which event this is. - // - ControlLoopEventManager.NEW_EVENT_STATUS eventStatus = $manager.onNewEvent($event); - Logger.info("Event status is " + eventStatus); - // - // Check what kind of event this is - // - if (eventStatus == NEW_EVENT_STATUS.SUBSEQUENT_ONSET) { - // - // We don't care about subsequent onsets - // - Logger.info("Retracting Subsequent Onset " + $event); - retract($event); - return; - } - if (eventStatus == NEW_EVENT_STATUS.SYNTAX_ERROR) { - // - // Ignore any bad syntax events - // - Logger.info("Retracting Bad Syntax Event " + $event); - retract($event); - return; - } - // - // We only want the initial ONSET event in memory, - // all the other events need to be retracted to support - // cleanup and avoid the other rules being fired for this event. - // - if (eventStatus != NEW_EVENT_STATUS.FIRST_ONSET) { - Logger.info("Retracting Event " + $event); - retract($event); - } - Logger.info("Checking due to new event " + $event.target); - // - // Now start seeing if we need to process this event - // - try { - // - // Check if this is a Final Event - // - VirtualControlLoopNotification notification = $manager.isControlLoopFinal(); - - - if (notification != null) { - // - // Its final, but are we waiting for abatement? - // - if ($manager.getNumAbatements() > 0) { - Logger.info("Abatement received, close out the control loop for " + $event.requestID); - notification.from = "policy"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - // - // In this case, we are done - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - // - // Unlock the target - // - TargetLock lock = $manager.unlockCurrentOperation(); - if (lock != null) { - System.out.println("retracting lock " + lock); - retract(lock); - } - // - // Retract everything from memory - // - System.out.println("retracting onset"); - retract($manager.getOnsetEvent()); - retract($manager); - retract($clTimer); - // - // TODO - what if we get subsequent Events for this RequestID? - // By default, it will all start over again. May be confusing for Ruby. - // Or, we could track this and then subsequently ignore the events - // - } else { - // - // Check whether we need to wait for abatement - // - if ($manager.getProcessor().getControlLoop().getAbatement() == true && notification.notification == ControlLoopNotificationType.FINAL_SUCCESS) { - Logger.info("Waiting for abatement."); - } else { - Logger.info("No abatement is promised to come, close out the control loop for " + $event.requestID); - notification.from = "policy"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - // - // In this case, we are done - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - // - // Unlock the target - // - TargetLock lock = $manager.unlockCurrentOperation(); - if (lock != null) { - System.out.println("retracting lock " + lock); - retract(lock); - } - // - // Retract everything from memory - // - System.out.println("retracting onset"); - retract($manager.getOnsetEvent()); - retract($manager); - retract($clTimer); - } - } - } else { - // - // NOT final, so let's ask for the next operation - // - ControlLoopOperationManager operation = $manager.processControlLoop(); - if (operation != null) { - Logger.info("starting a new operation" + operation); - // - // insert into memory - // - insert(operation); - // - // insert operation timeout object - // - OperationTimer opTimer = new OperationTimer(); - opTimer.setClosedLoopControlName($event.closedLoopControlName); - opTimer.setRequestID($event.requestID.toString()); - opTimer.setDelay(operation.getOperationTimeout().toString() + "s"); - insert(opTimer); - - // - // Let's ask for a lock right away - // - LockResult<GuardResult, TargetLock> result = $manager.lockCurrentOperation(); - if (result.getA().equals(GuardResult.LOCK_ACQUIRED)) { - Logger.info("manager returned lock " + result.getB()); - // - // Insert into memory - // - insert(result.getB()); - } - } else { - // - // Probably waiting for abatement - // - } - } - } catch (Exception e) { - e.printStackTrace(); - /* - VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); - notification.notification = ControlLoopNotificationType.REJECTED; - notification.from = "policy"; - notification.message = "Exception occurred " + e.getMessage(); - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - // - // - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - // - // TODO should we abort if we get an exception? - // - */ - } - -end - - - -/* -* -* -* -*/ -rule "${policyName}.EVENT.MANAGER.OPERATION.NOT_LOCKED.TIMEOUT" - timer (int: 5s 5s) - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() ) - $manager : ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID ) - $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.closedLoopControlName, onset.requestID == $event.requestID ) - not ( TargetLock (requestID == $event.requestID) ) - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - Logger.metrics($manager); - Logger.metrics($operation); - // - // Need to ask for a Lock - // - LockResult<GuardResult, TargetLock> result = $manager.lockCurrentOperation(); - if (result.getA().equals(GuardResult.LOCK_ACQUIRED)) { - Logger.info("Lock acquired: " + result.getB()); - // - // Insert into memory - // - insert(result.getB()); - } -end - -/* -* -* Guard Permitted, let's send request to the actor. -* -*/ -rule "${policyName}.EVENT.MANAGER.OPERATION.LOCKED.GUARD_PERMITTED" - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() ) - $manager : ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID ) - $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.closedLoopControlName, onset.requestID == $event.requestID, "Permit".equalsIgnoreCase(getGuardApprovalStatus()) ) - $lock : TargetLock (requestID == $event.requestID) - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - Logger.metrics($manager); - Logger.metrics($operation); - Logger.metrics($lock); - - - Object request = $operation.startOperation($event); - - if (request != null) { - Logger.info("Starting operation"); - // - // Tell interested parties we are performing this Operation - // - VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); - notification.notification = ControlLoopNotificationType.OPERATION; - notification.message = $operation.getOperationMessage(); - notification.history = $operation.getHistory(); - notification.from = "policy"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - - switch ($operation.policy.getActor()){ - - case "APPC": - if (request instanceof Request) { - Engine.deliver("UEB", "APPC-CL", request); - } - else if (request instanceof LCMRequestWrapper) { - Engine.deliver("UEB", "APPC-LCM-READ", request); - } - break; - case "SO": - // at this point the AAI named query request should have already been made, the response recieved and used - // in the construction of the SO Request which is stored in operationRequest - - if(request instanceof SORequest) { - // Call SO. The response will be inserted into memory once it's received - SOActorServiceProvider.sendRequest(drools.getWorkingMemory(), request); - } - break; - case "VFC": - if (request instanceof VFCRequest) { - // Start VFC thread - Thread t = new Thread(new VFCManager(drools.getWorkingMemory(), (VFCRequest)request)); - t.start(); - } - break; - } - } else { - // - // What happens if its null? - // - } -end - - -/* -* -* We were able to acquire a lock so now let's ask Xacml Guard whether we are allowed to proceed with the request to the actor. -* -*/ -rule "${policyName}.EVENT.MANAGER.OPERATION.LOCKED.GUARD_NOT_YET_QUERIED" - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() ) - $manager : ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID ) - $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.closedLoopControlName, onset.requestID == $event.requestID, getGuardApprovalStatus() == "NONE" ) - $lock : TargetLock (requestID == $event.requestID) - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - Logger.metrics($manager); - Logger.metrics($operation); - Logger.metrics($lock); - - // - // Sending notification that we are about to query Guard ("DB write - start operation") - // - VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); - notification.notification = ControlLoopNotificationType.OPERATION; - notification.message = "Sending guard query for " + $operation.policy.getActor() + " " + $operation.policy.getRecipe(); - notification.history = $operation.getHistory(); - notification.from = "policy"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - - // - // Now send Guard Request to XACML Guard. In order to bypass the call to Guard, just change guardEnabled to false. - // - // In order to use REST XACML, provide a URL instead of "" as a second argument o the CallGuardTask() and set the first - // argument to null (instead of XacmlPdpEngine). - // - boolean guardEnabled = true; - - if(guardEnabled){ - - Thread t = new Thread(new org.onap.policy.guard.CallGuardTask( - drools.getWorkingMemory(), - $event.closedLoopControlName, - $operation.policy.getActor().toString(), - $operation.policy.getRecipe(), - $manager.getTargetInstance($operation.policy), - //$event.target, - $event.requestID.toString() - )); - t.start(); - } - else{ - insert(new PolicyGuardResponse("Permit", $event.requestID, $operation.policy.getRecipe())); - } - - - - -end - -// -//This rule will be triggered when a thread talking to the XACML Guard inserts a guardResponse object into the working memory -// -rule "${policyName}.GUARD.RESPONSE" - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET ) - $manager : ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID ) - $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.closedLoopControlName, onset.requestID == $event.requestID ) - $lock : TargetLock (requestID == $event.requestID) - $opTimer : OperationTimer( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID.toString() ) - $guardResponse : PolicyGuardResponse(requestID == $event.requestID, $operation.policy.recipe == operation) - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - Logger.metrics($event); - Logger.metrics($operation); - Logger.metrics($lock); - Logger.metrics($guardResponse); - - - //we will permit the operation if there was no Guard for it - if("Indeterminate".equalsIgnoreCase($guardResponse.result)){ - $guardResponse.result = "Permit"; - } - - // - // This notification has Guard result in "message". ("DB write - end operation in case of Guard Deny") - // - VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); - notification.notification = ControlLoopNotificationType.OPERATION; - notification.message = "Guard result for " + $operation.policy.getActor() + " " + $operation.policy.getRecipe() + " is " + $guardResponse.result; - notification.history = $operation.getHistory(); - notification.from = "policy"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - - - - if("Permit".equalsIgnoreCase($guardResponse.result)){ - - modify($operation){setGuardApprovalStatus($guardResponse.result)}; - } - else { - //This is the Deny case - $operation.setOperationHasGuardDeny(); - retract($opTimer); - retract($operation); - modify($manager) {finishOperation($operation)}; - } - - retract($guardResponse); - -end - - - - -/* -* -* This rule responds to APPC Response Events -* -* I would have like to be consistent and write the Response like this: -* $response : Response( CommonHeader.RequestID == $onset.requestID ) -* -* However, no compile error was given. But a runtime error was given. I think -* because drools is confused between the classname CommonHeader vs the property CommonHeader. -* -*/ -rule "${policyName}.APPC.RESPONSE" - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET ) - $manager : ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID ) - $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.closedLoopControlName, onset.requestID == $event.requestID ) - $opTimer : OperationTimer( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID.toString() ) - $lock : TargetLock (requestID == $event.requestID) - $response : Response( getCommonHeader().RequestID == $event.requestID ) - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - Logger.metrics($event); - Logger.metrics($manager); - Logger.metrics($operation); - Logger.metrics($opTimer); - Logger.metrics($lock); - Logger.metrics($response); - // - // Get the result of the operation - // - PolicyResult policyResult = $operation.onResponse($response); - if (policyResult != null) { - Logger.info("operation finished with result: " + policyResult); - // - // This Operation has completed, construct a notification showing our results. (DB write - end operation) - // - VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); - notification.from = "policy"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - notification.message = $operation.getOperationHistory(); - notification.history = $operation.getHistory(); - if (policyResult.equals(PolicyResult.SUCCESS)) { - notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS; - // - // Let interested parties know - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - } else { - notification.notification = ControlLoopNotificationType.OPERATION_FAILURE; - // - // Let interested parties know - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - } - // - // Ensure the operation is complete - // - if ($operation.isOperationComplete() == true) { - // - // It is complete, remove it from memory - // - retract($operation); - // - // We must also retract the timer object - // NOTE: We could write a Rule to do this - // - retract($opTimer); - // - // Complete the operation - // - modify($manager) {finishOperation($operation)}; - } else { - // - // Just doing this will kick off the LOCKED rule again - // - modify($operation) {}; - } - } else { - // - // Its not finished yet (i.e. expecting more Response objects) - // - // Or possibly it is a leftover response that we timed the request out previously - // - } - // - // We are going to retract these objects from memory - // - retract($response); -end - -/* -* -* The problem with Responses is that they don't have a controlLoopControlName -* field in them, so the only way to attach them is via RequestID. If we have multiple -* control loop .drl's loaded in the same container, we need to be sure the cleanup -* rules don't remove Responses for other control loops. -* -*/ -rule "${policyName}.APPC.RESPONSE.CLEANUP" - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $response : Response($id : getCommonHeader().RequestID ) - not ( VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - // - // Retract it - // - retract($response); -end - -/* -* -* This rule responds to APPC Response Events using the new LCM interface provided by appc -* -*/ -rule "${policyName}.APPC.LCM.RESPONSE" - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET ) - $manager : ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID ) - $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.closedLoopControlName, onset.requestID == $event.requestID ) - $opTimer : OperationTimer( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID.toString() ) - $lock : TargetLock (requestID == $event.requestID) - $response : LCMResponseWrapper( getBody().getCommonHeader().getRequestId() == $event.requestID ) - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - Logger.metrics($event); - Logger.metrics($manager); - Logger.metrics($operation); - Logger.metrics($opTimer); - Logger.metrics($lock); - Logger.metrics($response); - // - // Get the result of the operation - // - PolicyResult policyResult = $operation.onResponse($response); - if (policyResult != null) { - Logger.info("operation finished with result: " + policyResult); - // - // This Operation has completed, construct a notification showing our results. (DB write - end operation) - // - VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); - notification.from = "policy"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - notification.message = $operation.getOperationHistory(); - notification.history = $operation.getHistory(); - if (policyResult.equals(PolicyResult.SUCCESS)) { - notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS; - // - // Let interested parties know - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - } else { - notification.notification = ControlLoopNotificationType.OPERATION_FAILURE; - // - // Let interested parties know - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - } - // - // Ensure the operation is complete - // - if ($operation.isOperationComplete() == true) { - // - // It is complete, remove it from memory - // - retract($operation); - // - // We must also retract the timer object - // NOTE: We could write a Rule to do this - // - retract($opTimer); - // - // Complete the operation - // - modify($manager) {finishOperation($operation)}; - } else { - // - // Just doing this will kick off the LOCKED rule again - // - modify($operation) {}; - } - } else { - // - // Its not finished yet (i.e. expecting more Response objects) - // - // Or possibly it is a leftover response that we timed the request out previously - // - } - // - // We are going to retract these objects from memory - // - retract($response); -end - -/* -* -* Clean Up any lingering LCM reponses -* -*/ -rule "${policyName}.APPC.LCM.RESPONSE.CLEANUP" - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $response : LCMResponseWrapper($id : getBody().getCommonHeader().getRequestId ) - not ( VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - // - // Retract it - // - retract($response); -end - -/* -* -* This rule responds to SO Response Events -* -*/ -rule "${policyName}.SO.RESPONSE" - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET ) - $manager : ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName ) - $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.closedLoopControlName, onset.requestID == $event.requestID ) - $opTimer : OperationTimer( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID.toString() ) - $lock : TargetLock (requestID == $event.requestID) - $response : SOResponse( requestReferences.requestId.toString() == $event.requestID.toString() ) - then - // - // Logging - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - Logger.metrics($event); - Logger.metrics($manager); - Logger.metrics($operation); - Logger.metrics($opTimer); - Logger.metrics($lock); - Logger.metrics($response); - // Get the result of the operation - // - PolicyResult policyResult = $operation.onResponse($response); - if (policyResult != null) { - // - // This Operation has completed, construct a notification showing our results - // - VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); - notification.from = "policy"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - notification.message = $operation.getOperationHistory(); - notification.history = $operation.getHistory(); - if (policyResult.equals(PolicyResult.SUCCESS)) { - notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS; - // - // Let interested parties know - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - } else { - notification.notification = ControlLoopNotificationType.OPERATION_FAILURE; - // - // Let interested parties know - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - } - // - // Ensure the operation is complete - // - if ($operation.isOperationComplete() == true) { - // - // It is complete, remove it from memory - // - retract($operation); - // - // We must also retract the timer object - // NOTE: We could write a Rule to do this - // - retract($opTimer); - // - // Complete the operation - // - modify($manager) {finishOperation($operation)}; - } else { - // - // Just doing this will kick off the LOCKED rule again - // - modify($operation) {}; - } - } else { - // - // Its not finished yet (i.e. expecting more Response objects) - // - // Or possibly it is a leftover response that we timed the request out previously - // - } - // - // We are going to retract these objects from memory - // - retract($response); - -end - -/* -* -* This rule responds to VFC Response Events -* -*/ -rule "${policyName}.VFC.RESPONSE" - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET ) - $manager : ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName ) - $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.closedLoopControlName, onset.requestID == $event.requestID ) - $opTimer : OperationTimer( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID.toString() ) - $lock : TargetLock (requestID == $event.requestID) - $response : VFCResponse( requestId.toString() == $event.requestID.toString() ) - then - // - // Logging - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - Logger.metrics($event); - Logger.metrics($manager); - Logger.metrics($operation); - Logger.metrics($opTimer); - Logger.metrics($lock); - Logger.metrics($response); - // Get the result of the operation - // - PolicyResult policyResult = $operation.onResponse($response); - if (policyResult != null) { - // - // This Operation has completed, construct a notification showing our results - // - VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); - notification.from = "policy"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - notification.message = $operation.getOperationHistory(); - notification.history = $operation.getHistory(); - // - // Ensure the operation is complete - // - if ($operation.isOperationComplete() == true) { - // - // It is complete, remove it from memory - // - retract($operation); - // - // We must also retract the timer object - // NOTE: We could write a Rule to do this - // - retract($opTimer); - // - // Complete the operation - // - modify($manager) {finishOperation($operation)}; - } else { - // - // Just doing this will kick off the LOCKED rule again - // - modify($operation) {}; - } - } else { - // - // Its not finished yet (i.e. expecting more Response objects) - // - // Or possibly it is a leftover response that we timed the request out previously - // - } - // - // We are going to retract these objects from memory - // - retract($response); - -end - - - -/* -* -* This is the timer that manages the timeout for an individual operation. -* -*/ -rule "${policyName}.EVENT.MANAGER.OPERATION.TIMEOUT" - timer (expr: $to ) - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() ) - $manager : ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID ) - $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.closedLoopControlName, onset.requestID == $event.requestID ) - $opTimer : OperationTimer( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID.toString(), $to : getDelay() ) - $lock : TargetLock (requestID == $event.requestID) - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - Logger.metrics($manager); - Logger.metrics($operation); - Logger.metrics($opTimer); - Logger.metrics($lock); - // - // Tell it its timed out - // - $operation.setOperationHasTimedOut(); - // - // Create a notification for it ("DB Write - end operation") - // - VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); - notification.from = "policy"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - notification.notification = ControlLoopNotificationType.OPERATION_FAILURE; - notification.message = $operation.getOperationHistory(); - notification.history = $operation.getHistory(); - // - // Let interested parties know - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - // - // Get rid of the timer - // - retract($opTimer); - // - // Ensure the operation is complete - // - if ($operation.isOperationComplete() == true) { - // - // It is complete, remove it from memory - // - retract($operation); - // - // Complete the operation - // - modify($manager) {finishOperation($operation)}; - } else { - // - // Just doing this will kick off the LOCKED rule again - // - modify($operation) {}; - } -end - -/* -* -* This is the timer that manages the overall control loop timeout. -* -*/ -rule "${policyName}.EVENT.MANAGER.TIMEOUT" - timer (expr: $to ) - when - $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) - $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() ) - $manager : ControlLoopEventManager( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID ) - $clTimer : ControlLoopTimer ( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID.toString(), $to : getDelay() ) - $operations : LinkedList() - from collect( ControlLoopOperationManager( onset.closedLoopControlName == $event.closedLoopControlName, onset.requestID == $event.requestID ) ) - $opTimers : LinkedList() - from collect( OperationTimer( closedLoopControlName == $event.closedLoopControlName, requestID == $event.requestID.toString() ) ) - $locks : LinkedList() - from collect( TargetLock (requestID == $event.requestID) ) - then - // - // Logging - // - Logger.info("------------------------------------------------------------------------------------------------"); - Logger.metrics(Instant.now() + " " + drools.getRule().getName() + " " + drools.getRule().getPackage()); - Logger.metrics($params); - Logger.metrics($manager); - Logger.metrics($clTimer); - if ($operations == null) { - Logger.info("no operations found"); - } else { - Logger.info("found " + $operations.size() + " operations"); - } - // - // Tell the Event Manager it has timed out - // - VirtualControlLoopNotification notification = $manager.setControlLoopTimedOut(); - if (notification != null) { - notification.from = "policy"; - notification.policyName = drools.getRule().getName(); - notification.policyScope = "${policyScope}"; - notification.policyVersion = "${policyVersion}"; - // - // Let interested parties know - // - Engine.deliver("UEB", "POLICY-CL-MGT", notification); - } - // - // Retract EVERYTHING - // - retract($event); - retract($manager); - retract($clTimer); - if ($operations != null && $operations.size() > 0) { - Iterator<ControlLoopOperationManager> iter = $operations.iterator(); - while (iter.hasNext()) { - ControlLoopOperationManager manager = iter.next(); - retract(manager); - } - } - if ($opTimers != null && $opTimers.size() > 0) { - Iterator<OperationTimer> iter = $opTimers.iterator(); - while (iter.hasNext()) { - OperationTimer opTimer = iter.next(); - retract(opTimer); - } - } - if ($locks != null && $locks.size() > 0) { - Iterator<TargetLock> iter = $locks.iterator(); - while (iter.hasNext()) { - TargetLock lock = iter.next(); - // - // Ensure we release the lock - // - PolicyGuard.unlockTarget(lock); - // - // - // - retract(lock); - } - } -end diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/Util.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/Util.java index 35b339e0f..0c633c477 100644 --- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/Util.java +++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/Util.java @@ -44,12 +44,9 @@ import org.kie.api.builder.Results; import org.kie.api.builder.model.KieModuleModel; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; -import org.onap.policy.controlloop.ControlLoopLogger; -import org.onap.policy.controlloop.impl.ControlLoopLoggerStdOutImpl; import org.onap.policy.controlloop.policy.ControlLoopPolicy; import org.onap.policy.controlloop.policy.guard.ControlLoopGuard; import org.onap.policy.drools.http.server.HttpServletServer; -import org.onap.policy.drools.impl.PolicyEngineJUnitImpl; import org.onap.policy.drools.system.PolicyEngine; import org.onap.policy.guard.PolicyGuardYamlToXacml; import org.slf4j.Logger; @@ -57,9 +54,6 @@ import org.slf4j.LoggerFactory; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.Constructor; -import com.att.research.xacml.api.pdp.PDPEngine; -import com.att.research.xacml.api.pdp.PDPEngineFactory; -import com.att.research.xacml.util.FactoryException; import com.att.research.xacml.util.XACMLProperties; public final class Util { @@ -245,30 +239,11 @@ public final class Util { "src/main/resources/blacklist_template.xml", "src/test/resources/xacml/autogenerated_blacklist.xml"); - - // - // Insert our globals - // - final ControlLoopLogger controlLoopLogger = new ControlLoopLoggerStdOutImpl(); - kieSession.setGlobal("Logger", controlLoopLogger); - final PolicyEngineJUnitImpl engine = new PolicyEngineJUnitImpl(); - kieSession.setGlobal("Engine", engine); - - // // Creating an embedded XACML PDP // - final PDPEngine xacmlPdpEngine; System.setProperty(XACMLProperties.XACML_PROPERTIES_NAME, "src/test/resources/xacml/xacml_guard.properties"); - PDPEngineFactory factory; - try { - factory = PDPEngineFactory.newInstance(); - xacmlPdpEngine = factory.newEngine(); - kieSession.setGlobal("XacmlPdpEngine", xacmlPdpEngine); - } catch (FactoryException e1) { - e1.printStackTrace(); - } return kieSession; } diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VCPEControlLoopTest.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VCPEControlLoopTest.java index 4dc6b806f..ae8bcb4e4 100644 --- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VCPEControlLoopTest.java +++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VCPEControlLoopTest.java @@ -26,6 +26,8 @@ import java.io.IOException; import java.net.URLEncoder; import java.time.Instant; import java.util.HashMap; +import java.util.List; +import java.util.Properties; import java.util.UUID; import org.junit.AfterClass; @@ -42,19 +44,26 @@ 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.drools.PolicyEngineListener; +import org.onap.policy.drools.event.comm.Topic.CommInfrastructure; +import org.onap.policy.drools.event.comm.TopicEndpoint; +import org.onap.policy.drools.event.comm.TopicListener; +import org.onap.policy.drools.event.comm.TopicSink; import org.onap.policy.drools.http.server.HttpServletServer; -import org.onap.policy.drools.impl.PolicyEngineJUnitImpl; +import org.onap.policy.drools.properties.PolicyProperties; +import org.onap.policy.drools.protocol.coders.EventProtocolCoder; +import org.onap.policy.drools.protocol.coders.JsonProtocolFilter; +import org.onap.policy.drools.system.PolicyEngine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class VCPEControlLoopTest implements PolicyEngineListener { +public class VCPEControlLoopTest implements TopicListener { private static final Logger logger = LoggerFactory.getLogger(VCPEControlLoopTest.class); + private static List<? extends TopicSink> noopTopics; + private KieSession kieSession; private Util.Pair<ControlLoopPolicy, String> pair; - private PolicyEngineJUnitImpl engine; private UUID requestID; static { @@ -66,6 +75,18 @@ public class VCPEControlLoopTest implements PolicyEngineListener { @BeforeClass public static void setUpSimulator() { + PolicyEngine.manager.configure(new Properties()); + assertTrue(PolicyEngine.manager.start()); + Properties noopSinkProperties = new Properties(); + noopSinkProperties.put(PolicyProperties.PROPERTY_NOOP_SINK_TOPICS, "APPC-LCM-READ,POLICY-CL-MGT"); + noopSinkProperties.put("noop.sink.topics.APPC-LCM-READ.events", "org.onap.policy.appclcm.LCMRequestWrapper"); + noopSinkProperties.put("noop.sink.topics.APPC-LCM-READ.events.custom.gson", "org.onap.policy.appclcm.util.Serialization,gson"); + noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events", "org.onap.policy.controlloop.VirtualControlLoopNotification"); + noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events.custom.gson", "org.onap.policy.controlloop.util.Serialization,gsonPretty"); + noopTopics = TopicEndpoint.manager.addTopicSinks(noopSinkProperties); + + EventProtocolCoder.manager.addEncoder("junit.groupId", "junit.artifactId", "POLICY-CL-MGT", "org.onap.policy.controlloop.VirtualControlLoopNotification", new JsonProtocolFilter(), null, null, 1111); + EventProtocolCoder.manager.addEncoder("junit.groupId", "junit.artifactId", "APPC-LCM-READ", "org.onap.policy.appclcm.LCMRequestWrapper", new JsonProtocolFilter(), null, null, 1111); try { Util.buildAaiSim(); Util.buildGuardSim(); @@ -77,6 +98,7 @@ public class VCPEControlLoopTest implements PolicyEngineListener { @AfterClass public static void tearDownSimulator() { HttpServletServer.factory.destroy(); + PolicyEngine.manager.shutdown(); } @Test @@ -85,7 +107,7 @@ public class VCPEControlLoopTest implements PolicyEngineListener { * Start the kie session */ try { - kieSession = startSession("src/main/resources/ControlLoop_Template_xacml_guard.drl", + kieSession = startSession("../archetype-cl-amsterdam/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl", "src/test/resources/yaml/policy_ControlLoop_vCPE.yaml", "service=ServiceDemo;resource=Res1Demo;type=operational", "CL_vCPE", @@ -101,7 +123,10 @@ public class VCPEControlLoopTest implements PolicyEngineListener { * notify that there is an event ready to be pulled * from the queue */ - engine.addListener(this); + for (TopicSink sink : noopTopics) { + assertTrue(sink.start()); + sink.register(this); + } /* * Create a unique requestId @@ -114,6 +139,7 @@ public class VCPEControlLoopTest implements PolicyEngineListener { * the rules */ sendEvent(pair.a, requestID, ControlLoopEventStatus.ONSET); + kieSession.fireUntilHalt(); @@ -179,7 +205,6 @@ public class VCPEControlLoopTest implements PolicyEngineListener { /* * Retrieve the Policy Engine */ - engine = (PolicyEngineJUnitImpl) kieSession.getGlobal("Engine"); logger.debug("============"); logger.debug(URLEncoder.encode(pair.b, "UTF-8")); @@ -192,12 +217,17 @@ public class VCPEControlLoopTest implements PolicyEngineListener { * (non-Javadoc) * @see org.onap.policy.drools.PolicyEngineListener#newEventNotification(java.lang.String) */ - public void newEventNotification(String topic) { + public void onTopicEvent(CommInfrastructure commType, String topic, String event) { /* * Pull the object that was sent out to DMAAP and make * sure it is a ControlLoopNoticiation of type active */ - Object obj = engine.subscribe("UEB", topic); + Object obj = null; + if ("POLICY-CL-MGT".equals(topic)) { + obj = org.onap.policy.controlloop.util.Serialization.gsonJunit.fromJson(event, org.onap.policy.controlloop.VirtualControlLoopNotification.class); + } + else if ("APPC-LCM-READ".equals(topic)) + obj = org.onap.policy.appclcm.util.Serialization.gsonJunit.fromJson(event, org.onap.policy.appclcm.LCMRequestWrapper.class); assertNotNull(obj); if (obj instanceof VirtualControlLoopNotification) { VirtualControlLoopNotification notification = (VirtualControlLoopNotification) obj; @@ -216,7 +246,7 @@ public class VCPEControlLoopTest implements PolicyEngineListener { logger.debug("Rule Fired: " + notification.policyName); assertTrue(ControlLoopNotificationType.OPERATION.equals(notification.notification)); assertNotNull(notification.message); - assertTrue(notification.message.endsWith("PERMIT")); + assertTrue(notification.message.toLowerCase().endsWith("permit")); } else if (policyName.endsWith("GUARD_PERMITTED")) { logger.debug("Rule Fired: " + notification.policyName); @@ -305,4 +335,5 @@ public class VCPEControlLoopTest implements PolicyEngineListener { logger.debug("FACT: {}", handle); } } + } diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VDNSControlLoopTest.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VDNSControlLoopTest.java index 641b56f13..c64764baf 100644 --- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VDNSControlLoopTest.java +++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VDNSControlLoopTest.java @@ -29,6 +29,8 @@ import java.io.IOException; import java.net.URLEncoder; import java.time.Instant; import java.util.HashMap; +import java.util.List; +import java.util.Properties; import java.util.UUID; import org.junit.AfterClass; @@ -41,21 +43,27 @@ 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.drools.PolicyEngineListener; +import org.onap.policy.drools.event.comm.TopicEndpoint; +import org.onap.policy.drools.event.comm.TopicListener; +import org.onap.policy.drools.event.comm.TopicSink; +import org.onap.policy.drools.event.comm.Topic.CommInfrastructure; import org.onap.policy.drools.http.server.HttpServletServer; -import org.onap.policy.drools.impl.PolicyEngineJUnitImpl; - +import org.onap.policy.drools.properties.PolicyProperties; +import org.onap.policy.drools.protocol.coders.EventProtocolCoder; +import org.onap.policy.drools.protocol.coders.JsonProtocolFilter; +import org.onap.policy.drools.system.PolicyEngine; import org.onap.policy.so.SORequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class VDNSControlLoopTest implements PolicyEngineListener { +public class VDNSControlLoopTest implements TopicListener { private static final Logger logger = LoggerFactory.getLogger(VDNSControlLoopTest.class); + private static List<? extends TopicSink> noopTopics; + private KieSession kieSession; private Util.Pair<ControlLoopPolicy, String> pair; - private PolicyEngineJUnitImpl engine; private UUID requestID; static { @@ -68,6 +76,16 @@ public class VDNSControlLoopTest implements PolicyEngineListener { @BeforeClass public static void setUpSimulator() { + PolicyEngine.manager.configure(new Properties()); + assertTrue(PolicyEngine.manager.start()); + Properties noopSinkProperties = new Properties(); + noopSinkProperties.put(PolicyProperties.PROPERTY_NOOP_SINK_TOPICS, "POLICY-CL-MGT"); + noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events", "org.onap.policy.controlloop.VirtualControlLoopNotification"); + noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events.custom.gson", "org.onap.policy.controlloop.util.Serialization,gsonPretty"); + noopTopics = TopicEndpoint.manager.addTopicSinks(noopSinkProperties); + + EventProtocolCoder.manager.addEncoder("junit.groupId", "junit.artifactId", "POLICY-CL-MGT", "org.onap.policy.controlloop.VirtualControlLoopNotification", new JsonProtocolFilter(), null, null, 1111); + try { Util.buildAaiSim(); Util.buildSoSim(); @@ -80,6 +98,7 @@ public class VDNSControlLoopTest implements PolicyEngineListener { @AfterClass public static void tearDownSimulator() { HttpServletServer.factory.destroy(); + PolicyEngine.manager.shutdown(); } @Test @@ -89,7 +108,7 @@ public class VDNSControlLoopTest implements PolicyEngineListener { * Start the kie session */ try { - kieSession = startSession("src/main/resources/ControlLoop_Template_xacml_guard.drl", + kieSession = startSession("../archetype-cl-amsterdam/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl", "src/test/resources/yaml/policy_ControlLoop_SO-test.yaml", "type=operational", "CL_vDNS", @@ -105,7 +124,10 @@ public class VDNSControlLoopTest implements PolicyEngineListener { * notify that there is an event ready to be pulled * from the queue */ - engine.addListener(this); + for (TopicSink sink : noopTopics) { + assertTrue(sink.start()); + sink.register(this); + } /* * Create a unique requestId @@ -183,7 +205,6 @@ public class VDNSControlLoopTest implements PolicyEngineListener { /* * Retrieve the Policy Engine */ - engine = (PolicyEngineJUnitImpl) kieSession.getGlobal("Engine"); logger.debug("============"); logger.debug(URLEncoder.encode(pair.b, "UTF-8")); @@ -196,12 +217,15 @@ public class VDNSControlLoopTest implements PolicyEngineListener { * (non-Javadoc) * @see org.onap.policy.drools.PolicyEngineListener#newEventNotification(java.lang.String) */ - public void newEventNotification(String topic) { + public void onTopicEvent(CommInfrastructure commType, String topic, String event) { /* * Pull the object that was sent out to DMAAP and make * sure it is a ControlLoopNoticiation of type active */ - Object obj = engine.subscribe("UEB", topic); + Object obj = null; + if ("POLICY-CL-MGT".equals(topic)) { + obj = org.onap.policy.controlloop.util.Serialization.gsonJunit.fromJson(event, org.onap.policy.controlloop.VirtualControlLoopNotification.class); + } assertNotNull(obj); if (obj instanceof VirtualControlLoopNotification) { VirtualControlLoopNotification notification = (VirtualControlLoopNotification) obj; @@ -220,7 +244,7 @@ public class VDNSControlLoopTest implements PolicyEngineListener { logger.debug("Rule Fired: " + notification.policyName); assertTrue(ControlLoopNotificationType.OPERATION.equals(notification.notification)); assertNotNull(notification.message); - assertTrue(notification.message.endsWith("PERMIT")); + assertTrue(notification.message.toLowerCase().endsWith("permit")); } else if (policyName.endsWith("GUARD_PERMITTED")) { logger.debug("Rule Fired: " + notification.policyName); diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VFCControlLoopTest.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VFCControlLoopTest.java index 6f0527773..c139ab339 100644 --- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VFCControlLoopTest.java +++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VFCControlLoopTest.java @@ -29,6 +29,8 @@ import java.io.IOException; import java.net.URLEncoder; import java.time.Instant; import java.util.HashMap; +import java.util.List; +import java.util.Properties; import java.util.UUID; import org.junit.AfterClass; @@ -42,20 +44,28 @@ import org.onap.policy.controlloop.ControlLoopTargetType; import org.onap.policy.controlloop.VirtualControlLoopEvent; import org.onap.policy.controlloop.VirtualControlLoopNotification; import org.onap.policy.controlloop.policy.ControlLoopPolicy; -import org.onap.policy.drools.PolicyEngineListener; +import org.onap.policy.drools.event.comm.TopicEndpoint; +import org.onap.policy.drools.event.comm.TopicListener; +import org.onap.policy.drools.event.comm.TopicSink; +import org.onap.policy.drools.event.comm.Topic.CommInfrastructure; import org.onap.policy.drools.http.server.HttpServletServer; -import org.onap.policy.drools.impl.PolicyEngineJUnitImpl; +import org.onap.policy.drools.properties.PolicyProperties; +import org.onap.policy.drools.protocol.coders.EventProtocolCoder; +import org.onap.policy.drools.protocol.coders.JsonProtocolFilter; +import org.onap.policy.drools.system.PolicyEngine; import org.onap.policy.vfc.VFCRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class VFCControlLoopTest implements PolicyEngineListener { +public class VFCControlLoopTest implements TopicListener { private static final Logger logger = LoggerFactory.getLogger(VFCControlLoopTest.class); + + private static List<? extends TopicSink> noopTopics; + private KieSession kieSession; private Util.Pair<ControlLoopPolicy, String> pair; - private PolicyEngineJUnitImpl engine; private UUID requestID; static { @@ -68,6 +78,16 @@ public class VFCControlLoopTest implements PolicyEngineListener { @BeforeClass public static void setUpSimulator() { + PolicyEngine.manager.configure(new Properties()); + assertTrue(PolicyEngine.manager.start()); + Properties noopSinkProperties = new Properties(); + noopSinkProperties.put(PolicyProperties.PROPERTY_NOOP_SINK_TOPICS, "POLICY-CL-MGT"); + noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events", "org.onap.policy.controlloop.VirtualControlLoopNotification"); + noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events.custom.gson", "org.onap.policy.controlloop.util.Serialization,gsonPretty"); + noopTopics = TopicEndpoint.manager.addTopicSinks(noopSinkProperties); + + EventProtocolCoder.manager.addEncoder("junit.groupId", "junit.artifactId", "POLICY-CL-MGT", "org.onap.policy.controlloop.VirtualControlLoopNotification", new JsonProtocolFilter(), null, null, 1111); + try { Util.buildAaiSim(); Util.buildVfcSim(); @@ -80,6 +100,7 @@ public class VFCControlLoopTest implements PolicyEngineListener { @AfterClass public static void tearDownSimulator() { HttpServletServer.factory.destroy(); + PolicyEngine.manager.shutdown(); } @Test @@ -89,7 +110,7 @@ public class VFCControlLoopTest implements PolicyEngineListener { * Start the kie session */ try { - kieSession = startSession("src/main/resources/ControlLoop_Template_xacml_guard.drl", + kieSession = startSession("../archetype-cl-amsterdam/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl", "src/test/resources/yaml/policy_ControlLoop_VFC.yaml", "type=operational", "CL_VoLTE", @@ -105,7 +126,10 @@ public class VFCControlLoopTest implements PolicyEngineListener { * notify that there is an event ready to be pulled * from the queue */ - engine.addListener(this); + for (TopicSink sink : noopTopics) { + assertTrue(sink.start()); + sink.register(this); + } /* * Create a unique requestId @@ -183,7 +207,6 @@ public class VFCControlLoopTest implements PolicyEngineListener { /* * Retrieve the Policy Engine */ - engine = (PolicyEngineJUnitImpl) kieSession.getGlobal("Engine"); logger.debug("============"); logger.debug(URLEncoder.encode(pair.b, "UTF-8")); @@ -196,12 +219,15 @@ public class VFCControlLoopTest implements PolicyEngineListener { * (non-Javadoc) * @see org.onap.policy.drools.PolicyEngineListener#newEventNotification(java.lang.String) */ - public void newEventNotification(String topic) { + public void onTopicEvent(CommInfrastructure commType, String topic, String event) { /* * Pull the object that was sent out to DMAAP and make * sure it is a ControlLoopNoticiation of type active */ - Object obj = engine.subscribe("UEB", topic); + Object obj = null; + if ("POLICY-CL-MGT".equals(topic)) { + obj = org.onap.policy.controlloop.util.Serialization.gsonJunit.fromJson(event, org.onap.policy.controlloop.VirtualControlLoopNotification.class); + } assertNotNull(obj); if (obj instanceof VirtualControlLoopNotification) { VirtualControlLoopNotification notification = (VirtualControlLoopNotification) obj; @@ -220,7 +246,7 @@ public class VFCControlLoopTest implements PolicyEngineListener { logger.debug("Rule Fired: " + notification.policyName); assertTrue(ControlLoopNotificationType.OPERATION.equals(notification.notification)); assertNotNull(notification.message); - assertTrue(notification.message.endsWith("PERMIT")); + assertTrue(notification.message.toLowerCase().endsWith("permit")); } else if (policyName.endsWith("GUARD_PERMITTED")) { logger.debug("Rule Fired: " + notification.policyName); diff --git a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VFWControlLoopTest.java b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VFWControlLoopTest.java index fb4dc0265..cef39b5e8 100644 --- a/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VFWControlLoopTest.java +++ b/controlloop/templates/template.demo/src/test/java/org/onap/policy/template/demo/VFWControlLoopTest.java @@ -29,6 +29,8 @@ import java.io.IOException; import java.net.URLEncoder; import java.time.Instant; import java.util.HashMap; +import java.util.List; +import java.util.Properties; import java.util.UUID; import org.junit.AfterClass; @@ -44,19 +46,26 @@ 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.drools.PolicyEngineListener; +import org.onap.policy.drools.event.comm.TopicEndpoint; +import org.onap.policy.drools.event.comm.TopicListener; +import org.onap.policy.drools.event.comm.TopicSink; +import org.onap.policy.drools.event.comm.Topic.CommInfrastructure; import org.onap.policy.drools.http.server.HttpServletServer; -import org.onap.policy.drools.impl.PolicyEngineJUnitImpl; +import org.onap.policy.drools.properties.PolicyProperties; +import org.onap.policy.drools.protocol.coders.EventProtocolCoder; +import org.onap.policy.drools.protocol.coders.JsonProtocolFilter; +import org.onap.policy.drools.system.PolicyEngine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class VFWControlLoopTest implements PolicyEngineListener { +public class VFWControlLoopTest implements TopicListener { private static final Logger logger = LoggerFactory.getLogger(VFWControlLoopTest.class); + private static List<? extends TopicSink> noopTopics; + private KieSession kieSession; private Util.Pair<ControlLoopPolicy, String> pair; - private PolicyEngineJUnitImpl engine; private UUID requestID; static { @@ -68,6 +77,19 @@ public class VFWControlLoopTest implements PolicyEngineListener { @BeforeClass public static void setUpSimulator() { + PolicyEngine.manager.configure(new Properties()); + assertTrue(PolicyEngine.manager.start()); + Properties noopSinkProperties = new Properties(); + noopSinkProperties.put(PolicyProperties.PROPERTY_NOOP_SINK_TOPICS, "APPC-CL,POLICY-CL-MGT"); + noopSinkProperties.put("noop.sink.topics.APPC-CL.events", "org.onap.policy.appc.Response"); + noopSinkProperties.put("noop.sink.topics.APPC-CL.events.custom.gson", "org.onap.policy.appc.util.Serialization,gsonPretty"); + noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events", "org.onap.policy.controlloop.VirtualControlLoopNotification"); + noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events.custom.gson", "org.onap.policy.controlloop.util.Serialization,gsonPretty"); + noopTopics = TopicEndpoint.manager.addTopicSinks(noopSinkProperties); + + EventProtocolCoder.manager.addEncoder("junit.groupId", "junit.artifactId", "POLICY-CL-MGT", "org.onap.policy.controlloop.VirtualControlLoopNotification", new JsonProtocolFilter(), null, null, 1111); + EventProtocolCoder.manager.addEncoder("junit.groupId", "junit.artifactId", "APPC-CL", "org.onap.policy.appc.Request", new JsonProtocolFilter(), null, null, 1111); + try { Util.buildAaiSim(); Util.buildGuardSim(); @@ -79,6 +101,7 @@ public class VFWControlLoopTest implements PolicyEngineListener { @AfterClass public static void tearDownSimulator() { HttpServletServer.factory.destroy(); + PolicyEngine.manager.shutdown(); } @Test @@ -88,7 +111,7 @@ public class VFWControlLoopTest implements PolicyEngineListener { * Start the kie session */ try { - kieSession = startSession("src/main/resources/ControlLoop_Template_xacml_guard.drl", + kieSession = startSession("../archetype-cl-amsterdam/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl", "src/test/resources/yaml/policy_ControlLoop_vFW.yaml", "service=ServiceDemo;resource=Res1Demo;type=operational", "CL_vFW", @@ -104,7 +127,10 @@ public class VFWControlLoopTest implements PolicyEngineListener { * notify that there is an event ready to be pulled * from the queue */ - engine.addListener(this); + for (TopicSink sink : noopTopics) { + assertTrue(sink.start()); + sink.register(this); + } /* * Create a unique requestId @@ -118,7 +144,15 @@ public class VFWControlLoopTest implements PolicyEngineListener { */ sendEvent(pair.a, requestID, ControlLoopEventStatus.ONSET); - kieSession.fireUntilHalt(); + try { + kieSession.fireUntilHalt(); + } + catch (Exception e) { + e.printStackTrace(); + logger.warn(e.toString()); + fail("fail"); + } + /* * The only fact in memory should be Params @@ -182,7 +216,6 @@ public class VFWControlLoopTest implements PolicyEngineListener { /* * Retrieve the Policy Engine */ - engine = (PolicyEngineJUnitImpl) kieSession.getGlobal("Engine"); logger.debug("============"); logger.debug(URLEncoder.encode(pair.b, "UTF-8")); @@ -194,12 +227,17 @@ public class VFWControlLoopTest implements PolicyEngineListener { /* * @see org.onap.policy.drools.PolicyEngineListener#newEventNotification(java.lang.String) */ - public void newEventNotification(String topic) { + public void onTopicEvent(CommInfrastructure commType, String topic, String event) { /* * Pull the object that was sent out to DMAAP and make * sure it is a ControlLoopNoticiation of type active */ - Object obj = engine.subscribe("UEB", topic); + Object obj = null; + if ("POLICY-CL-MGT".equals(topic)) { + obj = org.onap.policy.controlloop.util.Serialization.gsonJunit.fromJson(event, org.onap.policy.controlloop.VirtualControlLoopNotification.class); + } + else if ("APPC-CL".equals(topic)) + obj = org.onap.policy.appc.util.Serialization.gsonPretty.fromJson(event, org.onap.policy.appc.Request.class); assertNotNull(obj); if (obj instanceof VirtualControlLoopNotification) { VirtualControlLoopNotification notification = (VirtualControlLoopNotification) obj; @@ -218,7 +256,7 @@ public class VFWControlLoopTest implements PolicyEngineListener { logger.debug("Rule Fired: " + notification.policyName); assertTrue(ControlLoopNotificationType.OPERATION.equals(notification.notification)); assertNotNull(notification.message); - assertTrue(notification.message.endsWith("PERMIT")); + assertTrue(notification.message.toLowerCase().endsWith("permit")); } else if (policyName.endsWith("GUARD_PERMITTED")) { logger.debug("Rule Fired: " + notification.policyName); |