From 319e008dae673c08706cb41f3da81bf338476035 Mon Sep 17 00:00:00 2001 From: jhh Date: Wed, 25 Mar 2020 19:37:20 -0500 Subject: native policy use engine for top-down processing This will ensure proper invocation of all feature hooks. Issue-ID: POLICY-2388 Signed-off-by: jhh Change-Id: I8d1666bb5e9526faa588e4f613674e080181d4ba Signed-off-by: jhh --- .../policy/drools/lifecycle/LifecycleFeature.java | 20 +++++++-- .../onap/policy/drools/lifecycle/LifecycleFsm.java | 17 ++++++++ .../PolicyTypeNativeArtifactController.java | 47 +++++++++++++--------- .../PolicyTypeNativeDroolsController.java | 10 ++--- 4 files changed, 66 insertions(+), 28 deletions(-) (limited to 'feature-lifecycle/src') diff --git a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleFeature.java b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleFeature.java index d27172b2..d9205977 100644 --- a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleFeature.java +++ b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleFeature.java @@ -38,7 +38,7 @@ public class LifecycleFeature @Override public int getSequenceNumber() { - return 10; + return 1; } @Override @@ -51,6 +51,11 @@ public class LifecycleFeature return fsmStart(controller); } + @Override + public boolean afterPatch(PolicyController controller, boolean success) { + return fsmPatch(controller); + } + @Override public boolean beforeStop(PolicyEngine engine) { return fsmStop(); @@ -63,8 +68,7 @@ public class LifecycleFeature @Override public boolean beforeShutdown(PolicyEngine engine) { - fsm.shutdown(); - return false; + return fsmShutdown(engine); } @Override @@ -101,4 +105,14 @@ public class LifecycleFeature fsm.stop(controller); return false; } + + private boolean fsmPatch(PolicyController controller) { + fsm.patch(controller); + return false; + } + + private boolean fsmShutdown(PolicyEngine engine) { + fsm.shutdown(); + return false; + } } diff --git a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleFsm.java b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleFsm.java index 6953d831..3ecb4b3a 100644 --- a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleFsm.java +++ b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleFsm.java @@ -179,6 +179,11 @@ public class LifecycleFsm implements Startable { */ public synchronized void start(@NonNull PolicyController controller) { logger.info("lifecycle event: start controller: {}", controller.getName()); + if (!controller.getDrools().isBrained()) { + logger.warn("ignoring lifecycle event: start controller: {}", controller); + return; + } + for (ToscaPolicyTypeIdentifier id : controller.getPolicyTypes()) { if (isToscaPolicyType(id.getName())) { PolicyTypeDroolsController ptDroolsController = (PolicyTypeDroolsController) policyTypesMap.get(id); @@ -191,6 +196,18 @@ public class LifecycleFsm implements Startable { } } + /** + * Patch a controller event. + */ + public synchronized void patch(@NonNull PolicyController controller) { + logger.info("lifecycle event: patch controller: {}", controller.getName()); + if (controller.getDrools().isBrained()) { + this.start(controller); + } else { + this.stop(controller); + } + } + @Override public synchronized boolean stop() { logger.info("lifecycle event: stop engine"); diff --git a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/PolicyTypeNativeArtifactController.java b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/PolicyTypeNativeArtifactController.java index d91ecccf..113bb885 100644 --- a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/PolicyTypeNativeArtifactController.java +++ b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/PolicyTypeNativeArtifactController.java @@ -26,9 +26,11 @@ import org.onap.policy.common.gson.annotation.GsonJsonIgnore; import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.drools.controller.DroolsControllerConstants; import org.onap.policy.drools.domain.models.artifact.NativeArtifactPolicy; +import org.onap.policy.drools.protocol.configuration.ControllerConfiguration; import org.onap.policy.drools.protocol.configuration.DroolsConfiguration; import org.onap.policy.drools.system.PolicyController; import org.onap.policy.drools.system.PolicyControllerConstants; +import org.onap.policy.drools.system.PolicyEngineConstants; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier; import org.slf4j.Logger; @@ -55,42 +57,47 @@ public class PolicyTypeNativeArtifactController implements PolicyTypeController PolicyController controller; try { nativePolicy = fsm.getDomainMaker().convertTo(policy, NativeArtifactPolicy.class); + DroolsConfiguration droolsConfig = + new DroolsConfiguration( + nativePolicy.getProperties().getRulesArtifact().getArtifactId(), + nativePolicy.getProperties().getRulesArtifact().getGroupId(), + nativePolicy.getProperties().getRulesArtifact().getVersion()); + controller = PolicyControllerConstants.getFactory().get(nativePolicy.getProperties().getController().getName()); + if (controller.getDrools().isBrained()) { + logger.warn("upgrade of a live controller is strongly discouraged (undeploy first): {} -> {}", + controller, droolsConfig); + } + + return update(nativePolicy, droolsConfig); } catch (CoderException | RuntimeException e) { logger.warn("Invalid Policy: {}", policy); return false; } - - DroolsConfiguration newConfig = - new DroolsConfiguration( - nativePolicy.getProperties().getRulesArtifact().getArtifactId(), - nativePolicy.getProperties().getRulesArtifact().getGroupId(), - nativePolicy.getProperties().getRulesArtifact().getVersion()); - - PolicyControllerConstants.getFactory().patch(controller, newConfig); - return true; } @Override public boolean undeploy(ToscaPolicy policy) { - PolicyController controller; try { NativeArtifactPolicy nativePolicy = fsm.getDomainMaker().convertTo(policy, NativeArtifactPolicy.class); - controller = - PolicyControllerConstants.getFactory().get(nativePolicy.getProperties().getController().getName()); + DroolsConfiguration noConfig = + new DroolsConfiguration( + DroolsControllerConstants.NO_ARTIFACT_ID, + DroolsControllerConstants.NO_GROUP_ID, + DroolsControllerConstants.NO_VERSION); + + return update(nativePolicy, noConfig); } catch (RuntimeException | CoderException e) { logger.warn("Invalid Policy: {}", policy); return false; } + } - DroolsConfiguration noConfig = - new DroolsConfiguration( - DroolsControllerConstants.NO_ARTIFACT_ID, - DroolsControllerConstants.NO_GROUP_ID, - DroolsControllerConstants.NO_VERSION); - - PolicyControllerConstants.getFactory().patch(controller, noConfig); - return true; + private boolean update(NativeArtifactPolicy nativePolicy, DroolsConfiguration droolsConfig) { + ControllerConfiguration controllerConfig = + new ControllerConfiguration(nativePolicy.getProperties().getController().getName(), + ControllerConfiguration.CONFIG_CONTROLLER_OPERATION_UPDATE, droolsConfig); + return PolicyEngineConstants.getManager().updatePolicyController(controllerConfig) != null; } } diff --git a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/PolicyTypeNativeDroolsController.java b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/PolicyTypeNativeDroolsController.java index 2a417dcb..8255c027 100644 --- a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/PolicyTypeNativeDroolsController.java +++ b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/PolicyTypeNativeDroolsController.java @@ -41,6 +41,7 @@ import org.onap.policy.drools.domain.models.controller.ControllerSourceTopic; import org.onap.policy.drools.properties.DroolsPropertyConstants; import org.onap.policy.drools.system.PolicyController; import org.onap.policy.drools.system.PolicyControllerConstants; +import org.onap.policy.drools.system.PolicyEngineConstants; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier; import org.slf4j.Logger; @@ -83,9 +84,8 @@ public class PolicyTypeNativeDroolsController implements PolicyTypeController { PolicyController controller; try { - controller = - PolicyControllerConstants.getFactory().build( - controllerConfig.getControllerName(), controllerProps); + controller = PolicyEngineConstants.getManager() + .createPolicyController(controllerConfig.getControllerName(), controllerProps); } catch (RuntimeException e) { logger.warn("failed deploy (cannot create controller) for policy: {}", policy); return false; @@ -98,8 +98,8 @@ public class PolicyTypeNativeDroolsController implements PolicyTypeController { public boolean undeploy(ToscaPolicy policy) { try { ControllerPolicy nativePolicy = fsm.getDomainMaker().convertTo(policy, ControllerPolicy.class); - PolicyControllerConstants.getFactory() - .destroy(nativePolicy.getProperties().getControllerName()); + PolicyEngineConstants.getManager() + .removePolicyController(nativePolicy.getProperties().getControllerName()); return true; } catch (RuntimeException | CoderException e) { logger.warn("failed undeploy of policy: {}", policy); -- cgit 1.2.3-korg