Allow guards to be dynamically enabled/disabled 25/111925/1
authorJim Hahn <jrh3@att.com>
Mon, 31 Aug 2020 21:59:44 +0000 (17:59 -0400)
committerJim Hahn <jrh3@att.com>
Mon, 31 Aug 2020 22:04:27 +0000 (18:04 -0400)
Modified drools-apps so that guards can be dynamically enabled and
disabled.  Due to the current design, there are two properties that
control this:
- an actor-level property: when enabled, the DB connection is created,
  otherwise a stub connection is created.  This property is NOT dynamic
- an engine-level property: when enabled, the connection created by the
  actor is used, otherwise a stub connection is used.  This property IS
  dynamic

Issue-ID: POLICY-2748
Change-Id: I2a5baf908ce274f2eb46a6a3f01df1b3532038ff
Signed-off-by: Jim Hahn <jrh3@att.com>
controlloop/common/controller-usecases/src/main/resources/usecases.drl
controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java
controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java

index d3365e6..12c9849 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.policy.controlloop;
 
+import java.time.Instant;
 import java.util.Collections;
 import java.util.stream.Collectors;
 import org.onap.policy.controlloop.CanonicalOnset;
@@ -32,6 +33,7 @@ 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.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;
@@ -388,7 +390,19 @@ rule "EVENT.MANAGER.EXECUTE.STEP"
         $step.init();
         $step.setProperties();
 
-        if ($manager.executeStep()) {
+        boolean guardDisabled = "true".equalsIgnoreCase(
+                    PolicyEngineConstants.getManager().getEnvironmentProperty("guard.disabled"));
+
+        if (guardDisabled && "GUARD".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 {
index 1212855..248a41b 100644 (file)
@@ -41,6 +41,7 @@ import org.onap.policy.controlloop.actorserviceprovider.ActorService;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
 import org.onap.policy.controlloop.drl.legacy.ControlLoopParams;
 import org.onap.policy.controlloop.ophistory.OperationHistoryDataManager;
+import org.onap.policy.controlloop.ophistory.OperationHistoryDataManagerStub;
 import org.onap.policy.controlloop.processor.ControlLoopProcessor;
 import org.onap.policy.drools.core.lock.LockCallback;
 import org.onap.policy.drools.system.PolicyEngineConstants;
@@ -59,6 +60,12 @@ public class ControlLoopEventManager implements StepContext, Serializable {
     private static final Logger logger = LoggerFactory.getLogger(ControlLoopEventManager.class);
     private static final long serialVersionUID = -1216568161322872641L;
 
+    /**
+     * Data manager used when the policy engine's guard.disabled property is "true".
+     */
+    private static final OperationHistoryDataManager STUB_DATA_MANAGER = new OperationHistoryDataManagerStub();
+
+    private static final String GUARD_DISABLED_PROPERTY = "guard.disabled";
     private static final String EVENT_MANAGER_SERVICE_CONFIG = "event-manager";
 
     /**
@@ -269,8 +276,6 @@ public class ControlLoopEventManager implements StepContext, Serializable {
         private static final ActorService ACTOR_SERVICE;
 
         static {
-            // TODO how to dynamically change data manager, depending whether or not
-            // guards are enabled?
             EventManagerServices services = new EventManagerServices(EVENT_MANAGER_SERVICE_CONFIG);
             ACTOR_SERVICE = services.getActorService();
             DATA_MANAGER = services.getDataManager();
@@ -296,6 +301,11 @@ public class ControlLoopEventManager implements StepContext, Serializable {
     }
 
     public OperationHistoryDataManager getDataManager() {
-        return LazyInitData.DATA_MANAGER;
+        boolean guardDisabled = "true".equalsIgnoreCase(getEnvironmentProperty(GUARD_DISABLED_PROPERTY));
+        return (guardDisabled ? STUB_DATA_MANAGER : LazyInitData.DATA_MANAGER);
+    }
+
+    protected String getEnvironmentProperty(String propName) {
+        return PolicyEngineConstants.getManager().getEnvironmentProperty(propName);
     }
 }
index e4c2332..a863264 100644 (file)
@@ -49,6 +49,7 @@ import org.onap.policy.controlloop.ControlLoopException;
 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
 import org.onap.policy.controlloop.actorserviceprovider.OperationResult;
 import org.onap.policy.controlloop.drl.legacy.ControlLoopParams;
+import org.onap.policy.controlloop.ophistory.OperationHistoryDataManagerStub;
 import org.onap.policy.drools.core.lock.LockCallback;
 import org.onap.policy.drools.core.lock.LockImpl;
 import org.onap.policy.drools.core.lock.LockState;
@@ -241,6 +242,22 @@ public class ControlLoopEventManagerTest {
         assertFalse(mgr.contains(MY_KEY));
     }
 
+    /**
+     * Tests getDataManager() when guard.disabled=true.
+     */
+    @Test
+    public void testGetDataManagerDisabled() throws ControlLoopException {
+        mgr = new MyManager(params, REQ_ID) {
+            private static final long serialVersionUID = 1L;
+            @Override
+            protected String getEnvironmentProperty(String propName) {
+                return ("guard.disabled".equals(propName) ? "true" : null);
+            }
+        };
+
+        assertThat(mgr.getDataManager()).isInstanceOf(OperationHistoryDataManagerStub.class);
+    }
+
     @Test
     public void testToString() {
         assertNotNull(mgr.toString());