1 package org.openecomp.sdc.be.components.validation;
4 import org.openecomp.sdc.be.config.ConfigurationManager;
5 import org.openecomp.sdc.be.dao.api.ActionStatus;
6 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
7 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
8 import org.openecomp.sdc.be.model.Component;
9 import org.openecomp.sdc.be.model.PolicyDefinition;
10 import org.openecomp.sdc.be.model.Resource;
11 import org.openecomp.sdc.common.api.Constants;
12 import org.openecomp.sdc.common.log.wrappers.Logger;
13 import org.openecomp.sdc.common.util.ValidationUtils;
15 import java.util.Collections;
17 import java.util.Optional;
20 import static org.apache.commons.collections.MapUtils.isEmpty;
21 import static org.apache.commons.collections.MapUtils.isNotEmpty;
22 import static org.apache.commons.lang3.StringUtils.isEmpty;
23 import static org.apache.commons.lang3.StringUtils.isNotEmpty;
24 import static org.openecomp.sdc.common.api.Constants.GROUP_POLICY_NAME_DELIMETER;
27 * Provides specific functionality for policy
29 public class PolicyUtils {
31 private static final Logger log = Logger.getLogger(PolicyUtils.class);
33 private PolicyUtils() {
34 // No instances allowed
38 * Calculates the next integer counter according to the found max counter existing in the provided policies map
40 * @param policies the map of the policies
41 * @return the integer counter
43 public static int getNextPolicyCounter(Map<String, PolicyDefinition> policies) {
45 if (isNotEmpty(policies)) {
46 int nextCounterFromIds = policies.values()
48 .map(p -> extractNextPolicyCounterFromUniqueId(p.getUniqueId()))
49 .max(Integer::compareTo)
51 int nextCounterFromNames = policies.values()
53 .map(p -> extractNextPolicyCounterFromName(p.getName()))
54 .max(Integer::compareTo)
56 nextCounter = nextCounterFromIds > nextCounterFromNames ? nextCounterFromIds : nextCounterFromNames;
62 * Validates policy fields on policy update. Updates mutable fields
64 * @param recievedPolicy the policy parsed from the HTTP request
65 * @param validPolicy the copy of the existing policy found on the component
66 * @param policies all the polices related to the component
67 * @return validated and updated policy or an error as action status
69 public static Either<PolicyDefinition, ActionStatus> validatePolicyFields(PolicyDefinition recievedPolicy, PolicyDefinition validPolicy, Map<String, PolicyDefinition> policies) {
70 validateImmutablePolicyFields(recievedPolicy, validPolicy);
71 return validateUpdateMutablePolicyFields(recievedPolicy, validPolicy, policies);
75 * Retrieves the set of the excluded policy types for the specified component
77 * @return the set of the policies
79 public static Set<String> getExcludedPolicyTypesByComponent(Component component) {
80 if (isEmpty(ConfigurationManager.getConfigurationManager()
82 .getExcludedPolicyTypesMapping())) {
83 return Collections.emptySet();
85 if (component.getComponentType() == ComponentTypeEnum.SERVICE) {
86 return ConfigurationManager.getConfigurationManager()
88 .getExcludedPolicyTypesMapping()
89 .get(component.getComponentType().name());
91 return ConfigurationManager.getConfigurationManager()
93 .getExcludedPolicyTypesMapping()
94 .get(((Resource) component).getResourceType().getValue());
97 private static int extractNextPolicyCounterFromUniqueId(String uniqueId) {
99 if (isNotEmpty(uniqueId)) {
100 counter = extractNextPolicyCounter(uniqueId, uniqueId.lastIndexOf(Constants.POLICY_UID_POSTFIX));
105 private static int extractNextPolicyCounterFromName(String policyName) {
107 if (isNotEmpty(policyName)) {
108 counter = extractNextPolicyCounter(policyName, policyName.length());
113 private static int extractNextPolicyCounter(String policyName, int endIndex) {
116 int beginIndex = policyName.lastIndexOf(GROUP_POLICY_NAME_DELIMETER) + GROUP_POLICY_NAME_DELIMETER.length();
117 String counterStr = policyName.substring(beginIndex, endIndex);
118 counter = Integer.valueOf(counterStr) + 1;
120 catch (NumberFormatException | IndexOutOfBoundsException e) {
121 log.error("#extractNextPolicyCounter - An error occurred when attempting to extract counter from policy name [{}]. ", policyName, e);
126 private static Either<PolicyDefinition, ActionStatus> validateUpdateMutablePolicyFields(PolicyDefinition recievedPolicy, PolicyDefinition validPolicy, Map<String, PolicyDefinition> policies) {
127 return validateUpdatePolicyName(recievedPolicy, validPolicy, policies);
130 private static void validateImmutablePolicyFields(PolicyDefinition receivedPolicy, PolicyDefinition validPolicy) {
131 logImmutableFieldUpdateWarning(receivedPolicy.getUniqueId(), validPolicy.getUniqueId(), JsonPresentationFields.UNIQUE_ID);
132 logImmutableFieldUpdateWarning(receivedPolicy.getComponentName(), validPolicy.getComponentName(), JsonPresentationFields.CI_COMPONENT_NAME);
133 logImmutableFieldUpdateWarning(receivedPolicy.getDerivedFrom(), validPolicy.getDerivedFrom(), JsonPresentationFields.DERIVED_FROM);
134 logImmutableFieldUpdateWarning(receivedPolicy.getDescription(), validPolicy.getDescription(), JsonPresentationFields.DESCRIPTION);
135 logImmutableFieldUpdateWarning(receivedPolicy.getInvariantName(), validPolicy.getInvariantName(), JsonPresentationFields.CI_INVARIANT_NAME);
136 logImmutableFieldUpdateWarning(receivedPolicy.getInvariantUUID(), validPolicy.getInvariantUUID(), JsonPresentationFields.INVARIANT_UUID);
137 logImmutableFieldUpdateWarning(receivedPolicy.getPolicyTypeName(), validPolicy.getPolicyTypeName(), JsonPresentationFields.TYPE);
138 logImmutableFieldUpdateWarning(receivedPolicy.getPolicyTypeUid(), validPolicy.getPolicyTypeUid(), JsonPresentationFields.TYPE_UNIQUE_ID);
139 logImmutableFieldUpdateWarning(receivedPolicy.getPolicyUUID(), validPolicy.getPolicyUUID(), JsonPresentationFields.UUID);
140 logImmutableFieldUpdateWarning(receivedPolicy.getVersion(), validPolicy.getVersion(), JsonPresentationFields.VERSION);
141 logImmutableFieldUpdateWarning(receivedPolicy.getIsFromCsar().toString(), validPolicy.getIsFromCsar().toString(), JsonPresentationFields.IS_FROM_CSAR);
144 private static boolean isUpdatedField(String oldField, String newField) {
145 boolean isUpdatedField = false;
146 if (isEmpty(oldField) && isNotEmpty(newField)) {
147 isUpdatedField = true;
149 else if (isNotEmpty(oldField) && isNotEmpty(newField) && !oldField.equals(newField)) {
150 isUpdatedField = true;
152 return isUpdatedField;
155 private static void logImmutableFieldUpdateWarning(String oldValue, String newValue, JsonPresentationFields field) {
156 if (isUpdatedField(oldValue, newValue)) {
157 log.warn("#logImmutableFieldUpdateWarning - Update of the field {} of a policy not allowed. The change will be ignored. The old value is {} , the new value is {}. ", field, oldValue, newValue);
161 private static Either<PolicyDefinition, ActionStatus> validateUpdatePolicyName(PolicyDefinition receivedPolicy, PolicyDefinition validPolicy, Map<String, PolicyDefinition> policies) {
162 Either<PolicyDefinition, ActionStatus> result = null;
163 Optional<PolicyDefinition> sameNamePolicy = Optional.empty();
164 if (isEmpty(receivedPolicy.getName()) || !ValidationUtils.POLICY_NAME_PATTERN.matcher(receivedPolicy
165 .getName()).matches()) {
166 log.error("#validateUpdatePolicyName - Failed to validate the name {} of the policy {}. ", receivedPolicy.getName(), receivedPolicy.getUniqueId());
167 result = Either.right(ActionStatus.INVALID_POLICY_NAME);
169 if (result == null && isNotEmpty(policies)) {
170 sameNamePolicy = policies.values()
172 .filter(p -> p.getName().equals(receivedPolicy.getName()))
175 if (sameNamePolicy.isPresent()) {
176 log.error("#validateUpdatePolicyName - Failed to validate the name {} of the policy {}. The policy {} with the same name already exists. ", receivedPolicy
177 .getName(), receivedPolicy.getUniqueId(), sameNamePolicy.get().getUniqueId());
178 result = Either.right(ActionStatus.POLICY_NAME_ALREADY_EXIST);
180 if (result == null) {
181 validPolicy.setName(receivedPolicy.getName());
182 result = Either.left(validPolicy);