summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/YamlTemplateParsingHandler.java121
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogic.java89
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyTypeBusinessLogic.java17
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java20
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/components/utils/PropertiesUtils.java9
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/tosca/GroupExportParserImpl.java11
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/tosca/PolicyExportParserImpl.java11
-rw-r--r--catalog-be/src/main/resources/config/error-configuration.yaml16
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogicTest.java46
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/PolicyTypeBusinessLogicTest.java9
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogicTest.java5
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/YamlTemplateParsingHandlerTest.java200
-rw-r--r--catalog-be/src/test/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTest.java5
-rw-r--r--catalog-be/src/test/resources/config/catalog-be/error-configuration.yaml15
-rw-r--r--catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java2
-rw-r--r--catalog-model/src/main/java/org/openecomp/sdc/be/model/ParsedToscaYamlInfo.java39
-rw-r--r--catalog-model/src/main/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCache.java27
-rw-r--r--catalog-model/src/test/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCacheTest.java4
-rw-r--r--common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java2
19 files changed, 528 insertions, 120 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/YamlTemplateParsingHandler.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/YamlTemplateParsingHandler.java
index b86348d3a7..41dc3a6db3 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/YamlTemplateParsingHandler.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/csar/YamlTemplateParsingHandler.java
@@ -25,6 +25,9 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import fj.data.Either;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.Objects;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
@@ -32,12 +35,15 @@ import org.openecomp.sdc.be.components.impl.AnnotationBusinessLogic;
import org.openecomp.sdc.be.components.impl.GroupTypeBusinessLogic;
import org.openecomp.sdc.be.components.impl.ImportUtils;
import org.openecomp.sdc.be.components.impl.NodeFilterUploadCreator;
+import org.openecomp.sdc.be.components.impl.PolicyTypeBusinessLogic;
import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
+import org.openecomp.sdc.be.components.utils.PropertiesUtils;
import org.openecomp.sdc.be.config.BeEcompErrorManager;
import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.PolicyTargetType;
import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
import org.openecomp.sdc.be.model.CapabilityDefinition;
import org.openecomp.sdc.be.model.ComponentInstanceProperty;
@@ -46,6 +52,8 @@ import org.openecomp.sdc.be.model.GroupTypeDefinition;
import org.openecomp.sdc.be.model.InputDefinition;
import org.openecomp.sdc.be.model.NodeTypeInfo;
import org.openecomp.sdc.be.model.ParsedToscaYamlInfo;
+import org.openecomp.sdc.be.model.PolicyDefinition;
+import org.openecomp.sdc.be.model.PolicyTypeDefinition;
import org.openecomp.sdc.be.model.UploadArtifactInfo;
import org.openecomp.sdc.be.model.UploadCapInfo;
import org.openecomp.sdc.be.model.UploadComponentInstanceInfo;
@@ -85,9 +93,11 @@ import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.IS_PASSWORD
import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.MEMBERS;
import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.NODE;
import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.NODE_TEMPLATES;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.POLICIES;
import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.PROPERTIES;
import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.REQUIREMENTS;
import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.SUBSTITUTION_MAPPINGS;
+import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.TARGETS;
import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.TOPOLOGY_TEMPLATE;
import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.TYPE;
import static org.openecomp.sdc.be.utils.TypeUtils.ToscaTagNamesEnum.VALID_SOURCE_TYPES;
@@ -108,12 +118,14 @@ public class YamlTemplateParsingHandler {
private JanusGraphDao janusGraphDao;
private GroupTypeBusinessLogic groupTypeBusinessLogic;
private AnnotationBusinessLogic annotationBusinessLogic;
+ private PolicyTypeBusinessLogic policyTypeBusinessLogic;
- public YamlTemplateParsingHandler(JanusGraphDao janusGraphDao,
- GroupTypeBusinessLogic groupTypeBusinessLogic, AnnotationBusinessLogic annotationBusinessLogic) {
+ public YamlTemplateParsingHandler(JanusGraphDao janusGraphDao, GroupTypeBusinessLogic groupTypeBusinessLogic,
+ AnnotationBusinessLogic annotationBusinessLogic, PolicyTypeBusinessLogic policyTypeBusinessLogic) {
this.janusGraphDao = janusGraphDao;
this.groupTypeBusinessLogic = groupTypeBusinessLogic;
this.annotationBusinessLogic = annotationBusinessLogic;
+ this.policyTypeBusinessLogic = policyTypeBusinessLogic;
}
public ParsedToscaYamlInfo parseResourceInfoFromYAML(String fileName, String resourceYml, Map<String, String> createdNodesToscaResourceNames,
@@ -128,6 +140,7 @@ public class YamlTemplateParsingHandler {
parsedToscaYamlInfo.setInputs(getInputs(mappedToscaTemplate));
parsedToscaYamlInfo.setInstances(getInstances(fileName, mappedToscaTemplate, createdNodesToscaResourceNames));
parsedToscaYamlInfo.setGroups(getGroups(fileName, mappedToscaTemplate));
+ parsedToscaYamlInfo.setPolicies(getPolicies(fileName, mappedToscaTemplate));
log.debug("#parseResourceInfoFromYAML - The yaml {} has been parsed ", fileName);
return parsedToscaYamlInfo;
}
@@ -165,6 +178,110 @@ public class YamlTemplateParsingHandler {
return inputs;
}
+ private Map<String, PolicyDefinition> getPolicies(String fileName, Map<String, Object> toscaJson) {
+
+ Map<String, Object> foundPolicies = findFirstToscaMapElement(toscaJson, POLICIES)
+ .left()
+ .on(err -> logPoliciesNotFound(fileName));
+
+ if (MapUtils.isNotEmpty(foundPolicies)) {
+ return foundPolicies
+ .entrySet()
+ .stream()
+ .map(this::createPolicy)
+ .collect(Collectors.toMap(PolicyDefinition::getName, p -> p));
+ }
+ return Collections.emptyMap();
+ }
+
+ private PolicyDefinition createPolicy(Map.Entry<String, Object> policyNameValue) {
+ PolicyDefinition emptyPolicyDef = new PolicyDefinition();
+ String policyName = policyNameValue.getKey();
+ emptyPolicyDef.setName(policyName);
+ try {
+ if (policyNameValue.getValue() != null && policyNameValue.getValue() instanceof Map) {
+ Map<String, Object> policyTemplateJsonMap = (Map<String, Object>) policyNameValue.getValue();
+ validateAndFillPolicy(emptyPolicyDef, policyTemplateJsonMap);
+ } else {
+ rollbackWithException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE);
+ }
+ } catch (ClassCastException e) {
+ log.debug("#createPolicy - Failed to create the policy {}. The exception occurred", policyName, e);
+ rollbackWithException(ActionStatus.INVALID_YAML);
+ }
+ return emptyPolicyDef;
+ }
+
+ private Map<String, Object> logPoliciesNotFound(String fileName) {
+ log.debug("#logPoliciesNotFound - Policies were not found in the yaml template {}.", fileName);
+ return Collections.emptyMap();
+ }
+
+ private void validateAndFillPolicy(PolicyDefinition emptyPolicyDefinition, Map<String, Object> policyTemplateJsonMap) {
+ String policyTypeName = (String) policyTemplateJsonMap.get(TYPE.getElementName());
+ if(StringUtils.isEmpty(policyTypeName)){
+ log.debug("#validateAndFillPolicy - The 'type' member is not found under policy {}", emptyPolicyDefinition.getName());
+ rollbackWithException(ActionStatus.POLICY_MISSING_POLICY_TYPE, emptyPolicyDefinition.getName());
+ }
+ emptyPolicyDefinition.setType(policyTypeName);
+ // set policy targets
+ emptyPolicyDefinition.setTargets(validateFillPolicyTargets(policyTemplateJsonMap));
+ PolicyTypeDefinition policyTypeDefinition = validateGetPolicyTypeDefinition(policyTypeName);
+ // set policy properties
+ emptyPolicyDefinition.setProperties(validateFillPolicyProperties(policyTypeDefinition, policyTemplateJsonMap));
+ }
+
+ private PolicyTypeDefinition validateGetPolicyTypeDefinition(String policyType) {
+ PolicyTypeDefinition policyTypeDefinition = policyTypeBusinessLogic.getLatestPolicyTypeByType(policyType);
+ if (policyTypeDefinition == null) {
+ log.debug("#validateAndFillPolicy - The policy type {} not found", policyType);
+ rollbackWithException(ActionStatus.POLICY_TYPE_IS_INVALID, policyType);
+ }
+ return policyTypeDefinition;
+ }
+
+ private List<PropertyDataDefinition> validateFillPolicyProperties(PolicyTypeDefinition policyTypeDefinition,
+ Map<String, Object> policyTemplateJsonMap) {
+ if (MapUtils.isEmpty(policyTemplateJsonMap) || Objects.isNull(policyTypeDefinition)) {
+ return Collections.emptyList();
+ }
+ List<PropertyDataDefinition> propertyDataDefinitionList = new ArrayList<>();
+ Map<String, Object> propertiesMap =
+ (Map<String, Object>) policyTemplateJsonMap.get(PROPERTIES.getElementName());
+ if (MapUtils.isEmpty(propertiesMap)) {
+ return Collections.emptyList();
+ }
+ if (CollectionUtils.isNotEmpty(policyTypeDefinition.getProperties())) {
+ propertyDataDefinitionList = policyTypeDefinition
+ .getProperties()
+ .stream()
+ .map(propertyDefinition -> setPropertyValue(propertiesMap,
+ propertyDefinition))
+ .collect(Collectors.toList());
+ }
+ return propertyDataDefinitionList;
+ }
+
+ private PropertyDataDefinition setPropertyValue(Map<String, Object> propertiesMap, PropertyDataDefinition srcPropertyDataDefinition) {
+ PropertyDataDefinition newPropertyDef = new PropertyDataDefinition(srcPropertyDataDefinition);
+ String propertyName = newPropertyDef.getName();
+ if (Objects.nonNull(propertiesMap.get(propertyName))) {
+ Object propValue = propertiesMap.get(propertyName);
+ newPropertyDef.setValue(PropertiesUtils.trimQuotes(gson.toJson(propValue)));
+ }
+ return newPropertyDef;
+ }
+
+ private Map<PolicyTargetType, List<String>> validateFillPolicyTargets(Map<String, Object> policyTemplateJson) {
+ Map<PolicyTargetType, List<String>> targets = new EnumMap<>(PolicyTargetType.class);
+ if (policyTemplateJson.containsKey(TARGETS.getElementName())
+ && policyTemplateJson.get(TARGETS.getElementName()) instanceof List ) {
+ List<String> targetsElement = (List<String>) policyTemplateJson.get(TARGETS.getElementName());
+ targets.put(PolicyTargetType.COMPONENT_INSTANCES, targetsElement);
+ }
+ return targets;
+ }
+
private Map<String, UploadComponentInstanceInfo> getInstances(String yamlName, Map<String, Object> toscaJson, Map<String, String> createdNodesToscaResourceNames) {
Map<String, Object> nodeTemlates = findFirstToscaMapElement(toscaJson, NODE_TEMPLATES)
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogic.java
index 2d0ee0dd66..f872074f26 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogic.java
@@ -21,8 +21,12 @@
package org.openecomp.sdc.be.components.impl;
import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumMap;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.StringUtils;
import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
import org.openecomp.sdc.be.components.property.PropertyDeclarationOrchestrator;
@@ -32,9 +36,11 @@ import org.openecomp.sdc.be.datatypes.elements.GetPolicyValueDataDefinition;
import org.openecomp.sdc.be.datatypes.elements.PolicyTargetType;
import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
import org.openecomp.sdc.be.datatypes.enums.PromoteVersionEnum;
import org.openecomp.sdc.be.model.Component;
import org.openecomp.sdc.be.model.ComponentInstInputsMap;
+import org.openecomp.sdc.be.model.ComponentInstance;
import org.openecomp.sdc.be.model.ComponentInstanceProperty;
import org.openecomp.sdc.be.model.ComponentParametersView;
import org.openecomp.sdc.be.model.PolicyDefinition;
@@ -49,6 +55,9 @@ import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
import org.openecomp.sdc.common.datastructure.Wrapper;
+import org.openecomp.sdc.common.log.elements.LoggerSupportability;
+import org.openecomp.sdc.common.log.enums.LoggerSupportabilityActions;
+import org.openecomp.sdc.common.log.enums.StatusCode;
import org.openecomp.sdc.common.log.wrappers.Logger;
import org.openecomp.sdc.exception.ResponseFormat;
import org.springframework.beans.factory.annotation.Autowired;
@@ -76,6 +85,7 @@ public class PolicyBusinessLogic extends BaseBusinessLogic {
private static final String FAILED_TO_VALIDATE_COMPONENT = "#{} - failed to validate the component {} before policy processing. ";
private static final String DECLARE_PROPERTIES_TO_POLICIES = "declare properties to policies";
private static final Logger log = Logger.getLogger(PolicyBusinessLogic.class);
+ private static final LoggerSupportability loggerSupportability= LoggerSupportability.getLogger(PolicyBusinessLogic.class.getName());
private PropertyDeclarationOrchestrator propertyDeclarationOrchestrator;
@@ -123,6 +133,85 @@ public class PolicyBusinessLogic extends BaseBusinessLogic {
}
}
+ public Map<String, PolicyDefinition> createPoliciesFromParsedCsar(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();
+ 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();
+ 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();
+ 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();
+ createdPolicyDefinition = setUpdatePolicyTargets(component, createdPolicyDefinition, policyTargets);
+ // process policy properties
+ List<PropertyDataDefinition> properties = incomingPolicyDefinition.getProperties();
+ createdPolicyDefinition = setUpdatePolicyProperties(component, createdPolicyDefinition, properties);
+ createdPolicies.put(policyName, createdPolicyDefinition);
+ loggerSupportability.log(LoggerSupportabilityActions.CREATE_POLICIES,component.getComponentMetadataForSupportLog(), StatusCode.COMPLETE,"policy {} has been created ", policyName);
+ }
+ return createdPolicies;
+ }
+
+ private PolicyDefinition setUpdatePolicyProperties(Component component, PolicyDefinition policyDefinition, List<PropertyDataDefinition> properties) {
+ if (CollectionUtils.isNotEmpty(properties)) {
+ PropertyDataDefinition[] propertiesArray = properties.toArray(new PropertyDataDefinition[properties.size()]);
+ List<PropertyDataDefinition> updatedPropertiesList = setComponentValidateUpdatePolicyProperties(
+ policyDefinition.getUniqueId(),
+ propertiesArray,
+ component
+ );
+ policyDefinition.setProperties(updatedPropertiesList);
+ }
+ return policyDefinition;
+ }
+
+ private PolicyDefinition setUpdatePolicyTargets(Component component, PolicyDefinition policyDefinition,
+ Map<PolicyTargetType, List<String>> targets) {
+ if (MapUtils.isEmpty(targets)) {
+ return policyDefinition;
+ }
+ List<String> targetsToUpdate = targets.get(PolicyTargetType.COMPONENT_INSTANCES);
+ if (CollectionUtils.isEmpty(targetsToUpdate)) {
+ return policyDefinition;
+ }
+ // 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);
+ policyDefinition.setTargets(updatedTargets);
+ policyDefinition = validateAndUpdatePolicyTargets(component, policyDefinition.getUniqueId(),
+ policyDefinition.getTargets());
+ return policyDefinition;
+ }
+
/*public Either<PolicyDefinition, ResponseFormat> createPolicy(ComponentTypeEnum componentType, String componentId, String policyTypeName, String userId, boolean shouldLock) {
Either<PolicyDefinition, ResponseFormat> result = null;
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyTypeBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyTypeBusinessLogic.java
index 6154061056..c74520f825 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyTypeBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/PolicyTypeBusinessLogic.java
@@ -22,8 +22,10 @@ package org.openecomp.sdc.be.components.impl;
import fj.data.Either;
import org.apache.commons.lang.StringUtils;
+import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
import org.openecomp.sdc.be.components.validation.UserValidations;
import org.openecomp.sdc.be.config.ConfigurationManager;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
import org.openecomp.sdc.be.impl.ComponentsUtils;
import org.openecomp.sdc.be.model.PolicyTypeDefinition;
@@ -63,6 +65,12 @@ public class PolicyTypeBusinessLogic {
return getPolicyTypes(excludedPolicyTypes);
}
+ public PolicyTypeDefinition getLatestPolicyTypeByType(String policyTypeName) {
+ return policyTypeOperation.getLatestPolicyTypeByType(policyTypeName)
+ .left()
+ .on(e -> failOnPolicyType(e, policyTypeName));
+ }
+
public Set<String> getExcludedPolicyTypes(String internalComponentType) {
if (StringUtils.isEmpty(internalComponentType)) {
return emptySet();
@@ -80,4 +88,13 @@ public class PolicyTypeBusinessLogic {
log.debug("error when trying to fetch policy types: {}", err);
return componentsUtils.convertToResponseFormatOrNotFoundErrorToEmptyList(err);
}
+
+ private PolicyTypeDefinition failOnPolicyType(StorageOperationStatus status, String policyType) {
+ janusGraphDao.rollback();
+ if (status == StorageOperationStatus.INVALID_ID) {
+ throw new ByActionStatusComponentException(ActionStatus.POLICY_TYPE_IS_INVALID, policyType);
+ } else {
+ throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
+ }
+ }
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java
index cd0f8a0f61..45f2434482 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogic.java
@@ -124,6 +124,7 @@ import org.openecomp.sdc.be.model.LifecycleStateEnum;
import org.openecomp.sdc.be.model.NodeTypeInfo;
import org.openecomp.sdc.be.model.Operation;
import org.openecomp.sdc.be.model.ParsedToscaYamlInfo;
+import org.openecomp.sdc.be.model.PolicyDefinition;
import org.openecomp.sdc.be.model.PropertyDefinition;
import org.openecomp.sdc.be.model.RelationshipImpl;
import org.openecomp.sdc.be.model.RelationshipInfo;
@@ -217,6 +218,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
private final UiComponentDataConverter uiComponentDataConverter;
private final CsarBusinessLogic csarBusinessLogic;
private final PropertyBusinessLogic propertyBusinessLogic;
+ private final PolicyBusinessLogic policyBusinessLogic;
@Autowired
public ResourceBusinessLogic(IElementOperation elementDao,
@@ -238,7 +240,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
ComponentValidator componentValidator,
ComponentIconValidator componentIconValidator,
ComponentProjectCodeValidator componentProjectCodeValidator,
- ComponentDescriptionValidator componentDescriptionValidator) {
+ ComponentDescriptionValidator componentDescriptionValidator, PolicyBusinessLogic policyBusinessLogic) {
super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, groupBusinessLogic,
interfaceOperation, interfaceLifecycleTypeOperation, artifactsBusinessLogic, artifactToscaOperation,
componentContactIdValidator, componentNameValidator, componentTagsValidator, componentValidator,
@@ -253,6 +255,7 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
this.uiComponentDataConverter = uiComponentDataConverter;
this.csarBusinessLogic = csarBusinessLogic;
this.propertyBusinessLogic = propertyBusinessLogic;
+ this.policyBusinessLogic = policyBusinessLogic;
}
@Autowired
@@ -270,7 +273,6 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
@Autowired
private SoftwareInformationBusinessLogic softwareInformationBusinessLogic;
-
public LifecycleBusinessLogic getLifecycleBusinessLogic() {
return lifecycleBusinessLogic;
}
@@ -1690,8 +1692,15 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
resource.getComponentMetadataForSupportLog(),
StatusCode.STARTED,"Started to add artifacts from yaml: {}",yamlName);
+ log.trace("************* Starting to add policies from yaml {}", yamlName);
+ Map<String, PolicyDefinition> policies = parsedToscaYamlInfo.getPolicies();
+ if (MapUtils.isNotEmpty(policies)) {
+ resource = createPoliciesOnResource(resource, policies);
+ }
+ log.trace("************* Finished to add policies from yaml {}", yamlName);
+
final NodeTypeInfoToUpdateArtifacts nodeTypeInfoToUpdateArtifacts =
- new NodeTypeInfoToUpdateArtifacts(nodeName, nodeTypesArtifactsToCreate);
+ new NodeTypeInfoToUpdateArtifacts(nodeName, nodeTypesArtifactsToCreate);
final Either<Resource, ResponseFormat> createArtifactsEither = createOrUpdateArtifacts(
ArtifactOperationEnum.CREATE, createdArtifacts, yamlName, csarInfo, resource,
@@ -1789,6 +1798,11 @@ public class ResourceBusinessLogic extends ComponentBusinessLogic {
}
}
+ private Resource createPoliciesOnResource(Resource resource, Map<String, PolicyDefinition> policies) {
+ policyBusinessLogic.createPoliciesFromParsedCsar(resource, policies);
+ return resource;
+ }
+
private void handleGetInputs(PropertyDataDefinition property, List<InputDefinition> inputs) {
if (isNotEmpty(property.getGetInputValues())) {
if (inputs == null || inputs.isEmpty()) {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/utils/PropertiesUtils.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/utils/PropertiesUtils.java
index 22ba03ff27..351e2a343d 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/utils/PropertiesUtils.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/utils/PropertiesUtils.java
@@ -16,6 +16,7 @@
package org.openecomp.sdc.be.components.utils;
+import com.google.common.base.CharMatcher;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.collections4.ListUtils;
@@ -188,4 +189,12 @@ public class PropertiesUtils {
ResourceTypeEnum resType = resource.getResourceType();
return resType.equals(ResourceTypeEnum.ServiceProxy);
}
+
+ /**
+ * Trim " and ' quotes
+ * @return String
+ */
+ public static String trimQuotes(String incomingString) {
+ return CharMatcher.is('\"').or(CharMatcher.is('\'')).trimFrom(incomingString);
+ }
}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/GroupExportParserImpl.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/GroupExportParserImpl.java
index 981c444197..bb4d363e43 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/GroupExportParserImpl.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/GroupExportParserImpl.java
@@ -43,7 +43,6 @@ import org.openecomp.sdc.be.tosca.model.VfModuleToscaMetadata;
import org.openecomp.sdc.common.api.Constants;
import org.openecomp.sdc.common.log.wrappers.Logger;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.HashMap;
@@ -52,6 +51,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.function.Supplier;
+import org.springframework.context.event.EventListener;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
@@ -62,7 +62,7 @@ import static org.apache.commons.collections.MapUtils.isNotEmpty;
import static org.apache.commons.lang.StringUtils.isNotEmpty;
import static org.openecomp.sdc.be.model.utils.ComponentUtilities.getComponentInstanceNameByInstanceId;
-@Service
+@org.springframework.stereotype.Component
public class GroupExportParserImpl implements GroupExportParser {
private static final Logger log = Logger.getLogger(GroupExportParserImpl.class);
@@ -87,6 +87,13 @@ public class GroupExportParserImpl implements GroupExportParser {
return dataTypesEither.left().value();
}
+
+ @EventListener
+ public void onDataTypesCacheChangedEvent(
+ ApplicationDataTypeCache.DataTypesCacheChangedEvent dataTypesCacheChangedEvent) {
+ dataTypes = dataTypesCacheChangedEvent.getNewData();
+ log.debug("Data types cache updated.");
+ }
@Override
public Map<String, ToscaGroupTemplate> getGroups(Component component) {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/PolicyExportParserImpl.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/PolicyExportParserImpl.java
index ca4d40517a..598f73f9ee 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/PolicyExportParserImpl.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/PolicyExportParserImpl.java
@@ -37,7 +37,6 @@ import org.openecomp.sdc.be.tosca.model.ToscaMetadata;
import org.openecomp.sdc.be.tosca.model.ToscaPolicyTemplate;
import org.openecomp.sdc.common.log.wrappers.Logger;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
@@ -45,13 +44,14 @@ import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import java.util.stream.Collectors;
+import org.springframework.context.event.EventListener;
import static org.apache.commons.collections.CollectionUtils.isEmpty;
import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
import static org.apache.commons.collections.MapUtils.isNotEmpty;
import static org.apache.commons.lang.StringUtils.isNotEmpty;
-@Service
+@org.springframework.stereotype.Component
public class PolicyExportParserImpl implements PolicyExportParser {
private static final Logger log = Logger.getLogger(PolicyExportParserImpl.class);
@@ -76,6 +76,13 @@ public class PolicyExportParserImpl implements PolicyExportParser {
return dataTypesEither.left().value();
}
+
+ @EventListener
+ public void onDataTypesCacheChangedEvent(
+ ApplicationDataTypeCache.DataTypesCacheChangedEvent dataTypesCacheChangedEvent) {
+ dataTypes = dataTypesCacheChangedEvent.getNewData();
+ log.debug("Data types cache updated.");
+ }
@Override
public Map<String, ToscaPolicyTemplate> getPolicies(Component component) {
diff --git a/catalog-be/src/main/resources/config/error-configuration.yaml b/catalog-be/src/main/resources/config/error-configuration.yaml
index 25989dfe29..a4491de352 100644
--- a/catalog-be/src/main/resources/config/error-configuration.yaml
+++ b/catalog-be/src/main/resources/config/error-configuration.yaml
@@ -1915,6 +1915,22 @@ errors:
message: "Error: Invalid policy name %1 received.",
messageId: "SVC4684"
}
+ #---------SVC4801------------------------------
+ # %1 - policy type
+ POLICY_TYPE_IS_INVALID: {
+ code: 400,
+ message: "Error: Invalid content. Policy type %1 does not exist",
+ messageId: "SVC4801"
+ }
+
+ #---------SVC4802------------------------------
+ # %1 - policy name
+ POLICY_MISSING_POLICY_TYPE: {
+ code: 400,
+ message: "Error: Invalid content. Type name is not defined for policy %1",
+ messageId: "SVC4802"
+ }
+
#---------SVC4685------------------------------
# %1 - policy name
POLICY_NAME_ALREADY_EXIST: {
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogicTest.java
index 82b49fffa7..b8bb4a775b 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogicTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/PolicyBusinessLogicTest.java
@@ -18,6 +18,8 @@ package org.openecomp.sdc.be.components.impl;
import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Optional;
import org.apache.commons.collections.CollectionUtils;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -76,11 +78,14 @@ import java.util.Map;
import static org.assertj.core.api.Java6Assertions.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyMap;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
@@ -177,6 +182,47 @@ public class PolicyBusinessLogicTest {
PolicyDefinition response = businessLogic.createPolicy(ComponentTypeEnum.RESOURCE, COMPONENT_ID, POLICY_TYPE_NAME, USER_ID, true);
assertTrue(!response.isEmpty());
}
+
+ @Test
+ public void createPolicyFromCsarDefinitionTest() {
+ String prop1 = "Prop_1";
+ String prop2 = "Prop_2";
+ Map<String, PolicyDefinition> policies = new HashMap<>();
+ PolicyDefinition policy = buildPolicy(POLICY_NAME);
+ Map<PolicyTargetType, List<String>> targets = getTargets();
+ PropertyDataDefinition[] properties = getProperties(prop1, prop2);
+ policy.setTargets(targets);
+ policy.setProperties(Arrays.asList(properties));
+ policies.put(POLICY_NAME, policy);
+
+ List<ComponentInstance> instanceList = new ArrayList<>();
+ ComponentInstance componentInstance = new ComponentInstance();
+ componentInstance.setUniqueId(UNIQUE_ID_EXSISTS);
+ componentInstance.setName(UNIQUE_ID_EXSISTS);
+ instanceList.add(componentInstance);
+
+ Resource newResource = buildResource();
+ newResource.setPolicies(policies);
+ newResource.setComponentInstances(instanceList);
+
+ when(policyTypeOperation.getLatestPolicyTypeByType(eq(POLICY_TYPE_NAME))).thenReturn(getPolicyTypeSuccessEither);
+ when(toscaOperationFacade.associatePolicyToComponent(eq(COMPONENT_ID), any(PolicyDefinition.class), eq(0))).thenReturn(Either.left(policy));
+ when(toscaOperationFacade.getToscaFullElement(eq(COMPONENT_ID))).thenReturn(Either.left(newResource));
+ when(toscaOperationFacade.updatePolicyOfComponent(eq(COMPONENT_ID), any(PolicyDefinition.class), any(PromoteVersionEnum.class))).thenReturn(Either.left(policy));
+ when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
+ when(propertyOperation.validateAndUpdatePropertyValue(eq(null), eq(prop1), anyBoolean(), eq(null), anyMap())).thenReturn(Either.left(prop1));
+ when(propertyOperation.validateAndUpdatePropertyValue(eq(null), eq(prop2), anyBoolean(), eq(null), anyMap())).thenReturn(Either.left(prop2));
+
+ Map<String, PolicyDefinition> createdPolicy = businessLogic.createPoliciesFromParsedCsar(newResource, policies);
+
+ assertFalse(createdPolicy.isEmpty());
+ PolicyDefinition newPolicy = createdPolicy.get(POLICY_NAME);
+ assertNotNull(newPolicy);
+ assertNotNull(newPolicy.getTargets());
+ assertNotNull(newPolicy.getProperties());
+ assertEquals(2, newPolicy.getProperties().size());
+ assertEquals(1, newPolicy.getTargets().size());
+ }
@Test
public void createPolicyUserFailureTest(){
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/PolicyTypeBusinessLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/PolicyTypeBusinessLogicTest.java
index 44d1e06477..2baafdc9cb 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/PolicyTypeBusinessLogicTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/PolicyTypeBusinessLogicTest.java
@@ -22,6 +22,7 @@
package org.openecomp.sdc.be.components.impl;
import com.google.common.collect.ImmutableMap;
+import fj.data.Either;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -122,4 +123,12 @@ public class PolicyTypeBusinessLogicTest {
}
}
+ @Test
+ public void getLatestPolicyTypeByTypeTest() {
+ PolicyTypeDefinition policyTypeDefinition = new PolicyTypeBuilder().setType("org.openecomp.policies.placement.Antilocate").build();
+ when(policyTypeOperation.getLatestPolicyTypeByType("org.openecomp.policies.placement.Antilocate")).thenReturn(
+ Either.left(policyTypeDefinition));
+ assertThat(policyTypeOperation.getLatestPolicyTypeByType("org.openecomp.policies.placement.Antilocate"))
+ .isEqualTo(Either.left(testInstance.getLatestPolicyTypeByType("org.openecomp.policies.placement.Antilocate")));
+ }
} \ No newline at end of file
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogicTest.java
index 69b3f1d660..2401c7e772 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogicTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ResourceBusinessLogicTest.java
@@ -198,7 +198,7 @@ public class ResourceBusinessLogicTest {
MergeInstanceUtils mergeInstanceUtils = Mockito.mock(MergeInstanceUtils.class);
UiComponentDataConverter uiComponentDataConverter = Mockito.mock(UiComponentDataConverter.class);
ToscaExportHandler toscaExportHandler = Mockito.mock(ToscaExportHandler.class);
-
+ PolicyBusinessLogic policyBusinessLogic = Mockito.mock(PolicyBusinessLogic.class);
@InjectMocks
@@ -318,7 +318,8 @@ public class ResourceBusinessLogicTest {
resourceImportManager, inputsBusinessLogic, compositionBusinessLogic, resourceDataMergeBusinessLogic,
csarArtifactsAndGroupsBusinessLogic, mergeInstanceUtils, uiComponentDataConverter, csarBusinessLogic,
artifactToscaOperation, propertyBusinessLogic, componentContactIdValidator, componentNameValidator,
- componentTagsValidator, componentValidator, componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator);
+ componentTagsValidator, componentValidator, componentIconValidator, componentProjectCodeValidator,
+ componentDescriptionValidator, policyBusinessLogic);
bl.setElementDao(mockElementDao);
bl.setUserAdmin(mockUserAdmin);
bl.setCapabilityTypeOperation(capabilityTypeOperation);
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/YamlTemplateParsingHandlerTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/YamlTemplateParsingHandlerTest.java
index b63e6ffeb8..1d7a1c5eed 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/YamlTemplateParsingHandlerTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/utils/YamlTemplateParsingHandlerTest.java
@@ -35,6 +35,7 @@ import org.openecomp.sdc.be.components.csar.CsarInfo;
import org.openecomp.sdc.be.components.csar.YamlTemplateParsingHandler;
import org.openecomp.sdc.be.components.impl.AnnotationBusinessLogic;
import org.openecomp.sdc.be.components.impl.GroupTypeBusinessLogic;
+import org.openecomp.sdc.be.components.impl.PolicyTypeBusinessLogic;
import org.openecomp.sdc.be.components.validation.AnnotationValidator;
import org.openecomp.sdc.be.dao.jsongraph.JanusGraphDao;
import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
@@ -43,6 +44,8 @@ import org.openecomp.sdc.be.model.ComponentInstanceProperty;
import org.openecomp.sdc.be.model.GroupProperty;
import org.openecomp.sdc.be.model.GroupTypeDefinition;
import org.openecomp.sdc.be.model.ParsedToscaYamlInfo;
+import org.openecomp.sdc.be.model.PolicyDefinition;
+import org.openecomp.sdc.be.model.PolicyTypeDefinition;
import org.openecomp.sdc.be.model.UploadArtifactInfo;
import org.openecomp.sdc.be.model.UploadComponentInstanceInfo;
import org.openecomp.sdc.be.model.User;
@@ -58,6 +61,7 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
+import org.springframework.test.util.ReflectionTestUtils;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertNotNull;
@@ -78,6 +82,8 @@ public class YamlTemplateParsingHandlerTest {
private JanusGraphDao janusGraphDao;
@Mock
private User user;
+ @Mock
+ private PolicyTypeBusinessLogic policyTypeBusinessLogic;
private YamlTemplateParsingHandler handler;
@@ -87,9 +93,13 @@ public class YamlTemplateParsingHandlerTest {
private final static String VFC_GROUP_TYPE = "org.openecomp.groups.VfcInstanceGroup";
private final static String HEAT_GROUP_TYPE = "org.openecomp.groups.heat.HeatStack";
private final static String ROOT_GROUP_TYPE = "tosca.groups.Root";
+ private final static String OPENECOMP_ANTILOCATE_POLICY_TYPE = "org.openecomp.policies.placement.Antilocate";
+ private final static String ROOT_POLICIES_TYPE = "tosca.policies.Root";
private final static GroupTypeDefinition VfcInstanceGroupType = buildVfcInstanceGroupType();
private final static GroupTypeDefinition heatGroupType = buildHeatStackGroupType();
private final static GroupTypeDefinition rootGroupType = buildRootGroupType();
+ private static final PolicyTypeDefinition OPENECOMP_POLICY_TYPE = buildOpenecompPolicyType();
+ private final static String OPENECOMP_POLICY_NAME = "vepdg_server_group_policy";
private final static String CAPABILITY_TYPE = "org.openecomp.capabilities.VLANAssignment";
private final static String CAPABILITY_NAME = "vlan_assignment";
private static final String CSAR_FILE_PATH = "csars/with_groups.csar";
@@ -122,8 +132,10 @@ public class YamlTemplateParsingHandlerTest {
AnnotationBusinessLogic annotationBusinessLogic = new AnnotationBusinessLogic(annotationTypeOperations,
annotationValidator);
- handler = new YamlTemplateParsingHandler(janusGraphDao, groupTypeBusinessLogic, annotationBusinessLogic);
+ handler = new YamlTemplateParsingHandler(janusGraphDao, groupTypeBusinessLogic, annotationBusinessLogic, policyTypeBusinessLogic);
+ ReflectionTestUtils.setField(handler, "policyTypeBusinessLogic", policyTypeBusinessLogic);
stubGetGroupType();
+ stubGetPolicyType();
}
@Test
@@ -148,6 +160,79 @@ public class YamlTemplateParsingHandlerTest {
validateParsedYamlWithCapability(parsedYaml);
}
+ @Test
+ public void testSetArtifacts() {
+ UploadComponentInstanceInfo nodeTemplateInfo = new UploadComponentInstanceInfo();
+ Map<String, Object> nodeTemplateJsonMap = new HashMap<>();
+ Map<String, String> nodeMap = new HashMap<>();
+ nodeMap.put("name","test_name");
+ nodeMap.put("type","test_type");
+ nodeTemplateJsonMap.put(ARTIFACTS.getElementName(), nodeMap);
+ Deencapsulation.invoke(testSubject, "setArtifacts", nodeTemplateInfo, nodeTemplateJsonMap);
+ assertNotNull(nodeTemplateInfo.getArtifacts());
+ }
+
+ @Test
+ public void testCreateArtifactsModuleFromYaml() {
+ Map<String, Map<String, Map<String, String>>> nodeTemplateJsonMap = new HashMap<>();
+ Map<String, Map<String,String>> map0 = new HashMap<>();
+ Map<String, String> map1 = new HashMap<>();
+ map1.put("file", "test_file");
+ map1.put("type", "test_type");
+ map0.put("test_art", map1);
+ nodeTemplateJsonMap.put(ARTIFACTS.getElementName(), map0);
+ Map<String, Map<String, UploadArtifactInfo>> result;
+ result = Deencapsulation.invoke(testSubject, "createArtifactsModuleFromYaml", nodeTemplateJsonMap);
+ Assert.assertTrue(MapUtils.isNotEmpty(result));
+ Assert.assertTrue(MapUtils.isNotEmpty(result.get(ARTIFACTS.getElementName())));
+ Assert.assertEquals("test_file", result.get(ARTIFACTS.getElementName()).get("test_art").getFile());
+ Assert.assertEquals("test_type", result.get(ARTIFACTS.getElementName()).get("test_art").getType());
+ }
+
+ @Test
+ public void testAddModuleNodeTemplateArtifacts() {
+ Map<String, Map<String, UploadArtifactInfo>> result = new HashMap<>();
+ Map<String, String> map1 = new HashMap<>();
+ map1.put("file", "test_file");
+ map1.put("type", "test_type");
+ Deencapsulation.invoke(testSubject, "addModuleNodeTemplateArtifacts", result, map1, "test_art");
+ Assert.assertTrue(MapUtils.isNotEmpty(result));
+ Assert.assertTrue(MapUtils.isNotEmpty(result.get(ARTIFACTS.getElementName())));
+ Assert.assertEquals("test_file", result.get(ARTIFACTS.getElementName()).get("test_art").getFile());
+ Assert.assertEquals("test_type", result.get(ARTIFACTS.getElementName()).get("test_art").getType());
+ }
+
+ @Test
+ public void testBuildModuleNodeTemplateArtifact() {
+ Map<String, String> map1 = new HashMap<>();
+ map1.put("file", "test_file");
+ map1.put("type", "test_type");
+ UploadArtifactInfo result;
+ result = Deencapsulation.invoke(testSubject, "buildModuleNodeTemplateArtifact", map1);
+ assertNotNull(result);
+ Assert.assertEquals("test_file", result.getFile());
+ Assert.assertEquals("test_type", result.getType());
+ }
+
+ @Test
+ public void testFillArtifact() {
+ Map<String, String> map1 = new HashMap<>();
+ map1.put("file", "test_file");
+ map1.put("type", "test_type");
+ UploadArtifactInfo result = new UploadArtifactInfo();
+ Deencapsulation.invoke(testSubject, "fillArtifact", result, map1);
+ assertNotNull(result);
+ Assert.assertEquals("test_file", result.getFile());
+ Assert.assertEquals("test_type", result.getType());
+ }
+
+ @Test
+ public void parseResourceWithPoliciesDefined() {
+ ParsedToscaYamlInfo parsedYaml = handler.parseResourceInfoFromYAML(FILE_NAME, resourceYml, new HashMap<>(),
+ new HashMap<>(), "");
+ validateParsedYamlWithPolicies(parsedYaml);
+ }
+
private void validateParsedYaml(ParsedToscaYamlInfo parsedYaml, String group, List<String> expectedProp) {
assertThat(parsedYaml).isNotNull();
assertThat(parsedYaml.getGroups()).isNotNull().containsKey(group);
@@ -155,15 +240,15 @@ public class YamlTemplateParsingHandlerTest {
assertThat(parsedYaml.getGroups().get(group).getProperties()).isNotNull();
assertThat(parsedYaml.getGroups().get(group).getProperties()
- .stream()
- .map(PropertyDataDefinition::getName)
- .collect(Collectors.toList()))
+ .stream()
+ .map(PropertyDataDefinition::getName)
+ .collect(Collectors.toList()))
.containsAll(expectedProp);
assertThat(parsedYaml.getGroups().get(group).getMembers()).isNotNull();
}
- private void validateParsedYamlWithCapability(ParsedToscaYamlInfo parsedYaml) {
+ private void validateParsedYamlWithCapability(ParsedToscaYamlInfo parsedYaml) {
final List<String> expectedProp = Lists.newArrayList("vfc_parent_port_role",
"network_collection_function", "vfc_instance_group_function", "subinterface_role");
@@ -171,23 +256,23 @@ public class YamlTemplateParsingHandlerTest {
validateParsedYaml(parsedYaml, MAIN_GROUP_NAME, expectedProp);
assertThat(parsedYaml.getGroups().get(MAIN_GROUP_NAME).getCapabilities()
- .get(CAPABILITY_TYPE)
- .get(0).getProperties().get(0).getValue()).isEqualTo("success");
+ .get(CAPABILITY_TYPE)
+ .get(0).getProperties().get(0).getValue()).isEqualTo("success");
assertThat(parsedYaml.getGroups().get(MAIN_GROUP_NAME).getCapabilities()).isNotNull();
- }
+ }
- private void stubGetGroupType() {
- when(groupTypeBusinessLogic.getLatestGroupTypeByType(eq(VFC_GROUP_TYPE))).thenReturn(VfcInstanceGroupType);
- when(groupTypeBusinessLogic.getLatestGroupTypeByType(eq(HEAT_GROUP_TYPE))).thenReturn(heatGroupType);
+ private void stubGetGroupType() {
+ when(groupTypeBusinessLogic.getLatestGroupTypeByType(eq(VFC_GROUP_TYPE))).thenReturn(VfcInstanceGroupType);
+ when(groupTypeBusinessLogic.getLatestGroupTypeByType(eq(HEAT_GROUP_TYPE))).thenReturn(heatGroupType);
when(groupTypeBusinessLogic.getLatestGroupTypeByType(eq(ROOT_GROUP_TYPE))).thenReturn(rootGroupType);
}
private static GroupTypeDefinition buildRootGroupType() {
return createGroupTypeDefinition(ROOT_GROUP_TYPE, null,
"The TOSCA Group Type all other TOSCA Group Types derive from");
- }
+ }
- private static GroupTypeDefinition buildHeatStackGroupType() {
+ private static GroupTypeDefinition buildHeatStackGroupType() {
GroupTypeDefinition groupType = createGroupTypeDefinition(HEAT_GROUP_TYPE, "tosca.groups.Root",
"Grouped all heat resources which are in the same heat stack");
@@ -199,9 +284,9 @@ public class YamlTemplateParsingHandlerTest {
groupType.setProperties(Lists.newArrayList(property1, property2));
return groupType;
- }
+ }
- private static GroupTypeDefinition buildVfcInstanceGroupType() {
+ private static GroupTypeDefinition buildVfcInstanceGroupType() {
GroupTypeDefinition groupType = createGroupTypeDefinition(VFC_GROUP_TYPE, "tosca.groups.Root",
"Groups of VFCs with same parent port role");
@@ -250,7 +335,7 @@ public class YamlTemplateParsingHandlerTest {
return property;
}
private static GroupProperty createGroupProperty(String name, String description,
- String status){
+ String status){
GroupProperty property = new GroupProperty();
if (name != null)
property.setName(name);
@@ -268,69 +353,38 @@ public class YamlTemplateParsingHandlerTest {
return property;
}
- @Test
- public void testSetArtifacts() {
- UploadComponentInstanceInfo nodeTemplateInfo = new UploadComponentInstanceInfo();
- Map<String, Object> nodeTemplateJsonMap = new HashMap<>();
- Map<String, String> nodeMap = new HashMap<>();
- nodeMap.put("name","test_name");
- nodeMap.put("type","test_type");
- nodeTemplateJsonMap.put(ARTIFACTS.getElementName(), nodeMap);
- Deencapsulation.invoke(testSubject, "setArtifacts", nodeTemplateInfo, nodeTemplateJsonMap);
- assertNotNull(nodeTemplateInfo.getArtifacts());
- }
- @Test
- public void testCreateArtifactsModuleFromYaml() {
- Map<String, Map<String, Map<String, String>>> nodeTemplateJsonMap = new HashMap<>();
- Map<String, Map<String,String>> map0 = new HashMap<>();
- Map<String, String> map1 = new HashMap<>();
- map1.put("file", "test_file");
- map1.put("type", "test_type");
- map0.put("test_art", map1);
- nodeTemplateJsonMap.put(ARTIFACTS.getElementName(), map0);
- Map<String, Map<String, UploadArtifactInfo>> result;
- result = Deencapsulation.invoke(testSubject, "createArtifactsModuleFromYaml", nodeTemplateJsonMap);
- Assert.assertTrue(MapUtils.isNotEmpty(result));
- Assert.assertTrue(MapUtils.isNotEmpty(result.get(ARTIFACTS.getElementName())));
- Assert.assertEquals("test_file", result.get(ARTIFACTS.getElementName()).get("test_art").getFile());
- Assert.assertEquals("test_type", result.get(ARTIFACTS.getElementName()).get("test_art").getType());
+ private void validateParsedYamlWithPolicies(ParsedToscaYamlInfo parsedYaml) {
+ // validate policies
+ assertThat(parsedYaml.getPolicies()).isNotNull();
+ assertThat(parsedYaml.getPolicies()).containsKey(OPENECOMP_POLICY_NAME);
+ assertThat(parsedYaml.getPolicies().get(OPENECOMP_POLICY_NAME)).isInstanceOf(PolicyDefinition.class);
}
- @Test
- public void testAddModuleNodeTemplateArtifacts() {
- Map<String, Map<String, UploadArtifactInfo>> result = new HashMap<>();
- Map<String, String> map1 = new HashMap<>();
- map1.put("file", "test_file");
- map1.put("type", "test_type");
- Deencapsulation.invoke(testSubject, "addModuleNodeTemplateArtifacts", result, map1, "test_art");
- Assert.assertTrue(MapUtils.isNotEmpty(result));
- Assert.assertTrue(MapUtils.isNotEmpty(result.get(ARTIFACTS.getElementName())));
- Assert.assertEquals("test_file", result.get(ARTIFACTS.getElementName()).get("test_art").getFile());
- Assert.assertEquals("test_type", result.get(ARTIFACTS.getElementName()).get("test_art").getType());
+ private void stubGetPolicyType () {
+ when(policyTypeBusinessLogic.getLatestPolicyTypeByType(eq(OPENECOMP_ANTILOCATE_POLICY_TYPE))).thenReturn(
+ OPENECOMP_POLICY_TYPE);
}
- @Test
- public void testBuildModuleNodeTemplateArtifact() {
- Map<String, String> map1 = new HashMap<>();
- map1.put("file", "test_file");
- map1.put("type", "test_type");
- UploadArtifactInfo result;
- result = Deencapsulation.invoke(testSubject, "buildModuleNodeTemplateArtifact", map1);
- assertNotNull(result);
- Assert.assertEquals("test_file", result.getFile());
- Assert.assertEquals("test_type", result.getType());
+ private static PolicyTypeDefinition buildOpenecompPolicyType() {
+ return createPolicyTypeDefinition(OPENECOMP_POLICY_NAME, OPENECOMP_ANTILOCATE_POLICY_TYPE, ROOT_POLICIES_TYPE,
+ "The Openecomp Antilocate policy");
}
- @Test
- public void testFillArtifact() {
- Map<String, String> map1 = new HashMap<>();
- map1.put("file", "test_file");
- map1.put("type", "test_type");
- UploadArtifactInfo result = new UploadArtifactInfo();
- Deencapsulation.invoke(testSubject, "fillArtifact", result, map1);
- assertNotNull(result);
- Assert.assertEquals("test_file", result.getFile());
- Assert.assertEquals("test_type", result.getType());
+ private static PolicyTypeDefinition createPolicyTypeDefinition(String policyName, String policyType, String derivedFrom, String description) {
+ PolicyTypeDefinition policyTypeDefinition = new PolicyTypeDefinition();
+ if (policyName != null && !policyName.isEmpty()) {
+ policyTypeDefinition.setName(policyName);
+ }
+ if (policyType != null) {
+ policyTypeDefinition.setType(policyType);
+ }
+ if (derivedFrom != null) {
+ policyTypeDefinition.setDerivedFrom(derivedFrom);
+ }
+ if (description != null) {
+ policyTypeDefinition.setDescription(description);
+ }
+ return policyTypeDefinition;
}
}
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTest.java
index a27c959a2e..48c2c9c2a2 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/lifecycle/CheckoutTest.java
@@ -30,6 +30,7 @@ import org.openecomp.sdc.be.components.csar.CsarBusinessLogic;
import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
import org.openecomp.sdc.be.components.impl.CompositionBusinessLogic;
import org.openecomp.sdc.be.components.impl.InputsBusinessLogic;
+import org.openecomp.sdc.be.components.impl.PolicyBusinessLogic;
import org.openecomp.sdc.be.components.impl.PropertyBusinessLogic;
import org.openecomp.sdc.be.components.impl.ResourceBusinessLogic;
import org.openecomp.sdc.be.components.impl.ResourceImportManager;
@@ -64,7 +65,7 @@ public class CheckoutTest extends LifecycleTestBase {
private final PropertyBusinessLogic propertyBusinessLogic = Mockito.mock(PropertyBusinessLogic.class);
protected ComponentContactIdValidator componentContactIdValidator = new ComponentContactIdValidator(componentsUtils);
protected ComponentNameValidator componentNameValidator = new ComponentNameValidator(componentsUtils, toscaOperationFacade);
-
+ private final PolicyBusinessLogic policyBusinessLogic = Mockito.mock(PolicyBusinessLogic.class);
@InjectMocks
ResourceBusinessLogic bl = new ResourceBusinessLogic(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation,
groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation, artifactsBusinessLogic,
@@ -72,7 +73,7 @@ public class CheckoutTest extends LifecycleTestBase {
resourceDataMergeBusinessLogic, csarArtifactsAndGroupsBusinessLogic, mergeInstanceUtils,
uiComponentDataConverter, csarBusinessLogic, artifactToscaOperation, propertyBusinessLogic,
componentContactIdValidator, componentNameValidator, componentTagsValidator, componentValidator,
- componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator );
+ componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator ,policyBusinessLogic);
@Before
public void setup() {
diff --git a/catalog-be/src/test/resources/config/catalog-be/error-configuration.yaml b/catalog-be/src/test/resources/config/catalog-be/error-configuration.yaml
index 39316c62f9..a28f31b1b0 100644
--- a/catalog-be/src/test/resources/config/catalog-be/error-configuration.yaml
+++ b/catalog-be/src/test/resources/config/catalog-be/error-configuration.yaml
@@ -2239,3 +2239,18 @@ errors:
message: 'Error: Invalid Content. %1 has invalid format.',
messageId: "SVC4723"
}
+ #---------SVC4801------------------------------
+ # %1 - policy type
+ POLICY_TYPE_IS_INVALID: {
+ code: 400,
+ message: "Error: Invalid content. Policy type %1 does not exist",
+ messageId: "SVC4801"
+ }
+
+ #---------SVC4802------------------------------
+ # %1 - policy name
+ POLICY_MISSING_POLICY_TYPE: {
+ code: 400,
+ message: "Error: Invalid content. Type name is not defined for policy %1",
+ messageId: "SVC4802"
+ }
diff --git a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java
index bbd9db3a7b..09824fc16d 100644
--- a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java
+++ b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java
@@ -106,7 +106,7 @@ public enum ActionStatus {
RESOURCE_CANNOT_CONTAIN_POLICIES,
POLICY_NOT_FOUND_ON_CONTAINER,
INVALID_POLICY_NAME,
- POLICY_NAME_ALREADY_EXIST, EXCLUDED_POLICY_TYPE,
+ POLICY_NAME_ALREADY_EXIST, EXCLUDED_POLICY_TYPE, POLICY_MISSING_POLICY_TYPE, POLICY_TYPE_IS_INVALID,
//External References Statuses
EXT_REF_ALREADY_EXIST,
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ParsedToscaYamlInfo.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ParsedToscaYamlInfo.java
index f975806c88..a6f4165aeb 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ParsedToscaYamlInfo.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ParsedToscaYamlInfo.java
@@ -21,41 +21,16 @@
package org.openecomp.sdc.be.model;
import java.util.Map;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+@ToString
+@Getter
+@Setter
public class ParsedToscaYamlInfo {
Map<String, InputDefinition> inputs;
-
Map<String, UploadComponentInstanceInfo> instances;
-
Map<String, GroupDefinition> groups;
-
- public Map<String, UploadComponentInstanceInfo> getInstances() {
- return instances;
- }
-
- public void setInstances(Map<String, UploadComponentInstanceInfo> instances) {
- this.instances = instances;
- }
-
- public Map<String, GroupDefinition> getGroups() {
- return groups;
- }
-
- public void setGroups(Map<String, GroupDefinition> groups) {
- this.groups = groups;
- }
-
- public Map<String, InputDefinition> getInputs() {
- return inputs;
- }
-
- public void setInputs(Map<String, InputDefinition> inputs) {
- this.inputs = inputs;
- }
-
- @Override
- public String toString() {
- return "ParsedToscaYamlInfo [inputs=" + inputs + ", instances=" + instances + ", groups=" + groups + "]";
- }
-
+ Map<String, PolicyDefinition> policies;
}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCache.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCache.java
index fb49762736..25a305ed9b 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCache.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCache.java
@@ -21,6 +21,7 @@
package org.openecomp.sdc.be.model.cache;
import fj.data.Either;
+import lombok.Getter;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.openecomp.sdc.be.config.BeEcompErrorManager;
@@ -34,6 +35,9 @@ import org.openecomp.sdc.be.model.DataTypeDefinition;
import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
import org.openecomp.sdc.be.resources.data.DataTypeData;
import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@@ -74,6 +78,9 @@ public class ApplicationDataTypeCache implements ApplicationCache<DataTypeDefini
@Resource
private PropertyOperation propertyOperation;
+ @Autowired
+ private ApplicationEventPublisher applicationEventPublisher;
+
@PostConstruct
public void init() {
@@ -313,6 +320,8 @@ public class ApplicationDataTypeCache implements ApplicationCache<DataTypeDefini
w.lock();
data = allDataTypes.left().value();
+ // send notification on data types change
+ onDataChangeEventEmit(data);
BeEcompErrorManager.getInstance().logInternalFlowError("ReplaceDataTypesCache",
"Succeed to replace the data types cache", ErrorSeverity.INFO);
@@ -325,4 +334,22 @@ public class ApplicationDataTypeCache implements ApplicationCache<DataTypeDefini
}
+ private void onDataChangeEventEmit(Map<String, DataTypeDefinition> newData) {
+ log.trace("Cache data has changed, sending event to all listening for this change.");
+ DataTypesCacheChangedEvent dataTypesCacheChangedEvent = new DataTypesCacheChangedEvent(this, newData);
+ applicationEventPublisher.publishEvent(dataTypesCacheChangedEvent);
+ }
+
+ /**
+ * Custom event to notify all interested in cached data changes
+ */
+ public static class DataTypesCacheChangedEvent extends ApplicationEvent {
+ @Getter
+ private Map<String, DataTypeDefinition> newData;
+
+ public DataTypesCacheChangedEvent(Object source, Map<String, DataTypeDefinition> newData) {
+ super(source);
+ this.newData = newData;
+ }
+ }
}
diff --git a/catalog-model/src/test/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCacheTest.java b/catalog-model/src/test/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCacheTest.java
index 481894c0c3..7186d2a8bf 100644
--- a/catalog-model/src/test/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCacheTest.java
+++ b/catalog-model/src/test/java/org/openecomp/sdc/be/model/cache/ApplicationDataTypeCacheTest.java
@@ -39,6 +39,7 @@ import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import org.springframework.context.ApplicationEventPublisher;
public class ApplicationDataTypeCacheTest extends ModelConfDependentTest{
@@ -48,6 +49,9 @@ public class ApplicationDataTypeCacheTest extends ModelConfDependentTest{
@Mock
PropertyOperation propertyOperation;
+ @Mock
+ ApplicationEventPublisher applicationEventPublisher;
+
@Before
public void setUpMocks() throws Exception {
MockitoAnnotations.initMocks(this);
diff --git a/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java b/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java
index f68f217014..5198be967e 100644
--- a/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java
+++ b/common-be/src/main/java/org/openecomp/sdc/be/utils/TypeUtils.java
@@ -46,7 +46,7 @@ public class TypeUtils {
// Group Types
MEMBERS("members"), METADATA("metadata"),
// Policy Types
- TARGETS("targets"),
+ POLICIES("policies"), TARGETS("targets"),
// Capabilities
CAPABILITIES("capabilities"), VALID_SOURCE_TYPES("valid_source_types"),
// Requirements