X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Faai%2Fbabel%2Fparser%2FArtifactGeneratorToscaParser.java;h=0777e516fc0a2963b293a4a9311d12599824f039;hb=refs%2Fchanges%2F37%2F83637%2F1;hp=6e375876b3f46db334fcd0bef4a4726a23110f63;hpb=5a6fd49a6aca3a567464527335b107746e28f3bd;p=aai%2Fbabel.git diff --git a/src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java b/src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java index 6e37587..0777e51 100644 --- a/src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java +++ b/src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java @@ -25,15 +25,15 @@ import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.Properties; +import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; import org.onap.aai.babel.logging.LogHelper; @@ -43,13 +43,16 @@ import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil; import org.onap.aai.babel.xml.generator.model.Model; import org.onap.aai.babel.xml.generator.model.Resource; import org.onap.aai.babel.xml.generator.model.Widget; -import org.onap.aai.babel.xml.generator.model.Widget.Type; +import org.onap.aai.babel.xml.generator.model.WidgetType; import org.onap.aai.babel.xml.generator.types.ModelType; import org.onap.aai.cl.api.Logger; import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; +import org.onap.sdc.tosca.parser.impl.SdcPropertyNames; +import org.onap.sdc.tosca.parser.utils.SdcToscaUtility; import org.onap.sdc.toscaparser.api.Group; import org.onap.sdc.toscaparser.api.NodeTemplate; import org.onap.sdc.toscaparser.api.Property; +import org.onap.sdc.toscaparser.api.SubstitutionMappings; import org.onap.sdc.toscaparser.api.elements.Metadata; /** @@ -60,7 +63,6 @@ public class ArtifactGeneratorToscaParser { private static Logger log = LogHelper.INSTANCE; - public static final String PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE = "artifactgenerator.config"; public static final String PROPERTY_TOSCA_MAPPING_FILE = "tosca.mappings.config"; public static final String GENERATOR_AAI_CONFIGLOCATION_NOT_FOUND = @@ -93,33 +95,9 @@ public class ArtifactGeneratorToscaParser { this.csarHelper = csarHelper; } - /** - * Initializes the Widget to UUID mapping configuration. - * - * @throws IOException - * if an error occurs reading the configuration properties - */ - public static void initWidgetConfiguration() throws IOException { - log.debug("Getting Widget Configuration"); - String configLocation = System.getProperty(PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE); - if (configLocation != null) { - File file = new File(configLocation); - if (file.exists()) { - Properties properties = new Properties(); - properties.load(new FileInputStream(file)); - WidgetConfigurationUtil.setConfig(properties); - } else { - throw new IllegalArgumentException(String.format(GENERATOR_AAI_CONFIGFILE_NOT_FOUND, configLocation)); - } - } else { - throw new IllegalArgumentException( - String.format(GENERATOR_AAI_CONFIGLOCATION_NOT_FOUND, PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE)); - } - } - /** * Initializes the group filtering and TOSCA to Widget mapping configuration. - * + * * @param configLocation * the pathname to the JSON mappings file * @throws IOException @@ -162,7 +140,7 @@ public class ArtifactGeneratorToscaParser { throws XmlArtifactGenerationException { List resources = new ArrayList<>(); if (serviceNodeTemplate.getSubMappingToscaTemplate() != null) { - List serviceGroups = csarHelper.getGroupsOfOriginOfNodeTemplate(serviceNodeTemplate); + List serviceGroups = serviceNodeTemplate.getSubMappingToscaTemplate().getGroups(); for (Group group : serviceGroups) { if (WidgetConfigurationUtil.isSupportedInstanceGroup(group.getType())) { resources.addAll(processInstanceGroup(resourceModel, group.getMemberNodes(), @@ -191,14 +169,14 @@ public class ArtifactGeneratorToscaParser { } public Resource createInstanceGroupModel(Map properties) { - Resource groupModel = new Resource(Type.INSTANCE_GROUP, true); + Resource groupModel = new Resource(WidgetType.valueOf("INSTANCE_GROUP"), true); groupModel.populateModelIdentificationInformation(properties); return groupModel; } /** * Add the resource/widget to the specified model. - * + * * @param model * @param relation * resource or widget model to add @@ -209,7 +187,7 @@ public class ArtifactGeneratorToscaParser { if (relation.getModelType() == ModelType.RESOURCE) { model.addResource(relation); } else { - model.addWidget(Widget.getWidget(relation.getWidgetType())); + model.addWidget(Widget.createWidget(relation.getWidgetType())); } } @@ -226,29 +204,51 @@ public class ArtifactGeneratorToscaParser { * * @param resources * @param model - * @param serviceNode + * @param serviceVfNode + * a VF resource Node Template * @throws XmlArtifactGenerationException + * if the configured widget mappings do not support the widget type of a VF Module */ - public void processVfModules(List resources, Model resourceModel, NodeTemplate serviceNode) + public void processVfModules(List resources, Model resourceModel, NodeTemplate serviceVfNode) throws XmlArtifactGenerationException { - // Get the customisation UUID for each VF node and use it to get its Groups - String uuid = csarHelper.getNodeTemplateCustomizationUuid(serviceNode); - List serviceGroups = csarHelper.getVfModulesByVf(uuid); - // Process each VF Group - for (Group serviceGroup : serviceGroups) { + for (Group serviceGroup : getVfModuleGroups(serviceVfNode)) { Model groupModel = Model.getModelFor(serviceGroup.getType()); - if (groupModel.getWidgetType() == Type.VFMODULE) { - processVfModule(resources, resourceModel, serviceGroup, serviceNode, (Resource) groupModel); + if (groupModel.hasWidgetType("VFMODULE")) { + processVfModule(resources, resourceModel, serviceGroup, serviceVfNode, (Resource) groupModel); } } } /** + * Implementation taken from the sdc-tosca parser (deprecated method). + * + * @param serviceVfNode + * a VF resource Node Template + * @return all service level VfModule groups with a name matching that of the supplied VF node template + */ + private List getVfModuleGroups(NodeTemplate serviceVfNode) { + String instanceName = SdcToscaUtility.normaliseComponentInstanceName(serviceVfNode.getName()); + + return ToscaParser.getServiceLevelGroups(csarHelper).stream() + .filter(group -> "org.openecomp.groups.VfModule".equals(group.getTypeDefinition().getType()) + && group.getName().startsWith(instanceName)) + .collect(Collectors.toList()); + } + + /** + * Add each of the resources to the specified resourceModel. If the resourceModel type is Allotted Resource then + * validate that one of the resources is a Providing Service. + * * @param resourceModel + * parent Resource model * @param resourceNodeTemplates + * the child node templates of the resourceModel + * @throws XmlArtifactGenerationException + * if the resourceModel is an ALLOTTED_RESOURCE with no Providing Service */ - public void processResourceModels(Model resourceModel, List resourceNodeTemplates) { + public void processResourceModels(Resource resourceModel, List resourceNodeTemplates) + throws XmlArtifactGenerationException { boolean foundProvidingService = false; for (NodeTemplate resourceNodeTemplate : resourceNodeTemplates) { @@ -258,8 +258,8 @@ public class ArtifactGeneratorToscaParser { Resource model = Model.getModelFor(nodeTypeName, metaDataType); if (metadata != null && hasAllottedResource(metadata.getAllProperties()) - && model.getWidgetType() == Type.VSERVER) { - model = new Resource(Type.ALLOTTED_RESOURCE, false); + && model.hasWidgetType("VSERVER")) { + model = new Resource(WidgetType.valueOf("ALLOTTED_RESOURCE"), false); Map props = new HashMap<>(); props.put("providingService", true); model.setProperties(props); @@ -268,10 +268,9 @@ public class ArtifactGeneratorToscaParser { foundProvidingService |= processModel(resourceModel, metadata, model, resourceNodeTemplate.getProperties()); } - if (resourceModel.getWidgetType() == Type.ALLOTTED_RESOURCE && !foundProvidingService) { - final String modelInvariantId = resourceModel.getModelId(); - throw new IllegalArgumentException(String.format(GENERATOR_AAI_PROVIDING_SERVICE_MISSING, - modelInvariantId == null ? "" : modelInvariantId)); + if (resourceModel.hasWidgetType("ALLOTTED_RESOURCE") && !foundProvidingService) { + throw new XmlArtifactGenerationException(String.format(GENERATOR_AAI_PROVIDING_SERVICE_MISSING, + Optional.ofNullable(resourceModel.getModelId()).orElse(""))); } } @@ -341,12 +340,26 @@ public class ArtifactGeneratorToscaParser { return resources; } + /** + * @param resources + * @param vfModel + * @param groupDefinition + * @param serviceNode + * @param groupModel + * @throws XmlArtifactGenerationException + * if the configured widget mappings do not support the widget type of a VF Module + */ private void processVfModule(List resources, Model vfModel, Group groupDefinition, NodeTemplate serviceNode, Resource groupModel) throws XmlArtifactGenerationException { groupModel.populateModelIdentificationInformation( mergeProperties(groupDefinition.getMetadata().getAllProperties(), groupDefinition.getProperties())); - processVfModuleGroup(groupModel, csarHelper.getMembersOfVfModule(serviceNode, groupDefinition)); + + SubstitutionMappings substitutionMappings = serviceNode.getSubMappingToscaTemplate(); + if (substitutionMappings != null) { + processVfModuleGroup(groupModel, getVfModuleMembers(substitutionMappings, + groupDefinition.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID))); + } vfModel.addResource(groupModel); // Add group (VfModule) to the (VF) model // Check if we have already encountered the same VfModule across all the artifacts @@ -355,6 +368,35 @@ public class ArtifactGeneratorToscaParser { } } + /** + * @param substitutionMappings + * @param vfModuleInvariantUuid + * @return all serviceNode child Node Templates which are members of the first VF Module Group + */ + private List getVfModuleMembers(SubstitutionMappings substitutionMappings, + String vfModuleInvariantUuid) { + return Optional.ofNullable(substitutionMappings.getGroups()) // + .map(groups -> groups.stream() // + .filter(filterByVfModuleInvariantUuid(vfModuleInvariantUuid)) // + .findFirst().map(module -> Optional.ofNullable(module.getMembers()).orElse(new ArrayList<>())) + .orElse(new ArrayList<>())) + .map(members -> substitutionMappings.getNodeTemplates().stream() + .filter(nt -> members.contains(nt.getName())) // + .collect(Collectors.toList())) + .orElse(Collections.emptyList()); + } + + private Predicate filterByVfModuleInvariantUuid(String vfModuleInvariantUuid) { + return nt -> (nt.getMetadata() != null && vfModuleInvariantUuid + .equals(nt.getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_VFMODULEMODELINVARIANTUUID))); + } + + /** + * @param groupModel + * @param members + * @throws XmlArtifactGenerationException + * if the configured widget mappings do not support the widget type of a member + */ private void processVfModuleGroup(Resource groupModel, List members) throws XmlArtifactGenerationException { if (members != null && !members.isEmpty()) { @@ -369,23 +411,26 @@ public class ArtifactGeneratorToscaParser { /** * Process the Widget members of a VF Module Group - * + * * @param group + * the group resource model * @param member + * the group member to process * @throws XmlArtifactGenerationException + * if the configured widget mappings do not support the widget type of the member */ private void processGroupMembers(Resource group, NodeTemplate member) throws XmlArtifactGenerationException { Resource resource = Model.getModelFor(member.getType()); log.debug(member.getType() + " mapped to " + resource); - if (resource.getWidgetType() == Type.L3_NET) { + if (resource.hasWidgetType("L3_NET")) { // An l3-network inside a vf-module is treated as a Widget resource.setModelType(ModelType.WIDGET); } if (resource.getModelType() == ModelType.WIDGET) { - Widget widget = Widget.getWidget(resource.getWidgetType()); + Widget widget = Widget.createWidget(resource.getWidgetType()); widget.addKey(member.getName()); // Add the widget element encountered to the Group model group.addWidget(widget); @@ -426,11 +471,11 @@ public class ArtifactGeneratorToscaParser { if (foundProvidingService) { processProvidingService(resourceModel, resourceNode, nodeProperties); } else if (resourceNode != null && resourceNode.getModelType() == ModelType.RESOURCE - && resourceNode.getWidgetType() != Widget.Type.L3_NET) { + && !resourceNode.hasWidgetType("L3_NET")) { if (metaData != null) { resourceNode.populateModelIdentificationInformation(metaData.getAllProperties()); } - resourceModel.addResource((Resource) resourceNode); + resourceModel.addResource(resourceNode); } return foundProvidingService; }