From 45cbac699c67de72160d6aa83c3979b675bc326c Mon Sep 17 00:00:00 2001 From: Pavel Aharoni Date: Thu, 29 Jun 2017 19:18:21 +0300 Subject: [PATCH] [SDC-42] retrieve all port props from VFC Change-Id: I6f7549d5a39b6b22cd0c9ce3bf402efa2c3372f0 Signed-off-by: Pavel Aharoni --- .../sdc/tosca/parser/impl/SdcCsarHelperImpl.java | 68 ++++++++++++--------- .../sdc/impl/ToscaParserNodeTemplateTest.java | 17 +++--- .../csars/service-consolidated-props-csar.csar | Bin 321286 -> 321331 bytes 3 files changed, 46 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcCsarHelperImpl.java b/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcCsarHelperImpl.java index 8095974..e3b9937 100644 --- a/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcCsarHelperImpl.java +++ b/src/main/java/org/openecomp/sdc/tosca/parser/impl/SdcCsarHelperImpl.java @@ -22,11 +22,9 @@ package org.openecomp.sdc.tosca.parser.impl; import java.util.*; import java.util.Map.Entry; -import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; //import org.json.JSONObject; @@ -52,9 +50,7 @@ import static org.openecomp.sdc.tosca.parser.impl.SdcPropertyNames.PROPERTY_NAME public class SdcCsarHelperImpl implements ISdcCsarHelper { private static final String PATH_DELIMITER = "#"; - private static final String PREFIX = "port_"; private static final String CUSTOMIZATION_UUID = "customizationUUID"; - private static Pattern SUFFIX = Pattern.compile("(_network_role_tag|_ip_requirements|_subnetpoolid)$"); private ToscaTemplate toscaTemplate; private static Logger log = LoggerFactory.getLogger(SdcCsarHelperImpl.class.getName()); @@ -101,37 +97,30 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return new HashMap<>(); } - List paths = new ArrayList<>(); - paths.add("network_role_tag"); - paths.add("ip_requirements#ip_count_required#count"); - paths.add("ip_requirements#dhcp_enabled"); - paths.add("ip_requirements#ip_version"); - paths.add("subnetpoolid"); - - Map props = vfc.getProperties(); - + String presetProperty = "_ip_requirements"; Map> cps = new HashMap<>(); + Map props = vfc.getProperties(); if (props != null) { + // find all port names by pre-set property (ip_requirements) for (Map.Entry entry : props.entrySet()) { - String fullCpName = entry.getKey(); - Matcher matcher = SUFFIX.matcher(fullCpName); - - if (fullCpName.startsWith(PREFIX) && matcher.find()) { - //this is CP - get all it's properties according to paths list - String cpName = fullCpName.replaceAll("^(" + PREFIX + ")", "").replaceAll(matcher.group(1), ""); - - List propertiesToSearch = paths.stream().filter(i -> i.contains(StringUtils.stripStart(matcher.group(1), "_"))).collect(Collectors.toList()); - for (String item : propertiesToSearch) { - String fullPathToSearch = PREFIX + cpName + "_" + item; - Object value = getNodeTemplatePropertyAsObject(vfc, fullPathToSearch); - if (value != null) { - if (!cps.containsKey(cpName)){ - cps.put(cpName, new HashMap<>()); - } - cps.get(cpName).put(item, value); - } + if (entry.getKey().endsWith(presetProperty)) { + String portName = entry.getKey().replaceAll(presetProperty, ""); + cps.put(portName, new HashMap<>()); + } + } + + if (cps.size() > 0) { + // ports found - find all their properties + for (String portName : cps.keySet()) { + for (Map.Entry property: props.entrySet()) { + if (property.getKey().startsWith(portName)) { + Map portPaths = new HashMap<>(); + String portProperty = property.getKey().replaceFirst(portName + "_", ""); + buildPathMappedToValue(portProperty, property.getValue().getValue(), portPaths); + cps.get(portName).putAll(portPaths); + } } } } @@ -140,6 +129,25 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return cps; } + private void buildPathMappedToValue(String path, Object property, Map pathsMap) { + if (property instanceof Map) { + for (Map.Entry item : ((Map) property).entrySet()) { + if (item.getValue() instanceof Map || item.getValue() instanceof List) { + buildPathMappedToValue(path + PATH_DELIMITER + item.getKey(), item.getValue(), pathsMap); + } else { + pathsMap.put(path + PATH_DELIMITER + item.getKey(), item.getValue()); + } + } + } else if (property instanceof List) { + for (Object item: (List)property) { + buildPathMappedToValue(path, item, pathsMap); + } + } else { + pathsMap.put(path, property); + } + + } + @Override //Sunny flow - covered with UT public List getServiceVlList() { diff --git a/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java b/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java index 28058a5..a0808c5 100644 --- a/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java +++ b/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java @@ -343,22 +343,21 @@ public class ToscaParserNodeTemplateTest extends SdcToscaParserBasicTest { assertEquals(3,cps.size()); - assertEquals(new Integer(1), cps.get("ddc_int_imbl__port").get("ip_requirements#ip_count_required#count")); - assertEquals(new Boolean(true), cps.get("ddc_int_imbl__port").get("ip_requirements#dhcp_enabled")); - assertEquals(new Integer(6), cps.get("ddc_int_imbl__port").get("ip_requirements#ip_version")); - assertEquals(null, cps.get("ddc_int_imbl__port").get("subnetpoolid")); - - //assertEquals("\"int_imsp\"", cps.get("mon_ist_imsp__port").get("network_role_tag")); + assertEquals(new Integer(1), cps.get("port_ddc_int_imbl__port").get("ip_requirements#ip_count_required#count")); + assertEquals(new Boolean(true), cps.get("port_ddc_int_imbl__port").get("ip_requirements#dhcp_enabled")); + assertEquals(new Integer(6), cps.get("port_ddc_int_imbl__port").get("ip_requirements#ip_version")); + assertEquals("subnetpoolid_test", cps.get("port_ddc_int_imbl__port").get("subnetpoolid")); + assertEquals("int_imbl", cps.get("port_ddc_int_imbl__port").get("network_role_tag")); } if(vfcs.get(i).getName().equalsIgnoreCase("abstract_mda")) { isChecked1 = true; - Map> cps1 = complexCps.getCpPropertiesFromVfc(vfcs.get(i)); + Map> cps1 = complexCps.getCpPropertiesFromVfc(vfcs.get(i)); - assertEquals(new Integer(4), cps1.get("mda_int_imsp__port").get("ip_requirements#ip_version")); - assertEquals(null, cps1.get("mda_int_imsp__port").get("ip_requirements#ip_count_required#count")); + assertEquals(new Integer(4), cps1.get("port_mda_int_imsp__port").get("ip_requirements#ip_version")); + assertEquals(null, cps1.get("port_mda_int_imsp__port").get("ip_requirements#ip_count_required#count")); } diff --git a/src/test/resources/csars/service-consolidated-props-csar.csar b/src/test/resources/csars/service-consolidated-props-csar.csar index 37baffba8d6c5060216f3aeb8225aa166fe6afb9..79f95ceb2d64aded37b61157e61b80cd19c39539 100644 GIT binary patch delta 16986 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 BN`U|X delta 17020 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 PG6FELi4myJdH=rv&9?Ff -- 2.16.6