Upgrade Java 17 in policy-drools-apps
[policy/drools-applications.git] / controlloop / common / controller-usecases / src / main / resources / usecases.drl
index 439512c..c10b8d0 100644 (file)
@@ -2,7 +2,8 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2020-2022 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2023 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 
 package org.onap.policy.controlloop;
 
+import java.time.Instant;
 import java.util.Collections;
 import java.util.stream.Collectors;
 import org.onap.policy.controlloop.CanonicalOnset;
 import org.onap.policy.controlloop.VirtualControlLoopEvent;
 import org.onap.policy.controlloop.VirtualControlLoopNotification;
 import org.onap.policy.controlloop.ControlLoopNotificationType;
-import org.onap.policy.controlloop.actor.aai.AaiActor;
-import org.onap.policy.controlloop.actor.aai.AaiGetPnfOperation;
-import org.onap.policy.controlloop.actor.aai.AaiGetTenantOperation;
-import org.onap.policy.controlloop.actor.guard.GuardActor;
-import org.onap.policy.controlloop.actor.guard.DecisionOperation;
+import org.onap.policy.controlloop.actor.xacml.XacmlActor;
 import org.onap.policy.controlloop.actorserviceprovider.Operation;
+import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
+import org.onap.policy.controlloop.actorserviceprovider.OperationFinalResult;
 import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
+import org.onap.policy.controlloop.actorserviceprovider.OperationResult;
 import org.onap.policy.controlloop.drl.legacy.ControlLoopParams;
 import org.onap.policy.controlloop.eventmanager.ActorConstants;
 import org.onap.policy.controlloop.eventmanager.Step;
-import org.onap.policy.controlloop.policy.Policy;
-import org.onap.policy.controlloop.policy.FinalResult;
-import org.onap.policy.controlloop.policy.PolicyResult;
 import org.onap.policy.controlloop.utils.ControlLoopUtils;
 import org.onap.policy.drools.apps.controller.usecases.UsecasesEventManager;
-import org.onap.policy.drools.apps.controller.usecases.UsecasesEventManager.State;
-import org.onap.policy.drools.apps.controller.usecases.UsecasesEventManager.NewEventStatus;
-import org.onap.policy.drools.apps.controller.usecases.UsecasesEventManager.OperationOutcome2;
+import org.onap.policy.controlloop.eventmanager.ClEventManagerWithSteps.State;
+import org.onap.policy.controlloop.eventmanager.ClEventManagerWithOutcome.OperationOutcome2;
+import org.onap.policy.controlloop.eventmanager.ClEventManagerWithEvent.NewEventStatus;
+import org.onap.policy.controlloop.eventmanager.ControlLoopEventManager;
+import org.onap.policy.controlloop.eventmanager.EventManagerServices;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 
 import org.slf4j.LoggerFactory;
@@ -51,6 +51,27 @@ import org.slf4j.Logger;
 
 import org.onap.policy.drools.system.PolicyEngineConstants;
 
