aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeployProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeployProvider.java')
-rw-r--r--main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeployProvider.java112
1 files changed, 93 insertions, 19 deletions
diff --git a/main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeployProvider.java b/main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeployProvider.java
index 1fd99be9..01b41613 100644
--- a/main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeployProvider.java
+++ b/main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeployProvider.java
@@ -39,9 +39,12 @@ import org.onap.policy.common.utils.services.Registry;
import org.onap.policy.models.base.PfModelException;
import org.onap.policy.models.base.PfModelRuntimeException;
import org.onap.policy.models.pap.concepts.PdpDeployPolicies;
+import org.onap.policy.models.pdp.concepts.Pdp;
import org.onap.policy.models.pdp.concepts.PdpGroup;
import org.onap.policy.models.pdp.concepts.PdpGroups;
+import org.onap.policy.models.pdp.concepts.PdpStateChange;
import org.onap.policy.models.pdp.concepts.PdpSubGroup;
+import org.onap.policy.models.pdp.concepts.PdpUpdate;
import org.onap.policy.models.pdp.enums.PdpState;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
@@ -186,11 +189,57 @@ public class PdpGroupDeployProvider extends ProviderBase {
"cannot change properties"));
}
+ boolean updated = updateField(dbgroup.getDescription(), group.getDescription(), dbgroup::setDescription);
+ updated = notifyPdpsDelSubGroups(data, dbgroup, group) || updated;
+ updated = addOrUpdateSubGroups(data, dbgroup, group, result) || updated;
+
+ if (result.isValid() && updated) {
+ data.update(group);
+ }
+
+ return result;
+ }
+
+ /**
+ * Updates a field, if the new value is different than the old value.
+ *
+ * @param oldValue old value
+ * @param newValue new value
+ * @param setter function to set the field to the new value
+ * @return {@code true} if the field was updated, {@code false} if it already matched
+ * the new value
+ */
+ private <T> boolean updateField(T oldValue, T newValue, Consumer<T> setter) {
+ if (oldValue == newValue) {
+ return false;
+ }
+
+ if (oldValue != null && oldValue.equals(newValue)) {
+ return false;
+ }
+
+ setter.accept(newValue);
+ return true;
+ }
+
+ /**
+ * Adds or updates subgroups within the group.
+ *
+ * @param data session data
+ * @param dbgroup the group, as it appears within the DB
+ * @param group the group to be added
+ * @param result the validation result
+ * @return {@code true} if the DB group was modified, {@code false} otherwise
+ * @throws PfModelException if an error occurred
+ */
+ private boolean addOrUpdateSubGroups(SessionData data, PdpGroup dbgroup, PdpGroup group,
+ BeanValidationResult result) throws PfModelException {
+
// create a map of existing subgroups
Map<String, PdpSubGroup> type2sub = new HashMap<>();
dbgroup.getPdpSubgroups().forEach(subgrp -> type2sub.put(subgrp.getPdpType(), subgrp));
- boolean updated = updateField(dbgroup.getDescription(), group.getDescription(), dbgroup::setDescription);
+ boolean updated = false;
for (PdpSubGroup subgrp : group.getPdpSubgroups()) {
PdpSubGroup dbsub = type2sub.get(subgrp.getPdpType());
@@ -208,33 +257,58 @@ public class PdpGroupDeployProvider extends ProviderBase {
result.addResult(subResult);
}
- if (result.isValid() && updated) {
- data.update(group);
+ return updated;
+ }
+
+ /**
+ * Notifies any PDPs whose subgroups are being removed.
+ *
+ * @param data session data
+ * @param dbgroup the group, as it appears within the DB
+ * @param group the group being updated
+ * @return {@code true} if a subgroup was removed, {@code false} otherwise
+ */
+ private boolean notifyPdpsDelSubGroups(SessionData data, PdpGroup dbgroup, PdpGroup group) {
+ boolean updated = false;
+
+ // subgroups, as they appear within the updated group
+ Set<String> subgroups = new HashSet<>();
+ group.getPdpSubgroups().forEach(subgrp -> subgroups.add(subgrp.getPdpType()));
+
+ // loop through subgroups as they appear within the DB
+ for (PdpSubGroup subgrp : dbgroup.getPdpSubgroups()) {
+
+ if (!subgroups.contains(subgrp.getPdpType())) {
+ // this subgroup no longer appears - notify its PDPs
+ updated = true;
+ notifyPdpsDelSubGroup(data, subgrp);
+ }
}
- return result;
+ return updated;
}
/**
- * Updates a field, if the new value is different than the old value.
+ * Notifies the PDPs that their subgroup is being removed.
*
- * @param oldValue old value
- * @param newValue new value
- * @param setter function to set the field to the new value
- * @return {@code true} if the field was updated, {@code false} if it already matched
- * the new value
+ * @param data session data
+ * @param subgrp subgroup that is being removed
*/
- private <T> boolean updateField(T oldValue, T newValue, Consumer<T> setter) {
- if (oldValue == newValue) {
- return false;
- }
+ private void notifyPdpsDelSubGroup(SessionData data, PdpSubGroup subgrp) {
+ for (Pdp pdp : subgrp.getPdpInstances()) {
+ String name = pdp.getInstanceId();
- if (oldValue != null && oldValue.equals(newValue)) {
- return false;
- }
+ // make it passive
+ PdpStateChange change = new PdpStateChange();
+ change.setName(name);
+ change.setState(PdpState.PASSIVE);
- setter.accept(newValue);
- return true;
+ // remove it from subgroup and undeploy all policies
+ PdpUpdate update = new PdpUpdate();
+ update.setName(name);
+
+ data.addRequests(update, change);
+ }
}
/**