diff options
author | Jim Hahn <jrh3@att.com> | 2019-12-06 10:22:48 -0500 |
---|---|---|
committer | Jim Hahn <jrh3@att.com> | 2019-12-06 17:09:17 -0500 |
commit | 9780a369f50d5e1cad9e5a013c4cb353fa09f01d (patch) | |
tree | 9a83b1ceefb71fbcd15dd00713a6827f85578094 /models-pdp/src/main | |
parent | db85df62efbf70597d9f7e965f68b77f4ddc1f1f (diff) |
Add models to support deltas to policy deployments
Change-Id: Ia5134e2ba4faeefe8bcc1333abe6acc57972c243
Issue-ID: POLICY-2274
Signed-off-by: Jim Hahn <jrh3@att.com>
Diffstat (limited to 'models-pdp/src/main')
3 files changed, 271 insertions, 0 deletions
diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/DeploymentGroup.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/DeploymentGroup.java new file mode 100644 index 000000000..d98f6ed30 --- /dev/null +++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/DeploymentGroup.java @@ -0,0 +1,116 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 AT&T Intellectual Property. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.models.pdp.concepts; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; +import org.onap.policy.common.parameters.BeanValidationResult; +import org.onap.policy.common.parameters.ObjectValidationResult; +import org.onap.policy.common.parameters.ValidationResult; +import org.onap.policy.common.parameters.ValidationStatus; +import org.onap.policy.models.base.PfUtils; +import org.onap.policy.models.pdp.concepts.DeploymentSubGroup.Action; + +/** + * Batch modification of a deployment group, which groups multiple DeploymentSubGroup + * entities together for a particular domain. + */ +@Data +@NoArgsConstructor +public class DeploymentGroup { + private static final String SUBGROUP_FIELD = "deploymentSubgroups"; + + private String name; + private List<DeploymentSubGroup> deploymentSubgroups; + + /** + * Constructs the object, making a deep copy from the source. + * + * @param source source from which to copy fields + */ + public DeploymentGroup(@NonNull DeploymentGroup source) { + this.name = source.name; + this.deploymentSubgroups = + PfUtils.mapList(source.deploymentSubgroups, DeploymentSubGroup::new, new ArrayList<>(0)); + } + + /** + * Validates that appropriate fields are populated for an incoming call to the PAP + * REST API. + * + * @return the validation result + */ + public ValidationResult validatePapRest() { + BeanValidationResult result = new BeanValidationResult("group", this); + + result.validateNotNull("name", name); + result.validateNotNullList(SUBGROUP_FIELD, deploymentSubgroups, DeploymentSubGroup::validatePapRest); + + if (deploymentSubgroups != null && deploymentSubgroups.isEmpty()) { + result.addResult(new ObjectValidationResult(SUBGROUP_FIELD, deploymentSubgroups, ValidationStatus.INVALID, + "is empty")); + } + + checkDuplicateSubgroups(result); + + return result; + } + + /** + * Checks for duplicate subgroups. + * + * @param result where to place validation results + */ + private void checkDuplicateSubgroups(BeanValidationResult result) { + if (deploymentSubgroups == null || !result.isValid()) { + return; + } + + /* + * Verify that if a subgroup appears more than once, then the second appearance is + * not a PATCH, as that would overwrite anything that has appeared before. + */ + Map<String, Action> pdpType2action = new HashMap<>(); + + for (DeploymentSubGroup subgrp : deploymentSubgroups) { + Action action = subgrp.getAction(); + + pdpType2action.compute(subgrp.getPdpType(), (pdpType, curact) -> { + + if (curact != null && action == Action.PATCH) { + BeanValidationResult subResult = new BeanValidationResult(pdpType, pdpType); + subResult.addResult(new ObjectValidationResult("action", action, ValidationStatus.INVALID, + "incompatible with previous action: " + curact)); + BeanValidationResult subResult2 = new BeanValidationResult(SUBGROUP_FIELD, subgrp); + subResult2.addResult(subResult); + result.addResult(subResult2); + } + + return action; + }); + } + } +} diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/DeploymentGroups.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/DeploymentGroups.java new file mode 100644 index 000000000..0d810d210 --- /dev/null +++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/DeploymentGroups.java @@ -0,0 +1,73 @@ +/* + * ============LICENSE_START======================================================= + * ONAP Policy Models + * ================================================================================ + * Copyright (C) 2019 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.models.pdp.concepts; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.onap.policy.common.parameters.BeanValidationResult; +import org.onap.policy.common.parameters.ObjectValidationResult; +import org.onap.policy.common.parameters.ValidationResult; +import org.onap.policy.common.parameters.ValidationStatus; + +/** + * Batch modification of a deployment groups via the PDP Group deployment REST API. + */ +@Getter +@Setter +@ToString +public class DeploymentGroups { + private static final String GROUPS_FIELD = "groups"; + + private List<DeploymentGroup> groups; + + /** + * Validates that appropriate fields are populated for an incoming call to the PAP + * REST API. + * + * @return the validation result + */ + public ValidationResult validatePapRest() { + BeanValidationResult result = new BeanValidationResult(GROUPS_FIELD, this); + + result.validateNotNullList(GROUPS_FIELD, groups, DeploymentGroup::validatePapRest); + if (!result.isValid()) { + return result; + } + + // verify that the same group doesn't appear more than once + Set<String> sawGroup = new HashSet<>(); + for (DeploymentGroup group : groups) { + String name = group.getName(); + if (sawGroup.contains(name)) { + return new ObjectValidationResult(GROUPS_FIELD, name, ValidationStatus.INVALID, "duplicate group name"); + + } else { + sawGroup.add(name); + } + } + + return result; + } +} diff --git a/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/DeploymentSubGroup.java b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/DeploymentSubGroup.java new file mode 100644 index 000000000..1a1fe228d --- /dev/null +++ b/models-pdp/src/main/java/org/onap/policy/models/pdp/concepts/DeploymentSubGroup.java @@ -0,0 +1,82 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.models.pdp.concepts; + +import java.util.ArrayList; +import java.util.List; +import lombok.Data; +import lombok.NonNull; +import org.onap.policy.common.parameters.BeanValidationResult; +import org.onap.policy.common.parameters.ValidationResult; +import org.onap.policy.models.base.PfUtils; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier; + +/** + * A deployment (i.e., set of policies) for all PDPs of the same pdp type running within a + * particular domain. + */ +@Data +public class DeploymentSubGroup { + + public enum Action { + POST, // all listed policies are to be added + DELETE, // all listed policies are to be deleted + PATCH // update the deployment so that the policies match exactly + } + + private String pdpType; + private Action action; + private List<ToscaPolicyIdentifier> policies; + + /** + * Constructs the object. + */ + public DeploymentSubGroup() { + super(); + } + + /** + * Constructs the object, making a deep copy from the source. + * + * @param source source from which to copy fields + */ + public DeploymentSubGroup(@NonNull final DeploymentSubGroup source) { + this.pdpType = source.pdpType; + this.action = source.action; + this.policies = PfUtils.mapList(source.policies, ToscaPolicyIdentifier::new, new ArrayList<>(0)); + } + + /** + * Validates that appropriate fields are populated for an incoming call to the PAP + * REST API. + * + * @return the validation result + */ + public ValidationResult validatePapRest() { + BeanValidationResult result = new BeanValidationResult("group", this); + + result.validateNotNull("pdpType", pdpType); + result.validateNotNull("action", action); + result.validateNotNullList("policies", policies, ToscaPolicyIdentifier::validatePapRest); + + return result; + } +} |