X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=catalog-be%2Fsrc%2Fmain%2Fjava%2Forg%2Fopenecomp%2Fsdc%2Fbe%2Fcomponents%2Fcsar%2FYamlTemplateParsingHandler.java;h=5556548b50c6aba7396fbeb43fcadd1468f2677e;hb=39dd951527bf62568cf5815a6b1e4901c2b89c3f;hp=bdb659b259cc22229870c79c8b301709e3dbddd0;hpb=468d0770593e167990df815e45cde717bd845d18;p=sdc.git 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 bdb659b259..5556548b50 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 @@ -90,6 +90,7 @@ 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.ServiceBusinessLogic; import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException; import org.openecomp.sdc.be.components.utils.PropertiesUtils; import org.openecomp.sdc.be.config.BeEcompErrorManager; @@ -108,12 +109,10 @@ import org.openecomp.sdc.be.datatypes.elements.SubPropertyToscaFunction; import org.openecomp.sdc.be.datatypes.elements.SubstitutionFilterPropertyDataDefinition; import org.openecomp.sdc.be.datatypes.elements.ToscaFunction; import org.openecomp.sdc.be.datatypes.elements.ToscaGetFunctionDataDefinition; -import org.openecomp.sdc.be.datatypes.enums.ConstraintType; import org.openecomp.sdc.be.datatypes.elements.ToscaFunctionType; +import org.openecomp.sdc.be.datatypes.enums.ConstraintType; import org.openecomp.sdc.be.datatypes.enums.FilterValueType; import org.openecomp.sdc.be.datatypes.enums.PropertyFilterTargetType; -import org.openecomp.sdc.be.datatypes.enums.PropertySource; -import org.openecomp.sdc.be.datatypes.tosca.ToscaGetFunctionType; import org.openecomp.sdc.be.model.CapabilityDefinition; import org.openecomp.sdc.be.model.Component; import org.openecomp.sdc.be.model.ComponentInstanceProperty; @@ -126,6 +125,7 @@ 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.PropertyDefinition; +import org.openecomp.sdc.be.model.Resource; import org.openecomp.sdc.be.model.UploadArtifactInfo; import org.openecomp.sdc.be.model.UploadAttributeInfo; import org.openecomp.sdc.be.model.UploadCapInfo; @@ -157,18 +157,21 @@ public class YamlTemplateParsingHandler { private final GroupTypeBusinessLogic groupTypeBusinessLogic; private final AnnotationBusinessLogic annotationBusinessLogic; private final PolicyTypeBusinessLogic policyTypeBusinessLogic; + private final ServiceBusinessLogic serviceBusinessLogic; private final ToscaFunctionYamlParsingHandler toscaFunctionYamlParsingHandler; public YamlTemplateParsingHandler(JanusGraphDao janusGraphDao, GroupTypeBusinessLogic groupTypeBusinessLogic, AnnotationBusinessLogic annotationBusinessLogic, PolicyTypeBusinessLogic policyTypeBusinessLogic, + ServiceBusinessLogic serviceBusinessLogic, final ToscaFunctionYamlParsingHandler toscaFunctionYamlParsingHandler ) { this.janusGraphDao = janusGraphDao; this.groupTypeBusinessLogic = groupTypeBusinessLogic; this.annotationBusinessLogic = annotationBusinessLogic; this.policyTypeBusinessLogic = policyTypeBusinessLogic; + this.serviceBusinessLogic = serviceBusinessLogic; this.toscaFunctionYamlParsingHandler = toscaFunctionYamlParsingHandler; } @@ -195,8 +198,13 @@ public class YamlTemplateParsingHandler { parsedToscaYamlInfo.setPolicies(getPolicies(mappedToscaTemplate, component.getModel())); Map substitutionMappings = getSubstitutionMappings(mappedToscaTemplate); if (substitutionMappings != null) { - if (component.isService() && !interfaceTemplateYaml.isEmpty()) { - parsedToscaYamlInfo.setProperties(getProperties(loadYamlAsStrictMap(interfaceTemplateYaml))); + if (component.isService()) { + if (interfaceTemplateYaml.isEmpty()) { + List properties = serviceBusinessLogic.fetchDerivedFromGenericType(component, null).getProperties(); + parsedToscaYamlInfo.setProperties(properties.stream().collect(Collectors.toMap(PropertyDefinition::getName, prop -> prop))); + } else { + parsedToscaYamlInfo.setProperties(getProperties(loadYamlAsStrictMap(interfaceTemplateYaml))); + } parsedToscaYamlInfo.setSubstitutionFilterProperties(getSubstitutionFilterProperties(mappedToscaTemplate)); } if (substitutionMappings.get("properties") != null) { @@ -249,21 +257,30 @@ public class YamlTemplateParsingHandler { return ImportUtils.getProperties(toscaJson).left().on(err -> new HashMap<>()); } - private ListDataDefinition getSubstitutionFilterProperties(Map toscaJson) { - ListDataDefinition propertyList = new ListDataDefinition<>(); - Map substitutionFilters = findFirstToscaMapElement(toscaJson, SUBSTITUTION_FILTERS).left().on(err -> new HashMap<>()); + private ListDataDefinition getSubstitutionFilterProperties(final Map toscaJson) { + final ListDataDefinition propertyList = new ListDataDefinition<>(); + final Map substitutionFilters = findFirstToscaMapElement(toscaJson, SUBSTITUTION_FILTERS).left().on(err -> new HashMap<>()); if (MapUtils.isEmpty(substitutionFilters)) { return propertyList; } - ArrayList>>> substitutionFilterProperties = - (ArrayList>>>) substitutionFilters.get("properties"); + final List> substitutionFilterProperties = (List>) substitutionFilters.get("properties"); if (CollectionUtils.isEmpty(substitutionFilterProperties)) { return propertyList; } - for (Map>> filterProps : substitutionFilterProperties) { - for (Map.Entry>> propertyFilterEntry : filterProps.entrySet()) { + for (final Map filterProps : substitutionFilterProperties) { + for (final Map.Entry propertyFilterEntry : filterProps.entrySet()) { final String propertyName = propertyFilterEntry.getKey(); - for (Map filterValueMap : propertyFilterEntry.getValue()) { + final Object value = propertyFilterEntry.getValue(); + if (value instanceof List) { + final List> propertyFilterEntryValue = (List>) value; + for (final Map filterValueMap : propertyFilterEntryValue) { + final var substitutionFilterPropertyDataDefinition = new SubstitutionFilterPropertyDataDefinition(); + substitutionFilterPropertyDataDefinition.setName(propertyName); + substitutionFilterPropertyDataDefinition.setConstraints(createSubstitutionFilterConstraints(propertyName, filterValueMap)); + propertyList.add(substitutionFilterPropertyDataDefinition); + } + } else if (value instanceof Map) { + final Map filterValueMap = (Map) value; final var substitutionFilterPropertyDataDefinition = new SubstitutionFilterPropertyDataDefinition(); substitutionFilterPropertyDataDefinition.setName(propertyName); substitutionFilterPropertyDataDefinition.setConstraints(createSubstitutionFilterConstraints(propertyName, filterValueMap)); @@ -825,6 +842,7 @@ public class YamlTemplateParsingHandler { setDirectives(nodeTemplateInfo, nodeTemplateJsonMap); setNodeFilter(nodeTemplateInfo, nodeTemplateJsonMap); setSubstitutions(substitutionMappings, nodeTemplateInfo); + setOccurrencesAndInstanceCount(nodeTemplateInfo, nodeTemplateJsonMap); } else { rollbackWithException(ActionStatus.NOT_TOPOLOGY_TOSCA_TEMPLATE); } @@ -933,6 +951,24 @@ public class YamlTemplateParsingHandler { } } + @SuppressWarnings("unchecked") + private void setOccurrencesAndInstanceCount(UploadComponentInstanceInfo nodeTemplateInfo, Map nodeTemplateJsonMap) { + if (nodeTemplateJsonMap.containsKey(TypeUtils.ToscaTagNamesEnum.OCCURRENCES.getElementName())) { + List occurrences = (List) nodeTemplateJsonMap.get(TypeUtils.ToscaTagNamesEnum.OCCURRENCES.getElementName()); + nodeTemplateInfo.setMinOccurrences(occurrences.get(0).toString()); + nodeTemplateInfo.setMaxOccurrences(occurrences.get(1).toString()); + } + if (nodeTemplateJsonMap.containsKey(TypeUtils.ToscaTagNamesEnum.INSTANCE_COUNT.getElementName())) { + Object instanceCount = nodeTemplateJsonMap.get(TypeUtils.ToscaTagNamesEnum.INSTANCE_COUNT.getElementName()); + if (instanceCount instanceof Map) { + String instanceCountAsString = "{get_input:" + (String)((Map)instanceCount).get("get_input") + "}"; + nodeTemplateInfo.setInstanceCount(instanceCountAsString); + } else { + nodeTemplateInfo.setInstanceCount(instanceCount.toString()); + } + } + } + @SuppressWarnings("unchecked") private Map> createReqModuleFromYaml(Map nodeTemplateJsonMap, String nodeName) { Map> moduleRequirements = new HashMap<>(); @@ -1189,7 +1225,8 @@ public class YamlTemplateParsingHandler { if (toscaFunctionYamlParsingHandler.isPropertyValueToscaFunction(propValueObj)) { toscaFunctionYamlParsingHandler.buildToscaFunctionBasedOnPropertyValue(propValueMap).ifPresent(propertyDef::setToscaFunction); } else { - final Collection subPropertyToscaFunctions = buildSubPropertyToscaFunctions(propValueMap, new ArrayList<>()); + final Collection subPropertyToscaFunctions = + buildSubPropertyToscaFunctions(propValueMap, new ArrayList<>()); if (CollectionUtils.isNotEmpty(subPropertyToscaFunctions)) { Collection existingSubPropertyToscaFunctions = propertyDef.getSubPropertyToscaFunctions(); if (existingSubPropertyToscaFunctions == null) { @@ -1216,7 +1253,7 @@ public class YamlTemplateParsingHandler { } return propertyDef; } - + private Collection buildSubPropertyToscaFunctions(final Map propValueMap, final List path) { Collection subPropertyToscaFunctions = new ArrayList<>(); propValueMap.entrySet().stream().filter(entry -> entry.getValue() instanceof Map).forEach(entry -> { @@ -1224,7 +1261,7 @@ public class YamlTemplateParsingHandler { subPropertyPath.add(entry.getKey()); if (ToscaFunctionType.findType(((Map) entry.getValue()).keySet().iterator().next()).isPresent()) { Optional toscaFunction = - toscaFunctionYamlParsingHandler.buildToscaFunctionBasedOnPropertyValue((Map) entry.getValue()); + toscaFunctionYamlParsingHandler.buildToscaFunctionBasedOnPropertyValue((Map) entry.getValue()); if (toscaFunction.isPresent()) { SubPropertyToscaFunction subPropertyToscaFunction = new SubPropertyToscaFunction(); subPropertyToscaFunction.setToscaFunction(toscaFunction.get()); @@ -1288,12 +1325,24 @@ public class YamlTemplateParsingHandler { final OperationInputDefinition operationInput ) { if (value instanceof Map) { + final Map valueMap = (Map) value; log.debug("Creating interface operation input '{}'", inputName); Type type = new TypeToken>() { }.getType(); String stringValue = gson.toJson(value, type); if (toscaFunctionYamlParsingHandler.isPropertyValueToscaFunction(value)) { - toscaFunctionYamlParsingHandler.buildToscaFunctionBasedOnPropertyValue((Map) value).ifPresent(operationInput::setToscaFunction); + toscaFunctionYamlParsingHandler.buildToscaFunctionBasedOnPropertyValue((Map) value) + .ifPresent(operationInput::setToscaFunction); + } else { + final Collection subPropertyToscaFunctions = buildSubPropertyToscaFunctions(valueMap, new ArrayList<>()); + if (CollectionUtils.isNotEmpty(subPropertyToscaFunctions)) { + Collection existingSubPropertyToscaFunctions = operationInput.getSubPropertyToscaFunctions(); + if (existingSubPropertyToscaFunctions == null) { + operationInput.setSubPropertyToscaFunctions(subPropertyToscaFunctions); + } else { + operationInput.getSubPropertyToscaFunctions().addAll(subPropertyToscaFunctions); + } + } } operationInput.setValue(stringValue); } @@ -1350,6 +1399,13 @@ public class YamlTemplateParsingHandler { artifactDataDefinition.setArtifactName(generateArtifactName(primary.toString())); } } + + if (operationDefinitionMap.get(IMPLEMENTATION.getElementName()) instanceof Map && + ((Map) operationDefinitionMap.get(IMPLEMENTATION.getElementName())).containsKey("timeout")) { + final Object timeOut = ((Map) operationDefinitionMap.get(IMPLEMENTATION.getElementName())).get("timeout"); + artifactDataDefinition.setTimeout((Integer)timeOut); + } + if (operationDefinitionMap.get(IMPLEMENTATION.getElementName()) instanceof String) { final String implementation = (String) operationDefinitionMap.get(IMPLEMENTATION.getElementName()); artifactDataDefinition.setArtifactName(generateArtifactName(implementation)); @@ -1392,9 +1448,10 @@ public class YamlTemplateParsingHandler { for (Object objValue : propValueList) { if (objValue instanceof Map) { Map objMap = (Map) objValue; - Map propValueMap = new HashMap(); - propValueMap.put(String.valueOf(index),objValue); - final Collection subPropertyToscaFunctions = buildSubPropertyToscaFunctions(propValueMap, new ArrayList<>()); + Map propValueMap = new HashMap<>(); + propValueMap.put(String.valueOf(index), objValue); + final Collection subPropertyToscaFunctions = + buildSubPropertyToscaFunctions(propValueMap, new ArrayList<>()); if (CollectionUtils.isNotEmpty(subPropertyToscaFunctions)) { Collection existingSubPropertyToscaFunctions = propertyDef.getSubPropertyToscaFunctions(); if (existingSubPropertyToscaFunctions == null) {