package org.onap.policy.pap.main.rest;
-import com.att.aft.dme2.internal.apache.commons.lang.ObjectUtils;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.function.Consumer;
import java.util.stream.Collectors;
import javax.ws.rs.core.Response.Status;
import org.onap.policy.common.parameters.BeanValidationResult;
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.DeploymentGroup;
+import org.onap.policy.models.pdp.concepts.DeploymentGroups;
+import org.onap.policy.models.pdp.concepts.DeploymentSubGroup;
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;
import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifierOptVersion;
}
/**
- * Creates or updates PDP groups.
+ * Updates policies in specific PDP groups.
*
- * @param groups PDP group configurations to be created or updated
+ * @param groups PDP group deployments to be updated
* @throws PfModelException if an error occurred
*/
- public void createOrUpdateGroups(PdpGroups groups) throws PfModelException {
+ public void updateGroupPolicies(DeploymentGroups groups) throws PfModelException {
ValidationResult result = groups.validatePapRest();
if (!result.isValid()) {
throw new PfModelException(Status.BAD_REQUEST, msg);
}
- process(groups, this::createOrUpdate);
+ process(groups, this::updateGroups);
}
/**
- * Creates or updates PDP groups. This is the method that does the actual work.
+ * Updates policies in specific PDP groups. This is the method that does the actual work.
*
* @param data session data
- * @param groups PDP group configurations
+ * @param groups PDP group deployments
* @throws PfModelException if an error occurred
*/
- private void createOrUpdate(SessionData data, PdpGroups groups) throws PfModelException {
+ private void updateGroups(SessionData data, DeploymentGroups groups) throws PfModelException {
BeanValidationResult result = new BeanValidationResult("groups", groups);
- for (PdpGroup group : groups.getGroups()) {
+ for (DeploymentGroup group : groups.getGroups()) {
PdpGroup dbgroup = data.getGroup(group.getName());
if (dbgroup == null) {
- result.addResult(addGroup(data, group));
+ result.addResult(new ObjectValidationResult(group.getName(), group,
+ ValidationStatus.INVALID, "unknown group"));
} else {
result.addResult(updateGroup(data, dbgroup, group));
}
}
- /**
- * Adds a new group.
- *
- * @param data session data
- * @param group the group to be added
- * @return the validation result
- * @throws PfModelException if an error occurred
- */
- private ValidationResult addGroup(SessionData data, PdpGroup group) throws PfModelException {
- BeanValidationResult result = new BeanValidationResult(group.getName(), group);
-
- validateGroupOnly(group, result);
- if (!result.isValid()) {
- return result;
- }
-
- // default to active
- if (group.getPdpGroupState() == null) {
- group.setPdpGroupState(PdpState.ACTIVE);
- }
-
- for (PdpSubGroup subgrp : group.getPdpSubgroups()) {
- result.addResult(addSubGroup(data, subgrp));
- }
-
- if (result.isValid()) {
- data.create(group);
- }
-
- return result;
- }
-
- /**
- * Performs additional validations of a group, but does not examine the subgroups.
- *
- * @param group the group to be validated
- * @param result the validation result
- */
- private void validateGroupOnly(PdpGroup group, BeanValidationResult result) {
- if (group.getPdpGroupState() == null) {
- return;
- }
-
- switch (group.getPdpGroupState()) {
- case ACTIVE:
- case PASSIVE:
- break;
-
- default:
- result.addResult(new ObjectValidationResult("pdpGroupState", group.getPdpGroupState(),
- ValidationStatus.INVALID, "must be null, ACTIVE, or PASSIVE"));
- break;
- }
- }
-
/**
* Updates an existing group.
*
* @return the validation result
* @throws PfModelException if an error occurred
*/
- private ValidationResult updateGroup(SessionData data, PdpGroup dbgroup, PdpGroup group) throws PfModelException {
- BeanValidationResult result = new BeanValidationResult(group.getName(), group);
+ private ValidationResult updateGroup(SessionData data, PdpGroup dbgroup, DeploymentGroup group)
+ throws PfModelException {
- if (!ObjectUtils.equals(dbgroup.getProperties(), group.getProperties())) {
- result.addResult(new ObjectValidationResult("properties", "", ValidationStatus.INVALID,
- "cannot change properties"));
- }
+ BeanValidationResult result = new BeanValidationResult(group.getName(), group);
- boolean updated = updateField(dbgroup.getDescription(), group.getDescription(), dbgroup::setDescription);
- updated = updateField(dbgroup.getPdpGroupState(), group.getPdpGroupState(), dbgroup::setPdpGroupState)
- || updated;
- updated = notifyPdpsDelSubGroups(data, dbgroup, group) || updated;
- updated = addOrUpdateSubGroups(data, dbgroup, group, result) || updated;
+ boolean updated = updateSubGroups(data, dbgroup, group, result);
if (result.isValid() && updated) {
- data.update(group);
+ data.update(dbgroup);
}
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.
*
* @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,
+ private boolean updateSubGroups(SessionData data, PdpGroup dbgroup, DeploymentGroup group,
BeanValidationResult result) throws PfModelException {
// create a map of existing subgroups
boolean updated = false;
- for (PdpSubGroup subgrp : group.getPdpSubgroups()) {
+ for (DeploymentSubGroup subgrp : group.getDeploymentSubgroups()) {
PdpSubGroup dbsub = type2sub.get(subgrp.getPdpType());
BeanValidationResult subResult = new BeanValidationResult(subgrp.getPdpType(), subgrp);
if (dbsub == null) {
- updated = true;
- subResult.addResult(addSubGroup(data, subgrp));
- dbgroup.getPdpSubgroups().add(subgrp);
+ subResult.addResult(new ObjectValidationResult(subgrp.getPdpType(), subgrp,
+ ValidationStatus.INVALID, "unknown subgroup"));
} else {
- updated = updateSubGroup(data, group, dbsub, subgrp, subResult) || updated;
+ updated = updateSubGroup(data, dbgroup, dbsub, subgrp, subResult) || updated;
}
result.addResult(subResult);
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
- * @throws PfModelException if an error occurred
- */
- private boolean notifyPdpsDelSubGroups(SessionData data, PdpGroup dbgroup, PdpGroup group) throws PfModelException {
- 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);
- trackPdpsDelSubGroup(data, subgrp);
- }
- }
-
- return updated;
- }
-
- /**
- * Notifies the PDPs that their subgroup is being removed.
- *
- * @param data session data
- * @param subgrp subgroup that is being removed
- */
- private void notifyPdpsDelSubGroup(SessionData data, PdpSubGroup subgrp) {
- for (Pdp pdp : subgrp.getPdpInstances()) {
- String name = pdp.getInstanceId();
-
- // make it passive
- PdpStateChange change = new PdpStateChange();
- change.setName(name);
- change.setState(PdpState.PASSIVE);
-
- // remove it from subgroup and undeploy all policies
- PdpUpdate update = new PdpUpdate();
- update.setName(name);
-
- data.addRequests(update, change);
- }
- }
-
- /**
- * Tracks PDP responses when their subgroup is removed.
- *
- * @param data session data
- * @param subgrp subgroup that is being removed
- * @throws PfModelException if an error occurred
- */
- private void trackPdpsDelSubGroup(SessionData data, PdpSubGroup subgrp) throws PfModelException {
- Set<String> pdps = subgrp.getPdpInstances().stream().map(Pdp::getInstanceId).collect(Collectors.toSet());
-
- for (ToscaPolicyIdentifier policyId : subgrp.getPolicies()) {
- data.trackUndeploy(policyId, pdps);
- }
- }
-
- /**
- * Adds a new subgroup.
- *
- * @param data session data
- * @param subgrp the subgroup to be added, updated to fully qualified versions upon
- * return
- * @return the validation result
- * @throws PfModelException if an error occurred
- */
- private ValidationResult addSubGroup(SessionData data, PdpSubGroup subgrp) throws PfModelException {
- subgrp.setCurrentInstanceCount(0);
- subgrp.setPdpInstances(Collections.emptyList());
-
- BeanValidationResult result = new BeanValidationResult(subgrp.getPdpType(), subgrp);
-
- result.addResult(validateSupportedTypes(data, subgrp));
- result.addResult(validatePolicies(data, null, subgrp));
-
- return result;
- }
-
/**
* Updates an existing subgroup.
*
* were no changes
* @throws PfModelException if an error occurred
*/
- private boolean updateSubGroup(SessionData data, PdpGroup dbgroup, PdpSubGroup dbsub, PdpSubGroup subgrp,
+ private boolean updateSubGroup(SessionData data, PdpGroup dbgroup, PdpSubGroup dbsub, DeploymentSubGroup subgrp,
BeanValidationResult container) throws PfModelException {
// perform additional validations first
return false;
}
- /*
- * first, apply the changes about which the PDPs care
- */
- boolean updated = updatePolicies(data, dbsub, subgrp);
+ boolean updated = false;
+
+ switch (subgrp.getAction()) {
+ case POST:
+ updated = addPolicies(data, dbsub, subgrp);
+ break;
+ case DELETE:
+ updated = deletePolicies(data, dbsub, subgrp);
+ break;
+ case PATCH:
+ default:
+ updated = updatePolicies(data, dbsub, subgrp);
+ break;
+ }
- // publish any changes to the PDPs
if (updated) {
+ // publish any changes to the PDPs
makeUpdates(data, dbgroup, dbsub);
+ return true;
}
- /*
- * now make any remaining changes
- */
- updated = updateList(dbsub.getSupportedPolicyTypes(), subgrp.getSupportedPolicyTypes(),
- dbsub::setSupportedPolicyTypes) || updated;
+ return false;
+ }
+
+ private boolean addPolicies(SessionData data, PdpSubGroup dbsub, DeploymentSubGroup subgrp)
+ throws PfModelException {
+
+ Set<ToscaPolicyIdentifier> policies = new LinkedHashSet<>(dbsub.getPolicies());
+ policies.addAll(subgrp.getPolicies());
+
+ DeploymentSubGroup subgrp2 = new DeploymentSubGroup(subgrp);
+ subgrp2.getPolicies().clear();
+ subgrp2.getPolicies().addAll(policies);
- return updateField(dbsub.getDesiredInstanceCount(), subgrp.getDesiredInstanceCount(),
- dbsub::setDesiredInstanceCount) || updated;
+ return updatePolicies(data, dbsub, subgrp2);
}
- private boolean updatePolicies(SessionData data, PdpSubGroup dbsub, PdpSubGroup subgrp) throws PfModelException {
+ private boolean deletePolicies(SessionData data, PdpSubGroup dbsub, DeploymentSubGroup subgrp)
+ throws PfModelException {
+
+ Set<ToscaPolicyIdentifier> policies = new LinkedHashSet<>(dbsub.getPolicies());
+ policies.removeAll(subgrp.getPolicies());
+
+ DeploymentSubGroup subgrp2 = new DeploymentSubGroup(subgrp);
+ subgrp2.getPolicies().clear();
+ subgrp2.getPolicies().addAll(policies);
+
+ return updatePolicies(data, dbsub, subgrp2);
+ }
+
+ private boolean updatePolicies(SessionData data, PdpSubGroup dbsub, DeploymentSubGroup subgrp)
+ throws PfModelException {
+
Set<ToscaPolicyIdentifier> undeployed = new HashSet<>(dbsub.getPolicies());
undeployed.removeAll(subgrp.getPolicies());
}
- Set<String> pdps = subgrp.getPdpInstances().stream().map(Pdp::getInstanceId).collect(Collectors.toSet());
+ // TODO add code to ensure that dbsub has at least one PDP instance if policies is not empty
+
+ Set<String> pdps = dbsub.getPdpInstances().stream().map(Pdp::getInstanceId).collect(Collectors.toSet());
for (ToscaPolicyIdentifier policyId : deployed) {
data.trackDeploy(policyId, pdps);
* @return {@code true} if the subgroup is valid, {@code false} otherwise
* @throws PfModelException if an error occurred
*/
- private boolean validateSubGroup(SessionData data, PdpSubGroup dbsub, PdpSubGroup subgrp,
+ private boolean validateSubGroup(SessionData data, PdpSubGroup dbsub, DeploymentSubGroup subgrp,
BeanValidationResult container) throws PfModelException {
BeanValidationResult result = new BeanValidationResult(subgrp.getPdpType(), subgrp);
- if (!ObjectUtils.equals(dbsub.getProperties(), subgrp.getProperties())) {
- result.addResult(new ObjectValidationResult("properties", "", ValidationStatus.INVALID,
- "cannot change properties"));
- }
-
result.addResult(validatePolicies(data, dbsub, subgrp));
- result.addResult(validateSupportedTypes(data, subgrp));
container.addResult(result);
return result.isValid();
}
- /**
- * Updates a DB list with items from a new list.
- *
- * @param dblist the list from the DB
- * @param newList the new list
- * @param setter function to set the new list
- * @return {@code true} if the list changed, {@code false} if the lists were the same
- */
- private <T> boolean updateList(List<T> dblist, List<T> newList, Consumer<List<T>> setter) {
-
- Set<T> dbTypes = new HashSet<>(dblist);
- Set<T> newTypes = new HashSet<>(newList);
-
- if (dbTypes.equals(newTypes)) {
- return false;
- }
-
- setter.accept(new ArrayList<>(newTypes));
-
- return true;
- }
-
- /**
- * Performs additional validations of the supported policy types within a subgroup.
- *
- * @param data session data
- * @param subgrp the subgroup to be validated
- * @param result the validation result
- * @throws PfModelException if an error occurred
- */
- private ValidationResult validateSupportedTypes(SessionData data, PdpSubGroup subgrp) throws PfModelException {
- BeanValidationResult result = new BeanValidationResult(subgrp.getPdpType(), subgrp);
-
- for (ToscaPolicyTypeIdentifier type : subgrp.getSupportedPolicyTypes()) {
- if (!type.getName().endsWith(".*") && data.getPolicyType(type) == null) {
- result.addResult(new ObjectValidationResult("policy type", type, ValidationStatus.INVALID,
- "unknown policy type"));
- }
- }
-
- return result;
- }
-
/**
* Performs additional validations of the policies within a subgroup.
*
* @param result the validation result
* @throws PfModelException if an error occurred
*/
- private ValidationResult validatePolicies(SessionData data, PdpSubGroup dbsub, PdpSubGroup subgrp)
+ private ValidationResult validatePolicies(SessionData data, PdpSubGroup dbsub, DeploymentSubGroup subgrp)
throws PfModelException {
// build a map of the DB data, from policy name to (fully qualified) policy
// version
Map<String, String> dbname2vers = new HashMap<>();
- if (dbsub != null) {
- dbsub.getPolicies().forEach(ident -> dbname2vers.put(ident.getName(), ident.getVersion()));
- }
+ dbsub.getPolicies().forEach(ident -> dbname2vers.put(ident.getName(), ident.getVersion()));
BeanValidationResult result = new BeanValidationResult(subgrp.getPdpType(), subgrp);
result.addResult(new ObjectValidationResult(POLICY_RESULT_NAME, ident, ValidationStatus.INVALID,
"unknown policy"));
- } else if (!isPolicySupported(subgrp.getSupportedPolicyTypes(), policy.getTypeIdentifier())) {
+ } else if (!isPolicySupported(dbsub.getSupportedPolicyTypes(), policy.getTypeIdentifier())) {
result.addResult(new ObjectValidationResult(POLICY_RESULT_NAME, ident, ValidationStatus.INVALID,
"not a supported policy for the subgroup"));
package org.onap.policy.pap.main.rest;
+import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-import java.util.TreeMap;
import java.util.TreeSet;
import java.util.stream.Collectors;
import javax.ws.rs.core.Response.Status;
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.DeploymentGroup;
+import org.onap.policy.models.pdp.concepts.DeploymentGroups;
+import org.onap.policy.models.pdp.concepts.DeploymentSubGroup;
+import org.onap.policy.models.pdp.concepts.DeploymentSubGroup.Action;
import org.onap.policy.models.pdp.concepts.PdpGroup;
import org.onap.policy.models.pdp.concepts.PdpGroups;
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;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
import org.onap.policy.pap.main.notification.PolicyPdpNotificationData;
public class TestPdpGroupDeployProvider extends ProviderSuper {
private static final String EXPECTED_EXCEPTION = "expected exception";
private static final String POLICY2_NAME = "policyB";
+ private static final String POLICY3_NAME = "policyC";
private static final String POLICY1_VERSION = "1.2.3";
+ private static final String POLICY2_VERSION = "1.2.3";
+ private static final String POLICY3_VERSION = "1.2.3";
private static final String GROUP1_NAME = "groupA";
private static final String PDP1_TYPE = "pdpTypeA";
private static final String PDP2_TYPE = "pdpTypeB";
*
* @throws Exception if an error occurs
*/
- @Override
@Before
public void setUp() throws Exception {
super.setUp();
- when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("daoPolicyList.json"));
+ when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("daoPolicyList2.json"));
when(dao.getPolicyTypeList("typeA", "100.2.3")).thenReturn(Arrays.asList(loadPolicyType("daoPolicyType.json")));
prov = new PdpGroupDeployProvider();
}
+ /**
+ * Tests updateGroupPolicies when policies are being added.
+ */
@Test
- public void testCreateOrUpdateGroups() throws Exception {
- prov.createOrUpdateGroups(loadPdpGroups("emptyGroups.json"));
+ public void testUpdateGroupPoliciesAdd() throws Exception {
+ PdpGroups groups = loadPdpGroups("deployGroups.json");
+ PdpGroup newgrp = groups.getGroups().get(0);
+ PdpGroup dbgroup = new PdpGroup(newgrp);
+ when(dao.getPdpGroups(dbgroup.getName())).thenReturn(Arrays.asList(dbgroup));
- // no groups, so no action should have been taken
- assertNoGroupAction();
- }
+ // add new policies
+ List<ToscaPolicyIdentifier> policies = newgrp.getPdpSubgroups().get(0).getPolicies();
+ policies.add(new ToscaPolicyIdentifier(POLICY2_NAME, POLICY2_VERSION));
+ policies.add(new ToscaPolicyIdentifier(POLICY3_NAME, POLICY3_VERSION));
- @Test
- public void testCreateOrUpdateGroups_InvalidRequest() throws Exception {
- assertThatThrownBy(() -> prov.createOrUpdateGroups(new PdpGroups())).isInstanceOf(PfModelException.class)
- .hasMessageContaining("is null");
-
- assertNoGroupAction();
- }
+ when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("createGroupNewPolicy.json"))
+ .thenReturn(loadPolicies("createGroupNewPolicy2.json"))
+ .thenReturn(loadPolicies("daoPolicyList.json"));
- @Test
- public void testCreateOrUpdate_Invalid() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- groups.getGroups().get(0).setPdpGroupState(PdpState.TERMINATED);
+ // add = POST
+ DeploymentGroups depgroups = toDeploymentGroups(groups);
+ depgroups.getGroups().get(0).getDeploymentSubgroups().get(0).setAction(Action.POST);
- assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
- .hasMessageContaining("pdpGroupState");
+ prov.updateGroupPolicies(depgroups);
- assertNoGroupAction();
+ assertEquals(newgrp.toString(), dbgroup.toString());
+ assertGroupUpdate(dbgroup, dbgroup.getPdpSubgroups().get(0));
}
+ /**
+ * Tests updateGroupPolicies when policies are being deleted.
+ */
@Test
- public void testAddGroup() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- PdpGroup group = groups.getGroups().get(0);
- group.setPdpGroupState(PdpState.PASSIVE);
+ public void testUpdateGroupPoliciesDelete() throws Exception {
+ PdpGroups groups = loadPdpGroups("deployGroups.json");
+ PdpGroup newgrp = groups.getGroups().get(0);
- prov.createOrUpdateGroups(groups);
+ // additional policies in the DB that will be removed
+ List<ToscaPolicyIdentifier> policies = newgrp.getPdpSubgroups().get(0).getPolicies();
+ policies.add(new ToscaPolicyIdentifier(POLICY2_NAME, POLICY2_VERSION));
+ policies.add(new ToscaPolicyIdentifier(POLICY3_NAME, POLICY3_VERSION));
- // should not have updated the state
- assertEquals(PdpState.PASSIVE, group.getPdpGroupState());
+ PdpGroup dbgroup = new PdpGroup(newgrp);
+ when(dao.getPdpGroups(dbgroup.getName())).thenReturn(Arrays.asList(dbgroup));
- assertSame(group, getGroupCreates().get(0));
- }
+ // policy that should be left
+ final ToscaPolicyIdentifier policyId1 = policies.remove(0);
- @Test
- public void testAddGroup_Invalid() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- groups.getGroups().get(0).setPdpGroupState(PdpState.TERMINATED);
-
- assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
- .hasMessageContaining("pdpGroupState");
+ when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("createGroupNewPolicy.json"))
+ .thenReturn(loadPolicies("createGroupNewPolicy2.json"))
+ .thenReturn(loadPolicies("daoPolicyList.json"));
- assertNoGroupAction();
- }
+ DeploymentGroups depgroups = toDeploymentGroups(groups);
+ depgroups.getGroups().get(0).getDeploymentSubgroups().get(0).setAction(Action.DELETE);
- @Test
- public void testValidateGroupOnly_NullState() throws PfModelException {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- groups.getGroups().get(0).setPdpGroupState(null);
- prov.createOrUpdateGroups(groups);
- }
+ prov.updateGroupPolicies(depgroups);
- @Test
- public void testValidateGroupOnly_Active() throws PfModelException {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- groups.getGroups().get(0).setPdpGroupState(PdpState.ACTIVE);
- prov.createOrUpdateGroups(groups);
- }
+ // only the first policy should remain
+ policies.clear();
+ policies.add(policyId1);
- @Test
- public void testValidateGroupOnly_Passive() throws PfModelException {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- groups.getGroups().get(0).setPdpGroupState(PdpState.PASSIVE);
- prov.createOrUpdateGroups(groups);
+ assertEquals(newgrp.toString(), dbgroup.toString());
+ assertGroupUpdate(dbgroup, dbgroup.getPdpSubgroups().get(0));
}
+ /**
+ * Tests updateGroupPolicies when policies are being added and deleted in the same subgroup.
+ */
@Test
- public void testValidateGroupOnly_Invalid() {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- groups.getGroups().get(0).setPdpGroupState(PdpState.TERMINATED);
-
- assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
- .hasMessageContaining("pdpGroupState");
- }
+ public void testUpdateGroupPoliciesAddAndDelete() throws Exception {
+ PdpGroups groups = loadPdpGroups("deployGroups.json");
+ PdpGroup newgrp = groups.getGroups().get(0);
+ PdpSubGroup subgrp = newgrp.getPdpSubgroups().get(0);
- @Test
- public void testUpdateGroup() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
+ // put policy3 into db subgroup
+ subgrp.getPolicies().add(new ToscaPolicyIdentifier(POLICY3_NAME, POLICY3_VERSION));
+ PdpGroup dbgroup = new PdpGroup(newgrp);
+ when(dao.getPdpGroups(dbgroup.getName())).thenReturn(Arrays.asList(dbgroup));
- // DB group = new group
- PdpGroup group = new PdpGroup(groups.getGroups().get(0));
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
+ // now make the subgrp reflect our final expectation
+ subgrp.getPolicies().remove(1);
+ subgrp.getPolicies().add(new ToscaPolicyIdentifier(POLICY2_NAME, POLICY2_VERSION));
- prov.createOrUpdateGroups(groups);
+ // indicate policy2 being added and policy3 being deleted
+ DeploymentSubGroup depsub1 = new DeploymentSubGroup();
+ depsub1.setAction(Action.POST);
+ depsub1.setPdpType(subgrp.getPdpType());
+ depsub1.setPolicies(Arrays.asList(new ToscaPolicyIdentifier(POLICY2_NAME, POLICY2_VERSION)));
- assertNoGroupAction();
- }
+ DeploymentSubGroup depsub2 = new DeploymentSubGroup();
+ depsub2.setAction(Action.DELETE);
+ depsub2.setPdpType(subgrp.getPdpType());
+ depsub2.setPolicies(Arrays.asList(new ToscaPolicyIdentifier(POLICY3_NAME, POLICY3_VERSION)));
- @Test
- public void testUpdateGroup_PropertiesChanged() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
+ DeploymentGroup depgroup = new DeploymentGroup();
+ depgroup.setName(newgrp.getName());
+ depgroup.setDeploymentSubgroups(Arrays.asList(depsub1, depsub2));
- PdpGroup group = new PdpGroup(groups.getGroups().get(0));
- group.setProperties(new TreeMap<>());
+ DeploymentGroups depgroups = new DeploymentGroups();
+ depgroups.setGroups(Arrays.asList(depgroup));
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
+ when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("createGroupNewPolicy.json"))
+ .thenReturn(loadPolicies("daoPolicyList.json"))
+ .thenReturn(loadPolicies("createGroupNewPolicy2.json"));
- assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
- .hasMessageContaining("properties");
+ prov.updateGroupPolicies(depgroups);
- assertNoGroupAction();
+ assertEquals(newgrp.toString(), dbgroup.toString());
+ assertGroupUpdate(dbgroup, dbgroup.getPdpSubgroups().get(0));
}
@Test
- public void testUpdateGroup_NewDescription() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
+ public void testUpdateGroupPolicies() throws Exception {
+ PdpGroups groups = loadPdpGroups("deployGroups.json");
PdpGroup newgrp = groups.getGroups().get(0);
PdpGroup group = new PdpGroup(newgrp);
- group.setDescription("old description");
when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
- prov.createOrUpdateGroups(groups);
+ // something different in this subgroup
+ group.getPdpSubgroups().get(0).getPolicies().add(new ToscaPolicyIdentifier(POLICY2_NAME, POLICY2_VERSION));
- assertGroupUpdateOnly(group);
+ prov.updateGroupPolicies(toDeploymentGroups(groups));
- assertEquals(group.getDescription(), "my description");
assertEquals(newgrp.toString(), group.toString());
+ assertGroupUpdate(group, group.getPdpSubgroups().get(0));
}
@Test
- public void testUpdateGroup_NewState() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- PdpGroup newgrp = groups.getGroups().get(0);
- PdpGroup group = new PdpGroup(newgrp);
- group.setPdpGroupState(PdpState.TEST);
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
-
- prov.createOrUpdateGroups(groups);
-
- assertGroupUpdateOnly(group);
+ public void testUpdateGroupPolicies_EmptyRequest() throws Exception {
+ prov.updateGroupPolicies(toDeploymentGroups(loadPdpGroups("emptyGroups.json")));
- assertEquals(PdpState.ACTIVE, group.getPdpGroupState());
- assertEquals(newgrp.toString(), group.toString());
+ // no groups, so no action should have been taken
+ assertNoGroupAction();
}
@Test
- public void testUpdateGroup_UpdatedSubGroup() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- PdpGroup newgrp = groups.getGroups().get(0);
- PdpGroup group = new PdpGroup(newgrp);
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
-
- // something different in this subgroup
- group.getPdpSubgroups().get(0).setDesiredInstanceCount(10);
-
- prov.createOrUpdateGroups(groups);
+ public void testUpdateGroupPolicies_InvalidRequest() throws Exception {
+ assertThatThrownBy(() -> prov.updateGroupPolicies(new DeploymentGroups())).isInstanceOf(PfModelException.class)
+ .hasMessageContaining("is null");
- assertEquals(newgrp.toString(), group.toString());
- assertGroupUpdateOnly(group);
+ assertNoGroupAction();
}
@Test
- public void testUpdateGroup_MultipleChanges() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- PdpGroup newgrp = groups.getGroups().get(0);
- PdpGroup group = new PdpGroup(newgrp);
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
-
- PdpSubGroup subgrp = newgrp.getPdpSubgroups().get(0);
- subgrp.setDesiredInstanceCount(30);
- subgrp.getPolicies().add(new ToscaPolicyIdentifier(POLICY2_NAME, POLICY1_VERSION));
- subgrp.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier("typeX.*", "9.8.7"));
+ public void testUpdateGroup_UnknownGroup() throws Exception {
+ PdpGroups groups = loadPdpGroups("deployGroups.json");
- when(dao.getFilteredPolicyList(any()))
- .thenReturn(loadPolicies("createGroupNewPolicy.json"))
- .thenReturn(loadPolicies("daoPolicyList.json"))
- .thenReturn(loadPolicies("createGroupNewPolicy.json"));
+ String groupName = groups.getGroups().get(0).getName();
- prov.createOrUpdateGroups(groups);
+ // group not found
+ when(dao.getPdpGroups(groupName)).thenReturn(Collections.emptyList());
- Collections.sort(newgrp.getPdpSubgroups().get(0).getPolicies());
- Collections.sort(group.getPdpSubgroups().get(0).getPolicies());
+ assertThatThrownBy(() -> prov.updateGroupPolicies(toDeploymentGroups(groups)))
+ .isInstanceOf(PfModelException.class).hasMessageContaining(groupName)
+ .hasMessageContaining("unknown group");
- assertEquals(newgrp.toString(), group.toString());
-
- // this requires a PDP UPDATE message
- assertGroupUpdate(group, subgrp);
+ assertNoGroupAction();
}
@Test
- public void testUpdateField_Unchanged() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- PdpGroup newgrp = groups.getGroups().get(0);
- PdpGroup group = new PdpGroup(newgrp);
+ public void testUpdateGroup() throws Exception {
+ PdpGroups groups = loadPdpGroups("deployGroups.json");
+
+ // DB group = new group
+ PdpGroup group = new PdpGroup(groups.getGroups().get(0));
when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
- prov.createOrUpdateGroups(groups);
+ prov.updateGroupPolicies(toDeploymentGroups(groups));
assertNoGroupAction();
}
@Test
- public void testUpdateField_WasNull() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- PdpGroup newgrp = groups.getGroups().get(0);
- PdpGroup group = new PdpGroup(newgrp);
+ public void testUpdateGroup_NewSubGroup() throws Exception {
+ PdpGroups groups = loadPdpGroups("createGroupsNewSub.json");
+ PdpGroup group = loadPdpGroups("deployGroups.json").getGroups().get(0);
when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
- group.setDescription(null);
+ assertThatThrownBy(() -> prov.updateGroupPolicies(toDeploymentGroups(groups)))
+ .isInstanceOf(PfModelException.class).hasMessageContaining("pdpTypeB")
+ .hasMessageContaining("unknown subgroup");
- prov.createOrUpdateGroups(groups);
- assertEquals(newgrp.toString(), group.toString());
- assertGroupUpdateOnly(group);
+ assertNoGroupAction();
}
@Test
- public void testUpdateField_NowNull() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
+ public void testUpdateGroup_UpdatedSubGroup() throws Exception {
+ PdpGroups groups = loadPdpGroups("deployGroups.json");
PdpGroup newgrp = groups.getGroups().get(0);
PdpGroup group = new PdpGroup(newgrp);
when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
- newgrp.setDescription(null);
+ // something different in this subgroup
+ group.getPdpSubgroups().get(0).getPolicies().add(new ToscaPolicyIdentifier(POLICY2_NAME, POLICY2_VERSION));
- prov.createOrUpdateGroups(groups);
+ prov.updateGroupPolicies(toDeploymentGroups(groups));
assertEquals(newgrp.toString(), group.toString());
- assertGroupUpdateOnly(group);
+ assertGroupUpdate(group, group.getPdpSubgroups().get(0));
}
@Test
- public void testUpdateField_Changed() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
+ public void testUpdateSubGroup_Invalid() throws Exception {
+ PdpGroups groups = loadPdpGroups("deployGroups.json");
PdpGroup newgrp = groups.getGroups().get(0);
PdpGroup group = new PdpGroup(newgrp);
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
-
- newgrp.setDescription(group.getDescription() + "-changed");
-
- prov.createOrUpdateGroups(groups);
-
- assertEquals(newgrp.toString(), group.toString());
- assertGroupUpdateOnly(group);
- }
- /**
- * Tests addSubgroup() when the new subgroup has a wild-card policy type.
- *
- * @throws Exception if an error occurs
- */
- @Test
- public void testAddSubGroupWildCardPolicyType() throws Exception {
- when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("daoPolicyListWildCard.json"));
- when(dao.getPolicyTypeList("some.*", "2.3.4")).thenReturn(Collections.emptyList());
-
- PdpGroups groups = loadPdpGroups("createGroupsWildCard.json");
- PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
+ // group has no policies yet
+ group.getPdpSubgroups().get(0).getPolicies().clear();
when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
- prov.createOrUpdateGroups(groups);
-
- PdpGroup newgrp = groups.getGroups().get(0);
+ // unknown policy
+ when(dao.getFilteredPolicyList(any())).thenReturn(Collections.emptyList());
- PdpSubGroup newsub = newgrp.getPdpSubgroups().get(1);
- newsub.setCurrentInstanceCount(0);
- newsub.setPdpInstances(new ArrayList<>(0));
+ assertThatThrownBy(() -> prov.updateGroupPolicies(toDeploymentGroups(groups)))
+ .isInstanceOf(PfModelException.class)
+ .hasMessageContaining(newgrp.getPdpSubgroups().get(0).getPolicies().get(0).getName())
+ .hasMessageContaining("unknown policy");
- assertEquals(newgrp.toString(), group.toString());
+ assertNoGroupAction();
}
- /**
- * Tests addSubgroup() when the new subgroup has a wild-card policy type, but the
- * policy doesn't have a matching type.
- *
- * @throws PfModelException if an error occurs
- */
@Test
- public void testAddSubGroupWildCardPolicyTypeUnmatched() throws PfModelException {
- when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("daoPolicyListWildCardUnmatched.json"));
- when(dao.getPolicyTypeList("some.*", "2.3.4")).thenReturn(Collections.emptyList());
-
- PdpGroups groups = loadPdpGroups("createGroupsWildCard.json");
- PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
+ public void testUpdateSubGroup_Policies() throws Exception {
+ PdpGroups groups = loadPdpGroups("deployGroups.json");
+ PdpGroup newgrp = groups.getGroups().get(0);
- assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class);
- }
+ // add a second subgroup, which will be left unchanged
+ PdpSubGroup subgrp = newgrp.getPdpSubgroups().get(0);
+ PdpSubGroup subgrp2 = new PdpSubGroup(subgrp);
+ subgrp2.setPdpType(PDP2_TYPE);
+ newgrp.getPdpSubgroups().add(subgrp2);
- @Test
- public void testAddSubGroup_ValidationPolicyTypeNotFound() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroupsNewSub.json");
- PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
+ PdpGroup group = new PdpGroup(newgrp);
when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
- when(dao.getPolicyTypeList(any(), any())).thenReturn(Collections.emptyList());
-
- assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).hasMessageContaining("unknown policy type");
- }
-
- @Test
- public void testAddSubGroup_ValidationPolicyTypeDaoEx() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroupsNewSub.json");
- PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
+ // add two new policies
+ ToscaPolicyIdentifier policyId2 = new ToscaPolicyIdentifier(POLICY2_NAME, POLICY2_VERSION);
+ subgrp.getPolicies().add(policyId2);
- PfModelException exc = new PfModelException(Status.CONFLICT, EXPECTED_EXCEPTION);
- when(dao.getPolicyTypeList(any(), any())).thenThrow(exc);
+ ToscaPolicyIdentifier policyId3 = new ToscaPolicyIdentifier(POLICY3_NAME, POLICY3_VERSION);
+ subgrp.getPolicies().add(policyId3);
- assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isSameAs(exc);
- }
+ when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("createGroupNewPolicy.json"))
+ .thenReturn(loadPolicies("createGroupNewPolicy2.json"))
+ .thenReturn(loadPolicies("daoPolicyList.json"));
- @Test
- public void testAddSubGroup_ValidationPolicyNotFound() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroupsNewSubNotFound.json");
- PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
+ prov.updateGroupPolicies(toDeploymentGroups(groups));
- when(dao.getFilteredPolicyList(any())).thenReturn(Collections.emptyList());
+ Collections.sort(newgrp.getPdpSubgroups().get(0).getPolicies());
+ Collections.sort(group.getPdpSubgroups().get(0).getPolicies());
- assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).hasMessageContaining("unknown policy");
- }
+ assertEquals(newgrp.toString(), group.toString());
- @Test
- public void testAddSubGroup_ValidationPolicyDaoEx() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroupsNewSubNotFound.json");
- PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
+ // should have notified of added policy/PDPs
+ ArgumentCaptor<PolicyPdpNotificationData> captor = ArgumentCaptor.forClass(PolicyPdpNotificationData.class);
+ verify(notifier, times(2)).addDeploymentData(captor.capture());
+ assertDeploymentData(captor.getAllValues().get(0), policyId2, "[pdpA]");
+ assertDeploymentData(captor.getAllValues().get(1), policyId3, "[pdpA]");
- PfModelException exc = new PfModelException(Status.CONFLICT, EXPECTED_EXCEPTION);
- when(dao.getFilteredPolicyList(any())).thenThrow(exc);
+ // should NOT have notified of any deleted policy/PDPs
+ verify(notifier, never()).addUndeploymentData(any());
- assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isSameAs(exc);
+ // this requires a PDP UPDATE message
+ assertGroupUpdate(newgrp, subgrp);
}
@Test
- public void testUpdateSubGroup_Invalid() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
+ public void testUpdateSubGroup_PolicyVersionPrefix() throws Exception {
+ PdpGroups groups = loadPdpGroups("deployGroups.json");
PdpGroup newgrp = groups.getGroups().get(0);
+
PdpGroup group = new PdpGroup(newgrp);
when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
- // change properties
- newgrp.getPdpSubgroups().get(0).setProperties(new TreeMap<>());
-
- assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
- .hasMessageContaining("properties");
-
- assertNoGroupAction();
- }
+ // use version prefix
+ PdpSubGroup subgrp = newgrp.getPdpSubgroups().get(0);
+ ToscaPolicyIdentifier ident = subgrp.getPolicies().get(0);
+ String version = ident.getVersion();
+ ident.setVersion("1");
- @Test
- public void testUpdateSubGroup_SupportedPolicies() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- PdpGroup newgrp = groups.getGroups().get(0);
- PdpGroup group = new PdpGroup(newgrp);
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
+ prov.updateGroupPolicies(toDeploymentGroups(groups));
- newgrp.getPdpSubgroups().get(0).getSupportedPolicyTypes()
- .add(new ToscaPolicyTypeIdentifier("typeX.*", "9.8.7"));
+ // restore full type before comparing
+ ident.setVersion(version);
- prov.createOrUpdateGroups(groups);
+ Collections.sort(newgrp.getPdpSubgroups().get(0).getPolicies());
+ Collections.sort(group.getPdpSubgroups().get(0).getPolicies());
assertEquals(newgrp.toString(), group.toString());
- assertGroupUpdateOnly(group);
+
+ assertNoGroupAction();
}
@Test
- public void testUpdateSubGroup_DesiredCount() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
+ public void testUpdateSubGroup_PolicyVersionPrefixMismatch() throws Exception {
+ PdpGroups groups = loadPdpGroups("deployGroups.json");
PdpGroup newgrp = groups.getGroups().get(0);
+
PdpGroup group = new PdpGroup(newgrp);
when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
- newgrp.getPdpSubgroups().get(0).setDesiredInstanceCount(20);
+ // use incorrect version prefix
+ newgrp.getPdpSubgroups().get(0).getPolicies().get(0).setVersion("9");
- prov.createOrUpdateGroups(groups);
+ assertThatThrownBy(() -> prov.updateGroupPolicies(toDeploymentGroups(groups)))
+ .isInstanceOf(PfModelException.class)
+ .hasMessageContaining("different version already deployed");
- assertEquals(newgrp.toString(), group.toString());
- assertGroupUpdateOnly(group);
+ assertNoGroupAction();
}
@Test
- public void testUpdateSubGroup_Policies() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroupsDelPolicy.json");
- PdpGroup newgrp = groups.getGroups().get(0);
+ public void testUpdateSubGroup_Unchanged() throws Exception {
+ PdpGroups dbgroups = loadPdpGroups("deployGroups.json");
+ PdpGroup newgrp = dbgroups.getGroups().get(0);
PdpGroup group = new PdpGroup(newgrp);
when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
- PdpSubGroup subgrp = newgrp.getPdpSubgroups().get(0);
-
- // delete second policy
- subgrp.setPolicies(subgrp.getPolicies().subList(0, 1));
-
- // add new policy
- ToscaPolicyIdentifier policyId2 = new ToscaPolicyIdentifier(POLICY2_NAME, POLICY1_VERSION);
- subgrp.getPolicies().add(policyId2);
-
- when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("createGroupNewPolicy.json"))
- .thenReturn(loadPolicies("daoPolicyList.json"))
- .thenReturn(loadPolicies("daoPolicyListDelPolicy.json"))
- .thenReturn(loadPolicies("createGroupNewPolicy.json"));
-
- prov.createOrUpdateGroups(groups);
+ prov.updateGroupPolicies(toDeploymentGroups(dbgroups));
Collections.sort(newgrp.getPdpSubgroups().get(0).getPolicies());
Collections.sort(group.getPdpSubgroups().get(0).getPolicies());
assertEquals(newgrp.toString(), group.toString());
- // should have notified of added policy/PDPs
- ArgumentCaptor<PolicyPdpNotificationData> captor = ArgumentCaptor.forClass(PolicyPdpNotificationData.class);
- verify(notifier).addDeploymentData(captor.capture());
- assertDeploymentData(captor, policyId2, "[pdpA]");
-
- // should have notified of deleted policy/PDPs
- captor = ArgumentCaptor.forClass(PolicyPdpNotificationData.class);
- verify(notifier).addUndeploymentData(captor.capture());
- assertDeploymentData(captor, new ToscaPolicyIdentifier("ToBeDeleted", POLICY1_VERSION), "[pdpA]");
+ // no notifications
+ verify(notifier, never()).addDeploymentData(any());
+ verify(notifier, never()).addUndeploymentData(any());
- // this requires a PDP UPDATE message
- assertGroupUpdate(group, subgrp);
+ // no group updates
+ assertNoGroupAction();
}
@Test
- public void testUpdateSubGroup_Unchanged() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- PdpGroup newgrp = groups.getGroups().get(0);
- PdpGroup group = new PdpGroup(newgrp);
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
-
- prov.createOrUpdateGroups(groups);
+ public void testUpdateSubGroup_PolicyVersionMismatch() throws Exception {
+ PdpGroups dbgroups = loadPdpGroups("deployGroups.json");
+ PdpGroup newgrp = dbgroups.getGroups().get(0);
+ PdpGroup dbgroup = new PdpGroup(newgrp);
+ when(dao.getPdpGroups(dbgroup.getName())).thenReturn(Arrays.asList(dbgroup));
- Collections.sort(newgrp.getPdpSubgroups().get(0).getPolicies());
- Collections.sort(group.getPdpSubgroups().get(0).getPolicies());
+ // arrange for DB policy version to be different
+ PdpSubGroup dbsubgrp = dbgroup.getPdpSubgroups().get(0);
+ dbsubgrp.getPolicies().get(0).setVersion("9.9.9");
- assertEquals(newgrp.toString(), group.toString());
+ when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("daoPolicyList.json"));
- // no notifications
- verify(notifier, never()).addDeploymentData(any());
- verify(notifier, never()).addUndeploymentData(any());
+ assertThatThrownBy(() -> prov.updateGroupPolicies(toDeploymentGroups(dbgroups)))
+ .isInstanceOf(PfModelException.class)
+ .hasMessageContaining("different version already deployed");
- // no group updates
assertNoGroupAction();
}
@Test
- public void testValidateSubGroup_PropertiesMismatch() throws Exception {
- PdpGroups groups = loadPdpGroups("createGroups.json");
- PdpGroup newgrp = groups.getGroups().get(0);
- PdpGroup group = new PdpGroup(newgrp);
- when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
+ public void testUpdateSubGroup_UnsupportedType() throws Exception {
+ PdpGroups dbgroups = loadPdpGroups("deployGroups.json");
+ PdpGroup newgrp = dbgroups.getGroups().get(0);
+ PdpGroup dbgroup = new PdpGroup(newgrp);
+ when(dao.getPdpGroups(dbgroup.getName())).thenReturn(Arrays.asList(dbgroup));
+
+ final DeploymentGroups groups = toDeploymentGroups(dbgroups);
+
+ PdpSubGroup dbsubgrp = dbgroup.getPdpSubgroups().get(0);
+
+ // DB has no policies
+ dbsubgrp.getPolicies().clear();
- newgrp.setProperties(new TreeMap<>());
+ // DB has a different supported type
+ dbsubgrp.getSupportedPolicyTypes().get(0).setName("some-other-type");
- assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
- .hasMessageContaining("properties");
+ when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("daoPolicyList.json"));
+
+ assertThatThrownBy(() -> prov.updateGroupPolicies(groups))
+ .isInstanceOf(PfModelException.class)
+ .hasMessageContaining(newgrp.getPdpSubgroups().get(0).getPolicies().get(0).getName())
+ .hasMessageContaining("not a supported policy for the subgroup");
assertNoGroupAction();
}
@Test
public void testDeployPolicies() throws PfModelException {
- prov.deployPolicies(loadEmptyRequest());
+ assertThatCode(() -> prov.deployPolicies(loadEmptyRequest())).doesNotThrowAnyException();
}
/**
// should have notified of added policy/PDPs
ArgumentCaptor<PolicyPdpNotificationData> captor = ArgumentCaptor.forClass(PolicyPdpNotificationData.class);
verify(notifier).addDeploymentData(captor.capture());
- assertDeploymentData(captor, policy1.getIdentifier(), "[pdpB]");
+ assertDeploymentData(captor.getValue(), policy1.getIdentifier(), "[pdpB]");
// no undeployment notifications
verify(notifier, never()).addUndeploymentData(any());
@Test
public void testDeploySimplePolicies() throws Exception {
- prov.deployPolicies(loadEmptyRequest());
+ assertThatCode(() -> prov.deployPolicies(loadEmptyRequest())).doesNotThrowAnyException();
}
@Test
// should have notified of added policy/PDPs
ArgumentCaptor<PolicyPdpNotificationData> captor = ArgumentCaptor.forClass(PolicyPdpNotificationData.class);
verify(notifier).addDeploymentData(captor.capture());
- assertDeploymentData(captor, policy1.getIdentifier(), "[pdpB, pdpD]");
+ assertDeploymentData(captor.getValue(), policy1.getIdentifier(), "[pdpB, pdpD]");
// no undeployment notifications
verify(notifier, never()).addUndeploymentData(any());
assertEquals(Arrays.asList(group), updates);
}
- private void assertGroupUpdateOnly(PdpGroup group) throws Exception {
- verify(dao, never()).createPdpGroups(any());
- verify(reqmap, never()).addRequest(any(), any());
-
- List<PdpGroup> updates = getGroupUpdates();
- assertEquals(Arrays.asList(group), updates);
- }
-
- private void assertDeploymentData(ArgumentCaptor<PolicyPdpNotificationData> captor, ToscaPolicyIdentifier policyId,
+ private void assertDeploymentData(PolicyPdpNotificationData data, ToscaPolicyIdentifier policyId,
String expectedPdps) {
- PolicyPdpNotificationData data = captor.getValue();
assertEquals(policyId, data.getPolicyId());
assertEquals(policy1.getTypeIdentifier(), data.getPolicyType());
assertEquals(expectedPdps, new TreeSet<>(data.getPdps()).toString());
protected PdpDeployPolicies loadEmptyRequest() {
return loadRequest("emptyRequest.json");
}
+
+ private DeploymentGroups toDeploymentGroups(PdpGroups dbgroups) {
+ DeploymentGroups groups = new DeploymentGroups();
+
+ groups.setGroups(dbgroups.getGroups().stream().map(this::toDeploymentGroup).collect(Collectors.toList()));
+
+ return groups;
+ }
+
+ private DeploymentGroup toDeploymentGroup(PdpGroup dbgroup) {
+ DeploymentGroup group = new DeploymentGroup();
+
+ group.setName(dbgroup.getName());
+ group.setDeploymentSubgroups(dbgroup.getPdpSubgroups().stream().map(this::toDeploymentSubGroup)
+ .collect(Collectors.toList()));
+
+ return group;
+ }
+
+ private DeploymentSubGroup toDeploymentSubGroup(PdpSubGroup dbsubgrp) {
+ DeploymentSubGroup subgrp = new DeploymentSubGroup();
+
+ subgrp.setAction(Action.PATCH);
+ subgrp.setPdpType(dbsubgrp.getPdpType());
+ subgrp.setPolicies(new ArrayList<>(dbsubgrp.getPolicies()));
+
+ return subgrp;
+ }
}