1 package org.openecomp.sdc.be.components.validation;
4 import org.apache.commons.collections.MapUtils;
5 import org.apache.commons.lang3.StringUtils;
6 import org.openecomp.sdc.be.config.ConfigurationManager;
7 import org.openecomp.sdc.be.dao.api.ActionStatus;
8 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
9 import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
10 import org.openecomp.sdc.be.model.Component;
11 import org.openecomp.sdc.be.model.PolicyDefinition;
12 import org.openecomp.sdc.be.model.Resource;
13 import org.openecomp.sdc.common.api.Constants;
14 import org.openecomp.sdc.common.util.ValidationUtils;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
18 import java.util.Collections;
20 import java.util.Optional;
24 * Provides specific functionality for policy
26 public class PolicyUtils {
28 private static final Logger log = LoggerFactory.getLogger(PolicyUtils.class);
30 private PolicyUtils() {
31 // No instances allowed
35 * Calculates the next integer counter according to the found max counter existing in the provided policies map
37 * @param policies the map of the policies
38 * @return the integer counter
40 public static int getNextPolicyCounter(Map<String, PolicyDefinition> policies) {
42 if (MapUtils.isNotEmpty(policies)) {
43 int nextCounterFromIds = policies.values()
45 .map(p -> extractNextPolicyCounterFromUniqueId(p.getUniqueId()))
46 .max(Integer::compareTo)
48 int nextCounterFromNames = policies.values()
50 .map(p -> extractNextPolicyCounterFromName(p.getName()))
51 .max(Integer::compareTo)
53 nextCounter = nextCounterFromIds > nextCounterFromNames ? nextCounterFromIds : nextCounterFromNames;
59 * Validates policy fields on policy update. Updates mutable fields
61 * @param recievedPolicy the policy parsed from the HTTP request
62 * @param validPolicy the copy of the existing policy found on the component
63 * @param policies all the polices related to the component
64 * @return validated and updated policy or an error as action status
66 public static Either<PolicyDefinition, ActionStatus> validatePolicyFields(PolicyDefinition recievedPolicy, PolicyDefinition validPolicy, Map<String, PolicyDefinition> policies) {
67 validateImmutablePolicyFields(recievedPolicy, validPolicy);
68 return validateUpdateMutablePolicyFields(recievedPolicy, validPolicy, policies);
72 * Retrieves the set of the excluded policy types for the specified component
74 * @param the component
75 * @return the set of the policies
77 public static Set<String> getExcludedPolicyTypesByComponent(Component component) {
78 if (MapUtils.isEmpty(ConfigurationManager.getConfigurationManager()
80 .getExcludedPolicyTypesMapping())) {
81 return Collections.emptySet();
83 if (component.getComponentType() == ComponentTypeEnum.SERVICE) {
84 return ConfigurationManager.getConfigurationManager()
86 .getExcludedPolicyTypesMapping()
87 .get(component.getComponentType().name());
89 return ConfigurationManager.getConfigurationManager()
91 .getExcludedPolicyTypesMapping()
92 .get(((Resource) component).getResourceType().getValue());
95 private static int extractNextPolicyCounterFromUniqueId(String uniqueId) {
97 if (StringUtils.isNotEmpty(uniqueId)) {
98 counter = extractNextPolicyCounter(uniqueId, uniqueId.lastIndexOf(Constants.POLICY_UID_POSTFIX));
103 private static int extractNextPolicyCounterFromName(String policyName) {
105 if (StringUtils.isNotEmpty(policyName)) {
106 counter = extractNextPolicyCounter(policyName, policyName.length());
111 private static int extractNextPolicyCounter(String policyName, int endIndex) {
114 counter = Integer.valueOf(policyName.substring(policyName.lastIndexOf(Constants.GROUP_POLICY_NAME_DELIMETER) + Constants.GROUP_POLICY_NAME_DELIMETER
115 .length(), endIndex)) + 1;
117 catch (NumberFormatException | IndexOutOfBoundsException e) {
118 log.error("The exception {} occurred upon extraction counter from the srting value {}. ", e, policyName);
123 private static Either<PolicyDefinition, ActionStatus> validateUpdateMutablePolicyFields(PolicyDefinition recievedPolicy, PolicyDefinition validPolicy, Map<String, PolicyDefinition> policies) {
124 return validateUpdatePolicyName(recievedPolicy, validPolicy, policies);
127 private static void validateImmutablePolicyFields(PolicyDefinition receivedPolicy, PolicyDefinition validPolicy) {
128 boolean isUpdatedField = isUpdatedField(receivedPolicy.getUniqueId(), validPolicy.getUniqueId());
129 if (isUpdatedField) {
130 logImmutableFieldUpdateWarning(receivedPolicy.getUniqueId(), validPolicy.getUniqueId(), JsonPresentationFields.UNIQUE_ID);
132 isUpdatedField = isUpdatedField(receivedPolicy.getComponentName(), validPolicy.getComponentName());
133 if (isUpdatedField) {
134 logImmutableFieldUpdateWarning(receivedPolicy.getComponentName(), validPolicy.getComponentName(), JsonPresentationFields.CI_COMPONENT_NAME);
136 isUpdatedField = isUpdatedField(receivedPolicy.getDerivedFrom(), validPolicy.getDerivedFrom());
137 if (isUpdatedField) {
138 logImmutableFieldUpdateWarning(receivedPolicy.getDerivedFrom(), validPolicy.getDerivedFrom(), JsonPresentationFields.DERIVED_FROM);
140 isUpdatedField = isUpdatedField(receivedPolicy.getDescription(), validPolicy.getDescription());
141 if (isUpdatedField) {
142 logImmutableFieldUpdateWarning(receivedPolicy.getDescription(), validPolicy.getDescription(), JsonPresentationFields.DESCRIPTION);
144 isUpdatedField = isUpdatedField(receivedPolicy.getInvariantName(), validPolicy.getInvariantName());
145 if (isUpdatedField) {
146 logImmutableFieldUpdateWarning(receivedPolicy.getInvariantName(), validPolicy.getInvariantName(), JsonPresentationFields.CI_INVARIANT_NAME);
148 isUpdatedField = isUpdatedField(receivedPolicy.getInvariantUUID(), validPolicy.getInvariantUUID());
149 if (isUpdatedField) {
150 logImmutableFieldUpdateWarning(receivedPolicy.getInvariantUUID(), validPolicy.getInvariantUUID(), JsonPresentationFields.INVARIANT_UUID);
152 isUpdatedField = isUpdatedField(receivedPolicy.getPolicyTypeName(), validPolicy.getPolicyTypeName());
153 if (isUpdatedField) {
154 logImmutableFieldUpdateWarning(receivedPolicy.getPolicyTypeName(), validPolicy.getPolicyTypeName(), JsonPresentationFields.TYPE);
156 isUpdatedField = isUpdatedField(receivedPolicy.getPolicyTypeUid(), validPolicy.getPolicyTypeUid());
157 if (isUpdatedField) {
158 logImmutableFieldUpdateWarning(receivedPolicy.getPolicyTypeUid(), validPolicy.getPolicyTypeUid(), JsonPresentationFields.TYPE_UNIQUE_ID);
160 isUpdatedField = isUpdatedField(receivedPolicy.getPolicyUUID(), validPolicy.getPolicyUUID());
161 if (isUpdatedField) {
162 logImmutableFieldUpdateWarning(receivedPolicy.getPolicyUUID(), validPolicy.getPolicyUUID(), JsonPresentationFields.UUID);
164 isUpdatedField = isUpdatedField(receivedPolicy.getVersion(), validPolicy.getVersion());
165 if (isUpdatedField) {
166 logImmutableFieldUpdateWarning(receivedPolicy.getVersion(), validPolicy.getVersion(), JsonPresentationFields.VERSION);
168 isUpdatedField = isUpdatedField(receivedPolicy.getIsFromCsar().toString(), validPolicy.getIsFromCsar()
170 if (isUpdatedField) {
171 logImmutableFieldUpdateWarning(receivedPolicy.getIsFromCsar().toString(), validPolicy.getIsFromCsar()
172 .toString(), JsonPresentationFields.IS_FROM_CSAR);
176 private static boolean isUpdatedField(String oldField, String newField) {
177 boolean isUpdatedField = false;
178 if (StringUtils.isEmpty(oldField) && StringUtils.isNotEmpty(newField)) {
179 isUpdatedField = true;
181 if (StringUtils.isNotEmpty(oldField) && StringUtils.isNotEmpty(newField) && !oldField.equals(newField)) {
182 isUpdatedField = true;
184 return isUpdatedField;
187 private static void logImmutableFieldUpdateWarning(String oldValue, String newValue, JsonPresentationFields field) {
188 log.warn("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);
191 private static Either<PolicyDefinition, ActionStatus> validateUpdatePolicyName(PolicyDefinition receivedPolicy, PolicyDefinition validPolicy, Map<String, PolicyDefinition> policies) {
192 Either<PolicyDefinition, ActionStatus> result = null;
193 Optional<PolicyDefinition> sameNamePolicy = Optional.empty();
194 if (StringUtils.isEmpty(receivedPolicy.getName()) || !ValidationUtils.POLICY_NAME_PATTERN.matcher(receivedPolicy
195 .getName()).matches()) {
196 log.error("Failed to validate the name {} of the policy {}. ", receivedPolicy.getName(), receivedPolicy.getUniqueId());
197 result = Either.right(ActionStatus.INVALID_POLICY_NAME);
199 if (result == null && MapUtils.isNotEmpty(policies)) {
200 sameNamePolicy = policies.values()
202 .filter(p -> p.getName().equals(receivedPolicy.getName()))
205 if (sameNamePolicy.isPresent()) {
206 log.error("Failed to validate the name {} of the policy {}. The policy {} with the same name already exists. ", receivedPolicy
207 .getName(), receivedPolicy.getUniqueId(), sameNamePolicy.get().getUniqueId());
208 result = Either.right(ActionStatus.POLICY_NAME_ALREADY_EXIST);
210 if (result == null) {
211 validPolicy.setName(receivedPolicy.getName());
212 result = Either.left(validPolicy);