Constraint validation - Policy Properties in a Service 13/132913/4
authorKrupaNagabhushan <krupa.nagabhushan@est.tech>
Wed, 11 Jan 2023 18:41:05 +0000 (18:41 +0000)
committerVasyl Razinkov <vasyl.razinkov@est.tech>
Mon, 16 Jan 2023 22:10:54 +0000 (22:10 +0000)
Issue-ID: SDC-4320
Signed-off-by: KrupaNagabhushan <krupa.nagabhushan@est.tech>
Change-Id: I5f04b630f89b96d7a662fbab8894961670502f52

catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogic.java
catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogicTest.java

index 3d97166..113f8ba 100644 (file)
@@ -41,11 +41,13 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
+import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.components.property.PropertyDeclarationOrchestrator;
 import org.openecomp.sdc.be.components.validation.PolicyUtils;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
+import org.openecomp.sdc.be.datamodel.utils.PropertyValueConstraintValidationUtil;
 import org.openecomp.sdc.be.datatypes.elements.GetPolicyValueDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.PolicyTargetType;
@@ -60,6 +62,7 @@ import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.ComponentParametersView;
 import org.openecomp.sdc.be.model.PolicyDefinition;
 import org.openecomp.sdc.be.model.PolicyTypeDefinition;
+import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
@@ -690,10 +693,26 @@ public class PolicyBusinessLogic extends BaseBusinessLogic {
             final PropertyDataDefinition currentProperty = oldProperties.get(newProperty.getName());
             currentProperty.setValue(newPropertyValueEither);
             currentProperty.setToscaFunction(newProperty.getToscaFunction());
+            validatePropertyValueWithConstraints(currentProperty, policyOwnerComponent);
         }
         return policy;
     }
 
+    private void validatePropertyValueWithConstraints(final PropertyDataDefinition property, final Component component) {
+        PropertyDefinition propertyDefinition = new PropertyDefinition(property);
+        if (!propertyDefinition.isToscaFunction()) {
+            List<PropertyDefinition> propertyDefinitionList = new ArrayList<>();
+            propertyDefinitionList.add(propertyDefinition);
+            PropertyValueConstraintValidationUtil propertyValueConstraintValidationUtil = new PropertyValueConstraintValidationUtil();
+            Either<Boolean, ResponseFormat> isPropertyContraintsValid = propertyValueConstraintValidationUtil
+                .validatePropertyConstraints(propertyDefinitionList, applicationDataTypeCache,
+                    component.getModel());
+            if (isPropertyContraintsValid.isRight()) {
+                throw new ByResponseFormatComponentException(isPropertyContraintsValid.right().value());
+            }
+        }
+    }
+
     private <T extends PropertyDataDefinition> String updatePropertyValue(final Component policyOwnerComponent, final T property) {
         Either<Object, Boolean> isValid = propertyOperation
             .validateAndUpdatePropertyValue(policyOwnerComponent, property,
index f54a70d..d0a91e3 100644 (file)
@@ -69,6 +69,7 @@ import org.openecomp.sdc.be.model.ComponentInstInputsMap;
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.ComponentInstancePropInput;
 import org.openecomp.sdc.be.model.ComponentParametersView;
+import org.openecomp.sdc.be.model.DataTypeDefinition;
 import org.openecomp.sdc.be.model.GroupDefinition;
 import org.openecomp.sdc.be.model.LifecycleStateEnum;
 import org.openecomp.sdc.be.model.PolicyDefinition;
@@ -234,6 +235,10 @@ class PolicyBusinessLogicTest {
         policy.setProperties(Arrays.asList(properties));
         policies.put(POLICY_NAME, policy);
 
+        Map<String, DataTypeDefinition> types = new HashMap<>();
+        DataTypeDefinition dataTypeDef = new DataTypeDefinition();
+        types.put("string", dataTypeDef);
+
         List<ComponentInstance> instanceList = new ArrayList<>();
         ComponentInstance componentInstance = new ComponentInstance();
         componentInstance.setUniqueId(UNIQUE_ID_EXSISTS);
@@ -251,6 +256,7 @@ class PolicyBusinessLogicTest {
             Either.left(policy));
         when(propertyOperation.validateAndUpdatePropertyValue(eq(newResource), eq(properties[0]), anyMap())).thenReturn(Either.left(prop1));
         when(propertyOperation.validateAndUpdatePropertyValue(eq(newResource), eq(properties[1]), anyMap())).thenReturn(Either.left(prop2));
+        when(applicationDataTypeCache.getAll(any())).thenReturn(Either.left(types));
 
         Map<String, PolicyDefinition> createdPolicy = businessLogic.createPolicies(newResource, policies);
 
@@ -276,6 +282,10 @@ class PolicyBusinessLogicTest {
         policy.setProperties(Arrays.asList(properties));
         policies.put(POLICY_NAME, policy);
 
+        Map<String, DataTypeDefinition> types = new HashMap<>();
+        DataTypeDefinition dataTypeDef = new DataTypeDefinition();
+        types.put("string", dataTypeDef);
+
         List<ComponentInstance> instanceList = new ArrayList<>();
         ComponentInstance componentInstance = new ComponentInstance();
         componentInstance.setUniqueId(UNIQUE_ID_EXSISTS);
@@ -293,6 +303,7 @@ class PolicyBusinessLogicTest {
             Either.left(policy));
         when(propertyOperation.validateAndUpdatePropertyValue(eq(newService), eq(properties[0]), anyMap())).thenReturn(Either.left(prop1));
         when(propertyOperation.validateAndUpdatePropertyValue(eq(newService), eq(properties[1]), anyMap())).thenReturn(Either.left(prop2));
+        when(applicationDataTypeCache.getAll(any())).thenReturn(Either.left(types));
 
         Map<String, PolicyDefinition> createdPolicy = businessLogic.createPolicies(newService, policies);
 
@@ -408,12 +419,17 @@ class PolicyBusinessLogicTest {
         String prop1 = "Name";
         String prop2 = "Type";
 
+        Map<String, DataTypeDefinition> types = new HashMap<>();
+        DataTypeDefinition dataTypeDef = new DataTypeDefinition();
+        types.put("string", dataTypeDef);
+
         when(toscaOperationFacade.updatePolicyOfComponent(eq(COMPONENT_ID), any(PolicyDefinition.class), any(PromoteVersionEnum.class))).thenReturn(
             policySuccessEither);
         stubUnlockAndCommit();
         PropertyDataDefinition[] properties = getProperties(prop1, prop2);
         when(propertyOperation.validateAndUpdatePropertyValue(any(Resource.class), eq(properties[0]), anyMap())).thenReturn(Either.left(prop1));
         when(propertyOperation.validateAndUpdatePropertyValue(any(Resource.class), eq(properties[1]), anyMap())).thenReturn(Either.left(prop2));
+        when(applicationDataTypeCache.getAll(any())).thenReturn(Either.left(types));
         policy.setProperties(Arrays.asList(properties));
         List<PropertyDataDefinition> updatedProperties =
             businessLogic.updatePolicyProperties(ComponentTypeEnum.RESOURCE, COMPONENT_ID, POLICY_ID, properties, USER_ID, true);
@@ -554,9 +570,11 @@ class PolicyBusinessLogicTest {
         PropertyDataDefinition property1 = new PropertyDataDefinition();
         property1.setName(prop1);
         property1.setValue(prop1);
+        property1.setType("string");
         PropertyDataDefinition property2 = new PropertyDataDefinition();
         property2.setName(prop2);
         property2.setValue(prop2);
+        property2.setType("string");
         return new PropertyDataDefinition[]{property1, property2};
     }