+
+/*
+* Called at initial start-up, to create the event services that will be used by all
+* event managers in this rule engine instance.
+*/
+rule "CREATE.EVENT.SERVICES"
+    when
+        not (EventManagerServices())
+    then
+
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
+    logger.info("{}", drools.getRule().getName());
+
+    try {
+        insert(new EventManagerServices("event-manager"));
+
+    } catch(RuntimeException e) {
+        logger.warn("{}: cannot create event services", drools.getRule().getName(), e);
+    }
+end
+
 /*
 *
 * Called when the ControlLoopParams object has been inserted into working memory from the PAP.
@@ -61,7 +82,7 @@ rule "INSERT.PARAMS"
         $params : ControlLoopParams()
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {} : TOSCA-POLICY=[{}]", $params.getClosedLoopControlName(), $params.getPolicyName() + "."
         + drools.getRule().getName(), $params.getToscaPolicy());
 end
@@ -76,7 +97,7 @@ rule "NEW.TOSCA.POLICY"
         $policy : ToscaPolicy()
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: [{}|{}|{}|{}]: CONTENT: {}", drools.getRule().getName(),
                 $policy.getType(), $policy.getTypeVersion(), $policy.getName(),
                 $policy.getVersion(), $policy);
@@ -96,7 +117,7 @@ rule "REMOVE.PARAMS"
         not ( ToscaPolicy( getName() == $policyName, getVersion() == $policyVersion ) )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: [{}|{}|{}]", drools.getRule().getName(),
                 $params.getPolicyScope(), $params.getPolicyName(), $params.getPolicyVersion());
 
@@ -113,11 +134,12 @@ rule "EVENT"
     when
         $params : ControlLoopParams( $clName : getClosedLoopControlName() )
         $event : CanonicalOnset( closedLoopControlName == $clName )
+        $services : EventManagerServices()
         not ( UsecasesEventManager( closedLoopControlName == $event.getClosedLoopControlName(),
             getEvent() == $event ) )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: event={}",
                 $clName, $params.getPolicyName(), drools.getRule().getName(),
                 $event);
@@ -139,11 +161,13 @@ rule "EVENT"
             notification.setNotification(ControlLoopNotificationType.REJECTED);
             notification.setFrom("policy");
             notification.setMessage("Missing requestId");
-            notification.setPolicyName($params.getPolicyName() + "." + drools.getRule().getName());
+            notification.setPolicyScope(drools.getRule().getName());
+            notification.setPolicyName($params.getPolicyName());
             notification.setPolicyVersion($params.getPolicyVersion());
 
         } else {
-            UsecasesEventManager manager = new UsecasesEventManager($params, $event, drools.getWorkingMemory());
+            UsecasesEventManager manager =
+                new UsecasesEventManager($services, $params, $event, drools.getWorkingMemory());
             insert(manager);
             try {
                 // load the first policy/step
@@ -157,7 +181,9 @@ rule "EVENT"
 
                     notification = manager.makeNotification();
                     notification.setNotification(ControlLoopNotificationType.ACTIVE);
-                    notification.setPolicyName($params.getPolicyName() + "." + drools.getRule().getName());
+                    notification.setPolicyScope(drools.getRule().getName());
+                    notification.setPolicyName($params.getPolicyName());
+                    notification.setPolicyVersion($params.getPolicyVersion());
 
                 } else {
                     // Note: the notification will be generated lazily
@@ -175,7 +201,8 @@ rule "EVENT"
         notification = new VirtualControlLoopNotification($event);
         notification.setNotification(ControlLoopNotificationType.REJECTED);
         notification.setMessage("Exception occurred: " + e.getMessage());
-        notification.setPolicyName($params.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope(drools.getRule().getName());
+        notification.setPolicyName($params.getPolicyName());
         notification.setPolicyVersion($params.getPolicyVersion());
     }
     //
@@ -205,7 +232,7 @@ rule "EVENT.MANAGER.NEW.EVENT"
             getEvent() == $event )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: event={} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $event, $manager);
@@ -260,7 +287,7 @@ rule "EVENT.MANAGER.LOAD.NEXT.POLICY"
                         getSteps().isEmpty() )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $manager);
@@ -277,7 +304,7 @@ rule "EVENT.MANAGER.LOAD.NEXT.POLICY"
         logger.warn("{}: {}.{}: manager={} exception loading next policy",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to load next policy");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to load next policy");
     }
 
     update($manager);
@@ -298,7 +325,7 @@ rule "EVENT.MANAGER.PREPROCESS"
                         !$step.isPreprocessed() )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -317,7 +344,7 @@ rule "EVENT.MANAGER.PREPROCESS"
         logger.warn("{}: {}.{}: manager={} exception loading preprocessor steps",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to load preprocessing steps");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to load preprocessing steps");
     }
 
     update($manager);
@@ -342,7 +369,7 @@ rule "EVENT.MANAGER.ACCEPT"
                         $step.acceptsEvent() )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -352,14 +379,16 @@ rule "EVENT.MANAGER.ACCEPT"
 
         VirtualControlLoopNotification notification = $manager.makeNotification();
         notification.setNotification(ControlLoopNotificationType.ACTIVE);
-        notification.setPolicyName($manager.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope(drools.getRule().getName());
+        notification.setPolicyName($manager.getPolicyName());
+        notification.setPolicyVersion($manager.getPolicyVersion());
         $manager.deliver("POLICY-CL-MGT", notification, "notification", drools.getRule().getName());
 
     } catch(RuntimeException e) {
         logger.warn("{}: {}.{}: manager={} exception processing operation outcome",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to accept the event");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to accept the event");
     }
 
     update($manager);
@@ -380,7 +409,7 @@ rule "EVENT.MANAGER.EXECUTE.STEP"
                         $step.isPreprocessed() )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -389,7 +418,20 @@ rule "EVENT.MANAGER.EXECUTE.STEP"
         $step.init();
         $step.setProperties();
 
-        if ($manager.executeStep()) {
+        boolean guardDisabled = "true".equalsIgnoreCase(
+                    PolicyEngineConstants.getManager().getEnvironmentProperty(
+                        ControlLoopEventManager.GUARD_DISABLED_PROPERTY));
+
+        if (guardDisabled && XacmlActor.NAME.equals($step.getActorName())) {
+            // guard is disabled - just enqueue a "SUCCESS" (i.e., "Permit")
+            OperationOutcome outcome = $step.getParams().makeOutcome();
+            outcome.setStart(Instant.now());
+            outcome.setEnd(outcome.getStart());
+
+            $manager.getOutcomes().add(outcome);
+            $manager.setState(State.AWAITING_OUTCOME);
+
+        } else if ($manager.executeStep()) {
             $manager.setState(State.AWAITING_OUTCOME);
 
         } else {
@@ -401,7 +443,7 @@ rule "EVENT.MANAGER.EXECUTE.STEP"
         logger.warn("{}: {}.{}: manager={} exception executing a step",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to execute the next step");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to execute the next step");
     }
 
     update($manager);
@@ -429,7 +471,7 @@ rule "EVENT.MANAGER.GENERATE.SDNR.NOTIFICATION"
                         $outcome.isFor("SDNR", $step.getOperationName()) )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -461,11 +503,11 @@ rule "EVENT.MANAGER.PROCESS.GUARD.OUTCOME"
                         $outcome != null,
                         !isAbort($outcome),
                         $step : getSteps().peek(),
-                        "GUARD".equals($step.getActorName()),
-                        $outcome.isFor("GUARD", $step.getOperationName()) )
+                        XacmlActor.NAME.equals($step.getActorName()),
+                        $outcome.isFor($step.getActorName(), $step.getOperationName()) )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -473,7 +515,9 @@ rule "EVENT.MANAGER.PROCESS.GUARD.OUTCOME"
     try {
         VirtualControlLoopNotification notification = $manager.makeNotification();
         notification.setNotification(ControlLoopNotificationType.OPERATION);
-        notification.setPolicyName($manager.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope(drools.getRule().getName());
+        notification.setPolicyName($manager.getPolicyName());
+        notification.setPolicyVersion($manager.getPolicyVersion());
         notification.setHistory(Collections.emptyList());
 
         // get actor/operation name from the policy step, not from the guard step
@@ -483,7 +527,7 @@ rule "EVENT.MANAGER.PROCESS.GUARD.OUTCOME"
             // it's a "start" operation
             notification.setMessage("Sending guard query for " + step2.getActorName() + " " + step2.getOperationName());
 
-        } else if ($outcome.getResult() == PolicyResult.SUCCESS) {
+        } else if ($outcome.getResult() == OperationResult.SUCCESS) {
             notification.setMessage("Guard result for " + step2.getActorName() + " " + step2.getOperationName()
                                         + " is Permit");
         } else {
@@ -519,7 +563,7 @@ rule "EVENT.MANAGER.PROCESS.POLICY.STARTED"
                         $outcome.isFor($step.getActorName(), $step.getOperationName()) )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -535,7 +579,9 @@ rule "EVENT.MANAGER.PROCESS.POLICY.STARTED"
 
         VirtualControlLoopNotification notification = $manager.makeNotification();
         notification.setNotification(ControlLoopNotificationType.OPERATION);
-        notification.setPolicyName($manager.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope(drools.getRule().getName());
+        notification.setPolicyName($manager.getPolicyName());
+        notification.setPolicyVersion($manager.getPolicyVersion());
         notification.setHistory(Collections.emptyList());
         notification.setMessage($manager.getOperationMessage());
 
@@ -545,7 +591,7 @@ rule "EVENT.MANAGER.PROCESS.POLICY.STARTED"
         logger.warn("{}: {}.{}: manager={} exception processing operation outcome",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle policy 'start' outcome");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle policy 'start' outcome");
     }
 
     update($manager);
@@ -569,7 +615,7 @@ rule "EVENT.MANAGER.PROCESS.PREPROCESSOR.STARTED"
                         $outcome.isFor($step.getActorName(), $step.getOperationName()) )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -584,7 +630,7 @@ rule "EVENT.MANAGER.PROCESS.PREPROCESSOR.STARTED"
         logger.warn("{}: {}.{}: manager={} exception processing operation outcome",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle 'start' outcome");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle 'start' outcome");
     }
 
     update($manager);
@@ -603,13 +649,13 @@ rule "EVENT.MANAGER.PROCESS.POLICY.SUCCESS"
                         $outcome : getOutcomes().peek(),
                         $outcome != null,
                         $outcome.getEnd() != null,
-                        $outcome.getResult() == PolicyResult.SUCCESS,
+                        $outcome.getResult() == OperationResult.SUCCESS,
                         $step : getSteps().peek(),
                         $step.isPolicyStep(),
                         $outcome.isFor($step.getActorName(), $step.getOperationName()) )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -627,7 +673,9 @@ rule "EVENT.MANAGER.PROCESS.POLICY.SUCCESS"
 
         VirtualControlLoopNotification notification = $manager.makeNotification();
         notification.setNotification(ControlLoopNotificationType.OPERATION_SUCCESS);
-        notification.setPolicyName($manager.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope(drools.getRule().getName());
+        notification.setPolicyName($manager.getPolicyName());
+        notification.setPolicyVersion($manager.getPolicyVersion());
         notification.setHistory($manager.getPartialHistory().stream().map(OperationOutcome2::getClOperation)
                                 .collect(Collectors.toList()));
 
@@ -642,7 +690,7 @@ rule "EVENT.MANAGER.PROCESS.POLICY.SUCCESS"
         logger.warn("{}: {}.{}: manager={} exception processing operation outcome",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle policy 'success' outcome");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle policy 'success' outcome");
     }
 
     update($manager);
@@ -664,11 +712,11 @@ rule "EVENT.MANAGER.PROCESS.FINAL.FAILURE.ACCEPTED"
                         !isAbort($outcome),
                         $outcome.getEnd() != null,
                         $outcome.isFinalOutcome(),
-                        $outcome.getResult() != PolicyResult.SUCCESS,
+                        $outcome.getResult() != OperationResult.SUCCESS,
                         $step : getSteps().peek() )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -677,7 +725,7 @@ rule "EVENT.MANAGER.PROCESS.FINAL.FAILURE.ACCEPTED"
         $manager.getOutcomes().remove();
 
         if (!$outcome.isFor($step.getActorName(), $step.getOperationName())) {
-            $outcome.setResult(PolicyResult.FAILURE_GUARD);
+            $outcome.setResult(OperationResult.FAILURE_GUARD);
             $outcome.setMessage("Operation denied by " + $outcome.getActor());
         }
 
@@ -689,9 +737,11 @@ rule "EVENT.MANAGER.PROCESS.FINAL.FAILURE.ACCEPTED"
 
         VirtualControlLoopNotification notification = $manager.makeNotification();
         notification.setNotification(ControlLoopNotificationType.OPERATION_FAILURE);
-        notification.setPolicyName($manager.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope(drools.getRule().getName());
+        notification.setPolicyName($manager.getPolicyName());
+        notification.setPolicyVersion($manager.getPolicyVersion());
         notification.setHistory($manager.getPartialHistory().stream().map(OperationOutcome2::getClOperation)
-                                .collect(Collectors.toList()));
+                                .toList());
 
         // trigger move to the next policy - clear all steps
         $manager.getSteps().clear();
@@ -703,7 +753,7 @@ rule "EVENT.MANAGER.PROCESS.FINAL.FAILURE.ACCEPTED"
         logger.warn("{}: {}.{}: manager={} exception processing operation outcome",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle policy 'failure' outcome");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle policy 'failure' outcome");
     }
 
     update($manager);
@@ -727,11 +777,11 @@ rule "EVENT.MANAGER.PROCESS.FINAL.FAILURE.REJECTED"
                         !isAbort($outcome),
                         $outcome.getEnd() != null,
                         $outcome.isFinalOutcome(),
-                        $outcome.getResult() != PolicyResult.SUCCESS,
+                        $outcome.getResult() != OperationResult.SUCCESS,
                         $step : getSteps().peek() )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -746,9 +796,11 @@ rule "EVENT.MANAGER.PROCESS.FINAL.FAILURE.REJECTED"
 
         VirtualControlLoopNotification notification = $manager.makeNotification();
         notification.setNotification(ControlLoopNotificationType.REJECTED);
-        notification.setPolicyName($manager.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope(drools.getRule().getName());
+        notification.setPolicyName($manager.getPolicyName());
+        notification.setPolicyVersion($manager.getPolicyVersion());
         notification.setHistory($manager.getPartialHistory().stream().map(OperationOutcome2::getClOperation)
-                                .collect(Collectors.toList()));
+                                .toList());
 
         $manager.deliver("POLICY-CL-MGT", notification, "notification", drools.getRule().getName());
 
@@ -756,7 +808,7 @@ rule "EVENT.MANAGER.PROCESS.FINAL.FAILURE.REJECTED"
         logger.warn("{}: {}.{}: manager={} exception processing operation outcome",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to reject event");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to reject event");
     }
 
     $manager.destroy();
@@ -777,13 +829,13 @@ rule "EVENT.MANAGER.PROCESS.POLICY.FAILURE"
                         !isAbort($outcome),
                         $outcome.getEnd() != null,
                         !$outcome.isFinalOutcome(),
-                        $outcome.getResult() != PolicyResult.SUCCESS,
+                        $outcome.getResult() != OperationResult.SUCCESS,
                         $step : getSteps().peek(),
                         $step.isPolicyStep(),
                         $outcome.isFor($step.getActorName(), $step.getOperationName()) )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -800,7 +852,9 @@ rule "EVENT.MANAGER.PROCESS.POLICY.FAILURE"
 
         VirtualControlLoopNotification notification = $manager.makeNotification();
         notification.setNotification(ControlLoopNotificationType.OPERATION_FAILURE);
-        notification.setPolicyName($manager.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope(drools.getRule().getName());
+        notification.setPolicyName($manager.getPolicyName());
+        notification.setPolicyVersion($manager.getPolicyVersion());
 
         $manager.deliver("POLICY-CL-MGT", notification, "notification", drools.getRule().getName());
 
@@ -808,7 +862,7 @@ rule "EVENT.MANAGER.PROCESS.POLICY.FAILURE"
         logger.warn("{}: {}.{}: manager={} exception processing operation outcome",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle policy 'failure' outcome");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle policy 'failure' outcome");
     }
 
     update($manager);
@@ -830,7 +884,7 @@ rule "EVENT.MANAGER.DISCARD.OUTCOME"
                         $step : getSteps().peek() )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $outcome.getResult(), $manager);
@@ -842,7 +896,7 @@ rule "EVENT.MANAGER.DISCARD.OUTCOME"
             // it's a completion for the step
 
             // let the step record the response that's contained within the outcome
-            if ($outcome.getResult() == PolicyResult.SUCCESS) {
+            if ($outcome.getResult() == OperationResult.SUCCESS) {
                 $step.success($outcome);
             }
 
@@ -856,7 +910,7 @@ rule "EVENT.MANAGER.DISCARD.OUTCOME"
         logger.warn("{}: {}.{}: manager={} exception processing operation outcome",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle outcome");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle outcome");
     }
 
     update($manager);
@@ -878,7 +932,7 @@ rule "EVENT.MANAGER.ABORT"
                         $step : getSteps().peek() )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: {} manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $step, $manager);
@@ -898,7 +952,7 @@ rule "EVENT.MANAGER.ABORT"
                 break;
         }
 
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE, msg);
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE, msg);
 
         if ($step != null && "SDNR".equals($step.getActorName())
                 && $outcome.isFor($step.getActorName(), $step.getOperationName())) {
@@ -920,7 +974,7 @@ rule "EVENT.MANAGER.ABORT"
         logger.warn("{}: {}.{}: manager={} exception handling ABORT outcome",
                 $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
                 $manager, e);
-        $manager.abort(State.DONE, FinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle ABORT");
+        $manager.abort(State.DONE, OperationFinalResult.FINAL_FAILURE_EXCEPTION, "failed to handle ABORT");
     }
 
     update($manager);
@@ -937,7 +991,7 @@ rule "EVENT.MANAGER.FINAL"
                         !isActive() || getState() == State.DONE )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}.{}: manager={}",
             $manager.getClosedLoopControlName(), $manager.getPolicyName(), drools.getRule().getName(),
             $manager);
@@ -946,13 +1000,15 @@ rule "EVENT.MANAGER.FINAL"
 
     try {
         VirtualControlLoopNotification notification = $manager.makeNotification();
-        notification.setPolicyName($manager.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope(drools.getRule().getName());
+        notification.setPolicyName($manager.getPolicyName());
+        notification.setPolicyVersion($manager.getPolicyVersion());
         notification.setHistory($manager.getFullHistory().stream().map(OperationOutcome2::getClOperation)
-                                    .collect(Collectors.toList()));
+                                    .toList());
 
-        FinalResult finalResult = $manager.getFinalResult();
+        OperationFinalResult finalResult = $manager.getFinalResult();
         if (finalResult == null) {
-            finalResult = ($manager.isActive() ? FinalResult.FINAL_SUCCESS : FinalResult.FINAL_FAILURE);
+            finalResult = ($manager.isActive() ? OperationFinalResult.FINAL_SUCCESS : OperationFinalResult.FINAL_FAILURE);
         }
 
         switch (finalResult) {
@@ -999,7 +1055,7 @@ rule "EVENT.CLEANUP"
         $event : VirtualControlLoopEvent( $clName: closedLoopControlName )
     then
 
-    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackageName());
     logger.info("{}: {}", $clName, drools.getRule().getName());
     logger.debug("{}: {}: orphan event={}",
                 $clName, drools.getRule().getName(), $event);