From 65ac7c1097921711bde0a2cced5daa6d4c52b672 Mon Sep 17 00:00:00 2001 From: "Shabanov, Marina (ms656r)" Date: Sun, 24 Nov 2019 10:51:10 +0200 Subject: Added getVFModule API Issue-ID: SDC-2651 Signed-off-by: Shabanov, Marina (ms656r) Change-Id: I6adf3c2f00a1d4b94a4191ba595a52d65df56dff --- pom.xml | 14 + .../onap/sdc/tosca/parser/api/IEntityDetails.java | 5 + .../onap/sdc/tosca/parser/api/ISdcCsarHelper.java | 13 + .../sdc/tosca/parser/elements/EntityDetails.java | 30 +- .../tosca/parser/elements/GroupEntityDetails.java | 6 +- .../parser/elements/NodeTemplateEntityDetails.java | 14 + .../tosca/parser/elements/queries/EntityQuery.java | 6 +- .../sdc/tosca/parser/impl/SdcCsarHelperImpl.java | 99 ++++++- .../java/org/onap/sdc/impl/GetCvfcWithVfcTest.java | 118 ++++++++ .../test/java/org/onap/sdc/impl/GetEntityTest.java | 5 +- .../org/onap/sdc/impl/GetForwardingPathTest.java | 66 +++++ .../onap/sdc/impl/GetVfModulesWithMembersTest.java | 310 +++++++++++++++++++++ .../parser/elements/queries/EntityQueryTest.java | 4 +- .../resources/csars/service-Metaswitch1-csar.csar | Bin 0 -> 195626 bytes .../resources/csars/service-Servicefp1-csar.csar | Bin 0 -> 32418 bytes .../csars/service-Servicenovfmodules-csar.csar | Bin 0 -> 36177 bytes 16 files changed, 667 insertions(+), 23 deletions(-) create mode 100644 sdc-tosca/src/test/java/org/onap/sdc/impl/GetCvfcWithVfcTest.java create mode 100644 sdc-tosca/src/test/java/org/onap/sdc/impl/GetForwardingPathTest.java create mode 100644 sdc-tosca/src/test/java/org/onap/sdc/impl/GetVfModulesWithMembersTest.java create mode 100644 sdc-tosca/src/test/resources/csars/service-Metaswitch1-csar.csar create mode 100644 sdc-tosca/src/test/resources/csars/service-Servicefp1-csar.csar create mode 100644 sdc-tosca/src/test/resources/csars/service-Servicenovfmodules-csar.csar diff --git a/pom.xml b/pom.xml index 9fb21e2..9984767 100644 --- a/pom.xml +++ b/pom.xml @@ -86,6 +86,20 @@ compile + + org.assertj + assertj-core + 3.13.2 + test + + + + org.junit.jupiter + junit-jupiter-api + 5.3.2 + test + + diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/api/IEntityDetails.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/api/IEntityDetails.java index b69a8b3..64b6fd5 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/api/IEntityDetails.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/api/IEntityDetails.java @@ -110,4 +110,9 @@ public interface IEntityDetails { * Retrieves list of inputs */ List getInputs(); + + /** + * Retrieves list of CVFC members of a VfModule that contain VFC + */ + List getMemberNodesCVFCWithVFC(); } diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java index e4e8f3c..0b08315 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java @@ -678,4 +678,17 @@ public interface ISdcCsarHelper { * @return list of data_type value */ HashSet getDataTypes(); + + /** + * Get VfModule groups of service that belong to a specific VF on this service, + * when members from VFModule groups on the relevant VF are added to each group respectively. + * @return list of VfModule group entities + * */ + List getVFModule(String cuuid); + + /** + * Get VfModule groups of service when members from VFModule groups on VFs are added to each group respectively. + * @return list of VfModule group entities + * */ + List getVFModule(); } \ No newline at end of file diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java index 6054ac9..afdb90e 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java @@ -22,21 +22,22 @@ package org.onap.sdc.tosca.parser.elements; import org.onap.sdc.tosca.parser.api.IEntityDetails; import org.onap.sdc.tosca.parser.enums.EntityTemplateType; -import org.onap.sdc.toscaparser.api.CapabilityAssignment; -import org.onap.sdc.toscaparser.api.EntityTemplate; -import org.onap.sdc.toscaparser.api.Property; -import org.onap.sdc.toscaparser.api.RequirementAssignment; +import org.onap.sdc.tosca.parser.enums.SdcTypes; +import org.onap.sdc.toscaparser.api.*; import org.onap.sdc.toscaparser.api.parameters.Input; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toList; public abstract class EntityDetails implements IEntityDetails { private final EntityTemplate entityTemplate; private final IEntityDetails parentNodeTemplate; + private static final String TYPE = "type"; EntityDetails(EntityTemplate entityTemplate) { this.entityTemplate = entityTemplate; @@ -48,7 +49,7 @@ public abstract class EntityDetails implements IEntityDetails { return entityTemplate.getName(); } - public EntityTemplate getEntityTemplate() { + EntityTemplate getEntityTemplate() { return entityTemplate; } @@ -118,6 +119,21 @@ public abstract class EntityDetails implements IEntityDetails { return Collections.emptyList(); } + @Override + public List getMemberNodesCVFCWithVFC() { + return getMemberNodes().stream() + .filter(m -> SdcTypes.CVFC.getValue().equals(m.getMetadata().getValue(TYPE))) + .filter(this::isCvfcsWithVfc) + .distinct() + .collect(toList()); + } - + private boolean isCvfcsWithVfc(IEntityDetails member) { + List children =((NodeTemplate) ((NodeTemplateEntityDetails)member).getEntityTemplate()) + .getSubMappingToscaTemplate().getNodeTemplates(); + List vfcChildren = children.stream() + .filter(c -> SdcTypes.VFC.getValue().equals(c.getMetaData().getValue(TYPE))) + .collect(toList()); + return !vfcChildren.isEmpty(); + } } diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/GroupEntityDetails.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/GroupEntityDetails.java index 664fe42..df9e5b9 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/GroupEntityDetails.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/GroupEntityDetails.java @@ -32,7 +32,7 @@ import java.util.stream.Collectors; public class GroupEntityDetails extends EntityDetails { private final Group group; - private final List memberNodes; + private List memberNodes; GroupEntityDetails(EntityTemplate entityTemplate) { super(entityTemplate); @@ -58,6 +58,10 @@ public class GroupEntityDetails extends EntityDetails { return memberNodes; } + public void setMemberNodes(List memberNodes) { + this.memberNodes = memberNodes; + } + @Override public Metadata getMetadata() { return group.getMetadata(); diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java index 3b7aa99..b5c1340 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java @@ -27,6 +27,7 @@ import org.onap.sdc.toscaparser.api.elements.Metadata; import org.onap.sdc.toscaparser.api.parameters.Input; import java.util.List; +import java.util.Objects; public class NodeTemplateEntityDetails extends EntityDetails { @@ -54,4 +55,17 @@ public class NodeTemplateEntityDetails extends EntityDetails { } return super.getInputs(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof NodeTemplateEntityDetails)) return false; + NodeTemplateEntityDetails that = (NodeTemplateEntityDetails) o; + return nodeTemplate.equals(that.nodeTemplate); + } + + @Override + public int hashCode() { + return Objects.hash(nodeTemplate); + } } diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/EntityQuery.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/EntityQuery.java index e3af94f..bfeabf7 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/EntityQuery.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/elements/queries/EntityQuery.java @@ -90,10 +90,12 @@ public abstract class EntityQuery { } boolean isSearchCriteriaMatched(Metadata metadata, String toscaType, String uuidKeyName, String cuuidKeyName) { - return Objects.nonNull(metadata) + return Objects.nonNull(metadata) && isStringMatchingOrNull(metadata.getValue(uuidKeyName), getUUID()) && isStringMatchingOrNull(metadata.getValue(cuuidKeyName), getCustomizationUUID()) - && isStringMatchingOrNull(toscaType, getToscaType()); + && isStringMatchingOrNull(toscaType, getToscaType()) || + Objects.isNull(metadata) + && isStringMatchingOrNull(toscaType, getToscaType()); } boolean isSearchCriteriaMatched(Metadata metadata, String toscaType) { diff --git a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java index 95530f0..921a145 100644 --- a/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java +++ b/sdc-tosca/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java @@ -20,19 +20,19 @@ package org.onap.sdc.tosca.parser.impl; -import static java.util.stream.Collectors.toList; - +import java.util.List; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; +import java.util.Map; +import java.util.Map.Entry; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.Optional; +import java.util.Collections; +import java.util.Objects; import java.util.stream.Collectors; +import static java.util.stream.Collectors.toList; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -40,6 +40,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.onap.sdc.tosca.parser.api.IEntityDetails; import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; import org.onap.sdc.tosca.parser.config.ConfigurationManager; +import org.onap.sdc.tosca.parser.elements.GroupEntityDetails; import org.onap.sdc.tosca.parser.elements.queries.EntityQuery; import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery; import org.onap.sdc.tosca.parser.enums.FilterType; @@ -72,6 +73,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { private static final String PATH_DELIMITER = "#"; private static final String CUSTOMIZATION_UUID = "customizationUUID"; + private static final String GROUPS_VF_MODULE = "org.openecomp.groups.VfModule"; private ToscaTemplate toscaTemplate; private ConfigurationManager configurationManager; private static Logger log = LoggerFactory.getLogger(SdcCsarHelperImpl.class.getName()); @@ -418,7 +420,7 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { if (serviceLevelGroups != null) { return serviceLevelGroups .stream() - .filter(x -> "org.openecomp.groups.VfModule".equals(x.getTypeDefinition().getType()) && x.getName().startsWith(normaliseComponentInstanceName)) + .filter(x -> GROUPS_VF_MODULE.equals(x.getTypeDefinition().getType()) && x.getName().startsWith(normaliseComponentInstanceName)) .collect(toList()); } } @@ -1227,4 +1229,87 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { return toscaTemplate.getDataTypes(); } + @Override + public List getVFModule(String cuuid){ + String normalisedComponentInstanceName = SdcToscaUtility.normaliseComponentInstanceName(getVfiNameByCuuid(cuuid)); + List vfModulesFromVf = getVfModulesFromVf(cuuid); + List vfModulesFromService = getVfModulesFromService().stream() + .filter(v->v.getName().startsWith(normalisedComponentInstanceName)) + .collect(toList()); + addMembersToVfModuleInstances(vfModulesFromVf, vfModulesFromService); + return vfModulesFromService; + } + + @Override + public List getVFModule() { + List vfModules = new ArrayList<>(); + List vfModuleInstances = new ArrayList<>(); + + getVfModulesFromVf().forEach(vfmodule -> { + if (Objects.isNull(vfmodule.getParent())){ + vfModuleInstances.add(vfmodule); + } else { + vfModules.add(vfmodule); + } + }); + + addMembersToVfModuleInstances(vfModules,vfModuleInstances); + return vfModuleInstances; + } + + private void addMembersToVfModuleInstances(List vfModules, List vfModuleInstances) { + for(IEntityDetails vfModuleInstance : vfModuleInstances){ + String origGroupName = getOriginalGroupName(vfModuleInstance); + setVFModuleMembers(vfModules, vfModuleInstance, origGroupName); + } + } + + private void setVFModuleMembers(List vfModules, IEntityDetails vfModuleInstance, String origGroupName) { + for (IEntityDetails vfModule : vfModules){ + if (vfModuleInstance instanceof GroupEntityDetails && vfModule.getName().equals(origGroupName)){ + List memberNodes = vfModule.getMemberNodes(); + ((GroupEntityDetails)vfModuleInstance).setMemberNodes(memberNodes); + } + } + } + + private String getOriginalGroupName(IEntityDetails vfModuleInstance) { + String groupName = vfModuleInstance.getName(); + return groupName.substring(groupName.indexOf('.') + 2); + } + + private List getVfModulesFromService() { + EntityQuery entityQuery = EntityQuery.newBuilder(GROUPS_VF_MODULE) + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + return getEntity(entityQuery, topologyTemplateQuery, false); + } + + private List getVfModulesFromVf(String cuuid) { + EntityQuery entityQuery = EntityQuery.newBuilder(GROUPS_VF_MODULE) + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) + .customizationUUID(cuuid) + .build(); + return getEntity(entityQuery, topologyTemplateQuery, false); + } + + private List getVfModulesFromVf() { + EntityQuery entityQuery = EntityQuery.newBuilder(GROUPS_VF_MODULE) + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + return getEntity(entityQuery, topologyTemplateQuery, true); + } + + private String getVfiNameByCuuid(String cuuid) { + EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.VF) + .customizationUUID(cuuid) + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + return getEntity(entityQuery, topologyTemplateQuery, true).get(0).getName(); + } + } diff --git a/sdc-tosca/src/test/java/org/onap/sdc/impl/GetCvfcWithVfcTest.java b/sdc-tosca/src/test/java/org/onap/sdc/impl/GetCvfcWithVfcTest.java new file mode 100644 index 0000000..0fe75e2 --- /dev/null +++ b/sdc-tosca/src/test/java/org/onap/sdc/impl/GetCvfcWithVfcTest.java @@ -0,0 +1,118 @@ +/*- + * ============LICENSE_START======================================================= + * sdc-tosca + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.sdc.impl; +import org.junit.Test; +import org.onap.sdc.tosca.parser.api.IEntityDetails; +import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; +import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; +import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URL; +import java.util.*; + +import static com.google.common.collect.Lists.newArrayList; +import static org.assertj.core.api.Assertions.assertThat; + + +public class GetCvfcWithVfcTest { + private static final String SERVICE_WITH_SINGLE_VF_CSAR = "csars/service-JennyVtsbcVlanSvc-csar.csar"; + private static final String SERVICE_WITH_DOUBLE_VF_CSAR = "csars/service-Metaswitch1-csar.csar"; + private static final String ABSTRACT_RTP_MSC = "abstract_rtp_msc"; + private static final String ABSTRACT_SSC = "abstract_ssc"; + private static final String ABSTRACT_RTP_MSC_A = "abstract_rtp_msc_a"; + private static final String ABSTRACT_RTP_MSC_B = "abstract_rtp_msc_b"; + private static final String ABSTRACT_SSC_A = "abstract_ssc_a"; + private static final String ABSTRACT_SSC_B = "abstract_ssc_b"; + private ISdcCsarHelper helper; + private static Logger log = LoggerFactory.getLogger(GetCvfcWithVfcTest.class.getName()); + + public void setUp(String path) { + try { + URL resource = GetCvfcWithVfcTest.class.getClassLoader().getResource(path); + if (resource != null) { + helper = SdcToscaParserFactory.getInstance().getSdcCsarHelper(resource.getFile()); + } + + } catch (SdcToscaParserException e) { + log.error("Failed to create ISdcCsarHelper object from {}.", path, e); + } + } + + @Test + public void getCvfcsWithVfcsFromServiceWithSingleVfTest(){ + setUp(SERVICE_WITH_SINGLE_VF_CSAR); + List entities = helper.getVFModule(); + List actualMembersList = newArrayList(); + verifyCvfcWithVfcMembers(entities, actualMembersList, 0, Collections.singletonList(ABSTRACT_RTP_MSC)); + verifyCvfcWithVfcMembers(entities, actualMembersList, 1, Collections.singletonList(ABSTRACT_SSC)); + verifyCvfcWithVfcMembers(entities, actualMembersList, 2, Collections.emptyList()); + verifyCvfcWithVfcMembers(entities, actualMembersList, 3, Collections.singletonList(ABSTRACT_SSC)); + } + + @Test + public void getCvfcsWithVfcsFromVfiSingleVfTest(){ + setUp(SERVICE_WITH_SINGLE_VF_CSAR); + List entities = helper.getVFModule("05e77410-a1d8-44fe-8440-b9410c8f98ee"); + List actualMembersList = newArrayList(); + verifyCvfcWithVfcMembers(entities, actualMembersList, 0, Collections.singletonList(ABSTRACT_RTP_MSC)); + verifyCvfcWithVfcMembers(entities, actualMembersList, 1, Collections.singletonList(ABSTRACT_SSC)); + verifyCvfcWithVfcMembers(entities, actualMembersList, 2, Collections.emptyList()); + verifyCvfcWithVfcMembers(entities, actualMembersList, 3, Collections.singletonList(ABSTRACT_SSC)); + } + + @Test + public void getCvfcsWithVfcsFromServiceWithDuplicateVfTest(){ + setUp(SERVICE_WITH_DOUBLE_VF_CSAR); + List entities = helper.getVFModule(); + List actualMembersList = newArrayList(); + verifyCvfcWithVfcMembers(entities, actualMembersList, 0, Collections.emptyList()); + verifyCvfcWithVfcMembers(entities, actualMembersList, 1, Arrays.asList(ABSTRACT_RTP_MSC_A, ABSTRACT_RTP_MSC_B)); + verifyCvfcWithVfcMembers(entities, actualMembersList, 2, Arrays.asList(ABSTRACT_RTP_MSC_A, ABSTRACT_RTP_MSC_B)); + verifyCvfcWithVfcMembers(entities, actualMembersList, 3, Collections.singletonList(ABSTRACT_SSC_A)); + verifyCvfcWithVfcMembers(entities, actualMembersList, 4, Collections.emptyList()); + verifyCvfcWithVfcMembers(entities, actualMembersList, 5, Collections.singletonList(ABSTRACT_SSC_A)); + verifyCvfcWithVfcMembers(entities, actualMembersList, 6, Collections.singletonList(ABSTRACT_SSC_B)); + verifyCvfcWithVfcMembers(entities, actualMembersList, 7, Collections.singletonList(ABSTRACT_SSC_B)); + } + + + @Test + public void getCvfcsWithVfcsFromVfiOnServiceWithDuplicateVfTest(){ + setUp(SERVICE_WITH_DOUBLE_VF_CSAR); + List entities = helper.getVFModule("2b5f00de-8816-465c-b7bc-c36e26775e1e"); + List actualMembersList = newArrayList(); + verifyCvfcWithVfcMembers(entities, actualMembersList, 0, Collections.emptyList()); + verifyCvfcWithVfcMembers(entities, actualMembersList, 1, Arrays.asList(ABSTRACT_RTP_MSC_A, ABSTRACT_RTP_MSC_B)); + verifyCvfcWithVfcMembers(entities, actualMembersList, 2, Collections.singletonList(ABSTRACT_SSC_A)); + verifyCvfcWithVfcMembers(entities, actualMembersList, 3, Collections.singletonList(ABSTRACT_SSC_B)); + } + + + private void verifyCvfcWithVfcMembers(List entities, List actualMembersList, int index, List values) { + List list = entities.get(index).getMemberNodesCVFCWithVFC(); + list.forEach(e -> actualMembersList.add(e.getName())); + assertThat(actualMembersList).containsOnlyElementsOf(values); + actualMembersList.clear(); + } + + +} diff --git a/sdc-tosca/src/test/java/org/onap/sdc/impl/GetEntityTest.java b/sdc-tosca/src/test/java/org/onap/sdc/impl/GetEntityTest.java index e741cea..327ab68 100644 --- a/sdc-tosca/src/test/java/org/onap/sdc/impl/GetEntityTest.java +++ b/sdc-tosca/src/test/java/org/onap/sdc/impl/GetEntityTest.java @@ -24,7 +24,6 @@ import org.junit.BeforeClass; import org.junit.Test; import org.onap.sdc.tosca.parser.api.IEntityDetails; import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; -import org.onap.sdc.tosca.parser.elements.EntityDetails; import org.onap.sdc.tosca.parser.elements.queries.EntityQuery; import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery; import org.onap.sdc.tosca.parser.enums.EntityTemplateType; @@ -34,11 +33,9 @@ import org.onap.sdc.tosca.parser.impl.SdcPropertyNames; import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; import org.onap.sdc.toscaparser.api.CapabilityAssignment; import org.onap.sdc.toscaparser.api.Property; -import org.onap.sdc.toscaparser.api.parameters.Input; import java.net.URL; import java.util.List; -import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -405,7 +402,7 @@ public class GetEntityTest { @Test - public void getServiceInputs() { + public void getServiceInputsTest() { EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.NODE_TEMPLATE) .build(); TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) diff --git a/sdc-tosca/src/test/java/org/onap/sdc/impl/GetForwardingPathTest.java b/sdc-tosca/src/test/java/org/onap/sdc/impl/GetForwardingPathTest.java new file mode 100644 index 0000000..6c910e6 --- /dev/null +++ b/sdc-tosca/src/test/java/org/onap/sdc/impl/GetForwardingPathTest.java @@ -0,0 +1,66 @@ +/*- + * ============LICENSE_START======================================================= + * sdc-tosca + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.sdc.impl; + +import org.junit.Test; +import org.onap.sdc.tosca.parser.api.IEntityDetails; +import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; +import org.onap.sdc.tosca.parser.elements.queries.EntityQuery; +import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery; +import org.onap.sdc.tosca.parser.enums.SdcTypes; +import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; +import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URL; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GetForwardingPathTest { + private ISdcCsarHelper helper; + private static Logger log = LoggerFactory.getLogger(GetForwardingPathTest.class.getName()); + + public void setUp(String path) { + try { + URL resource = GetEntityTest.class.getClassLoader().getResource(path); + if (resource != null) { + helper = SdcToscaParserFactory.getInstance().getSdcCsarHelper(resource.getFile()); + } + + } catch (SdcToscaParserException e) { + log.error("Failed to create ISdcCsarHelper object from {}.", path, e); + } + } + + @Test + public void fpTest(){ + setUp("csars/service-Servicefp1-csar.csar"); + + EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.nodes.ForwardingPath") + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, false); + assertThat(entities.size()).isEqualTo(1); + } +} diff --git a/sdc-tosca/src/test/java/org/onap/sdc/impl/GetVfModulesWithMembersTest.java b/sdc-tosca/src/test/java/org/onap/sdc/impl/GetVfModulesWithMembersTest.java new file mode 100644 index 0000000..55bff57 --- /dev/null +++ b/sdc-tosca/src/test/java/org/onap/sdc/impl/GetVfModulesWithMembersTest.java @@ -0,0 +1,310 @@ +/*- + * ============LICENSE_START======================================================= + * sdc-tosca + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.onap.sdc.impl; + +import org.junit.Test; +import org.onap.sdc.tosca.parser.api.IEntityDetails; +import org.onap.sdc.tosca.parser.api.ISdcCsarHelper; +import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; +import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory; +import org.onap.sdc.toscaparser.api.Property; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URL; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.google.common.collect.Lists.newArrayList; +import static org.assertj.core.api.Assertions.assertThat; + +public class GetVfModulesWithMembersTest { + + private static final String SERVICE_WITH_SINGLE_VF_CSAR = "csars/service-JennyVtsbcVlanSvc-csar.csar"; + private static final String SERVICE_WITH_DOUBLE_VF_CSAR = "csars/service-Metaswitch1-csar.csar"; + private static final String VF_MODULE_MODEL_INVARIANT_UUID = "vfModuleModelInvariantUUID"; + private static final String VF_MODULE_MODEL_UUID = "vfModuleModelUUID"; + private static final String VF_MODULE_MODEL_VERSION = "vfModuleModelVersion"; + private static final String VF_MODULE_MODEL_CUSTOMIZATION_UUID = "vfModuleModelCustomizationUUID"; + private static final String INT_UNUSED_NETWORK = "int_unused_network"; + private static final String INT_HA_RSG = "int_ha_rsg"; + private static final String INT_HA_NETWORK = "int_ha_network"; + private static final String ABSTRACT_RTP_MSC = "abstract_rtp_msc"; + private static final String ABSTRACT_SSC = "abstract_ssc"; + private static final String MODULE_1_PERIMETA_SSC_B = "module_1_perimeta_ssc_b"; + private static final String MODULE_1_PERIMETA_SSC_A = "module_1_perimeta_ssc_a"; + private static final String MODULE_2_PERIMETA_RTP_MSC = "module_2_perimeta_rtp_msc"; + private static final String SHARED_PERIMETA_INT_HA_RSG = "shared_perimeta_int_ha_rsg"; + private static final String SHARED_PERIMETA_INTERNAL_HA_NET_0 = "shared_perimeta_internal_ha_net_0"; + private static final String SHARED_PERIMETA_INTERNAL_UNUSED_NET_0 = "shared_perimeta_internal_unused_net_0"; + private static final String ABSTRACT_RTP_MSC_A = "abstract_rtp_msc_a"; + private static final String ABSTRACT_RTP_MSC_B = "abstract_rtp_msc_b"; + private static final String ABSTRACT_SSC_B = "abstract_ssc_b"; + private static final String ABSTRACT_SSC_A = "abstract_ssc_a"; + private static final String MODULE_WITH_INDEX_DOES_NOT_EXIST_IN_THE_MODEL = "Module with index %s does not exist in the model of %s"; + private ISdcCsarHelper helper; + private static Logger log = LoggerFactory.getLogger(GetVfModulesWithMembersTest.class.getName()); + + public void setUp(String path) { + try { + URL resource = GetEntityTest.class.getClassLoader().getResource(path); + if (resource != null) { + helper = SdcToscaParserFactory.getInstance().getSdcCsarHelper(resource.getFile()); + } + + } catch (SdcToscaParserException e) { + log.error("Failed to create ISdcCsarHelper object from {}.", path, e); + } + } + + @Test + public void getVfModulesByVfSingleVfTest() { + setUp(SERVICE_WITH_SINGLE_VF_CSAR); + List expectedVfModules = newArrayList("jennyvtsbcvlanvnf0..JennyVtsbcVlanVnf..module_2_perimeta_rtp_msc..module-1", + "jennyvtsbcvlanvnf0..JennyVtsbcVlanVnf..base_perimeta_deployment_create..module-0", + "jennyvtsbcvlanvnf0..JennyVtsbcVlanVnf..module_1_perimeta_ssc_a..module-3", + "jennyvtsbcvlanvnf0..JennyVtsbcVlanVnf..module_1_perimeta_ssc_b..module-2"); + + List entities = helper.getVFModule("05e77410-a1d8-44fe-8440-b9410c8f98ee"); + verifyVfModulesNames(expectedVfModules, entities); + + for(IEntityDetails entity : entities){ + char moduleIndex = entity.getName().charAt(entity.getName().length()-1); + List actualMembersList = newArrayList(); + switch (moduleIndex){ + case '0': + verifyModuleMetadata(entity, VF_MODULE_MODEL_INVARIANT_UUID,"a141bf13-d817-4258-98d6-9f9d51fbe1c6"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_UUID,"e10458d4-6e4f-40a4-b47b-57a97380efc1"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_VERSION,"5"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_CUSTOMIZATION_UUID,"8f07ed2f-7f10-4f06-bba6-8f1222ced3ef"); + verifyModuleMembers(entity, actualMembersList, Arrays.asList(INT_UNUSED_NETWORK, INT_HA_RSG, INT_HA_NETWORK)); + verifyModuleProperties(entity,moduleIndex,null); + break; + case '1': + verifyModuleMetadata(entity, VF_MODULE_MODEL_INVARIANT_UUID,"eff0e0fd-67c5-4891-9382-d6959d761442"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_UUID,"d65b3d01-7b3d-4b27-9bd2-0165bab75709"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_VERSION,"5"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_CUSTOMIZATION_UUID,"97b648a3-eaf1-4dfb-a685-259b74a1a6fb"); + verifyModuleMember(entity, ABSTRACT_RTP_MSC); + verifyModuleProperties(entity,moduleIndex,MODULE_2_PERIMETA_RTP_MSC); + + break; + case '2': + verifyModuleMetadata(entity, VF_MODULE_MODEL_INVARIANT_UUID,"1c0e7c32-897c-454a-bb5d-42cc5e8f135c"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_UUID,"99589e9b-e650-4b0a-aa01-0dbf51adb226"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_VERSION,"5"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_CUSTOMIZATION_UUID,"fedb631d-211b-4659-a7eb-19421905808c"); + verifyModuleMember(entity, ABSTRACT_SSC); + verifyModuleProperties(entity,moduleIndex, MODULE_1_PERIMETA_SSC_B); + break; + case '3': + verifyModuleMetadata(entity, VF_MODULE_MODEL_INVARIANT_UUID,"5a7f8d9c-e102-4556-9484-3a5be8020977"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_UUID,"6130333c-6e41-4abe-84aa-7c669c6d2287"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_VERSION,"5"); + verifyModuleMetadata(entity, VF_MODULE_MODEL_CUSTOMIZATION_UUID,"94d27f05-a116-4662-b330-8758c2b049d7"); + verifyModuleMember(entity, ABSTRACT_SSC); + verifyModuleProperties(entity,moduleIndex, MODULE_1_PERIMETA_SSC_A); + break; + default: + log.error(String.format(MODULE_WITH_INDEX_DOES_NOT_EXIST_IN_THE_MODEL, moduleIndex, SERVICE_WITH_SINGLE_VF_CSAR)); + } + } + } + + @Test + public void getVfModulesByServiceSingleVfTest() { + setUp(SERVICE_WITH_SINGLE_VF_CSAR); + List expectedVfModules = newArrayList("jennyvtsbcvlanvnf0..JennyVtsbcVlanVnf..module_2_perimeta_rtp_msc..module-1", + "jennyvtsbcvlanvnf0..JennyVtsbcVlanVnf..base_perimeta_deployment_create..module-0", + "jennyvtsbcvlanvnf0..JennyVtsbcVlanVnf..module_1_perimeta_ssc_a..module-3", + "jennyvtsbcvlanvnf0..JennyVtsbcVlanVnf..module_1_perimeta_ssc_b..module-2"); + + List entities = helper.getVFModule(); + verifyVfModulesNames(expectedVfModules, entities); + + for(IEntityDetails entity : entities){ + char moduleIndex = entity.getName().charAt(entity.getName().length()-1); + List actualMembersList = newArrayList(); + entity.getMembers(); + switch (moduleIndex){ + case '0': + verifyModuleMembers(entity, actualMembersList, Arrays.asList(INT_UNUSED_NETWORK, INT_HA_RSG, INT_HA_NETWORK)); + break; + case '1': + verifyModuleMember(entity, ABSTRACT_RTP_MSC); + break; + case '2': + case '3': + verifyModuleMember(entity, ABSTRACT_SSC); + break; + default: + log.error(String.format(MODULE_WITH_INDEX_DOES_NOT_EXIST_IN_THE_MODEL, moduleIndex, SERVICE_WITH_SINGLE_VF_CSAR)); + } + } + } + + @Test + public void getVfModulesByVfDuplicateVfTest() { + setUp(SERVICE_WITH_DOUBLE_VF_CSAR); + List expectedVfModules = newArrayList("vsp10..Vsp1..base_perimeta_deployment_create..module-0", + "vsp10..Vsp1..module_2_perimeta_rtp_msc..module-1", + "vsp10..Vsp1..module_1_perimeta_ssc_a..module-3", + "vsp10..Vsp1..module_1_perimeta_ssc_b..module-2"); + + List entities = helper.getVFModule("2b5f00de-8816-465c-b7bc-c36e26775e1e"); + verifyVfModulesNames(expectedVfModules, entities); + + for(IEntityDetails entity : entities){ + char moduleIndex = entity.getName().charAt(entity.getName().length()-1); + List actualMembersList = newArrayList(); + switch (moduleIndex){ + case '0': + verifyModuleMembers(entity, actualMembersList, Arrays.asList(SHARED_PERIMETA_INT_HA_RSG, SHARED_PERIMETA_INTERNAL_HA_NET_0, + SHARED_PERIMETA_INTERNAL_UNUSED_NET_0)); + break; + case '1': + verifyModuleMembers(entity, actualMembersList, Arrays.asList(ABSTRACT_RTP_MSC_A, ABSTRACT_RTP_MSC_B)); + break; + case '2': + verifyModuleMember(entity, ABSTRACT_SSC_B); + break; + case '3': + verifyModuleMember(entity, ABSTRACT_SSC_A); + break; + default: + log.error(String.format(MODULE_WITH_INDEX_DOES_NOT_EXIST_IN_THE_MODEL, moduleIndex, SERVICE_WITH_DOUBLE_VF_CSAR)); + } + } + } + + @Test + public void getVfModulesByServiceDuplicateVfTest() { + setUp(SERVICE_WITH_DOUBLE_VF_CSAR); + List expectedVfModules = newArrayList("vsp10..Vsp1..base_perimeta_deployment_create..module-0", + "vsp10..Vsp1..module_2_perimeta_rtp_msc..module-1", + "vsp10..Vsp1..module_1_perimeta_ssc_a..module-3", + "vsp10..Vsp1..module_1_perimeta_ssc_b..module-2", + "vsp11..Vsp1..base_perimeta_deployment_create..module-0", + "vsp11..Vsp1..module_2_perimeta_rtp_msc..module-1", + "vsp11..Vsp1..module_1_perimeta_ssc_a..module-3", + "vsp11..Vsp1..module_1_perimeta_ssc_b..module-2"); + + List entities = helper.getVFModule(); + verifyVfModulesNames(expectedVfModules, entities); + + for(IEntityDetails entity : entities){ + char moduleIndex = entity.getName().charAt(entity.getName().length()-1); + List actualMembersList = newArrayList(); + switch (moduleIndex){ + case '0': + verifyModuleMembers(entity, actualMembersList, Arrays.asList(SHARED_PERIMETA_INT_HA_RSG, + SHARED_PERIMETA_INTERNAL_HA_NET_0, + SHARED_PERIMETA_INTERNAL_UNUSED_NET_0)); + break; + case '1': + verifyModuleMembers(entity, actualMembersList, Arrays.asList(ABSTRACT_RTP_MSC_A, + ABSTRACT_RTP_MSC_B)); + break; + case '2': + verifyModuleMember(entity, ABSTRACT_SSC_B); + break; + case '3': + verifyModuleMember(entity, ABSTRACT_SSC_A); + break; + default: + log.error(String.format(MODULE_WITH_INDEX_DOES_NOT_EXIST_IN_THE_MODEL, moduleIndex, SERVICE_WITH_DOUBLE_VF_CSAR)); + } + } + } + + @Test + public void getVfModulesManualServiceTest(){ + setUp("csars/service-Servicenovfmodules-csar.csar"); + List entities = helper.getVFModule(); + assertThat(entities.size()).isEqualTo(0); + } + + private void verifyVfModulesNames(List expectedVfModules, List entities) { + List actualVfModules = newArrayList(); + for (IEntityDetails entity : entities) { + actualVfModules.add(entity.getName()); + } + assertThat(actualVfModules).containsExactlyInAnyOrderElementsOf(expectedVfModules); + } + + private void verifyModuleMembers(IEntityDetails entity, List actualMembersList, List expectedMembersList) { + entity.getMemberNodes().forEach(member -> actualMembersList.add(member.getName())); + assertThat(actualMembersList).containsOnlyElementsOf(expectedMembersList); + actualMembersList.clear(); + } + + private void verifyModuleMember(IEntityDetails entity, String expectedMember) { + String actualMember = entity.getMemberNodes().get(0).getName(); + assertThat(actualMember).isEqualTo(expectedMember); + } + + private void verifyModuleMetadata(IEntityDetails entity, String metadataKey, String metadataValue) { + assertThat(entity.getMetadata().getValue(metadataKey)).isEqualTo(metadataValue); + } + + private void verifyModuleProperties(IEntityDetails entity, char moduleNumber, String vfModuleLabel){ + Map expectedProperties; + if (moduleNumber == '0'){ + expectedProperties = getExpectedPropertiesBase(); + } else { + expectedProperties = getExpectedPropertiesNonBase(vfModuleLabel); + } + assertThat(expectedProperties).isEqualTo(getActualProperties(entity)); + } + + private Map getExpectedPropertiesNonBase(String vfModuleLabel){ + Map properties = new HashMap<>(); + properties.put("min_vf_module_instances","0"); + properties.put("vf_module_label",vfModuleLabel); + properties.put("vf_module_type","Expansion"); + properties.put("isBase","false"); + properties.put("initial_count","0"); + properties.put("volume_group","false"); + return properties; + } + + private Map getExpectedPropertiesBase(){ + Map properties = new HashMap<>(); + properties.put("min_vf_module_instances","1"); + properties.put("vf_module_label","base_perimeta_deployment_create"); + properties.put("max_vf_module_instances","1"); + properties.put("vf_module_type","Base"); + properties.put("isBase","true"); + properties.put("initial_count","1"); + properties.put("volume_group","false"); + return properties; + } + + private Map getActualProperties(IEntityDetails entity){ + Map properties = new HashMap<>(); + for (Property prop : entity.getProperties().values()){ + properties.put(prop.getName(),prop.getValue().toString()); + } + return properties; + } +} + diff --git a/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/elements/queries/EntityQueryTest.java b/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/elements/queries/EntityQueryTest.java index a9af7d9..df8be5b 100644 --- a/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/elements/queries/EntityQueryTest.java +++ b/sdc-tosca/src/test/java/org/onap/sdc/tosca/parser/elements/queries/EntityQueryTest.java @@ -51,7 +51,7 @@ public class EntityQueryTest { public void findEntityWhenMetadataIsNull() { EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP) .build(); - assertFalse(entityQuery.isSearchCriteriaMatched(null,"abc")); + assertTrue(entityQuery.isSearchCriteriaMatched(null,"abc")); } @Test @@ -60,7 +60,7 @@ public class EntityQueryTest { .customizationUUID("2345") .uUID("9700") .build(); - assertFalse(entityQuery.isSearchCriteriaMatched(null, "")); + assertTrue(entityQuery.isSearchCriteriaMatched(null, "")); } @Test diff --git a/sdc-tosca/src/test/resources/csars/service-Metaswitch1-csar.csar b/sdc-tosca/src/test/resources/csars/service-Metaswitch1-csar.csar new file mode 100644 index 0000000..7d3d589 Binary files /dev/null and b/sdc-tosca/src/test/resources/csars/service-Metaswitch1-csar.csar differ diff --git a/sdc-tosca/src/test/resources/csars/service-Servicefp1-csar.csar b/sdc-tosca/src/test/resources/csars/service-Servicefp1-csar.csar new file mode 100644 index 0000000..1402509 Binary files /dev/null and b/sdc-tosca/src/test/resources/csars/service-Servicefp1-csar.csar differ diff --git a/sdc-tosca/src/test/resources/csars/service-Servicenovfmodules-csar.csar b/sdc-tosca/src/test/resources/csars/service-Servicenovfmodules-csar.csar new file mode 100644 index 0000000..9b7c54d Binary files /dev/null and b/sdc-tosca/src/test/resources/csars/service-Servicenovfmodules-csar.csar differ -- cgit 1.2.3-korg