X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Faai%2Fbabel%2Fparser%2FArtifactGeneratorToscaParser.java;h=cae0324c2a2ef62ce286ef5829f22679b726ccbb;hb=047862bba53addd381fc7c715ac9e3dff76b740d;hp=e5141a5424a6cc67e4342a631f9e1fb839aec67e;hpb=2aedac7b674a854600cac9b4bfe8e864f2e88526;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 e5141a5..cae0324 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 � 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright � 2017-2018 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,21 +18,19 @@ * limitations under the License. * ============LICENSE_END========================================================= */ - package org.onap.aai.babel.parser; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; -import java.util.LinkedList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Properties; import java.util.stream.Collectors; - -import org.onap.aai.babel.logging.ApplicationMsgs; +import java.util.stream.Stream; import org.onap.aai.babel.logging.LogHelper; import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil; import org.onap.aai.babel.xml.generator.model.AllotedResource; @@ -41,11 +39,8 @@ 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.Service; -import org.onap.aai.babel.xml.generator.model.TunnelXconnectWidget; 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.types.ModelType; import org.onap.aai.cl.api.Logger; import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; import org.onap.sdc.toscaparser.api.Group; @@ -53,6 +48,10 @@ import org.onap.sdc.toscaparser.api.NodeTemplate; import org.onap.sdc.toscaparser.api.Property; import org.onap.sdc.toscaparser.api.elements.Metadata; +/** + * Wrapper for the sdc-tosca parser + * + */ public class ArtifactGeneratorToscaParser { private static Logger log = LogHelper.INSTANCE; @@ -82,26 +81,29 @@ public class ArtifactGeneratorToscaParser { /** * Constructs using csarHelper * - * @param csarHelper The csar helper + * @param csarHelper + * The csar helper */ public ArtifactGeneratorToscaParser(ISdcCsarHelper csarHelper) { this.csarHelper = csarHelper; } /** - * Returns the artifact description + * Get or create the artifact description. * - * @param model the artifact model + * @param model + * the artifact model * @return the artifact model's description */ public static String getArtifactDescription(Model model) { - String artifactDesc = model.getModelDescription(); - if (model.getModelType().equals(ModelType.SERVICE)) { - artifactDesc = "AAI Service Model"; - } else if (model.getModelType().equals(ModelType.RESOURCE)) { - artifactDesc = "AAI Resource Model"; + switch (model.getModelType()) { + case SERVICE: + return "AAI Service Model"; + case RESOURCE: + return "AAI Resource Model"; + default: + return model.getModelDescription(); } - return artifactDesc; } /** @@ -150,97 +152,21 @@ public class ArtifactGeneratorToscaParser { } } - /** - * Process the service TOSCA. - * - * @param service model of the service artifact - * @param idTypeStore ID->Type mapping - * @param nodeTemplates a list of service nodes - * - */ - public void processServiceTosca(Service service, Map idTypeStore, - List nodeTemplates) { - log.debug("Processing (TOSCA) Service object"); - - for (NodeTemplate nodeTemplate : nodeTemplates) { - if (nodeTemplate.getMetaData() != null) { - addNodeToService(idTypeStore, service, nodeTemplate); - } else { - log.warn(ApplicationMsgs.MISSING_SERVICE_METADATA, nodeTemplate.getName()); - } - } - } - - /** - * Generates a Resource List using input Service Node Templates. - * - * @param serviceNodes input Service Node Templates - * @param idTypeStore ID->Type mapping - * - * @return the processed resource models - */ - public List processResourceToscas(List serviceNodes, Map idTypeStore) { - List resources = new LinkedList<>(); - for (NodeTemplate serviceNode : serviceNodes) { - if (serviceNode.getMetaData() != null) { - resources.addAll(processResourceTosca(idTypeStore, serviceNode, - csarHelper.getNodeTemplateChildren(serviceNode))); - } else { - log.warn(ApplicationMsgs.MISSING_SERVICE_METADATA, serviceNode.getName()); - } - } - return resources; - } - - /** - * @param idTypeStore ID->Type mapping - * @param serviceNode - * @param resourceNodes - * @return the processed resource models - */ - private List processResourceTosca(Map idTypeStore, NodeTemplate serviceNode, - List resourceNodes) { - List resources = new LinkedList<>(); - String resourceUuId = serviceNode.getMetaData().getValue("UUID"); - String nodeTypeName = idTypeStore.get(resourceUuId); - if (nodeTypeName != null) { - Model resourceModel = Model.getModelFor(nodeTypeName, serviceNode.getMetaData().getValue("type")); - - log.debug("Processing resource " + nodeTypeName + ": " + resourceUuId); - Map serviceMetadata = serviceNode.getMetaData().getAllProperties(); - resourceModel.populateModelIdentificationInformation(serviceMetadata); - - idTypeStore.remove(resourceModel.getModelNameVersionId()); - processResourceModels(idTypeStore, resourceModel, resourceNodes); - - if (csarHelper.getServiceVfList() != null) { - processVfModules(resources, resourceModel, serviceNode); - } - - if (hasSubCategoryTunnelXConnect(serviceMetadata) && hasAllottedResource(serviceMetadata)) { - resourceModel.addWidget(new TunnelXconnectWidget()); - } - - resources.addAll(processInstanceGroups(resourceModel, serviceNode)); - resources.add((Resource) resourceModel); - } - return resources; - } - /** * Process groups for this service node, according to the defined filter. * * @param resourceModel - * @param serviceNode + * @param serviceNodeTemplate * @return resources for which XML Models should be generated */ - private List processInstanceGroups(Model resourceModel, NodeTemplate serviceNode) { + public List processInstanceGroups(Model resourceModel, NodeTemplate serviceNodeTemplate) { List resources = new ArrayList<>(); - if (csarHelper.getNodeTemplateByName(serviceNode.getName()).getSubMappingToscaTemplate() != null) { - List serviceGroups = csarHelper.getGroupsOfOriginOfNodeTemplate(serviceNode); + if (serviceNodeTemplate.getSubMappingToscaTemplate() != null) { + List serviceGroups = csarHelper.getGroupsOfOriginOfNodeTemplate(serviceNodeTemplate); for (Group group : serviceGroups) { if (WidgetConfigurationUtil.isSupportedInstanceGroup(group.getType())) { - resources.addAll(processInstanceGroup(resourceModel, group)); + resources.addAll(processInstanceGroup(resourceModel, group.getMemberNodes(), + group.getMetadata().getAllProperties(), group.getProperties())); } } } @@ -248,65 +174,60 @@ public class ArtifactGeneratorToscaParser { } /** - * Create an Instance Group Model for the supplied Service Group and relate this to the supplied resource Model. + * Merge a Map of String values with a Map of TOSCA Property Objects to create a combined Map. If there are + * duplicate keys then the TOSCA Property value takes precedence. * - * @param resourceModel the Resource node template Model - * @param group the Service Group - * @return the Instance Group and Member resource models + * @param stringProps + * 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) + * @return a Map of the property values converted to String */ - private List processInstanceGroup(Model resourceModel, Group group) { - List resources = new ArrayList<>(); + public Map mergeProperties(Map stringProps, Map toscaProps) { + Map props = new HashMap<>(stringProps); + toscaProps.forEach((key, toscaProp) -> props.put(key, + toscaProp.getValue() == null ? "" : toscaProp.getValue().toString())); + return props; + } + public Resource createInstanceGroupModel(Map properties) { Resource groupModel = new InstanceGroup(); - groupModel.populateModelIdentificationInformation(group.getMetadata().getAllProperties()); - groupModel.populateModelIdentificationInformation(populateStringProperties(group.getProperties())); - - resourceModel.addResource(groupModel); - resources.add(groupModel); - - List members = group.getMemberNodes(); - if (members != null && !members.isEmpty()) { - for (NodeTemplate nodeTemplate : members) { - String nodeTypeName = normaliseNodeTypeName(nodeTemplate); - Model memberModel = Model.getModelFor(nodeTypeName, nodeTemplate.getMetaData().getValue("type")); - memberModel.populateModelIdentificationInformation(nodeTemplate.getMetaData().getAllProperties()); - if (memberModel instanceof Resource) { - log.debug("Generating grouped Resource " + nodeTypeName); - groupModel.addResource((Resource) memberModel); - resources.add((Resource) memberModel); - } else { - log.debug("Generating grouped Widget " + nodeTypeName); - groupModel.addWidget((Widget) memberModel); - } - } - } - - return resources; + groupModel.populateModelIdentificationInformation(properties); + return groupModel; } /** - * Add the supplied Node Template to the Service, provided that it is a valid Resource or Widget. If the Node - * Template is a Resource type, this is also recorded in the supplied nodesById Map. - * - * @param nodesById a map of Resource node type names, keyed by UUID - * @param service the Service to which the Node Template should be added - * @param nodeTemplate the Node Template to add (only if this is a Resource or Widget type) + * @param model + * @param relation */ - private void addNodeToService(Map nodesById, Service service, NodeTemplate nodeTemplate) { - String nodeTypeName = normaliseNodeTypeName(nodeTemplate); - Model model = Model.getModelFor(nodeTypeName, nodeTemplate.getMetaData().getValue("type")); - if (model != null) { - if (nodeTemplate.getMetaData() != null) { - model.populateModelIdentificationInformation(nodeTemplate.getMetaData().getAllProperties()); - } + public void addRelatedModel(final Model model, final Model relation) { + if (relation instanceof Resource) { + model.addResource((Resource) relation); + } else { + model.addWidget((Widget) relation); + } + } - if (model instanceof Resource) { - nodesById.put(model.getModelNameVersionId(), nodeTypeName); - service.addResource((Resource) model); - } else { - service.addWidget((Widget) model); + 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"; } } + return nodeTypeName; + } + + public boolean hasAllottedResource(Map metadata) { + return ALLOTTED_RESOURCE.equals(metadata.get(CATEGORY)); + } + + public boolean hasSubCategoryTunnelXConnect(Map metadata) { + return TUNNEL_XCONNECT.equals(metadata.get(SUBCATEGORY)); } /** @@ -316,7 +237,7 @@ public class ArtifactGeneratorToscaParser { * @param model * @param serviceNode */ - private void processVfModules(List resources, Model resourceModel, NodeTemplate serviceNode) { + public void processVfModules(List resources, Model resourceModel, NodeTemplate serviceNode) { // 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); @@ -330,34 +251,102 @@ public class ArtifactGeneratorToscaParser { } } - private void processVfModule(List resources, Model model, Group groupDefinition, NodeTemplate serviceNode, - VfModule groupModel) { - // Populate group with metadata properties - groupModel.populateModelIdentificationInformation(groupDefinition.getMetadata().getAllProperties()); - // Populate group with non-metadata properties - Map groupProperties = groupDefinition.getProperties(); - Map properties = populateStringProperties(groupProperties); - groupModel.populateModelIdentificationInformation(properties); - processVfModuleGroup(resources, model, groupDefinition, serviceNode, groupModel); + /** + * @param resourceModel + * @param resourceNodeTemplates + */ + public void processResourceModels(Model resourceModel, List resourceNodeTemplates) { + 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()); + } + + if (resourceModel instanceof AllotedResource && !foundProvidingService) { + final String modelInvariantId = resourceModel.getModelId(); + throw new IllegalArgumentException(String.format(GENERATOR_AAI_PROVIDING_SERVICE_MISSING, + modelInvariantId == null ? "" : modelInvariantId)); + } + } + + /** + * Create an Instance Group Model and populate it with the supplied data. + * + * @param resourceModel + * the Resource node template Model + * @param memberNodes + * the Resources and Widgets belonging to the Group + * @param metaProperties + * the metadata of the Group + * @param properties + * the properties of the Group + * @return the Instance Group and Member resource models + */ + private List processInstanceGroup(Model resourceModel, ArrayList memberNodes, + Map metaProperties, Map properties) { + Resource groupModel = createInstanceGroupModel(mergeProperties(metaProperties, properties)); + resourceModel.addResource(groupModel); + List resources = Stream.of(groupModel).collect(Collectors.toList()); + + if (memberNodes != null && !memberNodes.isEmpty()) { + resources.addAll(generateResourcesAndWidgets(memberNodes, groupModel)); + } + + return resources; + } + + /** + * @param memberNodes + * @param groupModel + * @return + */ + private List generateResourcesAndWidgets(final ArrayList memberNodes, + final Resource groupModel) { + 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()); + + 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); + } + } + return resources; } - private void processVfModuleGroup(List resources, Model model, Group groupDefinition, + private void processVfModule(List resources, Model vfModel, Group groupDefinition, NodeTemplate serviceNode, VfModule groupModel) { - // Get names of the members of the service group - List members = csarHelper.getMembersOfVfModule(serviceNode, groupDefinition); + groupModel.populateModelIdentificationInformation( + mergeProperties(groupDefinition.getMetadata().getAllProperties(), groupDefinition.getProperties())); + + processVfModuleGroup(groupModel, csarHelper.getMembersOfVfModule(serviceNode, groupDefinition)); + + vfModel.addResource(groupModel); // Add group (VfModule) to the (VF) model + // Check if we have already encountered the same VfModule across all the artifacts + if (!resources.contains(groupModel)) { + resources.add(groupModel); + } + } + + private void processVfModuleGroup(VfModule groupModel, List members) { if (members != null && !members.isEmpty()) { + // Get names of the members of the service group List memberNames = members.stream().map(NodeTemplate::getName).collect(Collectors.toList()); groupModel.setMembers(memberNames); for (NodeTemplate member : members) { processGroupMembers(groupModel, member); } } - - model.addResource(groupModel); // Added group (VfModule) to the (VF) model - // Check if we have already encountered the same VfModule across all the artifacts - if (!resources.contains(groupModel)) { - resources.add(groupModel); - } } private void processGroupMembers(Model group, NodeTemplate member) { @@ -376,32 +365,11 @@ public class ArtifactGeneratorToscaParser { } } - private 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"; - } - } - return nodeTypeName; - } - - private boolean hasAllottedResource(Map metadata) { - return ALLOTTED_RESOURCE.equals(metadata.get(CATEGORY)); - } - - private boolean hasSubCategoryTunnelXConnect(Map metadata) { - return TUNNEL_XCONNECT.equals(metadata.get(SUBCATEGORY)); - } - /** * Create a Map of property name against String property value from the input Map * - * @param inputMap The input Map + * @param inputMap + * The input Map * @return Map of property name against String property value */ private Map populateStringProperties(Map inputMap) { @@ -409,44 +377,38 @@ public class ArtifactGeneratorToscaParser { e -> e.getValue().getValue() == null ? "" : e.getValue().getValue().toString())); } - private void processResourceModels(Map idTypeStore, Model resourceModel, - List resourceNodes) { - boolean foundProvidingService = false; - - for (NodeTemplate resourceNodeTemplate : resourceNodes) { - 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(idTypeStore, resourceModel, resourceNodeTemplate, nodeTypeName, - metaData, resourceNode); - } - - if (resourceModel instanceof AllotedResource && !foundProvidingService) { - throw new IllegalArgumentException( - String.format(GENERATOR_AAI_PROVIDING_SERVICE_MISSING, resourceModel.getModelId())); - } - } - - private boolean processModel(Map idTypeStore, Model resourceModel, - NodeTemplate resourceNodeTemplate, String nodeTypeName, Metadata metaData, Model resourceNode) { + /** + * 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. + * + * @param resourceModel + * parent Resource + * @param metaData + * metadata for populating the Resource IDs + * @param resourceNode + * any Model (will be ignored if not a Resource) + * @param nodeProperties + * the node properties + * @return whether or not a ProvidingService was prcoessed + */ + private boolean processModel(Model resourceModel, Metadata metaData, Model resourceNode, + Map nodeProperties) { boolean foundProvidingService = false; if (resourceNode instanceof ProvidingService) { foundProvidingService = true; - processProvidingService(resourceModel, resourceNodeTemplate, resourceNode); + processProvidingService(resourceModel, resourceNode, nodeProperties); } else if (resourceNode instanceof Resource && !(resourceNode.getWidgetType().equals(Widget.Type.L3_NET))) { if (metaData != null) { resourceNode.populateModelIdentificationInformation(metaData.getAllProperties()); } - idTypeStore.put(resourceNode.getModelNameVersionId(), nodeTypeName); resourceModel.addResource((Resource) resourceNode); } return foundProvidingService; } - private void processProvidingService(Model resourceModel, NodeTemplate resourceNodeTemplate, Model resourceNode) { - Map nodeProperties = resourceNodeTemplate.getProperties(); - if (nodeProperties.get("providing_service_uuid") == null + private void processProvidingService(Model resourceModel, Model resourceNode, + Map nodeProperties) { + if (nodeProperties == null || nodeProperties.get("providing_service_uuid") == null || nodeProperties.get("providing_service_invariant_uuid") == null) { throw new IllegalArgumentException( String.format(GENERATOR_AAI_PROVIDING_SERVICE_METADATA_MISSING, resourceModel.getModelId())); @@ -456,5 +418,4 @@ public class ArtifactGeneratorToscaParser { resourceNode.populateModelIdentificationInformation(properties); resourceModel.addResource((Resource) resourceNode); } - }