From 25c8a555a739b1c80966ed88cc123a6e9ad9318e Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Mon, 31 Aug 2020 17:59:44 -0400 Subject: Allow guards to be dynamically enabled/disabled 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 --- .../controller-usecases/src/main/resources/usecases.drl | 16 +++++++++++++++- .../eventmanager/ControlLoopEventManager.java | 16 +++++++++++++--- .../eventmanager/ControlLoopEventManagerTest.java | 17 +++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/controlloop/common/controller-usecases/src/main/resources/usecases.drl b/controlloop/common/controller-usecases/src/main/resources/usecases.drl index d3365e6cc..12c9849f9 100644 --- a/controlloop/common/controller-usecases/src/main/resources/usecases.drl +++ b/controlloop/common/controller-usecases/src/main/resources/usecases.drl @@ -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 { diff --git a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java index 12128554f..248a41be6 100644 --- a/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java +++ b/controlloop/common/eventmanager/src/main/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManager.java @@ -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); } } diff --git a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java index e4c233281..a8632642a 100644 --- a/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java +++ b/controlloop/common/eventmanager/src/test/java/org/onap/policy/controlloop/eventmanager/ControlLoopEventManagerTest.java @@ -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()); -- cgit 1.2.3-korg