From 56e56b8860cf6e7ad70dc65134e8fd87eaf01123 Mon Sep 17 00:00:00 2001 From: ojasdubey Date: Tue, 6 Mar 2018 12:01:54 +0530 Subject: VLAN tagging - VFC Instance Group 1. Create VFC instance group per sub-interface network role 2. Refactored PortTemplateConsolidationData and its references based on review comments 3. Updated test data after rebase 4. Updated to flatMap based on review comments Change-Id: I423593c5156ecae5eff3a4f2ce8591c85db727cc Issue-ID: SDC-1073 Signed-off-by: ojasdubey --- .../datatypes/heattotosca/TranslationContext.java | 24 ++++- .../PortTemplateConsolidationData.java | 55 +++++++++-- .../services/heattotosca/ConfigConstants.java | 19 ++-- .../heattotosca/ConsolidationDataUtil.java | 34 +------ .../services/heattotosca/ConsolidationService.java | 36 ++++--- .../translator/services/heattotosca/Constants.java | 3 + .../heattotosca/UnifiedCompositionService.java | 107 +++++++++++++++++++-- .../heattotosca/UnifiedCompositionUtil.java | 45 ++------- .../UnifiedCompositionCatalogInstance.java | 44 ++++++--- .../UnifiedCompositionScalingInstances.java | 26 ++++- .../UnifiedCompositionSingleSubstitution.java | 32 ++++-- .../src/main/resources/config-unifiedModel.json | 16 +++ 12 files changed, 301 insertions(+), 140 deletions(-) create mode 100644 openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/resources/config-unifiedModel.json (limited to 'openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main') diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/TranslationContext.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/TranslationContext.java index 8175072bbc..7c55c37d53 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/TranslationContext.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/TranslationContext.java @@ -60,7 +60,9 @@ public class TranslationContext { private static Map nameExtractorImplMap; private static Map supportedConsolidationComputeResources; private static Map supportedConsolidationPortResources; + private static List vfcGroupSubInterfaceExposedProperties; private static List enrichPortResourceProperties; + private static ImplementationConfiguration vfcInstanceGroupConfiguration; private ManifestFile manifest; private FileContentHandler files = new FileContentHandler(); private Map manifestFiles = new HashMap<>(); @@ -94,7 +96,7 @@ public class TranslationContext { private Set nodeTemplateIdsPointingToStWithoutNodeTemplates = new HashSet<>(); - //Key - service template name, value - Map of key: node template id, value: proerties with %index% + //Key - service template name, value - Map of key: node template id, value: properties with %index% private Map> indexVarProperties = new HashMap<>(); static { @@ -118,6 +120,26 @@ public class TranslationContext { enrichPortResourceProperties = config.getAsStringValues(ConfigConstants .MANDATORY_UNIFIED_MODEL_NAMESPACE, ConfigConstants .ENRICH_PORT_RESOURCE_PROP); + vfcInstanceGroupConfiguration = getVfcInstanceGroupConfiguration(config); + vfcGroupSubInterfaceExposedProperties = config.getAsStringValues(ConfigConstants + .UNIFIED_MODEL_NAMESPACE, ConfigConstants.FULL_EXPOSED_PROPERTIES_KEY); + } + + + private static ImplementationConfiguration getVfcInstanceGroupConfiguration(Configuration config) { + Map supportedUnifiedModelProperties = + config.populateMap(ConfigConstants.UNIFIED_MODEL_NAMESPACE, ConfigConstants.UNIFIED_MODEL_IMPL_KEY, + ImplementationConfiguration.class); + return MapUtils.isEmpty(supportedUnifiedModelProperties) ? null : + supportedUnifiedModelProperties.get(ConfigConstants.VFC_INSTANCE_GROUP_KEY); + } + + public static boolean isVfcInstanceGroupingEnabled() { + return Objects.nonNull(vfcInstanceGroupConfiguration) && vfcInstanceGroupConfiguration.isEnable(); + } + + public static List getExposedVfcInstanceGroupingProperties() { + return vfcGroupSubInterfaceExposedProperties; } public static List getEnrichPortResourceProperties() { diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/PortTemplateConsolidationData.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/PortTemplateConsolidationData.java index 5d372370e3..487771b12d 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/PortTemplateConsolidationData.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/datatypes/heattotosca/unifiedmodel/consolidation/PortTemplateConsolidationData.java @@ -19,9 +19,15 @@ package org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.consolid import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; +import org.apache.commons.collections4.CollectionUtils; +import org.openecomp.core.utilities.file.FileUtils; +import org.openecomp.sdc.heat.datatypes.model.Resource; +import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; +import org.openecomp.sdc.translator.services.heattotosca.HeatToToscaUtil; import java.util.List; -import java.util.Set; +import java.util.Objects; +import java.util.Optional; /** @@ -32,7 +38,7 @@ public class PortTemplateConsolidationData extends EntityConsolidationData { // key - sub-interface type - for ResourceGroup it is the nested file name // value - List of sub-interfaces of that type in the port private final ListMultimap subInterfaceConsolidationData = - Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); + Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); private String networkRole; @@ -44,13 +50,41 @@ public class PortTemplateConsolidationData extends EntityConsolidationData { this.networkRole = networkRole; } - public List getSubInterfaceConsolidationData( - String subInterfaceType) { - return this.subInterfaceConsolidationData.get(subInterfaceType); + public SubInterfaceTemplateConsolidationData getSubInterfaceResourceTemplateConsolidationData(Resource resource, + String subInterfaceNodeTemplateId, + String parentPortNodeTemplateId) { + String subInterfaceType = createSubInterfaceType(resource); + List subInterfaceTemplateConsolidationDataList = + subInterfaceConsolidationData.get(subInterfaceType); + SubInterfaceTemplateConsolidationData consolidationData = null; + if (CollectionUtils.isNotEmpty(subInterfaceTemplateConsolidationDataList)) { + Optional optionalConsolidationData = + subInterfaceTemplateConsolidationDataList.stream() + .filter(s -> s.getNodeTemplateId().equals(subInterfaceNodeTemplateId)) + .findFirst(); + if (optionalConsolidationData.isPresent()) { + consolidationData = optionalConsolidationData.get(); + } + } + + if (Objects.isNull(consolidationData)) { + consolidationData = createSubInterfaceConsolidationData(subInterfaceNodeTemplateId, parentPortNodeTemplateId); + addSubInterfaceConsolidationData(subInterfaceType, consolidationData); + } + return consolidationData; } - public Set getAllSubInterfaceNodeTypes() { - return this.subInterfaceConsolidationData.keySet(); + private String createSubInterfaceType(Resource resource) { + + return ToscaNodeType.VLAN_SUB_INTERFACE_RESOURCE_TYPE_PREFIX + + FileUtils.getFileWithoutExtention(HeatToToscaUtil.getSubInterfaceResourceType(resource)); + } + + private SubInterfaceTemplateConsolidationData createSubInterfaceConsolidationData(String subInterfaceNodeTemplateId, String parentPortNodeTemplateId) { + SubInterfaceTemplateConsolidationData data = new SubInterfaceTemplateConsolidationData(); + data.setNodeTemplateId(subInterfaceNodeTemplateId); + data.setParentPortNodeTemplateId(parentPortNodeTemplateId); + return data; } public void addSubInterfaceConsolidationData(String subPortType, @@ -81,6 +115,13 @@ public class PortTemplateConsolidationData extends EntityConsolidationData { } + public boolean isSubInterfaceNodeTemplateIdParameter(String nodeTemplateType) { + List subInterfaceTemplateConsolidationDataList = + this.subInterfaceConsolidationData.get(nodeTemplateType); + return (Objects.nonNull(subInterfaceTemplateConsolidationDataList) + && subInterfaceTemplateConsolidationDataList.size() > 1) ; + } + private int calculateSize(List subInterfaces) { return subInterfaces == null ? 0 : subInterfaces.size(); } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConfigConstants.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConfigConstants.java index ca9f21b79a..676eb7d7a9 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConfigConstants.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConfigConstants.java @@ -1,21 +1,17 @@ -/*- - * ============LICENSE_START======================================================= - * SDC - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ +/* + * Copyright © 2016-2018 European Support Limited + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * ============LICENSE_END========================================================= */ package org.openecomp.sdc.translator.services.heattotosca; @@ -24,6 +20,7 @@ public class ConfigConstants { //namespaces public static final String MANDATORY_TRANSLATOR_NAMESPACE = "mandatoryHeatToToscaTranslator"; public static final String MANDATORY_UNIFIED_MODEL_NAMESPACE = "mandatoryUnifiedModel"; + public static final String UNIFIED_MODEL_NAMESPACE = "unifiedModel"; public static final String TRANSLATOR_NAMESPACE = "heatToToscaTranslator"; public static final String MAPPING_NAMESPACE = "heatToToscaMapping"; @@ -42,6 +39,10 @@ public class ConfigConstants { "supportedConsolidationPortResources"; public static final String ENRICH_PORT_RESOURCE_PROP = "enrichPortResourceProperties"; + public static final String UNIFIED_MODEL_IMPL_KEY = "unifiedModelImpl"; + public static final String VFC_INSTANCE_GROUP_KEY = "vfcInstanceGroup"; + public static final String FULL_EXPOSED_PROPERTIES_KEY = + "unifiedModelImpl.vfcInstanceGroup.properties.exposedProperties"; //others diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationDataUtil.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationDataUtil.java index 717f681073..282c444a57 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationDataUtil.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationDataUtil.java @@ -16,7 +16,6 @@ package org.openecomp.sdc.translator.services.heattotosca; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.openecomp.core.utilities.file.FileUtils; @@ -25,7 +24,6 @@ import org.openecomp.sdc.datatypes.configuration.ImplementationConfiguration; import org.openecomp.sdc.heat.datatypes.model.HeatOrchestrationTemplate; import org.openecomp.sdc.heat.datatypes.model.HeatResourcesTypes; import org.openecomp.sdc.heat.datatypes.model.Resource; -import org.openecomp.sdc.tosca.datatypes.ToscaNodeType; import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate; import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; @@ -211,40 +209,10 @@ public class ConsolidationDataUtil { portTemplateConsolidationData); } - return getSubInterfaceResourceTemplateConsolidationData(subInterfaceTo.getResource(), portTemplateConsolidationData, + return portTemplateConsolidationData.getSubInterfaceResourceTemplateConsolidationData(subInterfaceTo.getResource(), subInterfaceNodeTemplateId, parentPortNodeTemplateId); } - private static SubInterfaceTemplateConsolidationData getSubInterfaceResourceTemplateConsolidationData( - Resource resource, - PortTemplateConsolidationData portTemplateConsolidationData, - String subInterfaceNodeTemplateId, - String parentPortNodeTemplateId) { - String subInterfaceType = ToscaNodeType.VLAN_SUB_INTERFACE_RESOURCE_TYPE_PREFIX - + FileUtils.getFileWithoutExtention(HeatToToscaUtil.getSubInterfaceResourceType(resource)); - SubInterfaceTemplateConsolidationData data = new SubInterfaceTemplateConsolidationData(); - data.setNodeTemplateId(subInterfaceNodeTemplateId); - data.setParentPortNodeTemplateId(parentPortNodeTemplateId); - if (CollectionUtils.isNotEmpty(portTemplateConsolidationData.getSubInterfaceConsolidationData(subInterfaceType))) { - boolean isNewSubInterface = true; - List subInterfaceTemplateConsolidationDataList = - portTemplateConsolidationData.getSubInterfaceConsolidationData(subInterfaceType); - for (SubInterfaceTemplateConsolidationData subInterfaceTemplateConsolidationData : - subInterfaceTemplateConsolidationDataList) { - if (subInterfaceNodeTemplateId.equals(subInterfaceTemplateConsolidationData.getNodeTemplateId())) { - data = subInterfaceTemplateConsolidationData; - isNewSubInterface = false; - } - } - if (isNewSubInterface) { - portTemplateConsolidationData.addSubInterfaceConsolidationData(subInterfaceType, data); - } - } else { - portTemplateConsolidationData.addSubInterfaceConsolidationData(subInterfaceType, data); - } - return data; - } - /** * Gets nested template consolidation data. * diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java index 30a2f4ad20..cb6a3bc351 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/ConsolidationService.java @@ -950,28 +950,34 @@ public class ConsolidationService { FilePortConsolidationData filePortConsolidationData = consolidationData.getPortConsolidationData().getFilePortConsolidationData(ToscaUtil .getServiceTemplateFileName(serviceTemplate)); - List subInterfaceTemplateConsolidationDataList = - new ArrayList<>(); - for (List portList : portCollection) { - for (String portId : portList) { - if (!Objects.isNull(filePortConsolidationData)) { - PortTemplateConsolidationData portTemplateConsolidationData = - filePortConsolidationData.getPortTemplateConsolidationData(portId); - unifiedCompositionData.addPortTemplateConsolidationData(portTemplateConsolidationData); - if (portTemplateConsolidationData != null) { - portTemplateConsolidationData.copyFlatInto(subInterfaceTemplateConsolidationDataList); - } - } - } - } + List subInterfaceTemplateConsolidationDataList = new ArrayList<>(); + portCollection.stream() + .flatMap(Collection::stream) + .forEach(portId -> setUnifiedCompositionDataWithPortTemplateData(filePortConsolidationData, portId, + unifiedCompositionData, subInterfaceTemplateConsolidationDataList)); unifiedCompositionData.setSubInterfaceTemplateConsolidationDataList( subInterfaceTemplateConsolidationDataList); unifiedCompositionDataList.add(unifiedCompositionData); } - return unifiedCompositionDataList; } + private void setUnifiedCompositionDataWithPortTemplateData(FilePortConsolidationData filePortConsolidationData, + String portId, + UnifiedCompositionData unifiedCompositionData, + List + subInterfaceTemplateConsolidationDataList) { + if (Objects.isNull(filePortConsolidationData)) { + return; + } + PortTemplateConsolidationData portTemplateConsolidationData = + filePortConsolidationData.getPortTemplateConsolidationData(portId); + unifiedCompositionData.addPortTemplateConsolidationData(portTemplateConsolidationData); + if (portTemplateConsolidationData != null) { + portTemplateConsolidationData.copyFlatInto(subInterfaceTemplateConsolidationDataList); + } + } + private List createSubstitutionUnifiedCompositionDataList( String substituteNodeTemplateId, ServiceTemplate serviceTemplate, diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/Constants.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/Constants.java index 98e650719e..d0b1dd0096 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/Constants.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/Constants.java @@ -26,11 +26,14 @@ public class Constants { public static final String NAME_PROPERTY_NAME = "name"; public static final String SECURITY_GROUPS_PROPERTY_NAME = "security_groups"; public static final String PORT_PROPERTY_NAME = "port"; + static final String VFC_PARENT_PORT_ROLE = "vfc_parent_port_role"; + static final String SUB_INTERFACE_ROLE = "subinterface_role"; //General public static final String PROP = "properties"; public static final String ATTR = "attributes"; public static final String SERVICE_INSTANCE_PORT_PREFIX = "port_"; public static final String SERVICE_INSTANCE_LINK_PREFIX = "link_"; + static final String GROUP = "group"; //Unified model static final String COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX = "vm_"; static final String COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX = "_name"; diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java index ae48ccf156..f064fb6b60 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionService.java @@ -16,6 +16,9 @@ package org.openecomp.sdc.translator.services.heattotosca; +import static org.openecomp.sdc.tosca.datatypes.ToscaFunctions.GET_INPUT; +import static org.openecomp.sdc.tosca.datatypes.ToscaNodeType.GROUP_TYPE_PREFIX; +import static org.openecomp.sdc.tosca.datatypes.ToscaNodeType.VFC_INSTANCE_GROUP; import static org.openecomp.sdc.tosca.services.DataModelUtil.getClonedObject; import static org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity.COMPUTE; import static org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.composition.UnifiedCompositionEntity.PORT; @@ -23,8 +26,11 @@ import static org.openecomp.sdc.translator.datatypes.heattotosca.unifiedmodel.co import static org.openecomp.sdc.translator.services.heattotosca.Constants.ABSTRACT_NODE_TEMPLATE_ID_PREFIX; import static org.openecomp.sdc.translator.services.heattotosca.Constants.COMPUTE_IDENTICAL_VALUE_PROPERTY_PREFIX; import static org.openecomp.sdc.translator.services.heattotosca.Constants.COMPUTE_IDENTICAL_VALUE_PROPERTY_SUFFIX; +import static org.openecomp.sdc.translator.services.heattotosca.Constants.GROUP; import static org.openecomp.sdc.translator.services.heattotosca.Constants.PORT_IDENTICAL_VALUE_PROPERTY_PREFIX; import static org.openecomp.sdc.translator.services.heattotosca.Constants.SUB_INTERFACE_PROPERTY_VALUE_PREFIX; +import static org.openecomp.sdc.translator.services.heattotosca.Constants.SUB_INTERFACE_ROLE; +import static org.openecomp.sdc.translator.services.heattotosca.Constants.VFC_PARENT_PORT_ROLE; import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getComputeTypeSuffix; import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getConnectedComputeConsolidationData; import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getNewComputeNodeTemplateId; @@ -34,6 +40,7 @@ import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositi import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getSubInterfaceTemplateConsolidationDataList; import static org.openecomp.sdc.translator.services.heattotosca.UnifiedCompositionUtil.getSubInterfaceTypeSuffix; +import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import org.apache.commons.collections.map.HashedMap; import org.apache.commons.collections4.CollectionUtils; @@ -268,6 +275,92 @@ public class UnifiedCompositionService { } + public void createVfcInstanceGroup(String abstractNodeTemplateId, + ServiceTemplate serviceTemplate, + List unifiedCompositionDataList, + TranslationContext context) { + if (!TranslationContext.isVfcInstanceGroupingEnabled()) { + return; + } + for (UnifiedCompositionData unifiedCompositionData : unifiedCompositionDataList) { + List subInterfaceTemplateConsolidationDataList = + getSubInterfaceTemplateConsolidationDataList(unifiedCompositionData); + if (CollectionUtils.isNotEmpty(subInterfaceTemplateConsolidationDataList)) { + createVfcInstanceGroupPerSubInterface(abstractNodeTemplateId, serviceTemplate, + subInterfaceTemplateConsolidationDataList, context); + } + } + } + + private void createVfcInstanceGroupPerSubInterface(String abstractNodeTemplateId, + ServiceTemplate serviceTemplate, + List + subInterfaceList, + TranslationContext context) { + for (SubInterfaceTemplateConsolidationData subInterface : subInterfaceList) { + PortTemplateConsolidationData subInterfacePortTemplateConsolidationData = + getSubInterfacePortTemplateConsolidationData(serviceTemplate, subInterface, context); + String subInterfaceNetworkRole = subInterface.getNetworkRole(); + if (Objects.isNull(subInterfaceNetworkRole) + || Objects.isNull(subInterfacePortTemplateConsolidationData.getNetworkRole())) { + continue; + } + String vfcNetworkRoleGroupId = getVfcNetworkRoleGroupId(subInterfaceNetworkRole); + Map groups = DataModelUtil.getGroups(serviceTemplate); + if (!groups.containsKey(vfcNetworkRoleGroupId)) { + createNewVfcInstanceGroup(serviceTemplate, subInterfacePortTemplateConsolidationData, + subInterfaceNetworkRole, vfcNetworkRoleGroupId); + } + DataModelUtil.addGroupMember(serviceTemplate, vfcNetworkRoleGroupId, abstractNodeTemplateId); + } + } + + private void createNewVfcInstanceGroup(ServiceTemplate serviceTemplate, + PortTemplateConsolidationData portTemplate, + String subInterfaceNetworkRole, + String vfcNetworkRoleGroupId) { + Map properties = new HashMap<>(); + properties.put(SUB_INTERFACE_ROLE, subInterfaceNetworkRole); + properties.put(VFC_PARENT_PORT_ROLE, portTemplate.getNetworkRole()); + + updateVfcInstanceGroupExposedProperties(subInterfaceNetworkRole, + serviceTemplate, properties); + + GroupDefinition groupDefinition = new GroupDefinition(); + groupDefinition.setType(GROUP_TYPE_PREFIX + VFC_INSTANCE_GROUP); + groupDefinition.setProperties(properties); + + DataModelUtil.addGroupDefinitionToTopologyTemplate(serviceTemplate, + vfcNetworkRoleGroupId, groupDefinition); + } + + private void updateVfcInstanceGroupExposedProperties(String subInterfaceNetworkRole, + ServiceTemplate serviceTemplate, + Map properties) { + List exposedVfcInstanceGroupingProperties = + TranslationContext.getExposedVfcInstanceGroupingProperties(); + + if (CollectionUtils.isEmpty(exposedVfcInstanceGroupingProperties)) { + return; + } + + for (String propertyName : exposedVfcInstanceGroupingProperties) { + Map getInputMap = new HashMap<>(); + String vfcGroupPropertyInputName = subInterfaceNetworkRole + "_" + propertyName; + getInputMap.put(GET_INPUT.getDisplayName(), vfcGroupPropertyInputName); + properties.put(propertyName, getInputMap); + + addInputParameter(vfcGroupPropertyInputName, PropertyType.STRING.getDisplayName(), null, + serviceTemplate); + } + } + + private String getVfcNetworkRoleGroupId(String subInterfaceNetworkRole) { + StringBuilder sb = new StringBuilder(); + sb.append(subInterfaceNetworkRole).append("_").append(GROUP); + return sb.toString(); + } + /** * Update the connectivity from/to the "moved" nodes from the original service template to the new * substitution service template. @@ -2612,7 +2705,7 @@ public class UnifiedCompositionService { case SUB_INTERFACE: String subInterfaceType = getSubInterfaceTypeSuffix(nodeTemplate.getType()); if (Objects.isNull(portTemplateConsolidationData) - || isSubInterfaceNodeTemplateIdParameter(portTemplateConsolidationData, nodeTemplate)) { + || portTemplateConsolidationData.isSubInterfaceNodeTemplateIdParameter(nodeTemplate.getType())) { paramterId = UnifiedCompositionEntity.SUB_INTERFACE.getDisplayName().toLowerCase() + "_" + nodeTemplateId + "_" + propertyId; } else { @@ -2626,14 +2719,6 @@ public class UnifiedCompositionService { return paramterId; } - private boolean isSubInterfaceNodeTemplateIdParameter(PortTemplateConsolidationData portTemplateConsolidationData, - NodeTemplate nodeTemplate) { - List subInterfaceTemplateConsolidationDataList = - portTemplateConsolidationData.getSubInterfaceConsolidationData(nodeTemplate.getType()); - return (Objects.nonNull(subInterfaceTemplateConsolidationDataList) - && subInterfaceTemplateConsolidationDataList.size() > 1) ; - } - private void removeConnectivityOut(EntityConsolidationData entityConsolidationData, NodeTemplate nodeTemplate) { if (MapUtils.isEmpty(entityConsolidationData.getNodesConnectedOut())) { @@ -2966,7 +3051,9 @@ public class UnifiedCompositionService { getPortTemplateConsolidationDataList(unifiedCompositionData); for (PortTemplateConsolidationData portTemplateConsolidationData : portTemplateConsolidationDataList) { - subInterfaceTypes.addAll(portTemplateConsolidationData.getAllSubInterfaceNodeTypes()); + ListMultimap subInterfaceTypeToEntity = ArrayListMultimap.create(); + portTemplateConsolidationData.copyMappedInto(subInterfaceTypeToEntity); + subInterfaceTypes.addAll(subInterfaceTypeToEntity.keySet()); } if (subInterfaceTypes.stream().map(UnifiedCompositionUtil::getSubInterfaceTypeSuffix) diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java index 4d9a269c2e..223dc8760a 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/UnifiedCompositionUtil.java @@ -18,7 +18,6 @@ package org.openecomp.sdc.translator.services.heattotosca; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; -import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.LoggerFactory; @@ -39,8 +38,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; /** * Utility class for consolidation data collection helper methods. @@ -80,32 +77,11 @@ public class UnifiedCompositionUtil { portTemplateConsolidationDataCollection) { ListMultimap subInterfaceDataByType = ArrayListMultimap.create(); for (PortTemplateConsolidationData port : portTemplateConsolidationDataCollection) { - Set allSubInterfaceNodeTypes = port.getAllSubInterfaceNodeTypes(); - if (CollectionUtils.isEmpty(allSubInterfaceNodeTypes)) { - continue; - } - for (String subInterfaceNodeType : allSubInterfaceNodeTypes) { - subInterfaceDataByType.putAll(subInterfaceNodeType, - port.getSubInterfaceConsolidationData(subInterfaceNodeType)); - } + port.copyMappedInto(subInterfaceDataByType); } return subInterfaceDataByType; } - static List getSubInterfaceNodeTemplateIdsByType(PortTemplateConsolidationData - portTemplateConsolidationData, - String subInterfaceType) { - List subInterfaceNodeTemplateIds = new ArrayList<>(); - List subInterfaceTemplateConsolidationDataList = - portTemplateConsolidationData.getSubInterfaceConsolidationData(subInterfaceType); - if (CollectionUtils.isNotEmpty(subInterfaceTemplateConsolidationDataList)) { - subInterfaceNodeTemplateIds = subInterfaceTemplateConsolidationDataList.stream() - .map(SubInterfaceTemplateConsolidationData::getNodeTemplateId) - .collect(Collectors.toList()); - } - return subInterfaceNodeTemplateIds; - } - private static void addPortsToMap(Map> portTypeToIds, Map> ports) { for (Map.Entry> portTypeToIdEntry : ports.entrySet()) { @@ -184,21 +160,14 @@ public class UnifiedCompositionUtil { NodeTemplate subInterfaceNodeTemplate = DataModelUtil.getNodeTemplate(serviceTemplate, subInterfaceTemplateConsolidationData.getNodeTemplateId()); if (Objects.nonNull(portTemplateConsolidationData)) { - List subInterfaceNodeTemplateIdsByType = - UnifiedCompositionUtil.getSubInterfaceNodeTemplateIdsByType(portTemplateConsolidationData, - subInterfaceNodeTemplate.getType()); - if (CollectionUtils.isNotEmpty(subInterfaceNodeTemplateIdsByType)) { - //If there are more than one subinterfaces with same type use node template id - if (subInterfaceNodeTemplateIdsByType.size() > 1) { - newSubInterfaceNodeTemplateId.append("_").append(subInterfaceTemplateConsolidationData.getNodeTemplateId()); - } else { - //Add sub interface type since we have only one subinterface per type - String subInterfaceTypeSuffix = getSubInterfaceTypeSuffix(subInterfaceNodeTemplate.getType()); - newSubInterfaceNodeTemplateId.append("_").append(subInterfaceTypeSuffix); - } + String subInterfaceSuffix = (portTemplateConsolidationData.isSubInterfaceNodeTemplateIdParameter(subInterfaceNodeTemplate.getType()))? + //If there are more than one subinterfaces with same type use node template id + subInterfaceTemplateConsolidationData.getNodeTemplateId(): + //Add sub interface type since we have only one subinterface per type + getSubInterfaceTypeSuffix(subInterfaceNodeTemplate.getType()); + newSubInterfaceNodeTemplateId.append("_").append(subInterfaceSuffix); return newSubInterfaceNodeTemplateId.toString(); } - } return subInterfaceTemplateConsolidationData.getNodeTemplateId(); } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionCatalogInstance.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionCatalogInstance.java index dfb40af698..ad7deb9797 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionCatalogInstance.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionCatalogInstance.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2016-2018 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.openecomp.sdc.translator.services.heattotosca.impl.unifiedcomposition; import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate; @@ -12,31 +28,26 @@ import java.util.Optional; public class UnifiedCompositionCatalogInstance implements UnifiedComposition { - UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); - - // There is consolidation in ScalingInstance implemetation. + // There is consolidation in ScalingInstance implementation. // In case of scaling instance, if there is more than one entry in the - // unifiedComposotionDataList, we should have consolidation between them. + // unifiedCompositionDataList, we should have consolidation between them. // (all entries in the list are the once which need to be consolidated) @Override public void createUnifiedComposition(ServiceTemplate serviceTemplate, ServiceTemplate nestedServiceTemplate, - List unifiedComposotionDataList, + List unifiedCompositionDataList, TranslationContext context) { UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); unifiedCompositionService.handleComplexVfcType(serviceTemplate, context); - UnifiedCompositionSingleSubstitution unifiedCompositionSingleSubstitution = - new UnifiedCompositionSingleSubstitution(); - String substitutionNodeTypeId = unifiedCompositionService.getSubstitutionNodeTypeId(serviceTemplate, - unifiedComposotionDataList.get(0), null, context); + unifiedCompositionDataList.get(0), null, context); // create one substitution ST for all computes Optional substitutionServiceTemplate = unifiedCompositionService.createUnifiedSubstitutionServiceTemplate(serviceTemplate, - unifiedComposotionDataList, context, substitutionNodeTypeId, null); + unifiedCompositionDataList, context, substitutionNodeTypeId, null); if (!substitutionServiceTemplate.isPresent()) { return; @@ -44,16 +55,19 @@ public class UnifiedCompositionCatalogInstance implements UnifiedComposition { // create abstract NT for each compute - for(int i = 0; i < unifiedComposotionDataList.size(); i++){ + for (int i = 0; i < unifiedCompositionDataList.size(); i++) { List catalogInstanceUnifiedList = new ArrayList<>(); - catalogInstanceUnifiedList.add(unifiedComposotionDataList.get(i)); + catalogInstanceUnifiedList.add(unifiedCompositionDataList.get(i)); - Integer index = unifiedComposotionDataList.size() > 1 ? i : null; + Integer index = unifiedCompositionDataList.size() > 1 ? i : null; - unifiedCompositionService + String abstractSubstituteNodeTemplateId = unifiedCompositionService .createAbstractSubstituteNodeTemplate(serviceTemplate, substitutionServiceTemplate.get(), catalogInstanceUnifiedList, substitutionNodeTypeId, context, index); + unifiedCompositionService.createVfcInstanceGroup(abstractSubstituteNodeTemplateId, + serviceTemplate, catalogInstanceUnifiedList, context); + unifiedCompositionService .updateCompositionConnectivity(serviceTemplate, catalogInstanceUnifiedList, context); @@ -61,7 +75,7 @@ public class UnifiedCompositionCatalogInstance implements UnifiedComposition { .cleanUnifiedCompositionEntities(serviceTemplate, catalogInstanceUnifiedList, context); } - unifiedCompositionService.cleanNodeTypes(serviceTemplate, unifiedComposotionDataList, context); + unifiedCompositionService.cleanNodeTypes(serviceTemplate, unifiedCompositionDataList, context); unifiedCompositionService.updateSubstitutionNodeTypePrefix(substitutionServiceTemplate.get()); } } diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionScalingInstances.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionScalingInstances.java index 9572f672dd..6f53249542 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionScalingInstances.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionScalingInstances.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2016-2018 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.openecomp.sdc.translator.services.heattotosca.impl.unifiedcomposition; import org.apache.commons.collections4.CollectionUtils; @@ -26,21 +42,23 @@ public class UnifiedCompositionScalingInstances implements UnifiedComposition { unifiedCompositionService.handleComplexVfcType(serviceTemplate, context); - Integer index = null; String substitutionNodeTypeId = unifiedCompositionService.getSubstitutionNodeTypeId(serviceTemplate, unifiedCompositionDataList.get(0), null, context); Optional substitutionServiceTemplate = unifiedCompositionService.createUnifiedSubstitutionServiceTemplate(serviceTemplate, - unifiedCompositionDataList, context, substitutionNodeTypeId, index); + unifiedCompositionDataList, context, substitutionNodeTypeId, null); if (!substitutionServiceTemplate.isPresent()) { return; } - String abstractNodeTemplateId = unifiedCompositionService + String abstractSubstituteNodeTemplateId = unifiedCompositionService .createAbstractSubstituteNodeTemplate(serviceTemplate, substitutionServiceTemplate.get(), - unifiedCompositionDataList, substitutionNodeTypeId, context, index); + unifiedCompositionDataList, substitutionNodeTypeId, context, null); + + unifiedCompositionService.createVfcInstanceGroup(abstractSubstituteNodeTemplateId, + serviceTemplate, unifiedCompositionDataList, context); unifiedCompositionService .updateCompositionConnectivity(serviceTemplate, unifiedCompositionDataList, context); diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionSingleSubstitution.java b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionSingleSubstitution.java index ef9555302c..ee5d465d3c 100644 --- a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionSingleSubstitution.java +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/java/org/openecomp/sdc/translator/services/heattotosca/impl/unifiedcomposition/UnifiedCompositionSingleSubstitution.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2016-2018 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.openecomp.sdc.translator.services.heattotosca.impl.unifiedcomposition; import org.apache.commons.collections4.CollectionUtils; @@ -17,14 +33,14 @@ import java.util.Optional; */ public class UnifiedCompositionSingleSubstitution implements UnifiedComposition { - UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); + private UnifiedCompositionService unifiedCompositionService = new UnifiedCompositionService(); - // There is no consolidation in SingleSubstitution implemetation. + // There is no consolidation in SingleSubstitution implementation. // In case of single substitution, if there is more than one entry in the - // unifiedComposotionDataList, they all should contain the same compute type but the + // unifiedCompositionDataList, they all should contain the same compute type but the // consolidation between them was canceled. // For different compute type, this implementation will be called more than once, each time - // per diff compute type, while sending one entry in the unifiedComposotionDataList. + // per diff compute type, while sending one entry in the unifiedCompositionDataList. @Override public void createUnifiedComposition(ServiceTemplate serviceTemplate, ServiceTemplate nestedServiceTemplate, @@ -41,8 +57,6 @@ public class UnifiedCompositionSingleSubstitution implements UnifiedComposition List singleSubstitutionUnifiedList = new ArrayList<>(); singleSubstitutionUnifiedList.add(unifiedCompositionDataList.get(i)); - Integer index = unifiedCompositionDataList.size() > 1 ? i : null; - String substitutionNodeTypeId = unifiedCompositionService.getSubstitutionNodeTypeId(serviceTemplate, singleSubstitutionUnifiedList.get(0), null, context); @@ -55,11 +69,13 @@ public class UnifiedCompositionSingleSubstitution implements UnifiedComposition continue; } - - String abstractNodeTemplateId = unifiedCompositionService + String abstractSubstituteNodeTemplateId = unifiedCompositionService .createAbstractSubstituteNodeTemplate(serviceTemplate, substitutionServiceTemplate.get(), singleSubstitutionUnifiedList, substitutionNodeTypeId, context, null); + unifiedCompositionService.createVfcInstanceGroup(abstractSubstituteNodeTemplateId, + serviceTemplate, singleSubstitutionUnifiedList, context); + unifiedCompositionService .updateCompositionConnectivity(serviceTemplate, singleSubstitutionUnifiedList, context); diff --git a/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/resources/config-unifiedModel.json b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/resources/config-unifiedModel.json new file mode 100644 index 0000000000..5fe6ef551d --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-translator-lib/openecomp-sdc-translator-core/src/main/resources/config-unifiedModel.json @@ -0,0 +1,16 @@ +{ + "unifiedModelImpl": { + "vfcInstanceGroup": { + "enable": true, + "properties": { + "exposedProperties": [ + "network_collection_function", + "vfc_instance_group_function" + ] + } + } + }, + "_config": { + "namespace": "unifiedModel" + } +} \ No newline at end of file -- cgit 1.2.3-korg