+ 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;
+ }
+