block status operations until controllers ready 81/115981/2
authorjhh <jorge.hernandez-herrero@att.com>
Tue, 1 Dec 2020 22:38:35 +0000 (16:38 -0600)
committerjhh <jorge.hernandez-herrero@att.com>
Tue, 1 Dec 2020 23:59:27 +0000 (17:59 -0600)
manual port of https://gerrit.onap.org/r/c/policy/drools-pdp/+/111665

Issue-ID: POLICY-2901
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
Change-Id: Ib8c265228385901fc7e65cefabd612e990c20f2f
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
feature-lifecycle/src/main/feature/config/feature-lifecycle.properties
feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleFsm.java
feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleStateRunning.java
feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActivePoliciesTest.java
feature-lifecycle/src/test/resources/feature-lifecycle.properties
packages/install/src/files/base.conf

index 076da1f..b495664 100644 (file)
@@ -1,7 +1,7 @@
 # ============LICENSE_START=======================================================
 # ONAP
 # ================================================================================
-# Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+# Copyright (C) 2019-2020 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.
@@ -18,6 +18,9 @@
 
 lifecycle.pdp.group=${envd:POLICY_PDP_PAP_GROUP:defaultGroup}
 
+# Mandatory policy types that this PDP-D must support at a minimum
+lifecycle.pdp.policytypes=${envd:POLICY_PDP_PAP_POLICYTYPES}
+
 dmaap.source.topics=POLICY-PDP-PAP
 dmaap.sink.topics=POLICY-PDP-PAP
 
