From 6ad41e3ccd398a2721f41ad61c80b7bb03f7d127 Mon Sep 17 00:00:00 2001 From: Ittay Stern Date: Mon, 31 Dec 2018 17:21:27 +0200 Subject: Merge from ECOMP's repository Main Features -------------- - Async-Instantiation jobs mechanism major update; still WIP (package `org.onap.vid.job`) - New features in View/Edit: Activate fabric configuration; show related networks; soft delete - Support AAI service-tree traversal (`AAIServiceTree`) - In-memory cache for SDC models and certain A&AI queries (`CacheProviderWithLoadingCache`) - Upgrade TOSCA Parser and add parsing options; fix malformed TOSCA models - Resolve Cloud-Owner values for MSO - Pass X-ONAP headers to MSO Infrastructure -------------- - Remove codehaus' jackson mapper; use soley fasterxml 2.9.7 - Surefire invokes both TestNG and JUnit tests - Support Kotlin source files - AaiController2 which handles errors in a "Spring manner" - Inline generated-sources and remove jsonschema2pojo Quality -------- - Cumulative bug fixes (A&AI API, UI timeouts, and many more) - Many Sonar issues cleaned-up - Some unused classes removed - Minor changes in vid-automation project, allowing some API verification to run Hard Merges ------------ - HTTP Clients (MSO, A&AI, WebConfig, OutgoingRequestHeadersTest) - Moved `package org.onap.vid.controllers` to `controller`, without plural -- just to keep semantic sync with ECOMP. Reference commit in ECOMP: 3d1141625 Issue-ID: VID-378 Change-Id: I9c8d1e74caa41815891d441fc0760bb5f29c5788 Signed-off-by: Ittay Stern --- .../main/java/org/onap/vid/asdc/AsdcClient.java | 1 + .../org/onap/vid/asdc/beans/SecureServices.java | 1 - .../java/org/onap/vid/asdc/beans/tosca/Input.java | 17 +- .../onap/vid/asdc/beans/tosca/InputProperties.java | 3 - .../onap/vid/asdc/beans/tosca/NodeTemplate.java | 4 +- .../org/onap/vid/asdc/beans/tosca/Property.java | 2 +- .../vid/asdc/beans/tosca/SubstitutionMappings.java | 4 +- .../vid/asdc/beans/tosca/TopologyTemplate.java | 6 +- .../org/onap/vid/asdc/beans/tosca/ToscaCsar.java | 2 +- .../org/onap/vid/asdc/beans/tosca/ToscaMeta.java | 11 +- .../org/onap/vid/asdc/local/LocalAsdcClient.java | 60 +-- .../onap/vid/asdc/parser/ServiceModelInflator.kt | 43 ++ .../onap/vid/asdc/parser/ToscaNamingPolicy.java | 28 ++ .../org/onap/vid/asdc/parser/ToscaParserImpl.java | 5 +- .../org/onap/vid/asdc/parser/ToscaParserImpl2.java | 449 +++++++++++++-------- .../onap/vid/asdc/parser/VidNotionsBuilder.java | 130 ++++++ 16 files changed, 508 insertions(+), 258 deletions(-) create mode 100644 vid-app-common/src/main/java/org/onap/vid/asdc/parser/ServiceModelInflator.kt create mode 100644 vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaNamingPolicy.java create mode 100644 vid-app-common/src/main/java/org/onap/vid/asdc/parser/VidNotionsBuilder.java (limited to 'vid-app-common/src/main/java/org/onap/vid/asdc') diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/AsdcClient.java b/vid-app-common/src/main/java/org/onap/vid/asdc/AsdcClient.java index fdbf2c288..d26a1b278 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/AsdcClient.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/AsdcClient.java @@ -50,4 +50,5 @@ public interface AsdcClient { * @throws AsdcCatalogException the asdc catalog exception */ Path getServiceToscaModel(UUID uuid) throws AsdcCatalogException; + } diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/SecureServices.java b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/SecureServices.java index a6aa3de6f..6eaf37b9d 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/SecureServices.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/SecureServices.java @@ -1,7 +1,6 @@ package org.onap.vid.asdc.beans; import java.util.Collection; -import java.util.List; /** * Created by Oren on 6/27/17. diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/Input.java b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/Input.java index 590284928..d66591c3b 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/Input.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/Input.java @@ -20,10 +20,11 @@ package org.onap.vid.asdc.beans.tosca; +import com.fasterxml.jackson.annotation.JsonInclude; import org.onap.sdc.toscaparser.api.Property; -import java.util.List; import java.util.ArrayList; +import java.util.List; // TODO: Auto-generated Javadoc /** @@ -36,6 +37,7 @@ public class Input { this.description = input.getDescription(); this._default = input.getDefault(); this.inputProperties = new InputProperties(properties); + this.fromInputName = input.getName(); } /** The type. */ @@ -51,7 +53,9 @@ public class Input { private Input entry_schema; private InputProperties inputProperties; - + + private String fromInputName; + /** The constraints */ private List constraints; @@ -63,12 +67,12 @@ public class Input { private String templateUUID; private String templateInvariantUUID; private String templateCustomizationUUID; - + /** * Instantiates a new input. */ public Input() { - constraints = new ArrayList(); + constraints = new ArrayList<>(); } /** @@ -160,6 +164,11 @@ public class Input { return inputProperties; } + @JsonInclude(JsonInclude.Include.NON_NULL) + public String getFromInputName() { + return fromInputName; + } + public void setInputProperties(InputProperties inputProperties) { this.inputProperties = inputProperties; } diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/InputProperties.java b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/InputProperties.java index bc2513ea9..c5fe8b90e 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/InputProperties.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/InputProperties.java @@ -17,13 +17,10 @@ public class InputProperties { for(Property property: properties) { if (property.getName().equals("source_type")) { this.sourceType = (String)property.getValue(); - continue; } else if (property.getName().equals("param_name")) { this.paramName = (String)property.getValue(); - continue; } else if (property.getName().equals("vf_module_label")) { this.vfModuleLabel = getPropertyValueAsString(property); - continue; } } } diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/NodeTemplate.java b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/NodeTemplate.java index 28210b2ec..23c0a1094 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/NodeTemplate.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/NodeTemplate.java @@ -20,8 +20,8 @@ package org.onap.vid.asdc.beans.tosca; -import java.util.Map; import java.util.HashMap; +import java.util.Map; /** * The Class NodeTemplate. @@ -41,7 +41,7 @@ public class NodeTemplate { private Object requirements; public NodeTemplate () { - properties = new HashMap(); + properties = new HashMap<>(); } /** * Gets the type. diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/Property.java b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/Property.java index 74b00bdf7..a15c55ff5 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/Property.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/Property.java @@ -43,7 +43,7 @@ public class Property { /** * Instantiates a new property. */ - Property() {} + private Property() {} /** * Gets the type. diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/SubstitutionMappings.java b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/SubstitutionMappings.java index 70779c5f2..4ce30239c 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/SubstitutionMappings.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/SubstitutionMappings.java @@ -41,8 +41,8 @@ public class SubstitutionMappings { * Instantiates a new substitution mappings. */ public SubstitutionMappings() { - capabilities = new HashMap (); - requirements = new HashMap (); + capabilities = new HashMap<> (); + requirements = new HashMap<> (); } /** diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/TopologyTemplate.java b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/TopologyTemplate.java index 70830715e..b24627d1f 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/TopologyTemplate.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/TopologyTemplate.java @@ -45,9 +45,9 @@ public class TopologyTemplate { */ public TopologyTemplate() { substitution_mappings = new SubstitutionMappings(); - inputs = new HashMap (); - node_templates = new HashMap (); - groups = new HashMap (); + inputs = new HashMap<> (); + node_templates = new HashMap<> (); + groups = new HashMap<> (); } /** diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/ToscaCsar.java b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/ToscaCsar.java index 678583573..4cf2f7975 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/ToscaCsar.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/ToscaCsar.java @@ -43,7 +43,7 @@ public class ToscaCsar { private final ToscaModel parent; /** The children. */ - private Collection children = new LinkedList (); + private Collection children = new LinkedList<> (); /** * Instantiates a new builder. diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/ToscaMeta.java b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/ToscaMeta.java index a7a6c6296..ad8834015 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/ToscaMeta.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/tosca/ToscaMeta.java @@ -20,6 +20,8 @@ package org.onap.vid.asdc.beans.tosca; +import org.onap.vid.asdc.AsdcCatalogException; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -27,8 +29,6 @@ import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; -import org.onap.vid.asdc.AsdcCatalogException; - /** * The Class ToscaMeta. */ @@ -45,7 +45,7 @@ public class ToscaMeta { * @throws AsdcCatalogException the asdc catalog exception */ private ToscaMeta(Builder builder) throws IOException, AsdcCatalogException { - metadata = new HashMap (); + metadata = new HashMap<> (); read(builder.inputStream); } @@ -113,10 +113,7 @@ public class ToscaMeta { metadata.put(entry[0], entry[1].substring(1)); } } - } catch (IOException e) { - metadata.clear(); - throw e; - } catch (AsdcCatalogException e) { + } catch (IOException | AsdcCatalogException e) { metadata.clear(); throw e; } diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/local/LocalAsdcClient.java b/vid-app-common/src/main/java/org/onap/vid/asdc/local/LocalAsdcClient.java index 108d9c06a..bcb201d2e 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/local/LocalAsdcClient.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/local/LocalAsdcClient.java @@ -1,31 +1,22 @@ package org.onap.vid.asdc.local; -import org.codehaus.jackson.JsonParseException; -import org.codehaus.jackson.map.JsonMappingException; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.json.JSONArray; import org.json.JSONObject; import org.onap.vid.asdc.AsdcCatalogException; import org.onap.vid.asdc.AsdcClient; import org.onap.vid.asdc.beans.Service; -import org.onap.vid.asdc.beans.tosca.ToscaCsar; -import org.onap.vid.asdc.beans.tosca.ToscaMeta; -import org.onap.vid.asdc.beans.tosca.ToscaModel; import org.onap.vid.exceptions.GenericUncheckedException; -import org.yaml.snakeyaml.Yaml; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.Map; import java.util.UUID; -import java.util.zip.ZipFile; /** * The Class LocalAsdcClient. @@ -117,7 +108,7 @@ public class LocalAsdcClient implements AsdcClient { /* (non-Javadoc) * @see org.onap.vid.asdc.AsdcClient#getServiceToscaModel(java.util.UUID) */ - public Path getServiceToscaModel(UUID serviceUuid) throws AsdcCatalogException { + public Path getServiceToscaModel(UUID serviceUuid) { String toscaModelURL = null; @@ -145,49 +136,6 @@ public class LocalAsdcClient implements AsdcClient { } } - /** - * Gets the tosca model. - * - * @param csarInputStream the csar input stream - * @return the tosca model - * @throws AsdcCatalogException the asdc catalog exception - */ - private ToscaCsar getToscaModel(InputStream csarInputStream) throws AsdcCatalogException { - final Path csarFile; - - try { - csarFile = Files.createTempFile("csar", ".zip"); - Files.copy(csarInputStream, csarFile, StandardCopyOption.REPLACE_EXISTING); - } catch (IOException e) { - throw new AsdcCatalogException("Caught IOException while creating CSAR", e); - } - - try (final ZipFile csar = new ZipFile(csarFile.toFile())) { - - final InputStream toscaMetaStream = csar.getInputStream(csar.getEntry("TOSCA-Metadata/TOSCA.meta")); - final ToscaMeta toscaMeta = new ToscaMeta.Builder(toscaMetaStream).build(); - final String entryDefinitions = toscaMeta.get("Entry-Definitions"); - final InputStream toscaParentEntryYamlStream = csar.getInputStream(csar.getEntry(entryDefinitions)); - - final Yaml yaml = new Yaml(); - final ToscaModel parentModel = yaml.loadAs(toscaParentEntryYamlStream, ToscaModel.class); - - final ToscaCsar.Builder csarBuilder = new ToscaCsar.Builder(parentModel); - - for (Map> imports : parentModel.getImports()) { - for (Map.Entry> entry : imports.entrySet()) { - final InputStream toscaChildEntryYamlStream = csar.getInputStream(csar.getEntry("Definitions/" + entry.getValue().get("file"))); - final ToscaModel childModel = yaml.loadAs(toscaChildEntryYamlStream, ToscaModel.class); - csarBuilder.addVnf(childModel); - } - } - - return csarBuilder.build(); - } catch (IOException e) { - throw new AsdcCatalogException("Caught IOException while processing CSAR", e); - } - } - /** * The Class Builder. */ diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ServiceModelInflator.kt b/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ServiceModelInflator.kt new file mode 100644 index 000000000..79ab0459a --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ServiceModelInflator.kt @@ -0,0 +1,43 @@ +package org.onap.vid.asdc.parser + +import org.onap.vid.model.* +import org.springframework.stereotype.Component + +@Component +class ServiceModelInflator { + + data class Names (val modelCustomizationName: String?, val modelKey: String?) + + fun toNamesByVersionId(model: ServiceModel): Map { + return emptyMap() + .plus(inflate(model.networks)) + .plus(inflate(model.vnfs)) + .plus(inflate(model.vnfGroups)) + } + + private fun inflate(instances: Map): Map { + return instances.entries.map { inflate(it.key, it.value) }.fold(emptyMap()) { acc, it -> acc.plus(it) } + } + + private fun inflate(modelKey: String, vnf: VNF): Map { + return mapOf(vnf.uuid to Names(vnf.modelCustomizationName, modelKey)) + .plus(inflate(vnf.vfModules)) + .plus(inflate(vnf.volumeGroups)) + } + + private fun inflate(modelKey: String, instance: Any?): Map { + return when (instance) { + is Network -> mapOf(instance.uuid to Names(instance.modelCustomizationName, modelKey)) + is VfModule -> mapOf(instance.uuid to Names(instance.modelCustomizationName, modelKey)) + is VolumeGroup -> mapOf(instance.uuid to Names(instance.modelCustomizationName, modelKey)) + is ResourceGroup -> mapOf(instance.uuid to Names(instance.modelCustomizationName, modelKey)) + is VNF -> inflate(modelKey, instance) + + else -> { + // sink + emptyMap() + } + } + } + +} diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaNamingPolicy.java b/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaNamingPolicy.java new file mode 100644 index 000000000..ca2601034 --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaNamingPolicy.java @@ -0,0 +1,28 @@ +package org.onap.vid.asdc.parser; + +import org.apache.commons.lang3.StringUtils; +import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.Property; + +import java.util.Map; + +public class ToscaNamingPolicy { + + public static String isUserProvidingServiceNameOptional(ISdcCsarHelper csarHelper){ + return csarHelper.getServiceMetadata().getValue(ToscaParserImpl2.Constants.ECOMP_GENERATED_NAMING); + } + + private static Object isPropertyContainsEcompGeneratedNaming(Property property) { + return ((Map) (property.getValue())).get(ToscaParserImpl2.Constants.ECOMP_GENERATED_NAMING_PROPERTY); + } + + public static String getEcompNamingValueForNode(NodeTemplate node, String parentProperty) { + return node.getPropertiesObjects().stream() + .filter(property -> StringUtils.equals(property.getName(), parentProperty)) + .findFirst() + .map(ToscaNamingPolicy::isPropertyContainsEcompGeneratedNaming) + .map(Object::toString) + .orElse("false"); + } +} diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaParserImpl.java b/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaParserImpl.java index 27445c0f3..ef57ccb65 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaParserImpl.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaParserImpl.java @@ -16,6 +16,7 @@ import org.yaml.snakeyaml.error.YAMLException; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -92,7 +93,7 @@ public class ToscaParserImpl implements ToscaParser { final ToscaModel asdcServiceToscaModel = toscaCsar.getParent(); serviceModel.setService(ServiceModel.extractService(asdcServiceToscaModel, service)); - + serviceModel.setFabricConfigurations(Collections.emptyMap()); populateVnfsAndNetwork(methodName, isNewFlow, vnfs, networks, asdcServiceToscaModel, serviceModel); @@ -180,8 +181,6 @@ public class ToscaParserImpl implements ToscaParser { } private ServiceModel getCustomizedServices(ToscaModel asdcServiceToscaModel, ServiceModel serviceModel) { - String methodName = "asdcServiceToscaModel"; - // asdcServiceToscaModel should have vf modules and vol groups populated // at this point but // they are not associated with the VNFs diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaParserImpl2.java b/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaParserImpl2.java index 57d80ce9d..53ec4036b 100644 --- a/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaParserImpl2.java +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/parser/ToscaParserImpl2.java @@ -1,11 +1,12 @@ package org.onap.vid.asdc.parser; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; +import org.onap.sdc.tosca.parser.enums.FilterType; +import org.onap.sdc.tosca.parser.enums.SdcTypes; import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; -import org.onap.sdc.tosca.parser.impl.FilterType; import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; -import org.onap.sdc.tosca.parser.impl.SdcTypes; import org.onap.sdc.toscaparser.api.Group; import org.onap.sdc.toscaparser.api.*; import org.onap.sdc.toscaparser.api.elements.Metadata; @@ -15,87 +16,112 @@ import org.onap.vid.model.*; import java.nio.file.Path; import java.util.*; -import java.util.stream.Collectors; +import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; import static org.onap.vid.asdc.parser.ToscaParserImpl2.Constants.VF_MODULE_LABEL; public class ToscaParserImpl2 { - - public class Constants { - public final static String UUID = "UUID"; - public final static String DESCRIPTION = "description"; - public final static String SERVICE_TYPE = "serviceType"; - public final static String SERVICE_ROLE = "serviceRole"; - public final static String ECOMP_GENERATED_NAMING = "ecompGeneratedNaming"; - - public final static String CUSTOMIZATION_UUID = "customizationUUID"; - public final static String VF_MODULE_MODEL_VERSION = "vfModuleModelVersion"; - public final static String VF_MODULE_MODEL_CUSTOMIZATION_UUID = "vfModuleModelCustomizationUUID"; - public final static String VOLUME_GROUP = "volume_group"; - public final static String VF_MODULE_MODEL_INVARIANT_UUID = "vfModuleModelInvariantUUID"; - public final static String VF_MODULE_MODEL_UUID = "vfModuleModelUUID"; - public final static String INVARIANT_UUID = "invariantUUID"; - public final static String VERSION = "version"; - public final static String NAME = "name"; - public final static String CATEGORY = "category"; - public final static String VF_MODULE_MODEL_NAME = "vfModuleModelName"; - public final static String GET_INPUT = "get_input"; - public final static String TYPE = "type"; - - public final static String INSTANTIATION_TYPE = "instantiationType"; + + private final VidNotionsBuilder vidNotionsBuilder; + + public class Constants { + public static final String UUID = "UUID"; + public static final String DESCRIPTION = "description"; + public static final String SERVICE_TYPE = "serviceType"; + public static final String SERVICE_ROLE = "serviceRole"; + public static final String ECOMP_GENERATED_NAMING = "ecompGeneratedNaming"; + + public static final String CUSTOMIZATION_UUID = "customizationUUID"; + public static final String VF_MODULE_MODEL_VERSION = "vfModuleModelVersion"; + public static final String VF_MODULE_MODEL_CUSTOMIZATION_UUID = "vfModuleModelCustomizationUUID"; + public static final String VOLUME_GROUP = "volume_group"; + public static final String VF_MODULE_MODEL_INVARIANT_UUID = "vfModuleModelInvariantUUID"; + public static final String VF_MODULE_MODEL_UUID = "vfModuleModelUUID"; + public static final String INVARIANT_UUID = "invariantUUID"; + public static final String VERSION = "version"; + public static final String NAME = "name"; + public static final String CATEGORY = "category"; + public static final String VF_MODULE_MODEL_NAME = "vfModuleModelName"; + public static final String GET_INPUT = "get_input"; + public static final String TYPE = "type"; + + public static final String INSTANTIATION_TYPE = "instantiationType"; //instantiation type - public final static String BOTH = "Both"; - public final static String MACRO = "Macro"; - public final static String A_LA_CARTE = "A-La-Carte"; - public final static String CLIENT_CONFIG = "ClientConfig"; + public static final String BOTH = "Both"; + public static final String MACRO = "Macro"; + public static final String A_LA_CARTE = "A-La-Carte"; + public static final String CLIENT_CONFIG = "ClientConfig"; + + //service role + public static final String GROUPING = "GROUPING"; //group properties - public final static String MIN_VF_MODULE_INSTANCES = "min_vf_module_instances"; - public final static String MAX_VF_MODULE_INSTANCES = "max_vf_module_instances"; - public final static String INITIAL_COUNT = "initial_count"; - public final static String VF_MODULE_LABEL = "vf_module_label"; + public static final String MIN_VF_MODULE_INSTANCES = "min_vf_module_instances"; + public static final String MAX_VF_MODULE_INSTANCES = "max_vf_module_instances"; + public static final String INITIAL_COUNT = "initial_count"; + public static final String VF_MODULE_LABEL = "vf_module_label"; + public static final String VF_MODULE_TYPE = "vf_module_type"; //collection resource properties - public final static String SUBCATEGORY = "subcategory"; - public final static String RESOURCE_VENDOR = "resourceVendor"; - public final static String RESOURCE_VENDOR_RELEASE = "resourceVendorRelease"; - public final static String RESOURCE_VENDOR_MODEL_NUMBER = "resourceVendorModelNumber"; - public final static String ORG_OPENECOMP_GROUPS_NETWORK_COLLECTION = "org.openecomp.groups.NetworkCollection"; - public final static String NETWORK_COLLECTION_FUNCTION = "network_collection_function"; - public final static String NETWORK_COLLECTION_DESCRIPTION = "network_collection_description"; + public static final String SUBCATEGORY = "subcategory"; + public static final String RESOURCE_VENDOR = "resourceVendor"; + public static final String RESOURCE_VENDOR_RELEASE = "resourceVendorRelease"; + public static final String RESOURCE_VENDOR_MODEL_NUMBER = "resourceVendorModelNumber"; + public static final String ORG_OPENECOMP_GROUPS_NETWORK_COLLECTION = "org.openecomp.groups.NetworkCollection"; + public static final String NETWORK_COLLECTION_FUNCTION = "network_collection_function"; + public static final String NETWORK_COLLECTION_DESCRIPTION = "network_collection_description"; //vfc instance group properties - public final static String VFC_INSTANCE_GROUP_TYPE = "org.openecomp.groups.VfcInstanceGroup"; - public final static String VFC_PARENT_PORT_ROLE = "vfc_parent_port_role"; - public final static String SUBINTERFACE_ROLE = "subinterface_role"; - public final static String VFC_INSTANCE_GROUP_FUNCTION = "vfc_instance_group_function"; + public static final String VFC_INSTANCE_GROUP_TYPE = "org.openecomp.groups.VfcInstanceGroup"; + public static final String VFC_PARENT_PORT_ROLE = "vfc_parent_port_role"; + public static final String SUBINTERFACE_ROLE = "subinterface_role"; + public static final String VFC_INSTANCE_GROUP_FUNCTION = "vfc_instance_group_function"; + + public static final String FABRIC_CONFIGURATION_TYPE = "org.openecomp.nodes.FabricConfiguration"; + + public static final String RESOURCE_GROUP_TYPE = "org.openecomp.groups.ResourceInstanceGroup"; + public static final String RESOURCE_GROUP_CONTAINED_TYPE = "contained_resource_type"; + + public static final String VNF_GROUP = "VnfGroup"; + + public static final String NAMING_POLICY_TYPE = "org.openecomp.policies.External"; + + public static final String ECOMP_GENERATED_NAMING_PROPERTY = "ecomp_generated_naming"; } - - public ToscaParserImpl2() {} - public ServiceModel makeServiceModel(Path path, Service asdcServiceMetadata) throws SdcToscaParserException { + public ToscaParserImpl2(VidNotionsBuilder vidNotionsBuilder) { + this.vidNotionsBuilder = vidNotionsBuilder; + } + + public ServiceModel makeServiceModel(Path path, Service asdcServiceMetadata) throws SdcToscaParserException { ServiceModel serviceModel = new ServiceModel(); - SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance(); - ISdcCsarHelper sdcCsarHelper = factory.getSdcCsarHelper(path.toFile().getAbsolutePath(),false); + ISdcCsarHelper sdcCsarHelper = getSdcCsarHelper(path); + List policiesTargets = extractNamingPoliciesTargets(sdcCsarHelper); serviceModel.setService(extractServiceFromCsar(asdcServiceMetadata, sdcCsarHelper)); serviceModel.setVolumeGroups(extractVolumeGroups(sdcCsarHelper)); serviceModel.setVfModules(extractVfModuleFromCsar(sdcCsarHelper)); - serviceModel.setVnfs(extractVnfsFromCsar(sdcCsarHelper)); - serviceModel.setConfigurations(extractPortMirroringConfigFromCsar(sdcCsarHelper)); - serviceModel.setServiceProxies(extractServiceProxyFromCsar(sdcCsarHelper)); - serviceModel.setNetworks(extractNetworksFromCsar(sdcCsarHelper)); - serviceModel.setPnfs(extractPnfsFromCsar(sdcCsarHelper)); - serviceModel.setCollectionResource(extractCRFromCsar(sdcCsarHelper)); + serviceModel.setVnfs(extractVnfsFromCsar(sdcCsarHelper, policiesTargets)); + serviceModel.setConfigurations(extractPortMirroringConfigFromCsar(sdcCsarHelper, policiesTargets)); + serviceModel.setServiceProxies(extractServiceProxyFromCsar(sdcCsarHelper, policiesTargets)); + serviceModel.setNetworks(extractNetworksFromCsar(sdcCsarHelper, policiesTargets)); + serviceModel.setPnfs(extractPnfsFromCsar(sdcCsarHelper, policiesTargets)); + serviceModel.setCollectionResource(extractCRFromCsar(sdcCsarHelper, policiesTargets)); + serviceModel.setFabricConfigurations(extractFabricConfigFromCsar(sdcCsarHelper, policiesTargets)); + serviceModel.setVnfGroups(extractVnfGroupsFromCsar(sdcCsarHelper, policiesTargets)); + serviceModel.getService().setVidNotions(vidNotionsBuilder.buildVidNotions(sdcCsarHelper, serviceModel)); return serviceModel; } + public ISdcCsarHelper getSdcCsarHelper(Path path) throws SdcToscaParserException { + SdcToscaParserFactory factory = SdcToscaParserFactory.getInstance(); + return factory.getSdcCsarHelper(path.toFile().getAbsolutePath(), false); + } - - private org.onap.vid.model.Service extractServiceFromCsar(Service asdcServiceMetadata, ISdcCsarHelper csarHelper) throws SdcToscaParserException { - org.onap.vid.model.Service service = new org.onap.vid.model.Service(); + private org.onap.vid.model.Service extractServiceFromCsar(Service asdcServiceMetadata, ISdcCsarHelper csarHelper) { + org.onap.vid.model.Service service = new org.onap.vid.model.Service(); service.setName(csarHelper.getServiceMetadata().getValue(Constants.NAME)); service.setCategory(csarHelper.getServiceMetadata().getValue(Constants.CATEGORY)); @@ -104,21 +130,25 @@ public class ToscaParserImpl2 { service.setVersion(asdcServiceMetadata.getVersion()); service.setDescription(csarHelper.getServiceMetadata().getValue(Constants.DESCRIPTION)); service.setInputs(inputsListToInputsMap(csarHelper.getInputsWithAnnotations())); - service.setServiceEcompNaming(csarHelper.getServiceMetadata().getValue(Constants.ECOMP_GENERATED_NAMING)); + service.setServiceEcompNaming(isUserProvidingServiceNameOptional(csarHelper)); service.setServiceType(csarHelper.getServiceMetadata().getValue(Constants.SERVICE_TYPE)); service.setServiceRole(csarHelper.getServiceMetadata().getValue(Constants.SERVICE_ROLE)); service.setInstantiationType(validateInstantiationType(csarHelper)); return service; } - private Map extractCRFromCsar(ISdcCsarHelper sdcCsarHelper) { - List nodeTemplates = sdcCsarHelper.getServiceNodeTemplates(); - Map collectionResourceMap = new HashMap<>(); + private String isUserProvidingServiceNameOptional(ISdcCsarHelper csarHelper) { + return ToscaNamingPolicy.isUserProvidingServiceNameOptional(csarHelper); + } + + private Map extractCRFromCsar(ISdcCsarHelper sdcCsarHelper, List policiesTargets) { + List nodeTemplates = sdcCsarHelper.getServiceNodeTemplates(); + Map collectionResourceMap = new HashMap<>(); - for(NodeTemplate nodeTemplate: nodeTemplates){ - if(nodeTemplate.getMetaData().getValue(Constants.TYPE).equals(SdcTypes.CR.getValue())) { + for (NodeTemplate nodeTemplate : nodeTemplates) { + if ( nodeTemplate.getMetaData().getValue(Constants.TYPE).equals(SdcTypes.CR.getValue()) ) { CR cr = new CR(); - populateCrFromNodeTemplate(nodeTemplate, sdcCsarHelper, cr); + populateCrFromNodeTemplate(nodeTemplate, sdcCsarHelper, cr, policiesTargets); collectionResourceMap.put(nodeTemplate.getName(), cr); } } @@ -126,21 +156,39 @@ public class ToscaParserImpl2 { return collectionResourceMap; } - private void populateCrFromNodeTemplate(NodeTemplate nodeTemplate, ISdcCsarHelper sdcCsarHelper, CR cr) { - populateNodeFromNodeTemplate(nodeTemplate, sdcCsarHelper, cr); + private Map extractFabricConfigFromCsar(ISdcCsarHelper sdcCsarHelper, List policiesTargets) { + List nodeTemplates = sdcCsarHelper.getServiceNodeTemplates(); + Map fabricConfiguration = new HashMap<>(); + + for (NodeTemplate nodeTemplate : nodeTemplates) { + List nodeTemplateChildren = sdcCsarHelper.getNodeTemplateChildren(nodeTemplate); + for (NodeTemplate nodeTemplateChild : nodeTemplateChildren) { + if ( nodeTemplateChild.getType().equals(Constants.FABRIC_CONFIGURATION_TYPE) ) { + Node node = new Node(); + fabricConfiguration.put(nodeTemplateChild.getName(), populateNodeFromNodeTemplate(nodeTemplateChild, sdcCsarHelper, node, policiesTargets)); + } + } + + } + return fabricConfiguration; + } + + + private void populateCrFromNodeTemplate(NodeTemplate nodeTemplate, ISdcCsarHelper sdcCsarHelper, CR cr, List policiesTargets) { + populateNodeFromNodeTemplate(nodeTemplate, sdcCsarHelper, cr, policiesTargets); cr.setCustomizationUUID(nodeTemplate.getMetaData().getValue(Constants.CUSTOMIZATION_UUID)); cr.setCategory(nodeTemplate.getMetaData().getValue(Constants.CATEGORY)); - cr.setSubcategory(nodeTemplate.getMetaData().getValue(Constants.SUBCATEGORY)); - cr.setResourceVendor(nodeTemplate.getMetaData().getValue(Constants.RESOURCE_VENDOR)); - cr.setResourceVendorRelease(nodeTemplate.getMetaData().getValue(Constants.RESOURCE_VENDOR_RELEASE)); - cr.setResourceVendorModelNumber(nodeTemplate.getMetaData().getValue(Constants.RESOURCE_VENDOR_MODEL_NUMBER)); - cr.setNetworksCollection(getNetworksCollectionMapFromGroupsList(sdcCsarHelper, nodeTemplate)); + cr.setSubcategory(nodeTemplate.getMetaData().getValue(Constants.SUBCATEGORY)); + cr.setResourceVendor(nodeTemplate.getMetaData().getValue(Constants.RESOURCE_VENDOR)); + cr.setResourceVendorRelease(nodeTemplate.getMetaData().getValue(Constants.RESOURCE_VENDOR_RELEASE)); + cr.setResourceVendorModelNumber(nodeTemplate.getMetaData().getValue(Constants.RESOURCE_VENDOR_MODEL_NUMBER)); + cr.setNetworksCollection(getNetworksCollectionMapFromGroupsList(sdcCsarHelper, nodeTemplate)); } private Map getNetworksCollectionMapFromGroupsList(ISdcCsarHelper sdcCsarHelper, NodeTemplate nodeTemplate) { List groups = sdcCsarHelper.getGroupsOfOriginOfNodeTemplateByToscaGroupType(nodeTemplate, Constants.ORG_OPENECOMP_GROUPS_NETWORK_COLLECTION); - Map networksCollectionMap = new HashMap(); - for(Group group: groups){ + Map networksCollectionMap = new HashMap<>(); + for (Group group : groups) { networksCollectionMap.put(group.getName(), populateCollectionNetworkFromGroup(group, nodeTemplate)); } return networksCollectionMap; @@ -161,44 +209,46 @@ public class ToscaParserImpl2 { LinkedHashMap properties = group.getProperties(); Map nodeTemplateProperties = nodeTemplate.getProperties(); - String networkCollectionFunction = (String)((Map)(properties.get(Constants.NETWORK_COLLECTION_FUNCTION).getValue())).get(Constants.GET_INPUT); - String networkCollectionDescription = (String)((Map)(properties.get(Constants.NETWORK_COLLECTION_DESCRIPTION).getValue())).get(Constants.GET_INPUT); + String networkCollectionFunction = (String) ((Map) (properties.get(Constants.NETWORK_COLLECTION_FUNCTION).getValue())).get(Constants.GET_INPUT); + String networkCollectionDescription = (String) ((Map) (properties.get(Constants.NETWORK_COLLECTION_DESCRIPTION).getValue())).get(Constants.GET_INPUT); - networkCollection.getNetworkCollectionProperties().setNetworkCollectionDescription((String)nodeTemplateProperties.get(networkCollectionDescription).getValue()); - networkCollection.getNetworkCollectionProperties().setNetworkCollectionFunction((String)nodeTemplateProperties.get(networkCollectionFunction).getValue()); + networkCollection.getNetworkCollectionProperties().setNetworkCollectionDescription((String) nodeTemplateProperties.get(networkCollectionDescription).getValue()); + networkCollection.getNetworkCollectionProperties().setNetworkCollectionFunction((String) nodeTemplateProperties.get(networkCollectionFunction).getValue()); } - private Map extractVnfsFromCsar(ISdcCsarHelper csarHelper) { + private Map extractVnfsFromCsar(ISdcCsarHelper csarHelper, List policiesTargets) { List nodeTemplates = csarHelper.getServiceVfList(); - Map vnfsMaps = new HashMap(); + Map vnfsMaps = new HashMap<>(); for (NodeTemplate nodeTemplate : nodeTemplates) { VNF vnf = new VNF(); - populateNodeFromNodeTemplate(nodeTemplate, csarHelper, vnf); + populateNodeFromNodeTemplate(nodeTemplate, csarHelper, vnf, policiesTargets); vnf.setModelCustomizationName(nodeTemplate.getName()); vnf.setVfModules(getVfModulesFromVF(csarHelper, vnf.getCustomizationUuid())); vnf.setVolumeGroups(getVolumeGroupsFromVF(csarHelper, vnf.getCustomizationUuid())); vnf.setVfcInstanceGroups(getVfcInstanceGroup(csarHelper, nodeTemplate)); - + if (ToscaNamingPolicy.getEcompNamingValueForNode(nodeTemplate, "nf_naming").equals("true")) { + setEcompNamingProperty(vnf.getProperties(), "true"); + } vnfsMaps.put(nodeTemplate.getName(), vnf); } return vnfsMaps; } - private Map getVfcInstanceGroup(ISdcCsarHelper csarHelper, NodeTemplate nodeTemplate) { - List vfcList = csarHelper.getGroupsOfOriginOfNodeTemplateByToscaGroupType(nodeTemplate, Constants.VFC_INSTANCE_GROUP_TYPE); + private Map getVfcInstanceGroup(ISdcCsarHelper csarHelper, NodeTemplate nodeTemplate) { + List vfcList = csarHelper.getGroupsOfOriginOfNodeTemplateByToscaGroupType(nodeTemplate, Constants.VFC_INSTANCE_GROUP_TYPE); return vfcList.stream() - .collect(toMap(Group::getName, group -> populateVfcInstanceGroupFromGroup(group, csarHelper, nodeTemplate))); + .collect(toMap(Group::getName, group -> populateVfcInstanceGroupFromGroup(group, nodeTemplate))); } - private VfcInstanceGroup populateVfcInstanceGroupFromGroup(Group group, ISdcCsarHelper csarHelper, NodeTemplate nodeTemplate) { - VfcInstanceGroup vfcInstanceGroup = new VfcInstanceGroup(); - vfcInstanceGroup.setUuid(group.getMetadata().getValue(Constants.UUID)); - vfcInstanceGroup.setInvariantUuid(group.getMetadata().getValue(Constants.INVARIANT_UUID)); - vfcInstanceGroup.setVersion(group.getMetadata().getValue(Constants.VERSION)); - vfcInstanceGroup.setName(group.getMetadata().getValue(Constants.NAME)); - vfcInstanceGroup.setVfcInstanceGroupProperties(getVfcPropertiesFromGroup(nodeTemplate, group)); + private VfcInstanceGroup populateVfcInstanceGroupFromGroup(Group group, NodeTemplate nodeTemplate) { + VfcInstanceGroup vfcInstanceGroup = new VfcInstanceGroup(); + vfcInstanceGroup.setUuid(group.getMetadata().getValue(Constants.UUID)); + vfcInstanceGroup.setInvariantUuid(group.getMetadata().getValue(Constants.INVARIANT_UUID)); + vfcInstanceGroup.setVersion(group.getMetadata().getValue(Constants.VERSION)); + vfcInstanceGroup.setName(group.getMetadata().getValue(Constants.NAME)); + vfcInstanceGroup.setVfcInstanceGroupProperties(getVfcPropertiesFromGroup(nodeTemplate, group)); return vfcInstanceGroup; @@ -209,24 +259,24 @@ public class ToscaParserImpl2 { vfcInstanceGroupProperties.setVfcParentPortRole((String) group.getProperties().get(Constants.VFC_PARENT_PORT_ROLE).getValue()); vfcInstanceGroupProperties.setSubinterfaceRole((String) group.getProperties().get(Constants.SUBINTERFACE_ROLE).getValue()); - String networkCollectionFunction = (String)((Map)(group.getProperties().get(Constants.NETWORK_COLLECTION_FUNCTION).getValue())).get(Constants.GET_INPUT); - String vfcInstanceGroupFunction = (String)((Map)(group.getProperties().get(Constants.VFC_INSTANCE_GROUP_FUNCTION).getValue())).get(Constants.GET_INPUT); + String networkCollectionFunction = (String) ((Map) (group.getProperties().get(Constants.NETWORK_COLLECTION_FUNCTION).getValue())).get(Constants.GET_INPUT); + String vfcInstanceGroupFunction = (String) ((Map) (group.getProperties().get(Constants.VFC_INSTANCE_GROUP_FUNCTION).getValue())).get(Constants.GET_INPUT); - if(nodeTemplate.getProperties().get(networkCollectionFunction) != null) + if ( nodeTemplate.getProperties().get(networkCollectionFunction) != null ) vfcInstanceGroupProperties.setNetworkCollectionFunction((String) nodeTemplate.getProperties().get(networkCollectionFunction).getValue()); - if(nodeTemplate.getProperties().get(vfcInstanceGroupFunction) != null) + if ( nodeTemplate.getProperties().get(vfcInstanceGroupFunction) != null ) vfcInstanceGroupProperties.setVfcInstanceGroupFunction((String) nodeTemplate.getProperties().get(vfcInstanceGroupFunction).getValue()); return vfcInstanceGroupProperties; } - private Map extractPortMirroringConfigFromCsar(ISdcCsarHelper csarHelper) { - List nodeTemplates = csarHelper.getServiceNodeTemplateBySdcType(SdcTypes.CONFIGURATION); + private Map extractPortMirroringConfigFromCsar(ISdcCsarHelper csarHelper, List policiesTargets) { + List nodeTemplates = csarHelper.getServiceNodeTemplateBySdcType(SdcTypes.CONFIGURATION);//TODO change to Map configMaps = new HashMap<>(); for (NodeTemplate nodeTemplate : nodeTemplates) { PortMirroringConfig pmConfig = new PortMirroringConfig(); - populateNodeFromNodeTemplate(nodeTemplate, csarHelper, pmConfig); + populateNodeFromNodeTemplate(nodeTemplate, csarHelper, pmConfig, policiesTargets); pmConfig.setModelCustomizationName(nodeTemplate.getName()); pmConfig.setRequirementAssignments(nodeTemplate.getRequirements()); @@ -236,38 +286,38 @@ public class ToscaParserImpl2 { } return configMaps; - } + } - private Map extractServiceProxyFromCsar(ISdcCsarHelper csarHelper) { + private Map extractServiceProxyFromCsar(ISdcCsarHelper csarHelper, List policiesTargets) { List nodeTemplates = csarHelper.getServiceNodeTemplateBySdcType(SdcTypes.SERVICE_PROXY); - Map serviceProxies = new HashMap<>(); - for (NodeTemplate nodeTemplate: nodeTemplates) { - ServiceProxy serviceProxy = new ServiceProxy(); - populateNodeFromNodeTemplate(nodeTemplate, csarHelper, serviceProxy); + return nodeTemplates.stream() + .collect(toMap(NodeTemplate::getName, node -> getServiceProxyFromNodeTemplate(node, csarHelper, policiesTargets))); + } - Map metadata = nodeTemplate.getMetaData().getAllProperties(); - serviceProxy.setSourceModelUuid(metadata.get("sourceModelUuid")); - serviceProxy.setSourceModelInvariant(metadata.get("sourceModelInvariant")); - serviceProxy.setSourceModelName(metadata.get("sourceModelName")); + private ServiceProxy getServiceProxyFromNodeTemplate(NodeTemplate nodeTemplate, ISdcCsarHelper csarHelper, List policiesTargets) { + ServiceProxy serviceProxy = new ServiceProxy(); + populateNodeFromNodeTemplate(nodeTemplate, csarHelper, serviceProxy, policiesTargets); - serviceProxies.put(nodeTemplate.getName(), serviceProxy); - } + Map metadata = nodeTemplate.getMetaData().getAllProperties(); + serviceProxy.setSourceModelUuid(metadata.get("sourceModelUuid")); + serviceProxy.setSourceModelInvariant(metadata.get("sourceModelInvariant")); + serviceProxy.setSourceModelName(metadata.get("sourceModelName")); - return serviceProxies; + return serviceProxy; } - private void setSourceAndCollectorProxyNodes(ISdcCsarHelper csarHelper, PortMirroringConfig portMirroringConfig, NodeTemplate nodeTemplate) { - RequirementAssignments requirementAssignments = nodeTemplate.getRequirements(); + private void setSourceAndCollectorProxyNodes(ISdcCsarHelper csarHelper, PortMirroringConfig portMirroringConfig, NodeTemplate nodeTemplate) { + RequirementAssignments requirementAssignments = nodeTemplate.getRequirements(); List sourceNodes = getRequirementsNodesNames(requirementAssignments.getRequirementsByName("source").getAll()); portMirroringConfig.setSourceNodes(sourceNodes); List collectorNodes = getRequirementsNodesNames(requirementAssignments.getRequirementsByName("collector").getAll()); - if (!collectorNodes.isEmpty()) { // vprobe + if ( !collectorNodes.isEmpty() ) { // vprobe portMirroringConfig.setCollectorNodes(collectorNodes); } else { // pprobe - configuration by policy String collectorNodeName = csarHelper.getNodeTemplatePropertyLeafValue(nodeTemplate, "collector_node"); - if (collectorNodeName != null) { + if ( collectorNodeName != null ) { portMirroringConfig.setCollectorNodes(Arrays.asList(collectorNodeName)); portMirroringConfig.setConfigurationByPolicy(true); } @@ -277,8 +327,8 @@ public class ToscaParserImpl2 { private List getRequirementsNodesNames(List requirements) { List requirementsNodes = new ArrayList<>(); - if (requirements != null && requirements.size() > 0) { - requirementsNodes = requirements.stream().map(RequirementAssignment::getNodeTemplateName).collect(Collectors.toList()); + if ( !CollectionUtils.isEmpty(requirements) ) { + requirementsNodes = requirements.stream().map(RequirementAssignment::getNodeTemplateName).collect(toList()); } return requirementsNodes; @@ -301,26 +351,29 @@ public class ToscaParserImpl2 { return Boolean.valueOf(group.getPropertyValue(Constants.VOLUME_GROUP).toString()); } - private Map extractNetworksFromCsar(ISdcCsarHelper csarHelper) { + private Map extractNetworksFromCsar(ISdcCsarHelper csarHelper, List policiesTargets) { List nodeTemplates = csarHelper.getServiceVlList(); - Map networksMap = new HashMap(); + Map networksMap = new HashMap<>(); for (NodeTemplate nodeTemplate : nodeTemplates) { Network newNetwork = new Network(); - populateNodeFromNodeTemplate(nodeTemplate, csarHelper, newNetwork); + populateNodeFromNodeTemplate(nodeTemplate, csarHelper, newNetwork, policiesTargets); newNetwork.setModelCustomizationName(nodeTemplate.getName()); + if (ToscaNamingPolicy.getEcompNamingValueForNode(nodeTemplate, "exVL_naming").equals("true")) { + setEcompNamingProperty(newNetwork.getProperties(), "true"); + } networksMap.put(nodeTemplate.getName(), newNetwork); } return networksMap; - } + } - private Map extractPnfsFromCsar(ISdcCsarHelper csarHelper) { + private Map extractPnfsFromCsar(ISdcCsarHelper csarHelper, List policiesTargets) { List nodeTemplates = csarHelper.getServiceNodeTemplateBySdcType(SdcTypes.PNF); HashMap pnfHashMap = new HashMap<>(); for (NodeTemplate nodeTemplate : nodeTemplates) { Node pnf = new Node(); - populateNodeFromNodeTemplate(nodeTemplate, csarHelper, pnf); + populateNodeFromNodeTemplate(nodeTemplate, csarHelper, pnf, policiesTargets); pnfHashMap.put(nodeTemplate.getName(), pnf); } return pnfHashMap; @@ -352,13 +405,13 @@ public class ToscaParserImpl2 { Map inputs = new HashMap<>(); for (org.onap.sdc.toscaparser.api.parameters.Input input : inputList) { //Set only inputs without annotation to the service level - if(input.getAnnotations() == null) + if ( input.getAnnotations() == null ) inputs.put(input.getName(), convertInput(input, new org.onap.vid.asdc.beans.tosca.Input(), null)); } return inputs; } - private Node populateNodeFromNodeTemplate(NodeTemplate nodeTemplate, ISdcCsarHelper csarHelper, Node newNode) { + private Node populateNodeFromNodeTemplate(NodeTemplate nodeTemplate, ISdcCsarHelper csarHelper, Node newNode, List policiesTargets) { newNode.setCustomizationUuid(csarHelper.getNodeTemplateCustomizationUuid(nodeTemplate)); newNode.setDescription(nodeTemplate.getMetaData().getValue(Constants.DESCRIPTION)); newNode.setInvariantUuid(nodeTemplate.getMetaData().getValue(Constants.INVARIANT_UUID)); @@ -367,19 +420,21 @@ public class ToscaParserImpl2 { newNode.setVersion(nodeTemplate.getMetaData().getValue(Constants.VERSION)); newNode.setInputs(extractInputsAndCommandsForNodeTemplate(nodeTemplate, csarHelper, newNode)); newNode.setType(nodeTemplate.getMetaData().getValue(Constants.TYPE)); - Map propertiesMap = setPropertiesOfVnf(nodeTemplate.getPropertiesObjects()); + Map propertiesMap = nodeTemplate.getPropertiesObjects().stream() + .collect(toMap(Property::getName, p -> p.getValue().toString())); + setEcompNamingProperty(propertiesMap, String.valueOf(policiesTargets.contains(nodeTemplate.getName()))); newNode.setProperties(propertiesMap); return newNode; } - private VfModule populateVfModuleFromGroup(Group group, ISdcCsarHelper csarHelper){ + private VfModule populateVfModuleFromGroup(Group group, ISdcCsarHelper csarHelper) { VfModule vfModule = new VfModule(); extractBasicPropertiesForGroup(vfModule, group, csarHelper); vfModule.setVolumeGroupAllowed(isVolumeGroup(group)); return vfModule; } - private VolumeGroup populateVolumeGroupFromGroup(Group group, ISdcCsarHelper csarHelper){ + private VolumeGroup populateVolumeGroupFromGroup(Group group, ISdcCsarHelper csarHelper) { VolumeGroup volumeGroup = new VolumeGroup(); extractBasicPropertiesForGroup(volumeGroup, group, csarHelper); return volumeGroup; @@ -398,30 +453,39 @@ public class ToscaParserImpl2 { } - private Map extractVfInputsFromCsarByAnnotation(ISdcCsarHelper csarHelper, org.onap.vid.model.Group group) { + private Map extractVfInputsFromCsarByAnnotation(ISdcCsarHelper csarHelper, org.onap.vid.model.Group group) { Map inputMap = new HashMap<>(); - if(group.getProperties().getVfModuleLabel() != null){ + if ( group.getProperties().getVfModuleLabel() != null ) { List inputsList = csarHelper.getInputsWithAnnotations(); - for(Input input: inputsList){ - if(input.getAnnotations() != null){ - List annotationProperties = input.getAnnotations().get("source").getProperties(); - if(isInputMatchesToGroup(annotationProperties, group)){ - inputMap.put(input.getName(), new org.onap.vid.asdc.beans.tosca.Input(input ,annotationProperties)); - } - } + for (Input input : inputsList) { + extractVfModuleInput(group, inputMap, input); } } return inputMap; } + private void extractVfModuleInput(org.onap.vid.model.Group group, Map inputMap, Input input) { + if ( input.getAnnotations() != null ) { + List annotationProperties = input.getAnnotations().get("source").getProperties(); + if ( isInputMatchesToGroup(annotationProperties, group) ) { + final org.onap.vid.asdc.beans.tosca.Input vfModuleInput = new org.onap.vid.asdc.beans.tosca.Input(input, annotationProperties); + if ( vfModuleInput.getInputProperties() != null && vfModuleInput.getInputProperties().getParamName() != null ) { + inputMap.put(vfModuleInput.getInputProperties().getParamName(), vfModuleInput); + } else { + inputMap.put(input.getName(), vfModuleInput); + } + } + } + } + - private boolean isInputMatchesToGroup(List annotationProperties, org.onap.vid.model.Group group){ - for(Property property: annotationProperties){ - if(property.getName().equals(VF_MODULE_LABEL)){ + private boolean isInputMatchesToGroup(List annotationProperties, org.onap.vid.model.Group group) { + for (Property property : annotationProperties) { + if ( property.getName().equals(VF_MODULE_LABEL) ) { final Object values = property.getValue(); final String vfModuleLabel = group.getProperties().getVfModuleLabel(); - if (values instanceof List) { - if (listContainsAsString((List) values, vfModuleLabel)) return true; + if ( values instanceof List ) { + if ( listContainsAsString((List) values, vfModuleLabel) ) return true; } else { return getPropertyValueAsString(property).equals(vfModuleLabel); } @@ -432,7 +496,7 @@ public class ToscaParserImpl2 { private boolean listContainsAsString(List list, String value) { for (Object v : list) { - if (StringUtils.equals(v.toString(), value)) { + if ( StringUtils.equals(v.toString(), value) ) { return true; } } @@ -443,37 +507,45 @@ public class ToscaParserImpl2 { return removeSquareBrackets(property.getValue().toString()); } - private String removeSquareBrackets(String stringWithSquareBrackets){ + private String removeSquareBrackets(String stringWithSquareBrackets) { return stringWithSquareBrackets.replaceAll("(^\\[|\\]$)", ""); } - private GroupProperties extractVfModuleProperties(Group group, ISdcCsarHelper csarHelper){ + private GroupProperties extractVfModuleProperties(Group group, ISdcCsarHelper csarHelper) { GroupProperties vfModuleProperties = new GroupProperties(); - if(csarHelper.getGroupPropertyAsObject(group, Constants.MIN_VF_MODULE_INSTANCES) != null) - vfModuleProperties.setMinCountInstances((Integer)csarHelper.getGroupPropertyAsObject(group, Constants.MIN_VF_MODULE_INSTANCES)); - if(csarHelper.getGroupPropertyAsObject(group, Constants.MAX_VF_MODULE_INSTANCES) != null) - vfModuleProperties.setMaxCountInstances((Integer)csarHelper.getGroupPropertyAsObject(group, Constants.MAX_VF_MODULE_INSTANCES)); - if(csarHelper.getGroupPropertyAsObject(group, Constants.INITIAL_COUNT) != null) - vfModuleProperties.setInitialCount((Integer)csarHelper.getGroupPropertyAsObject(group, Constants.INITIAL_COUNT)); - if(csarHelper.getGroupPropertyAsObject(group, VF_MODULE_LABEL) != null) + if ( csarHelper.getGroupPropertyAsObject(group, Constants.MIN_VF_MODULE_INSTANCES) != null ) + vfModuleProperties.setMinCountInstances((Integer) csarHelper.getGroupPropertyAsObject(group, Constants.MIN_VF_MODULE_INSTANCES)); + if ( csarHelper.getGroupPropertyAsObject(group, Constants.MAX_VF_MODULE_INSTANCES) != null ) + vfModuleProperties.setMaxCountInstances((Integer) csarHelper.getGroupPropertyAsObject(group, Constants.MAX_VF_MODULE_INSTANCES)); + if ( csarHelper.getGroupPropertyAsObject(group, Constants.INITIAL_COUNT) != null ) + vfModuleProperties.setInitialCount((Integer) csarHelper.getGroupPropertyAsObject(group, Constants.INITIAL_COUNT)); + if ( csarHelper.getGroupPropertyAsObject(group, VF_MODULE_LABEL) != null ) vfModuleProperties.setVfModuleLabel((String) csarHelper.getGroupPropertyAsObject(group, VF_MODULE_LABEL)); + vfModuleProperties.setBaseModule(isModuleTypeIsBaseObjectSafe(csarHelper.getGroupPropertyAsObject(group, Constants.VF_MODULE_TYPE))); return vfModuleProperties; } + public static boolean isModuleTypeIsBaseObjectSafe(Object vfModuleTypeValue) { + return (vfModuleTypeValue instanceof String) && (isModuleTypeIsBase((String) vfModuleTypeValue)); + } + + protected static boolean isModuleTypeIsBase(String vfModuleTypeValue) { + return "Base".equalsIgnoreCase(vfModuleTypeValue); + } - private Map extractInputsAndCommandsForNodeTemplate(NodeTemplate nodeTemplate, ISdcCsarHelper csarHelper, Node newNode){ + private Map extractInputsAndCommandsForNodeTemplate(NodeTemplate nodeTemplate, ISdcCsarHelper csarHelper, Node newNode) { Map inputMap = new HashMap<>(); Map commandPropertyMap = new HashMap<>(); List inputs = csarHelper.getServiceInputs(); - Map properties = csarHelper.filterNodeTemplatePropertiesByValue(nodeTemplate, FilterType.CONTAINS, Constants.GET_INPUT); + Map properties = csarHelper.filterNodeTemplatePropertiesByValue(nodeTemplate, FilterType.CONTAINS, Constants.GET_INPUT); for (Map.Entry property : properties.entrySet()) { String inputKey = property.getValue(); String key = extractInputValue(inputKey); - for (Input input: inputs){ - if(input.getName().equals(key)){ + for (Input input : inputs) { + if ( input.getName().equals(key) ) { org.onap.vid.asdc.beans.tosca.Input localInput = new org.onap.vid.asdc.beans.tosca.Input(); localInput = convertInput(input, localInput, nodeTemplate); String name = property.getKey(); @@ -487,7 +559,7 @@ public class ToscaParserImpl2 { } private String extractInputValue(String inputKey) { - return inputKey.substring(inputKey.indexOf(":") + 1); + return inputKey.substring(inputKey.indexOf(':') + 1); } private org.onap.vid.asdc.beans.tosca.Input convertInput(Input parserInput, org.onap.vid.asdc.beans.tosca.Input localInput, NodeTemplate nodeTemplate){ @@ -497,7 +569,7 @@ public class ToscaParserImpl2 { localInput.setType(parserInput.getType()); localInput.setConstraints(parserInput.getConstraints()); // localInput.setentry_schema() - + //if inputs of inner nodeTemplate - tell its details if(nodeTemplate != null) { Metadata metadata = nodeTemplate.getMetaData(); @@ -506,11 +578,11 @@ public class ToscaParserImpl2 { localInput.setTemplateInvariantUUID(metadata.getValue("invariantUUID")); localInput.setTemplateCustomizationUUID(metadata.getValue("customizationUUID")); } - + return localInput; } - private CommandProperty extractCommands(String displayName, String inputName){ + private CommandProperty extractCommands(String displayName, String inputName) { CommandProperty commandProperty = new CommandProperty(); commandProperty.setDisplayName(displayName); commandProperty.setCommand(Constants.GET_INPUT); @@ -518,19 +590,8 @@ public class ToscaParserImpl2 { return commandProperty; } - private Map setPropertiesOfVnf(List properties) { - Map propertiesMap = new HashMap(); - for (Property property : properties) { - //special handling to necessary sub-property "ecomp_generated_naming" - if(property.getName().equals("nf_naming")){ - final Object ecompGeneratedNaming = ((Map) (property.getValue())).get("ecomp_generated_naming"); - if (ecompGeneratedNaming != null) { - propertiesMap.put("ecomp_generated_naming", ecompGeneratedNaming.toString()); - } - } - propertiesMap.put(property.getName(), property.getValue().toString()); - } - return propertiesMap; + private void setEcompNamingProperty(Map propertiesMap, String isUserProvidingVnfNameOptional) { + propertiesMap.put(Constants.ECOMP_GENERATED_NAMING_PROPERTY, isUserProvidingVnfNameOptional); } private String validateInstantiationType(ISdcCsarHelper csarHelper){ @@ -545,5 +606,43 @@ public class ToscaParserImpl2 { return validatedInstantiationType; } + private Map extractVnfGroupsFromCsar(ISdcCsarHelper csarHelper, List policiesTargets) { + List resourceGroups = csarHelper.getGroupsOfTopologyTemplateByToscaGroupType(Constants.RESOURCE_GROUP_TYPE); + + return resourceGroups.stream() + .filter(group -> group.getProperties().get(Constants.RESOURCE_GROUP_CONTAINED_TYPE).getValue().equals("VF")) + .collect(toMap(Group::getName, group -> parseResourceGroup(group, csarHelper, policiesTargets))); + } + + private ResourceGroup parseResourceGroup(Group group, ISdcCsarHelper csarHelper, List policiesTargets) { + return new ResourceGroup( + Constants.VNF_GROUP, + group.getMetadata().getValue(Constants.INVARIANT_UUID), + group.getMetadata().getValue(Constants.UUID), + group.getMetadata().getValue(Constants.VERSION), + group.getMetadata().getValue(Constants.NAME), + group.getMetadata().getValue(Constants.NAME), + getPropertiesOfResourceGroup(group.getProperties(), policiesTargets.contains(group.getName())), + csarHelper.getGroupMembersFromTopologyTemplate(group.getName()).stream() + .collect(toMap(NodeTemplate::getName, node -> getServiceProxyFromNodeTemplate(node, csarHelper, policiesTargets))) + ); + } + + private Map getPropertiesOfResourceGroup(Map properties, boolean hasPolicyTarget) { + Map propertiesMap = properties.entrySet().stream() + .collect(toMap(Map.Entry::getKey, e -> e.getValue().getValue())); + propertiesMap.put(Constants.ECOMP_GENERATED_NAMING_PROPERTY, String.valueOf(hasPolicyTarget)); + return propertiesMap; + } + + public List extractNamingPoliciesTargets(ISdcCsarHelper csarHelper) { + List policies = csarHelper.getPoliciesOfTopologyTemplateByToscaPolicyType(Constants.NAMING_POLICY_TYPE); + return policies.stream() + .filter(policy -> policy.getProperties().get(Constants.TYPE) != null && + policy.getProperties().get(Constants.TYPE).getValue() != null && + StringUtils.equalsIgnoreCase(policy.getProperties().get(Constants.TYPE).getValue().toString(), "naming")) + .flatMap(policy -> policy.getTargets().stream()) + .collect(toList()); + } } \ No newline at end of file diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/parser/VidNotionsBuilder.java b/vid-app-common/src/main/java/org/onap/vid/asdc/parser/VidNotionsBuilder.java new file mode 100644 index 000000000..ca0607b8a --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/parser/VidNotionsBuilder.java @@ -0,0 +1,130 @@ +package org.onap.vid.asdc.parser; + +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.vid.model.ServiceModel; +import org.onap.vid.model.VidNotions; +import org.onap.vid.properties.Features; +import org.togglz.core.manager.FeatureManager; + +import static org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase; +import static org.apache.commons.lang3.StringUtils.equalsIgnoreCase; + +public class VidNotionsBuilder { + + private final FeatureManager featureManager; + + public VidNotionsBuilder(FeatureManager featureManager) { + this.featureManager = featureManager; + } + + public VidNotions buildVidNotions(ISdcCsarHelper csarHelper, ServiceModel serviceModel) { + final VidNotions.InstantiationUI instantiationUI = suggestInstantiationUI(csarHelper); + + return new VidNotions(instantiationUI, suggestModelCategory(csarHelper), suggestViewEditUI(csarHelper, serviceModel)); + } + + //UI route a-la-carte services to old UI only if InstantiationUI is LEGACY + //So any other value for InstantiationUI other than LEGACY make UI to route + //a-la-carte services to new UI + VidNotions.InstantiationUI suggestInstantiationUI(ISdcCsarHelper csarHelper) { + if(featureManager.isActive(Features.FLAG_EXP_ANY_ALACARTE_NEW_INSTANTIATION_UI) && isALaCarte(csarHelper)) { + return VidNotions.InstantiationUI.ANY_ALACARTE_NEW_UI; + } + if (featureManager.isActive(Features.FLAG_1902_VNF_GROUPING) && isGrouping(csarHelper)) { + return VidNotions.InstantiationUI.SERVICE_WITH_VNF_GROUPING; + } + if (featureManager.isActive(Features.FLAG_5G_IN_NEW_INSTANTIATION_UI)) { + if (isUuidExactlyHardCoded1ffce89fef3f(csarHelper)) { + return VidNotions.InstantiationUI.SERVICE_UUID_IS_1ffce89f_ef3f_4cbb_8b37_82134590c5de; + } else if (isALaCarte(csarHelper) && hasAnyNetworkWithPropertyNetworkTechnologyEqualsStandardSriovOrOvs(csarHelper)) { + return VidNotions.InstantiationUI.NETWORK_WITH_PROPERTY_NETWORK_TECHNOLOGY_EQUALS_STANDARD_SRIOV_OR_OVS; + } else if (isALaCarte(csarHelper) && hasFabricConfiguration(csarHelper)) { + return VidNotions.InstantiationUI.SERVICE_WITH_FABRIC_CONFIGURATION; + } + } + + return VidNotions.InstantiationUI.LEGACY; + + } + + VidNotions.ModelCategory suggestModelCategory(ISdcCsarHelper csarHelper) { + if (isALaCarte(csarHelper) && hasAnyNetworkWithPropertyNetworkTechnologyEqualsStandardSriovOrOvs(csarHelper)){ + return VidNotions.ModelCategory.IS_5G_PROVIDER_NETWORK_MODEL; + } else if(isALaCarte(csarHelper) && hasFabricConfiguration(csarHelper)) { + return VidNotions.ModelCategory.IS_5G_FABRIC_CONFIGURATION_MODEL; + } else { + return VidNotions.ModelCategory.OTHER; + } + } + + VidNotions.InstantiationUI suggestViewEditUI(ISdcCsarHelper csarHelper, ServiceModel serviceModel) { + if (!featureManager.isActive(Features.FLAG_ASYNC_INSTANTIATION)){ + return VidNotions.InstantiationUI.LEGACY; + } + if (featureManager.isActive(Features.FLAG_1902_VNF_GROUPING) && isGrouping(csarHelper)) { + return VidNotions.InstantiationUI.SERVICE_WITH_VNF_GROUPING; + } + + if (featureManager.isActive(Features.FLAG_1902_NEW_VIEW_EDIT)) { + if (isMacro(serviceModel) && !isMacroExcludedFromAsyncFlow(serviceModel)) { + return VidNotions.InstantiationUI.MACRO_SERVICE; + } + VidNotions.InstantiationUI instantiationUISuggestion = suggestInstantiationUI(csarHelper); + if (instantiationUISuggestion!=VidNotions.InstantiationUI.LEGACY) { + return instantiationUISuggestion; + } + } + + return VidNotions.InstantiationUI.LEGACY; + } + + private boolean isMacro(ServiceModel serviceModel) { + return ToscaParserImpl2.Constants.MACRO.equals(serviceModel.getService().getInstantiationType()); + } + + private boolean isUuidExactlyHardCoded1ffce89fef3f(ISdcCsarHelper csarHelper) { + return equalsIgnoreCase( + csarHelper.getServiceMetadata().getValue(ToscaParserImpl2.Constants.UUID), "95eb2c44-bff2-4e8b-ad5d-8266870b7717"); + } + + private boolean hasAnyNetworkWithPropertyNetworkTechnologyEqualsStandardSriovOrOvs(ISdcCsarHelper csarHelper) { + return hasAnyNetworkWithPropertyEqualsToAnyOf(csarHelper, "network_technology","Standard-SR-IOV","OVS") ; + } + + boolean hasFabricConfiguration(ISdcCsarHelper csarHelper) { + return csarHelper.getServiceNodeTemplates().stream() + .flatMap(nodeTemplate -> csarHelper.getNodeTemplateChildren(nodeTemplate).stream()) + .anyMatch(child -> child.getType().equals(ToscaParserImpl2.Constants.FABRIC_CONFIGURATION_TYPE)); + } + + boolean hasAnyNetworkWithPropertyEqualsToAnyOf(ISdcCsarHelper csarHelper, String propertyName, String... propertyValues) { + return csarHelper + .getServiceVlList().stream() + .map(NodeTemplate::getProperties) + .flatMap(props -> props.entrySet().stream()) + .filter(prop -> equalsIgnoreCase(prop.getKey(), propertyName)) + // getValue().getValue() because value is Entry, where it's inner value is what we're looking for + .anyMatch(prop -> equalsAnyIgnoreCase(prop.getValue().getValue().toString(), propertyValues)); + } + + boolean isALaCarte(ISdcCsarHelper csarHelper) { + final String instantiationType = csarHelper.getServiceMetadata().getValue(ToscaParserImpl2.Constants.INSTANTIATION_TYPE); + return StringUtils.equalsIgnoreCase(instantiationType, ToscaParserImpl2.Constants.A_LA_CARTE); + } + + boolean isMacroExcludedFromAsyncFlow(ServiceModel serviceModel) { + return (MapUtils.isNotEmpty(serviceModel.getPnfs()) || + MapUtils.isNotEmpty(serviceModel.getCollectionResource()) || + (MapUtils.isNotEmpty(serviceModel.getNetworks()) && !featureManager.isActive(Features.FLAG_NETWORK_TO_ASYNC_INSTANTIATION))); + + + } + + private boolean isGrouping(ISdcCsarHelper csarHelper) { + final String serviceRole = csarHelper.getServiceMetadata().getValue(ToscaParserImpl2.Constants.SERVICE_ROLE); + return StringUtils.equalsIgnoreCase(serviceRole, ToscaParserImpl2.Constants.GROUPING); + } +} -- cgit 1.2.3-korg