summaryrefslogtreecommitdiffstats
path: root/feature-lifecycle/src
diff options
context:
space:
mode:
authorjhh <jorge.hernandez-herrero@att.com>2020-08-24 20:04:52 -0500
committerjhh <jorge.hernandez-herrero@att.com>2020-08-25 10:54:58 -0500
commit5c71b5a62f4208030b3c3cd18b3f42398a0a86e5 (patch)
tree482c785dae07a441e2a30176c1faf8ff8b62e3d8 /feature-lifecycle/src
parent13d8a3204013f1c0bc02ddede96ab37ac3d64129 (diff)
block status operations until controllers ready
Status messages to the PAP won't be send until all mandatory resources specified in the lifecycle.pdp.policytypes property are functional. Issue-ID: POLICY-2669 Signed-off-by: jhh <jorge.hernandez-herrero@att.com> Change-Id: Ia9d4c678fcfbdb232059d0827235845ee11f1201 Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
Diffstat (limited to 'feature-lifecycle/src')
-rw-r--r--feature-lifecycle/src/main/feature/config/feature-lifecycle.properties5
-rw-r--r--feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleFsm.java56
-rw-r--r--feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleStateRunning.java10
-rw-r--r--feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActivePoliciesTest.java18
-rw-r--r--feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java8
-rw-r--r--feature-lifecycle/src/test/resources/feature-lifecycle.properties1
6 files changed, 72 insertions, 26 deletions
diff --git a/feature-lifecycle/src/main/feature/config/feature-lifecycle.properties b/feature-lifecycle/src/main/feature/config/feature-lifecycle.properties
index 076da1f9..b495664d 100644
--- a/feature-lifecycle/src/main/feature/config/feature-lifecycle.properties
+++ b/feature-lifecycle/src/main/feature/config/feature-lifecycle.properties
@@ -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
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 319770bd..a45f2b4e 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
@@ -22,10 +22,12 @@ package org.onap.policy.drools.lifecycle;
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;
@@ -77,6 +79,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 {
protected String subgroup;
@Getter
+ protected Set<String> mandatoryPolicyTypes = new HashSet<>();
+
+ @Getter
protected final Map<ToscaPolicyTypeIdentifier, PolicyTypeController> policyTypesMap = new HashMap<>();
@Getter
@@ -146,6 +152,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());
}
@GsonJsonIgnore
@@ -165,6 +181,7 @@ public class LifecycleFsm implements Startable {
return state.state();
}
+
/* ** FSM events - entry points of events into the FSM ** */
@Override
@@ -184,14 +201,12 @@ public class LifecycleFsm implements Startable {
}
for (ToscaPolicyTypeIdentifier id : controller.getPolicyTypes()) {
- if (isToscaPolicyType(id.getName())) {
- PolicyTypeDroolsController ptDroolsController = (PolicyTypeDroolsController) policyTypesMap.get(id);
- if (ptDroolsController == null) {
- policyTypesMap.put(id, new PolicyTypeDroolsController(this, id, controller));
- logger.info("policy-type {} added", id);
- } else {
- ptDroolsController.add(controller);
- }
+ 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 {
+ ptDc.add(controller);
}
}
}
@@ -329,10 +344,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());
@@ -363,6 +374,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() {
@@ -444,11 +471,6 @@ public class LifecycleFsm implements Startable {
return this.client.getSink().start();
}
- protected boolean isToscaPolicyType(String domain) {
- // HACK: until legacy controllers support is removed
- return StringUtils.countMatches(domain, ".") > 1;
- }
-
protected boolean isItMe(String name, String group, String subgroup) {
if (Objects.equals(name, getName())) {
return true;
diff --git a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleStateRunning.java b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleStateRunning.java
index 503c0c11..cf13c46d 100644
--- a/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleStateRunning.java
+++ b/feature-lifecycle/src/main/java/org/onap/policy/drools/lifecycle/LifecycleStateRunning.java
@@ -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();
}
}
diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActivePoliciesTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActivePoliciesTest.java
index 49e439d9..2b0e65bf 100644
--- a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActivePoliciesTest.java
+++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActivePoliciesTest.java
@@ -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;
@@ -32,6 +33,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;
@@ -83,6 +85,22 @@ public class LifecycleStateActivePoliciesTest extends LifecycleStateRunningTest
}
@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());
assertNotNull(fsm.getPolicyTypesMap().get(
diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java
index e8a9c825..39a3a939 100644
--- a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java
+++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java
@@ -205,7 +205,7 @@ public class LifecycleStateActiveTest extends LifecycleStateRunningTest {
ToscaPolicy toscaPolicyRestartV1 =
getExamplesPolicy("policies/vCPE.policy.operational.input.tosca.json", "operational.restart");
toscaPolicyRestartV1.getProperties().put("controllerName", "lifecycle");
- update.setPolicies(Arrays.asList(toscaPolicyRestartV1));
+ update.setPolicies(Collections.singletonList(toscaPolicyRestartV1));
int qlength = fsm.client.getSink().getRecentEvents().length;
@@ -260,7 +260,7 @@ public class LifecycleStateActiveTest extends LifecycleStateRunningTest {
// redeploy operational.restart policy
- update.setPolicies(Arrays.asList(toscaPolicyRestartV1));
+ update.setPolicies(Collections.singletonList(toscaPolicyRestartV1));
assertTrue(fsm.update(update));
assertEquals(qlength + 4, fsm.client.getSink().getRecentEvents().length);
assertEquals(3, fsm.policyTypesMap.size());
@@ -279,7 +279,7 @@ public class LifecycleStateActiveTest extends LifecycleStateRunningTest {
getExamplesPolicy("policies/vCPE.policy.operational.input.tosca.json", "operational.restart");
toscaPolicyRestartV2.setVersion("2.0.0");
toscaPolicyRestartV2.getProperties().put("controllerName", "lifecycle");
- update.setPolicies(Arrays.asList(toscaPolicyRestartV2));
+ update.setPolicies(Collections.singletonList(toscaPolicyRestartV2));
assertTrue(fsm.update(update));
assertEquals(qlength + 5, fsm.client.getSink().getRecentEvents().length);
assertEquals(3, fsm.policyTypesMap.size());
@@ -327,7 +327,7 @@ public class LifecycleStateActiveTest extends LifecycleStateRunningTest {
String badIntegerPolicy =
Files.readString(Paths.get(POLICY_COMPLIANT_VCPE_BAD_INTEGER_JSON), StandardCharsets.UTF_8);
ToscaPolicy toscaPolicyRestartBad = new StandardCoder().decode(badIntegerPolicy, ToscaPolicy.class);
- update.setPolicies(Arrays.asList(toscaPolicyRestartBad));
+ update.setPolicies(Collections.singletonList(toscaPolicyRestartBad));
assertFalse(fsm.update(update));
assertTrue(controllerSupport.getController().getDrools().delete(ToscaPolicy.class));
diff --git a/feature-lifecycle/src/test/resources/feature-lifecycle.properties b/feature-lifecycle/src/test/resources/feature-lifecycle.properties
index 0c80ed45..052b0165 100644
--- a/feature-lifecycle/src/test/resources/feature-lifecycle.properties
+++ b/feature-lifecycle/src/test/resources/feature-lifecycle.properties
@@ -17,6 +17,7 @@
# ============LICENSE_END=========================================================
lifecycle.pdp.group=${envd:POLICY_PDP_PAP_GROUP:defaultGroup}
+lifecycle.pdp.policytypes=${envd:POLICY_PDP_PAP_POLICYTYPES:onap.policies.native.drools.Controller,onap.policies.native.drools.Artifact}
noop.source.topics=POLICY-PDP-PAP
noop.sink.topics=POLICY-PDP-PAP