From 16b52f965b23d05cd2b57c5c29d1330e8d04a5f1 Mon Sep 17 00:00:00 2001 From: Pavel Aharoni Date: Thu, 29 Jun 2017 19:24:06 +0300 Subject: [PATCH] [SDC-43] NFOD getVnfConfig support Change-Id: I067a30e1c62228b52403807f9572d35f93cd0cfa Signed-off-by: Pavel Aharoni --- .../sdc/tosca/parser/api/ISdcCsarHelper.java | 9 +++++ .../sdc/tosca/parser/impl/SdcCsarHelperImpl.java | 43 +++++++++++++++++++-- .../sdc/impl/SdcToscaParserBasicTest.java | 3 +- .../sdc/impl/ToscaParserNodeTemplateTest.java | 33 ++++++++++++++++ .../resources/csars/service-NfodService-csar.csar | Bin 0 -> 39906 bytes 5 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/csars/service-NfodService-csar.csar diff --git a/src/main/java/org/openecomp/sdc/tosca/parser/api/ISdcCsarHelper.java b/src/main/java/org/openecomp/sdc/tosca/parser/api/ISdcCsarHelper.java index 35c68d4..45d8392 100644 --- a/src/main/java/org/openecomp/sdc/tosca/parser/api/ISdcCsarHelper.java +++ b/src/main/java/org/openecomp/sdc/tosca/parser/api/ISdcCsarHelper.java @@ -361,4 +361,13 @@ public interface ISdcCsarHelper { * @return service node templates of this SDC type. */ public List getServiceNodeTemplateBySdcType(SdcTypes sdcType); + + /** + * Get all node templates for this CSAR service. + * @param vfCustomizationUuid - the Customization UUID of the node. + * @return VNF Configuration Node Template. + */ + public NodeTemplate getVnfConfig(String vfCustomizationUuid); + + } 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..590abd9 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 @@ -25,6 +25,7 @@ import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -553,7 +554,12 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { } public List getNodeTemplateBySdcType(NodeTemplate parentNodeTemplate, SdcTypes sdcType) { - if (parentNodeTemplate == null) { + return getNodeTemplateBySdcType(parentNodeTemplate, sdcType, false); + } + + private List getNodeTemplateBySdcType(NodeTemplate parentNodeTemplate, SdcTypes sdcType, boolean isVNF) { + + if (parentNodeTemplate == null) { log.error("getNodeTemplateBySdcType - nodeTemplate is null or empty"); return new ArrayList<>(); } @@ -567,10 +573,23 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { if (substitutionMappings != null) { List nodeTemplates = substitutionMappings.getNodeTemplates(); - if (nodeTemplates != null && nodeTemplates.size() > 0) - return nodeTemplates.stream().filter(x -> (x.getMetaData() != null && sdcType.toString().equals(x.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)))).collect(Collectors.toList()); - else + if (nodeTemplates != null && nodeTemplates.size() > 0) { + if (sdcType.equals(SdcTypes.VFC) && isVNF) { + return nodeTemplates.stream() + .filter(x -> (x.getMetaData() != null && + sdcType.toString().equals(x.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE))) && (x.getType().endsWith("VnfConfiguration"))) + .collect(Collectors.toList()); + } + else { + return nodeTemplates.stream() + .filter(x -> (x.getMetaData() != null && + sdcType.toString().equals(x.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE))) && !(x.getType().endsWith("VnfConfiguration"))) + .collect(Collectors.toList()); + } + } + else { log.debug("getNodeTemplateBySdcType - SubstitutionMappings' node Templates not exist"); + } } else log.debug("getNodeTemplateBySdcType - SubstitutionMappings not exist"); @@ -608,6 +627,19 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return filterMap; } + + public NodeTemplate getVnfConfig(String vfCustomizationUuid) { + + if (GeneralUtility.isEmptyString(vfCustomizationUuid)) { + log.error("getVnfConfig - vfCustomizationId - is null or empty"); + return null; + } + + List serviceVfList = getServiceVfList(); + NodeTemplate vfInstance = getNodeTemplateByCustomizationUuid(serviceVfList, vfCustomizationUuid); + NodeTemplate vnfConfig = getNodeTemplateBySdcType(vfInstance, SdcTypes.VFC, true).stream().findAny().orElse(null); + return vnfConfig; + } /************************************* helper functions ***********************************/ private Map filterProperties(Object property, String path, FilterType filterType, String pattern, Map filterMap) { @@ -648,6 +680,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { TopologyTemplate topologyTemplate = toscaTemplate.getTopologyTemplate(); return getNodeTemplateBySdcType(topologyTemplate, sdcType); } + /************************************* helper functions ***********************************/ private List getNodeTemplateBySdcType(TopologyTemplate topologyTemplate, SdcTypes sdcType) { @@ -688,6 +721,8 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return null; } + + } diff --git a/src/test/java/org/openecomp/sdc/impl/SdcToscaParserBasicTest.java b/src/test/java/org/openecomp/sdc/impl/SdcToscaParserBasicTest.java index 2039645..3af654e 100644 --- a/src/test/java/org/openecomp/sdc/impl/SdcToscaParserBasicTest.java +++ b/src/test/java/org/openecomp/sdc/impl/SdcToscaParserBasicTest.java @@ -26,6 +26,7 @@ public abstract class SdcToscaParserBasicTest { static ISdcCsarHelper fdntCsarHelper; static ISdcCsarHelper complexCps; static ISdcCsarHelper fdntCsarHelperWithInputs; + static ISdcCsarHelper nfodCsarHlper; static Map>> fdntCsarHelper_Data; @BeforeClass @@ -37,7 +38,7 @@ public abstract class SdcToscaParserBasicTest { rainyCsarHelperSingleVf = getCsarHelper("csars/service-ServiceFdnt-csar.csar"); complexCps = getCsarHelper("csars/service-consolidated-props-csar.csar"); fdntCsarHelperWithInputs = getCsarHelper("csars/service-ServiceFdnt-with-get-input.csar"); - + nfodCsarHlper = getCsarHelper("csars/service-NfodService-csar.csar"); fdntCsarHelper_Data = new HashMap>>(){ { HashMap> FDNT ; diff --git a/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java b/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java index 28058a5..bc506b1 100644 --- a/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java +++ b/src/test/java/org/openecomp/sdc/impl/ToscaParserNodeTemplateTest.java @@ -523,4 +523,37 @@ public class ToscaParserNodeTemplateTest extends SdcToscaParserBasicTest { + + @Test + public void testGetVnfConfig() { + NodeTemplate vnfConfig = nfodCsarHlper.getVnfConfig("9bb2ef82-f8f6-4391-bc71-db063f15bf57"); + assertNotNull(vnfConfig); + assertEquals("vnfConfiguration", vnfConfig.getMetaData().getValue("name")); + } + + @Test + public void testGetVnfConfigByNonFoundVNF() { + NodeTemplate vnfConfig = complexCps.getVnfConfig("f999e2ca-72c0-42d3-9b11-13f2122fb8ef"); + assertNull(vnfConfig); + } + + @Test + public void testGetVnfConfigByDummyUUID() { + NodeTemplate vnfConfig = nfodCsarHlper.getVnfConfig("XXX"); + assertNull(vnfConfig); + } + + @Test + public void testGetVnfConfigByNullUUID() { + NodeTemplate vnfConfig = nfodCsarHlper.getVnfConfig(null); + assertNull(vnfConfig); + } + + @Test + public void testGetVfcTypWithoutVnf() { + List vfcList = nfodCsarHlper.getVfcListByVf("9bb2ef82-f8f6-4391-bc71-db063f15bf57"); + assertNotNull(vfcList); + assertEquals(2, vfcList.size()); + } + } diff --git a/src/test/resources/csars/service-NfodService-csar.csar b/src/test/resources/csars/service-NfodService-csar.csar new file mode 100644 index 0000000000000000000000000000000000000000..679c80b1e9ec104dba984de2e8a934b5ced27114 GIT binary patch literal 39906 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 s^F9GT%hl=01MUyLqEPGD1j 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ℜ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 literal 0 HcmV?d00001 -- 2.16.6