diff options
author | Jorge Hernandez <jorge.hernandez-herrero@att.com> | 2019-06-05 12:46:29 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@onap.org> | 2019-06-05 12:46:29 +0000 |
commit | ee3bea2552f89babf1b0e0ada286cc36bc6af105 (patch) | |
tree | 5e59bd704d5d11b63953862a1097b907ee484b33 /main/src/main/java/org/onap | |
parent | 6615ef003958266c2b687dd63fa010b7779643a6 (diff) | |
parent | 23b2730941fff26082de9e8a308e1a29758c96a5 (diff) |
Merge "Undeploy policies when subgroup is deleted"
Diffstat (limited to 'main/src/main/java/org/onap')
-rw-r--r-- | main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeployProvider.java | 112 |
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); + } } /** |