Support Policies during Import Service
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / PolicyBusinessLogic.java
index f8aab3d..2f01ef3 100644 (file)
@@ -46,6 +46,7 @@ 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.datatypes.elements.GetPolicyValueDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.PolicyTargetType;
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
@@ -125,33 +126,32 @@ public class PolicyBusinessLogic extends BaseBusinessLogic {
         }
     }
 
-    public Map<String, PolicyDefinition> createPoliciesFromParsedCsar(Component component,
-                                                                      final Map<String, PolicyDefinition> incomingPolicyDefinitions) {
+    public Map<String, PolicyDefinition> createPolicies(final Component component,
+                                                        final Map<String, PolicyDefinition> incomingPolicyDefinitions) {
         if (MapUtils.isEmpty(incomingPolicyDefinitions)) {
             return Collections.emptyMap();
         }
-        Map<String, PolicyDefinition> createdPolicies = new HashMap<>();
-        for (Map.Entry<String, PolicyDefinition> policyEntry : incomingPolicyDefinitions.entrySet()) {
-            PolicyDefinition incomingPolicyDefinition = policyEntry.getValue();
-            String policyName = incomingPolicyDefinition.getName();
+        final Map<String, PolicyDefinition> createdPolicies = new HashMap<>();
+        for (final PolicyDefinition incomingPolicyDefinition : incomingPolicyDefinitions.values()) {
+            final String policyName = incomingPolicyDefinition.getName();
             log.trace("Going to create policy {}", incomingPolicyDefinition);
             loggerSupportability
                 .log(LoggerSupportabilityActions.CREATE_GROUP_POLICY, component.getComponentMetadataForSupportLog(), StatusCode.STARTED,
                     "Start to create policy: {} for component {}", policyName, component.getName());
-            String policyType = incomingPolicyDefinition.getType();
+            final String policyType = incomingPolicyDefinition.getType();
             if (StringUtils.isEmpty(policyType)) {
                 log.debug("Policy type '{}' for policy '{}' not found.", policyType, policyName);
                 throw new ByActionStatusComponentException(ActionStatus.POLICY_MISSING_POLICY_TYPE, policyName);
             }
             // create policyDefinition
-            String policyTypeName = incomingPolicyDefinition.getPolicyTypeName();
+            final String policyTypeName = incomingPolicyDefinition.getPolicyTypeName();
             PolicyDefinition createdPolicyDefinition = createPolicy(policyTypeName, component);
             // set isFromCsar
             createdPolicyDefinition.setToscaPresentationValue(JsonPresentationFields.IS_FROM_CSAR, true);
             // link policy to component
             component.addPolicy(createdPolicyDefinition);
             // process targets
-            Map<PolicyTargetType, List<String>> policyTargets = incomingPolicyDefinition.getTargets();
+            final Map<PolicyTargetType, List<String>> policyTargets = incomingPolicyDefinition.getTargets();
             createdPolicyDefinition = setUpdatePolicyTargets(component, createdPolicyDefinition, policyTargets);
             // process policy properties
             List<PropertyDataDefinition> properties = incomingPolicyDefinition.getProperties();
@@ -179,38 +179,60 @@ public class PolicyBusinessLogic extends BaseBusinessLogic {
         if (MapUtils.isEmpty(targets)) {
             return policyDefinition;
         }
-        List<String> targetsToUpdate = targets.get(PolicyTargetType.COMPONENT_INSTANCES);
-        if (CollectionUtils.isEmpty(targetsToUpdate)) {
+        final List<String> componentInstancesTargetsToUpdate = targets.get(PolicyTargetType.COMPONENT_INSTANCES);
+        final List<String> groupsTargetsToUpdate = targets.get(PolicyTargetType.GROUPS);
+        if (CollectionUtils.isEmpty(componentInstancesTargetsToUpdate) && CollectionUtils.isEmpty(groupsTargetsToUpdate)) {
             return policyDefinition;
         }
+
+        final List<String> allTargets = joinLists(componentInstancesTargetsToUpdate, groupsTargetsToUpdate);
+
         // update targets to uniqueIds of respective component instance
-        List<String> targetsUniqueIds = new ArrayList<>();
-        for (String targetName : targetsToUpdate) {
-            Optional<ComponentInstance> componentInstance = component.getComponentInstanceByName(targetName);
-            String componentUniqueId = componentInstance
-                .orElseThrow(() -> new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND)).getUniqueId();
-            targetsUniqueIds.add(componentUniqueId);
-        }
-        EnumMap<PolicyTargetType, List<String>> updatedTargets = new EnumMap<>(PolicyTargetType.class);
-        updatedTargets.put(PolicyTargetType.COMPONENT_INSTANCES, targetsUniqueIds);
+        final List<String> targetsGroupsUniqueIds = new ArrayList<>();
+        final List<String> targetsInstanceUniqueIds = new ArrayList<>();
+        for (final String targetName : allTargets) {
+            final String groupsTargetUniqueIdForTargetName = getTargetGroupUniqueIdByTargetName(component, targetName);
+            if (groupsTargetUniqueIdForTargetName != null) {
+                targetsGroupsUniqueIds.add(groupsTargetUniqueIdForTargetName);
+            }
+            final String instanceTargetUniqueIdForTargetName = getTargetInstanceUniqueIdByTargetName(component, targetName);
+            if (instanceTargetUniqueIdForTargetName != null) {
+                targetsInstanceUniqueIds.add(instanceTargetUniqueIdForTargetName);
+            }
+        }
+        if (targetsGroupsUniqueIds.isEmpty() && targetsInstanceUniqueIds.isEmpty()) {
+            throw new ByActionStatusComponentException(ActionStatus.POLICY_TARGET_DOES_NOT_EXIST);
+        }
+        final EnumMap<PolicyTargetType, List<String>> updatedTargets = new EnumMap<>(PolicyTargetType.class);
+        if (!targetsGroupsUniqueIds.isEmpty()) {
+            updatedTargets.put(PolicyTargetType.GROUPS, targetsGroupsUniqueIds);
+        }
+        if (!targetsInstanceUniqueIds.isEmpty()) {
+            updatedTargets.put(PolicyTargetType.COMPONENT_INSTANCES, targetsInstanceUniqueIds);
+        }
         policyDefinition.setTargets(updatedTargets);
-        policyDefinition = validateAndUpdatePolicyTargets(component, policyDefinition.getUniqueId(), policyDefinition.getTargets());
-        return policyDefinition;
+        return validateAndUpdatePolicyTargets(component, policyDefinition.getUniqueId(), policyDefinition.getTargets());
     }
 
-    public Either<List<PolicyDefinition>, ResponseFormat> getPoliciesList(ComponentTypeEnum componentType, String componentId, String userId) {
-        Either<List<PolicyDefinition>, ResponseFormat> result;
-        log.trace("#getPolicies - starting to retrieve policies of component {}. ", componentId);
-        try {
-            Component component = validateContainerComponentAndUserBeforeReadOperation(componentType, componentId, userId);
-            result = Either.left(component.resolvePoliciesList());
-        } catch (Exception e) {
-            log.error("#getPolicy - the exception occurred upon retrieving policies list of component {}: ", componentId, e);
-            result = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+    private List<String> joinLists(final List<String> a, final List<String> b) {
+        final List<String> result = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(a)) {
+            result.addAll(a);
+        }
+        if (CollectionUtils.isNotEmpty(b)) {
+            result.addAll(b);
         }
         return result;
     }
 
+    private String getTargetGroupUniqueIdByTargetName(final Component component, final String targetName) {
+        return component.getGroupByInvariantName(targetName).map(GroupDataDefinition::getUniqueId).orElse(null);
+    }
+
+    private String getTargetInstanceUniqueIdByTargetName(final Component component, final String targetName) {
+        return component.getComponentInstanceByName(targetName).map(ComponentInstance::getUniqueId).orElse(null);
+    }
+
     /**
      * Retrieves the policy of the component by UniqueId
      *
@@ -266,7 +288,6 @@ public class PolicyBusinessLogic extends BaseBusinessLogic {
      * @return a policy or an error in a response format
      */
     public PolicyDefinition deletePolicy(ComponentTypeEnum componentType, String componentId, String policyId, String userId, boolean shouldLock) {
-        PolicyDefinition result = null;
         log.trace("#deletePolicy - starting to update the policy {} on the component {}. ", policyId, componentId);
         Component component = null;
         boolean failed = false;
@@ -358,7 +379,6 @@ public class PolicyBusinessLogic extends BaseBusinessLogic {
 
     public PolicyDefinition updatePolicyTargets(ComponentTypeEnum componentTypeEnum, String componentId, String policyId,
                                                 Map<PolicyTargetType, List<String>> targets, String userId) {
-        Either<PolicyDefinition, ResponseFormat> result = null;
         log.debug("updating the policy id {} targets with the components {}. ", policyId, componentId);
         boolean failed = false;
         try {
@@ -554,7 +574,7 @@ public class PolicyBusinessLogic extends BaseBusinessLogic {
     }
 
     private PolicyTypeDefinition validatePolicyTypeOnCreatePolicy(String policyTypeName, Component component) {
-        Either<PolicyTypeDefinition, StorageOperationStatus> latestPolicyTypeByType = policyTypeOperation.getLatestPolicyTypeByType(policyTypeName, component.getModel());
+        final var latestPolicyTypeByType = policyTypeOperation.getLatestPolicyTypeByType(policyTypeName, component.getModel());
         if (latestPolicyTypeByType.isRight()) {
             throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(latestPolicyTypeByType.right().value()));
         }