X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Faai%2Fbabel%2Fparser%2FArtifactGeneratorToscaParser.java;h=6e375876b3f46db334fcd0bef4a4726a23110f63;hb=5a6fd49a6aca3a567464527335b107746e28f3bd;hp=cae0324c2a2ef62ce286ef5829f22679b726ccbb;hpb=047862bba53addd381fc7c715ac9e3dff76b740d;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 cae0324..6e37587 100644 --- a/src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java +++ b/src/main/java/org/onap/aai/babel/parser/ArtifactGeneratorToscaParser.java @@ -2,8 +2,8 @@ * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ - * Copyright � 2017-2018 AT&T Intellectual Property. All rights reserved. - * Copyright � 2017-2018 European Software Marketing Ltd. + * Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. + * Copyright (c) 2017-2019 European Software Marketing Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +18,15 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.babel.parser; +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.HashMap; @@ -32,15 +37,14 @@ import java.util.Properties; import java.util.stream.Collectors; import java.util.stream.Stream; import org.onap.aai.babel.logging.LogHelper; +import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException; +import org.onap.aai.babel.xml.generator.data.GroupConfiguration; import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil; -import org.onap.aai.babel.xml.generator.model.AllotedResource; -import org.onap.aai.babel.xml.generator.model.InstanceGroup; -import org.onap.aai.babel.xml.generator.model.L3NetworkWidget; import org.onap.aai.babel.xml.generator.model.Model; -import org.onap.aai.babel.xml.generator.model.ProvidingService; import org.onap.aai.babel.xml.generator.model.Resource; -import org.onap.aai.babel.xml.generator.model.VfModule; 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.types.ModelType; import org.onap.aai.cl.api.Logger; import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; import org.onap.sdc.toscaparser.api.Group; @@ -49,7 +53,7 @@ import org.onap.sdc.toscaparser.api.Property; import org.onap.sdc.toscaparser.api.elements.Metadata; /** - * Wrapper for the sdc-tosca parser + * Wrapper for the sdc-tosca parser. * */ public class ArtifactGeneratorToscaParser { @@ -57,12 +61,13 @@ 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_GROUP_FILTERS_CONFIG_FILE = "groupfilter.config"; + public static final String PROPERTY_TOSCA_MAPPING_FILE = "tosca.mappings.config"; + + public static final String GENERATOR_AAI_CONFIGLOCATION_NOT_FOUND = + "Cannot generate artifacts. System property %s not configured"; private static final String GENERATOR_AAI_CONFIGFILE_NOT_FOUND = "Cannot generate artifacts. Artifact Generator Configuration file not found at %s"; - private static final String GENERATOR_AAI_CONFIGLOCATION_NOT_FOUND = - "Cannot generate artifacts. System property %s not configured"; private static final String GENERATOR_AAI_PROVIDING_SERVICE_METADATA_MISSING = "Cannot generate artifacts. Providing Service Metadata is missing for allotted resource %s"; private static final String GENERATOR_AAI_PROVIDING_SERVICE_MISSING = @@ -82,34 +87,17 @@ public class ArtifactGeneratorToscaParser { * Constructs using csarHelper * * @param csarHelper - * The csar helper + * The csar helper */ public ArtifactGeneratorToscaParser(ISdcCsarHelper csarHelper) { this.csarHelper = csarHelper; } /** - * Get or create the artifact description. - * - * @param model - * the artifact model - * @return the artifact model's description - */ - public static String getArtifactDescription(Model model) { - switch (model.getModelType()) { - case SERVICE: - return "AAI Service Model"; - case RESOURCE: - return "AAI Resource Model"; - default: - return model.getModelDescription(); - } - } - - /** - * Initialises the widget configuration. - * + * 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"); @@ -130,26 +118,35 @@ public class ArtifactGeneratorToscaParser { } /** - * Initialises the group filter configuration. - * + * Initializes the group filtering and TOSCA to Widget mapping configuration. + * + * @param configLocation + * the pathname to the JSON mappings file * @throws IOException + * if the file content could not be read successfully */ - public static void initGroupFilterConfiguration() throws IOException { - log.debug("Getting Filter Tyoes Configuration"); - String configLocation = System.getProperty(PROPERTY_GROUP_FILTERS_CONFIG_FILE); - if (configLocation != null) { - File file = new File(configLocation); - if (file.exists()) { - Properties properties = new Properties(); - properties.load(new FileInputStream(file)); - WidgetConfigurationUtil.setFilterConfig(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_GROUP_FILTERS_CONFIG_FILE)); + public static void initToscaMappingsConfiguration(String configLocation) throws IOException { + log.debug("Getting TOSCA Mappings Configuration"); + File file = new File(configLocation); + if (!file.exists()) { + throw new IllegalArgumentException(String.format(GENERATOR_AAI_CONFIGFILE_NOT_FOUND, configLocation)); } + + GroupConfiguration config; + + try (BufferedReader bufferedReader = new BufferedReader(new FileReader(configLocation))) { + config = new Gson().fromJson(bufferedReader, GroupConfiguration.class); + } catch (JsonSyntaxException e) { + throw new IOException("Invalid Mappings Configuration " + configLocation, e); + } + + if (config == null) { + throw new IOException("There is no content for the Mappings Configuration " + configLocation); + } + + WidgetConfigurationUtil.setSupportedInstanceGroups(config.getInstanceGroupTypes()); + WidgetConfigurationUtil.setWidgetTypes(config.getWidgetTypes()); + WidgetConfigurationUtil.setWidgetMappings(config.getWidgetMappings()); } /** @@ -158,8 +155,11 @@ public class ArtifactGeneratorToscaParser { * @param resourceModel * @param serviceNodeTemplate * @return resources for which XML Models should be generated + * @throws XmlArtifactGenerationException + * if there is no configuration defined for a member Widget of an instance group */ - public List processInstanceGroups(Model resourceModel, NodeTemplate serviceNodeTemplate) { + public List processInstanceGroups(Model resourceModel, NodeTemplate serviceNodeTemplate) + throws XmlArtifactGenerationException { List resources = new ArrayList<>(); if (serviceNodeTemplate.getSubMappingToscaTemplate() != null) { List serviceGroups = csarHelper.getGroupsOfOriginOfNodeTemplate(serviceNodeTemplate); @@ -178,9 +178,9 @@ public class ArtifactGeneratorToscaParser { * duplicate keys then the TOSCA Property value takes precedence. * * @param stringProps - * initial Map of String property values (e.g. from the TOSCA YAML metadata section) + * initial Map of String property values (e.g. from the TOSCA YAML metadata section) * @param toscaProps - * Map of TOSCA Property Type Object values to merge in (or overwrite) + * Map of TOSCA Property Type Object values to merge in (or overwrite) * @return a Map of the property values converted to String */ public Map mergeProperties(Map stringProps, Map toscaProps) { @@ -191,35 +191,26 @@ public class ArtifactGeneratorToscaParser { } public Resource createInstanceGroupModel(Map properties) { - Resource groupModel = new InstanceGroup(); + Resource groupModel = new Resource(Type.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 + * @throws XmlArtifactGenerationException + * if the relation is a widget and there is no configuration defined for the relation's widget type */ - public void addRelatedModel(final Model model, final Model relation) { - if (relation instanceof Resource) { - model.addResource((Resource) relation); + public void addRelatedModel(final Model model, final Resource relation) throws XmlArtifactGenerationException { + if (relation.getModelType() == ModelType.RESOURCE) { + model.addResource(relation); } else { - model.addWidget((Widget) relation); - } - } - - public String normaliseNodeTypeName(NodeTemplate nodeType) { - String nodeTypeName = nodeType.getType(); - Metadata metadata = nodeType.getMetaData(); - if (metadata != null && hasAllottedResource(metadata.getAllProperties())) { - if (nodeType.getType().contains("org.openecomp.resource.vf.")) { - nodeTypeName = "org.openecomp.resource.vf.allottedResource"; - } - if (nodeType.getType().contains("org.openecomp.resource.vfc.")) { - nodeTypeName = "org.openecomp.resource.vfc.AllottedResource"; - } + model.addWidget(Widget.getWidget(relation.getWidgetType())); } - return nodeTypeName; } public boolean hasAllottedResource(Map metadata) { @@ -236,8 +227,10 @@ public class ArtifactGeneratorToscaParser { * @param resources * @param model * @param serviceNode + * @throws XmlArtifactGenerationException */ - public void processVfModules(List resources, Model resourceModel, NodeTemplate serviceNode) { + public void processVfModules(List resources, Model resourceModel, NodeTemplate serviceNode) + 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); @@ -245,8 +238,8 @@ public class ArtifactGeneratorToscaParser { // Process each VF Group for (Group serviceGroup : serviceGroups) { Model groupModel = Model.getModelFor(serviceGroup.getType()); - if (groupModel instanceof VfModule) { - processVfModule(resources, resourceModel, serviceGroup, serviceNode, (VfModule) groupModel); + if (groupModel.getWidgetType() == Type.VFMODULE) { + processVfModule(resources, resourceModel, serviceGroup, serviceNode, (Resource) groupModel); } } } @@ -259,15 +252,23 @@ public class ArtifactGeneratorToscaParser { boolean foundProvidingService = false; for (NodeTemplate resourceNodeTemplate : resourceNodeTemplates) { - String nodeTypeName = normaliseNodeTypeName(resourceNodeTemplate); - Metadata metaData = resourceNodeTemplate.getMetaData(); - String metaDataType = Optional.ofNullable(metaData).map(m -> m.getValue("type")).orElse(nodeTypeName); - Model resourceNode = Model.getModelFor(nodeTypeName, metaDataType); - foundProvidingService |= - processModel(resourceModel, metaData, resourceNode, resourceNodeTemplate.getProperties()); + String nodeTypeName = resourceNodeTemplate.getType(); + Metadata metadata = resourceNodeTemplate.getMetaData(); + String metaDataType = Optional.ofNullable(metadata).map(m -> m.getValue("type")).orElse(nodeTypeName); + Resource model = Model.getModelFor(nodeTypeName, metaDataType); + + if (metadata != null && hasAllottedResource(metadata.getAllProperties()) + && model.getWidgetType() == Type.VSERVER) { + model = new Resource(Type.ALLOTTED_RESOURCE, false); + Map props = new HashMap<>(); + props.put("providingService", true); + model.setProperties(props); + } + + foundProvidingService |= processModel(resourceModel, metadata, model, resourceNodeTemplate.getProperties()); } - if (resourceModel instanceof AllotedResource && !foundProvidingService) { + 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)); @@ -278,17 +279,20 @@ public class ArtifactGeneratorToscaParser { * Create an Instance Group Model and populate it with the supplied data. * * @param resourceModel - * the Resource node template Model + * the Resource node template Model * @param memberNodes - * the Resources and Widgets belonging to the Group + * the Resources and Widgets belonging to the Group * @param metaProperties - * the metadata of the Group + * the metadata of the Group * @param properties - * the properties of the Group + * the properties of the Group * @return the Instance Group and Member resource models + * @throws XmlArtifactGenerationException + * if there is no configuration defined for one of the member Widgets */ private List processInstanceGroup(Model resourceModel, ArrayList memberNodes, - Map metaProperties, Map properties) { + Map metaProperties, Map properties) + throws XmlArtifactGenerationException { Resource groupModel = createInstanceGroupModel(mergeProperties(metaProperties, properties)); resourceModel.addResource(groupModel); List resources = Stream.of(groupModel).collect(Collectors.toList()); @@ -303,29 +307,42 @@ public class ArtifactGeneratorToscaParser { /** * @param memberNodes * @param groupModel - * @return + * @return a list of Resources + * @throws XmlArtifactGenerationException + * if a member node template is a widget and there is no configuration defined for that relation's + * widget type */ private List generateResourcesAndWidgets(final ArrayList memberNodes, - final Resource groupModel) { + final Resource groupModel) throws XmlArtifactGenerationException { + log.debug(String.format("Processing member nodes for Group %s (invariant UUID %s)", // + groupModel.getModelName(), groupModel.getModelId())); + List resources = new ArrayList<>(); + for (NodeTemplate nodeTemplate : memberNodes) { - String nodeTypeName = normaliseNodeTypeName(nodeTemplate); - Model memberModel = Model.getModelFor(nodeTypeName, nodeTemplate.getMetaData().getValue("type")); - memberModel.populateModelIdentificationInformation(nodeTemplate.getMetaData().getAllProperties()); + String nodeTypeName = nodeTemplate.getType(); + final String metadataType = nodeTemplate.getMetaData().getValue("type"); + + log.debug(String.format("Get model for %s (metadata type %s)", nodeTypeName, metadataType)); + Resource memberModel = Model.getModelFor(nodeTypeName, metadataType); + + if (memberModel != null) { + memberModel.populateModelIdentificationInformation(nodeTemplate.getMetaData().getAllProperties()); - log.debug(String.format("Generating grouped %s (%s) from TOSCA type %s", - memberModel.getClass().getSuperclass().getSimpleName(), memberModel.getClass(), nodeTypeName)); + log.debug(String.format("Generating grouped %s (%s) from TOSCA type %s", + memberModel.getClass().getSuperclass().getSimpleName(), memberModel.getClass(), nodeTypeName)); - addRelatedModel(groupModel, memberModel); - if (memberModel instanceof Resource) { - resources.add((Resource) memberModel); + addRelatedModel(groupModel, memberModel); + if (memberModel.getModelType() == ModelType.RESOURCE) { + resources.add(memberModel); + } } } return resources; } private void processVfModule(List resources, Model vfModel, Group groupDefinition, - NodeTemplate serviceNode, VfModule groupModel) { + NodeTemplate serviceNode, Resource groupModel) throws XmlArtifactGenerationException { groupModel.populateModelIdentificationInformation( mergeProperties(groupDefinition.getMetadata().getAllProperties(), groupDefinition.getProperties())); @@ -338,7 +355,8 @@ public class ArtifactGeneratorToscaParser { } } - private void processVfModuleGroup(VfModule groupModel, List members) { + private void processVfModuleGroup(Resource groupModel, List members) + throws XmlArtifactGenerationException { if (members != null && !members.isEmpty()) { // Get names of the members of the service group List memberNames = members.stream().map(NodeTemplate::getName).collect(Collectors.toList()); @@ -349,16 +367,25 @@ public class ArtifactGeneratorToscaParser { } } - private void processGroupMembers(Model group, NodeTemplate member) { - Model resourceNode; - // L3-network inside vf-module to be generated as Widget a special handling. - if (member.getType().contains("org.openecomp.resource.vl")) { - resourceNode = new L3NetworkWidget(); - } else { - resourceNode = Model.getModelFor(member.getType()); + /** + * Process the Widget members of a VF Module Group + * + * @param group + * @param member + * @throws XmlArtifactGenerationException + */ + 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) { + // An l3-network inside a vf-module is treated as a Widget + resource.setModelType(ModelType.WIDGET); } - if (resourceNode != null && !(resourceNode instanceof Resource)) { - Widget widget = (Widget) resourceNode; + + if (resource.getModelType() == ModelType.WIDGET) { + Widget widget = Widget.getWidget(resource.getWidgetType()); widget.addKey(member.getName()); // Add the widget element encountered to the Group model group.addWidget(widget); @@ -369,7 +396,7 @@ public class ArtifactGeneratorToscaParser { * Create a Map of property name against String property value from the input Map * * @param inputMap - * The input Map + * The input Map * @return Map of property name against String property value */ private Map populateStringProperties(Map inputMap) { @@ -379,25 +406,27 @@ public class ArtifactGeneratorToscaParser { /** * If the specified resourceNode is a type of Resource, add it to the specified resourceModel. If the Resource type - * is ProvidingService return true, otherwise return false. + * is ProvidingService then return true, otherwise return false. * * @param resourceModel - * parent Resource + * parent Resource * @param metaData - * metadata for populating the Resource IDs + * for populating the Resource IDs * @param resourceNode - * any Model (will be ignored if not a Resource) + * any Model (will be ignored if not a Resource) * @param nodeProperties - * the node properties - * @return whether or not a ProvidingService was prcoessed + * the node properties + * @return whether or not a ProvidingService was processed */ - private boolean processModel(Model resourceModel, Metadata metaData, Model resourceNode, + private boolean processModel(Model resourceModel, Metadata metaData, Resource resourceNode, Map nodeProperties) { - boolean foundProvidingService = false; - if (resourceNode instanceof ProvidingService) { - foundProvidingService = true; + boolean foundProvidingService = resourceNode != null + && (boolean) Optional.ofNullable(resourceNode.getProperties().get("providingService")).orElse(false); + + if (foundProvidingService) { processProvidingService(resourceModel, resourceNode, nodeProperties); - } else if (resourceNode instanceof Resource && !(resourceNode.getWidgetType().equals(Widget.Type.L3_NET))) { + } else if (resourceNode != null && resourceNode.getModelType() == ModelType.RESOURCE + && resourceNode.getWidgetType() != Widget.Type.L3_NET) { if (metaData != null) { resourceNode.populateModelIdentificationInformation(metaData.getAllProperties()); } @@ -406,7 +435,7 @@ public class ArtifactGeneratorToscaParser { return foundProvidingService; } - private void processProvidingService(Model resourceModel, Model resourceNode, + private void processProvidingService(Model resourceModel, Resource resourceNode, Map nodeProperties) { if (nodeProperties == null || nodeProperties.get("providing_service_uuid") == null || nodeProperties.get("providing_service_invariant_uuid") == null) { @@ -416,6 +445,6 @@ public class ArtifactGeneratorToscaParser { Map properties = populateStringProperties(nodeProperties); properties.put(VERSION, "1.0"); resourceNode.populateModelIdentificationInformation(properties); - resourceModel.addResource((Resource) resourceNode); + resourceModel.addResource(resourceNode); } }