index ac76883..de256e2 100644 (file)
@@ -23,10 +23,12 @@ package org.onap.policy.drools.lifecycle;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Properties;
+import java.util.Set;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
@@ -78,6 +80,7 @@ public class LifecycleFsm implements Startable {
 
     protected static final String CONFIGURATION_PROPERTIES_NAME = "feature-lifecycle";
     protected static final String GROUP_NAME = "lifecycle.pdp.group";
+    protected static final String MANDATORY_POLICY_TYPES = "lifecycle.pdp.policytypes";
     protected static final String DEFAULT_PDP_GROUP = "defaultGroup";
     protected static final long MIN_STATUS_INTERVAL_SECONDS = 5L;
     protected static final String PDP_MESSAGE_NAME = "messageName";
@@ -129,6 +132,9 @@ public class LifecycleFsm implements Startable {
     @Setter
     protected String subgroup;
 
+    @Getter
+    protected Set<String> mandatoryPolicyTypes = new HashSet<>();
+
     @Getter
     protected final Map<ToscaPolicyTypeIdentifier, PolicyTypeController> policyTypesMap = new HashMap<>();
 
@@ -147,6 +153,16 @@ public class LifecycleFsm implements Startable {
         this.policyTypesMap.put(
                 POLICY_TYPE_DROOLS_NATIVE_RULES,
                  new PolicyTypeNativeArtifactController(this, POLICY_TYPE_DROOLS_NATIVE_RULES));
+
+        String commaSeparatedPolicyTypes = this.properties.getProperty(MANDATORY_POLICY_TYPES);
+        if (!StringUtils.isBlank(commaSeparatedPolicyTypes)) {
+            for (String mpt: commaSeparatedPolicyTypes.split("\\s*,\\s*")) {
+                this.mandatoryPolicyTypes.add(mpt);
+            }
+        }
+
+        logger.info("The mandatory Policy Types are {}. Compliance is {}",
+                this.mandatoryPolicyTypes, this.isMandatoryPolicyTypesCompliant());
     }
 
     @JsonIgnore
@@ -167,6 +183,7 @@ public class LifecycleFsm implements Startable {
         return state.state();
     }
 
+
     /* ** FSM events - entry points of events into the FSM ** */
 
     @Override
@@ -187,12 +204,12 @@ public class LifecycleFsm implements Startable {
 
         for (ToscaPolicyTypeIdentifier id : controller.getPolicyTypes()) {
             if (isToscaPolicyType(id.getName())) {
-                PolicyTypeDroolsController ptDroolsController = (PolicyTypeDroolsController) policyTypesMap.get(id);
-                if (ptDroolsController == null) {
+                PolicyTypeDroolsController ptDc = (PolicyTypeDroolsController) policyTypesMap.get(id); //NOSONAR
+                if (ptDc == null) {
                     policyTypesMap.put(id, new PolicyTypeDroolsController(this, id, controller));
                     logger.info("policy-type {} added", id);
                 } else {
-                    ptDroolsController.add(controller);
+                    ptDc.add(controller);
                 }
             }
         }
@@ -331,10 +348,6 @@ public class LifecycleFsm implements Startable {
         return stopTimers() && startTimers();
     }
 
-    protected PolicyTypeController getController(ToscaPolicyTypeIdentifier policyType) {
-        return policyTypesMap.get(policyType);
-    }
-
     protected List<ToscaPolicy> getDeployablePoliciesAction(@NonNull List<ToscaPolicy> policies) {
         List<ToscaPolicy> deployPolicies = new ArrayList<>(policies);
         deployPolicies.removeAll(policiesMap.values());
@@ -365,6 +378,22 @@ public class LifecycleFsm implements Startable {
         return (this.scheduler.submit( () -> state.updatePolicies(toscaPolicies)) != null);
     }
 
+    protected PolicyTypeController getController(ToscaPolicyTypeIdentifier policyType) {
+        return policyTypesMap.get(policyType);
+    }
+
+    /**
+     * Do I support the mandatory policy types?.
+     */
+    protected boolean isMandatoryPolicyTypesCompliant() {
+        return getCurrentPolicyTypes().containsAll(getMandatoryPolicyTypes());
+    }
+
+    protected Set<String> getCurrentPolicyTypes() {
+        return getPolicyTypesMap().keySet().stream()
+                       .map(ToscaPolicyTypeIdentifier::getName).collect(Collectors.toSet());
+    }
+
     /* ** Action Helpers ** */
 
     private boolean startIo() {
index f762bff..42790fc 100644 (file)
@@ -79,11 +79,13 @@ public abstract class LifecycleStateRunning extends LifecycleStateDefault {
     @Override
     public boolean status() {
         synchronized (fsm) {
-            if (fsm.getPolicyTypesMap().isEmpty()) {
-                return true;
-            } else {
-                return fsm.statusAction();
+            if (!fsm.isMandatoryPolicyTypesCompliant()) {
+                logger.info("Not all expected policy types are registered yet, current={}, expected={}",
+                        fsm.getCurrentPolicyTypes(), fsm.getMandatoryPolicyTypes());
+                return false;
             }
+
+            return fsm.statusAction();
         }
     }
 
index fdcaac5..2dd8def 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.policy.drools.lifecycle;
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -34,6 +35,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
@@ -84,6 +86,22 @@ public class LifecycleStateActivePoliciesTest extends LifecycleStateRunningTest
         controllerSupport.getController().start();
     }
 
+    @Test
+    public void testMandatoryPolicyTypes() {
+        assertEquals(Set.of("onap.policies.native.drools.Artifact", "onap.policies.native.drools.Controller"),
+            fsm.getMandatoryPolicyTypes());
+        assertEquals(fsm.getMandatoryPolicyTypes(), fsm.getCurrentPolicyTypes());
+        assertTrue(fsm.isMandatoryPolicyTypesCompliant());
+        assertTrue(fsm.status());
+
+        fsm.mandatoryPolicyTypes.add("blah");
+        assertEquals(Set.of("onap.policies.native.drools.Artifact", "onap.policies.native.drools.Controller", "blah"),
+                fsm.getMandatoryPolicyTypes());
+        assertNotEquals(fsm.getMandatoryPolicyTypes(), fsm.getCurrentPolicyTypes());
+        assertFalse(fsm.isMandatoryPolicyTypesCompliant());
+        assertFalse(fsm.status());
+    }
+
     @Test
     public void testUpdatePolicies() throws IOException, CoderException {
         assertEquals(2, fsm.policyTypesMap.size());
index 0c80ed4..c0b0085 100644 (file)
@@ -17,6 +17,7 @@
 # ============LICENSE_END=========================================================
 
 lifecycle.pdp.group=${envd:POLICY_PDP_PAP_GROUP:defaultGroup}
+lifecycle.pdp.policytypes=onap.policies.native.drools.Controller,onap.policies.native.drools.Artifact
 
 noop.source.topics=POLICY-PDP-PAP
 noop.sink.topics=POLICY-PDP-PAP
index 865a9d1..19a5e44 100644 (file)
@@ -2,7 +2,7 @@
 # ============LICENSE_START=======================================================
 # ONAP POLICY
 # ================================================================================
-# Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+# Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved.
 # Modifications Copyright (C) 2020 Bell Canada.
 # ================================================================================
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -101,6 +101,7 @@ PAP_HOST=
 PAP_USERNAME=
 PAP_PASSWORD=
 POLICY_PDP_PAP_GROUP=defaultGroup
+POLICY_PDP_PAP_POLICYTYPES=
 
 # PDP-X