+ private Map<String, PolicyDefinition> getPolicies(Map<String, Object> toscaJson, String model) {
+ Map<String, Object> mappedTopologyTemplate = (Map<String, Object>) findToscaElement(toscaJson, TOPOLOGY_TEMPLATE, ToscaElementTypeEnum.ALL)
+ .left().on(err -> new HashMap<>());
+ Map<String, Object> foundPolicies = (Map<String, Object>) mappedTopologyTemplate.get(POLICIES.getElementName());
+ if (MapUtils.isNotEmpty(foundPolicies)) {
+ return foundPolicies.entrySet().stream().map(policyToCreate -> createPolicy(policyToCreate, model))
+ .collect(Collectors.toMap(PolicyDefinition::getName, p -> p));
+ }
+ return Collections.emptyMap();
+ }
+
+ private PolicyDefinition createPolicy(Map.Entry<String, Object> policyNameValue, String model) {
+ PolicyDefinition emptyPolicyDef = new PolicyDefinition();
+ String policyName = policyNameValue.getKey();
+ emptyPolicyDef.setName(policyName);
+ try {
+ // There's no need to null test in conjunction with an instanceof test. null is not an instanceof anything, so a null check is redundant.
+ if (policyNameValue.getValue() instanceof Map) {
+ Map<String, Object> policyTemplateJsonMap = (Map<String, Object>) policyNameValue.getValue();
+ validateAndFillPolicy(emptyPolicyDef, policyTemplateJsonMap, model);
+ } 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 void validateAndFillPolicy(PolicyDefinition emptyPolicyDefinition, Map<String, Object> policyTemplateJsonMap, String model) {
+ 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, model);
+ // set policy properties
+ emptyPolicyDefinition.setProperties(validateFillPolicyProperties(policyTypeDefinition, policyTemplateJsonMap));
+ }
+
+ private PolicyTypeDefinition validateGetPolicyTypeDefinition(String policyType, String modelName) {
+ PolicyTypeDefinition policyTypeDefinition = policyTypeBusinessLogic.getLatestPolicyTypeByType(policyType, modelName);
+ 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(final PolicyTypeDefinition policyTypeDefinition,
+ final Map<String, Object> policyTemplateJsonMap) {
+ if (policyTypeDefinition == null || CollectionUtils.isEmpty(policyTypeDefinition.getProperties())
+ || MapUtils.isEmpty(policyTemplateJsonMap)) {
+ return Collections.emptyList();
+ }
+ final Map<String, Object> propertiesJsonMap = (Map<String, Object>) policyTemplateJsonMap.get(PROPERTIES.getElementName());
+ if (MapUtils.isEmpty(propertiesJsonMap)) {
+ return Collections.emptyList();
+ }
+ return propertiesJsonMap.entrySet().stream()
+ .map(propertyJson -> {
+ final PropertyDefinition originalProperty =
+ policyTypeDefinition.getProperties().stream()
+ .filter(propertyDefinition -> propertyDefinition.getName().equals(propertyJson.getKey()))
+ .findFirst()
+ .orElse(null);
+ if (originalProperty == null) {
+ return null;
+ }
+ final UploadPropInfo uploadPropInfo = buildProperty(propertyJson.getKey(), propertyJson.getValue());
+ final PropertyDefinition propertyDefinition = new PropertyDefinition(originalProperty);
+ propertyDefinition.setToscaFunction(uploadPropInfo.getToscaFunction());
+ propertyDefinition.setSubPropertyToscaFunctions(uploadPropInfo.getSubPropertyToscaFunctions());
+ propertyDefinition.setGetInputValues(uploadPropInfo.getGet_input());
+ propertyDefinition.setDescription(uploadPropInfo.getDescription());
+ String propertyValue = gson.toJson(uploadPropInfo.getValue());
+ if (!propertyDefinition.isToscaFunction()) {
+ propertyValue = PropertiesUtils.trimQuotes(propertyValue);
+ }
+ propertyDefinition.setValue(propertyValue);
+ return propertyDefinition;
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+ }
+
+ 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(
+ Map<String, Object> toscaJson,
+ Map<String, String> createdNodesToscaResourceNames
+ ) {
+ Map<String, Object> nodeTemplates = findFirstToscaMapElement(toscaJson, NODE_TEMPLATES)
+ .left().on(err -> new HashMap<>());
+ if (nodeTemplates.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ return getInstances(
+ toscaJson,
+ createdNodesToscaResourceNames,
+ nodeTemplates
+ );
+ }
+
+ private Map<String, UploadComponentInstanceInfo> getInstances(
+ Map<String, Object> toscaJson,
+ Map<String, String> createdNodesToscaResourceNames,
+ Map<String, Object> nodeTemplates
+ ) {