From 16cfd402db3048735615f11751c512386dfc0382 Mon Sep 17 00:00:00 2001 From: "Manzon, Inna (im453s)" Date: Tue, 25 Dec 2018 17:41:33 +0200 Subject: SDC Tosca Parser getEntity API Change-Id: I4232c4ca85432bf9c81a81d717bee23b187182aa Issue-ID: SDC-1967 Signed-off-by: Manzon, Inna (im453s) --- README.md | 17 +- pom.xml | 4 +- .../onap/sdc/tosca/parser/api/IEntityDetails.java | 60 +++- .../onap/sdc/tosca/parser/api/ISdcCsarHelper.java | 45 ++- .../sdc/tosca/parser/elements/EntityDetails.java | 62 ++-- .../parser/elements/EntityDetailsFactory.java | 14 +- .../tosca/parser/elements/GroupEntityDetails.java | 21 +- .../parser/elements/NodeTemplateEntityDetails.java | 4 +- .../tosca/parser/elements/PolicyEntityDetails.java | 33 ++- .../parser/elements/queries/AllEntitiesQuery.java | 46 +++ .../tosca/parser/elements/queries/EntityQuery.java | 44 ++- .../parser/elements/queries/GroupEntityQuery.java | 39 ++- .../elements/queries/NodeTemplateEntityQuery.java | 47 ++- .../parser/elements/queries/PolicyEntityQuery.java | 38 ++- .../elements/queries/TopologyTemplateQuery.java | 46 ++- .../sdc/tosca/parser/enums/EntityTemplateType.java | 3 +- .../org/onap/sdc/tosca/parser/enums/SdcTypes.java | 3 +- .../onap/sdc/tosca/parser/impl/QueryProcessor.java | 127 ++++++++ .../sdc/tosca/parser/impl/SdcCsarHelperImpl.java | 18 +- src/test/java/org/onap/sdc/impl/GetEntityTest.java | 323 +++++++++++++++++++-- .../parser/elements/EntityDetailsFactoryTest.java | 106 +++++++ .../parser/elements/queries/EntityQueryTest.java | 163 +++++++++++ .../queries/TopologyTemplateQueryTest.java | 122 ++++++++ version.properties | 2 +- 24 files changed, 1267 insertions(+), 120 deletions(-) create mode 100644 src/main/java/org/onap/sdc/tosca/parser/elements/queries/AllEntitiesQuery.java create mode 100644 src/main/java/org/onap/sdc/tosca/parser/impl/QueryProcessor.java create mode 100644 src/test/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactoryTest.java create mode 100644 src/test/java/org/onap/sdc/tosca/parser/elements/queries/EntityQueryTest.java create mode 100644 src/test/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQueryTest.java diff --git a/README.md b/README.md index 9935a4e..68636f1 100644 --- a/README.md +++ b/README.md @@ -124,4 +124,19 @@ to use add the folowing depandency to your POM file: ## 1.4.7 ### Bug fix: -1. **validation fix** Null value caused to NullPointerException in validate function in DataEntity \ No newline at end of file +1. **validation fix** Null value caused to NullPointerException in validate function in DataEntity + + +## 1.4.8 + +### Features: +1. A new API is declared: + +*List getEntity(EntityQuery entityQuery, TopologyTemplateQuery topologyTemplateQuery, boolean isRecursive)* + +It is designed to retrieve details of one or more entity templates from corresponding topology template according to provided query parameters + +2. Mock-up version of **getEntity** API is implemented. + +### Note: +This version is intended for SDN-C team usage only. diff --git a/pom.xml b/pom.xml index 341d126..9fd3232 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ sdc-tosca sdc-sdc-tosca SDC Tosca Parser JAR file for use by consumers - 1.4.9-SNAPSHOT + 1.4.10-SNAPSHOT jar @@ -118,7 +118,7 @@ org.onap.sdc.jtosca jtosca - 1.4.9 + 1.4.10-SNAPSHOT diff --git a/src/main/java/org/onap/sdc/tosca/parser/api/IEntityDetails.java b/src/main/java/org/onap/sdc/tosca/parser/api/IEntityDetails.java index f8e8c6e..c4393cc 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/api/IEntityDetails.java +++ b/src/main/java/org/onap/sdc/tosca/parser/api/IEntityDetails.java @@ -1,20 +1,76 @@ package org.onap.sdc.tosca.parser.api; import org.onap.sdc.tosca.parser.enums.EntityTemplateType; +import org.onap.sdc.toscaparser.api.CapabilityAssignment; import org.onap.sdc.toscaparser.api.Property; +import org.onap.sdc.toscaparser.api.RequirementAssignment; import org.onap.sdc.toscaparser.api.elements.Metadata; import java.util.List; import java.util.Map; public interface IEntityDetails { + /** + * Retrieves entity instance template type. + * @return {@link EntityTemplateType} enum entry describing given object type + */ EntityTemplateType getType(); + + /** + * Retrieves entity instance name + */ String getName(); + + /** + * Retrieves entity {@link Metadata} object + */ Metadata getMetadata(); + + /** + * Retrieves entity instance properties + * @return map of entity property names and corresponding {@link Property} object instances + */ Map getProperties(); - List getPropertyList(); + + /** + * Retrieves member nodes of the entity instance + * @return List of member nodes entity objects + */ List getMemberNodes(); + + /** + * Retrieves node template containing the current entity instance. + * @return parent entity instance or null if the entity is contained by service + */ IEntityDetails getParent(); + + /** + * Retrieves path to the searched entity instance in the model. It is based on the collection of the node templates names delimited by #. + * The entity instance may exist in the service node templates, in the VF node templates or in the nested of nested CVFC. + * The path will include the VF name, then the names of the CVFC recursively. + * If the entity instance is located in the service directly, the path is empty string + */ String getPath(); -} + /** + * Retrieves map of requirements of the entity instance + * @return map of entity requirement names and corresponding {@link RequirementAssignment} object instances + */ + Map getRequirements(); + + /** + * Retrieves map of capabilities of the entity instance + * @return map of entity capability names and corresponding {@link CapabilityAssignment} object instances + */ + Map getCapabilities(); + + /** + * Retrieves list of policy target names + */ + List getTargets(); + + /** + * Retrieves list of policy target entity instances (groups or node templates) + */ + List getTargetNodes(); +} \ No newline at end of file diff --git a/src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java b/src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java index b64d0de..129f7b4 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java +++ b/src/main/java/org/onap/sdc/tosca/parser/api/ISdcCsarHelper.java @@ -42,6 +42,7 @@ public interface ISdcCsarHelper { * @param nodeType - the TOSCA type of the node. * @return service node templates of this type. */ + @Deprecated public List getServiceNodeTemplatesByType(String nodeType); /** @@ -49,6 +50,7 @@ public interface ISdcCsarHelper { * * @return service node templates. */ + @Deprecated public List getServiceNodeTemplates(); /** @@ -57,6 +59,7 @@ public interface ISdcCsarHelper { * @param vfCustomizationUuid - customizationUuid of VF instance. * @return list of vfModule groups. */ + @Deprecated public List getVfModulesByVf(String vfCustomizationUuid); @@ -84,6 +87,7 @@ public interface ISdcCsarHelper { * @param pathToPropertyLeafValue - the full path of the required property. * @return the leaf value as String, or null if there's no such property, or it's not a leaf. */ + @Deprecated public String getNodeTemplatePropertyLeafValue(NodeTemplate nodeTemplate, String pathToPropertyLeafValue); /** @@ -110,6 +114,7 @@ public interface ISdcCsarHelper { * @param pathToPropertyLeafValue - the full path of the required property. * @return the leaf value as Object, or null if there's no such property. It's up to the caller to cast it to a proper type. */ + @Deprecated public Object getNodeTemplatePropertyValueAsObject(NodeTemplate nodeTemplate, String pathToPropertyLeafValue); /** @@ -119,6 +124,7 @@ public interface ISdcCsarHelper { * @param propertyName - the name of the required property. * @return the leaf value as String, or null if there's no such property, or it's not a leaf. */ + @Deprecated public String getGroupPropertyLeafValue(Group group, String propertyName); /** @@ -128,18 +134,21 @@ public interface ISdcCsarHelper { * @param propertyName - the name of the required property. * @return the leaf value as Object, or null if there's no such property. It's up to the caller to cast it to a proper type. */ + @Deprecated public Object getGroupPropertyAsObject(Group group, String propertyName); /** * Get all VL node templates of the CSAR service. * @return - all VL node templates. */ + @Deprecated public List getServiceVlList(); /** * Get all VF node templates of the CSAR service. * @return - all VF node templates. */ + @Deprecated public List getServiceVfList(); @@ -169,6 +178,7 @@ public interface ISdcCsarHelper { * @param metadataPropertyName - the name of the metadata property. * @return metadata property value */ + @Deprecated public String getMetadataPropertyValue(Metadata metadata, String metadataPropertyName); @@ -234,6 +244,7 @@ public interface ISdcCsarHelper { * @param vfCustomizationId - customizationUuid of the VF node template. * @return all VFC node templates from a specified VF */ + @Deprecated public List getVfcListByVf(String vfCustomizationId); /** @@ -241,6 +252,7 @@ public interface ISdcCsarHelper { * @param vfCustomizationId - customizationUuid of the VF node template. * @return all CP node templates from a specified VF */ + @Deprecated public List getCpListByVf(String vfCustomizationId); /** @@ -261,6 +273,7 @@ public interface ISdcCsarHelper { * @return node templates from vf with the names as in members section. * */ + @Deprecated public List getMembersOfVfModule(NodeTemplate vf, Group vfModule); @@ -297,6 +310,7 @@ public interface ISdcCsarHelper { * Get all allotted node templates from this service. * @return all allotted node templates from this service. */ + @Deprecated public List getAllottedResources(); /** @@ -313,6 +327,7 @@ public interface ISdcCsarHelper { * @param nodeTemplate - node template object * @return - node type string. */ + @Deprecated public String getTypeOfNodeTemplate(NodeTemplate nodeTemplate); /** @@ -355,6 +370,7 @@ public interface ISdcCsarHelper { * @param vfc - VFC node template to look for CP-related props. * @return map CP node template name to a map of property name - property value as object. */ + @Deprecated public Map> getCpPropertiesFromVfcAsObject(NodeTemplate vfc); /** @@ -362,6 +378,7 @@ public interface ISdcCsarHelper { * @param nt - node template * @return customization UUID of a node template. */ + @Deprecated public String getNodeTemplateCustomizationUuid(NodeTemplate nt); /** @@ -380,6 +397,7 @@ public interface ISdcCsarHelper { * @param sdcType - the SDC type of the node. * @return node templates of this SDC type. */ + @Deprecated public List getNodeTemplateBySdcType(NodeTemplate parentNodeTemplate, SdcTypes sdcType); /** @@ -388,6 +406,7 @@ public interface ISdcCsarHelper { * @param sdcType - the SDC type of the node (for example, CP, VF...). * @return service node templates of this SDC type. */ + @Deprecated public List getServiceNodeTemplateBySdcType(SdcTypes sdcType); /** @@ -395,6 +414,7 @@ public interface ISdcCsarHelper { * @param vfCustomizationUuid - the Customization UUID of the node. * @return VNF Configuration Node Template. */ + @Deprecated public NodeTemplate getVnfConfig(String vfCustomizationUuid); /** @@ -402,6 +422,7 @@ public interface ISdcCsarHelper { * @param nodeTemplate - Node Template to check * @return true if node template has topology template, false if not. */ + @Deprecated public boolean hasTopology(NodeTemplate nodeTemplate); /** @@ -409,6 +430,7 @@ public interface ISdcCsarHelper { * @param nodeTemplate - Node Template to get its children * @return return list of children node templates for node template. */ + @Deprecated public List getNodeTemplateChildren(NodeTemplate nodeTemplate); /** @@ -416,6 +438,7 @@ public interface ISdcCsarHelper { * @param nodeName - the name of the node template. * @return service-level node template with this name, or null if no such node template was found. */ + @Deprecated public NodeTemplate getServiceNodeTemplateByNodeName(String nodeName); /** @@ -424,6 +447,7 @@ public interface ISdcCsarHelper { * @param nt - Node template to get its Metadata object. * @return Metadata for this node template, or null if not found. */ + @Deprecated public Metadata getNodeTemplateMetadata(NodeTemplate nt); /** @@ -434,6 +458,7 @@ public interface ISdcCsarHelper { * @return CapabilitiesAssignments that contains list of capability assignments for the node template.
* If none found, an empty list will be returned. */ + @Deprecated public CapabilityAssignments getCapabilitiesOf(NodeTemplate nt); /** @@ -444,6 +469,7 @@ public interface ISdcCsarHelper { * @return RequirementAssignments that contains list of requirement assignments for the node template. * If none found, an empty list will be returned. */ + @Deprecated public RequirementAssignments getRequirementsOf(NodeTemplate nt); /** @@ -453,12 +479,14 @@ public interface ISdcCsarHelper { * @param pathToPropertyLeafValue - the full path of the required property. * @return the leaf value as String, or null if there's no such property, or it's not a leaf. */ + @Deprecated public String getCapabilityPropertyLeafValue(CapabilityAssignment capability, String pathToPropertyLeafValue); /** * Get all the policies of the main topology template (either VF or service) * @return the list of the policies */ + @Deprecated public List getPoliciesOfTopologyTemplate(); /** @@ -466,6 +494,7 @@ public interface ISdcCsarHelper { * @param policyTypeName the name of the policy type * @return the list of the policies */ + @Deprecated public List getPoliciesOfTopologyTemplateByToscaPolicyType(String policyTypeName); /** @@ -473,6 +502,7 @@ public interface ISdcCsarHelper { * @param nodeTemplate the node template * @return the list of the policies */ + @Deprecated public List getPoliciesOfOriginOfNodeTemplate(NodeTemplate nodeTemplate); /** @@ -481,6 +511,7 @@ public interface ISdcCsarHelper { * @param policyTypeName the name of the policy type * @return the list of the policies */ + @Deprecated List getPoliciesOfOriginOfNodeTemplateByToscaPolicyType(NodeTemplate nodeTemplate, String policyTypeName); /** @@ -488,6 +519,7 @@ public interface ISdcCsarHelper { * @param policyName the name of the policy * @return the list of the node templates */ + @Deprecated List getPolicyTargetsFromTopologyTemplate(String policyName); /** @@ -496,6 +528,7 @@ public interface ISdcCsarHelper { * @param policyName the name of the policy * @return the list of the node templates */ + @Deprecated List getPolicyTargetsFromOrigin(NodeTemplate nodeTemplate, String policyName); /** @@ -503,6 +536,7 @@ public interface ISdcCsarHelper { * @param nodeTemplateName the name of the node template * @return the node template */ + @Deprecated NodeTemplate getNodeTemplateByName(String nodeTemplateName); /** @@ -510,6 +544,7 @@ public interface ISdcCsarHelper { * @param targetNode the node template * @return the list of the policies */ + @Deprecated List getPoliciesOfTarget(NodeTemplate targetNode); /** @@ -518,6 +553,7 @@ public interface ISdcCsarHelper { * @param policyTypeName the name of the policy type * @return the list of the policies */ + @Deprecated List getPoliciesOfTargetByToscaPolicyType(NodeTemplate nodeTemplate, String policyTypeName); /** @@ -525,6 +561,7 @@ public interface ISdcCsarHelper { * @param nodeTemplate the node template * @return the list of the groups */ + @Deprecated ArrayList getGroupsOfOriginOfNodeTemplate(NodeTemplate nodeTemplate); /** @@ -532,12 +569,14 @@ public interface ISdcCsarHelper { * @param groupType the group type * @return the list of the groups */ + @Deprecated ArrayList getGroupsOfTopologyTemplateByToscaGroupType(String groupType); /** * Get all groups of this of the main topology template (either VF or service) * @return the list of the groups */ + @Deprecated ArrayList getGroupsOfTopologyTemplate(); /** @@ -546,6 +585,7 @@ public interface ISdcCsarHelper { * @param groupType the group type * @return the list of the groups */ + @Deprecated ArrayList getGroupsOfOriginOfNodeTemplateByToscaGroupType(NodeTemplate nodeTemplate, String groupType); /** @@ -553,6 +593,7 @@ public interface ISdcCsarHelper { * @param groupName the name of the group * @return the list of the node templates */ + @Deprecated List getGroupMembersFromTopologyTemplate(String groupName); /** @@ -561,6 +602,7 @@ public interface ISdcCsarHelper { * @param groupName the name of the group * @return the list of the node templates */ + @Deprecated List getGroupMembersOfOriginOfNodeTemplate(NodeTemplate nodeTemplate, String groupName); /** @@ -612,6 +654,7 @@ public interface ISdcCsarHelper { * Path is based on the collection of the node templates names delimited by #. * @return List of property values. If none found, empty list will be returned. */ + @Deprecated List getPropertyLeafValueByPropertyNamePathAndNodeTemplatePath(String propertyNamePath, String nodeTemplatePath); boolean isNodeTypeSupported(NodeTemplate nodeTemplate); @@ -622,7 +665,7 @@ public interface ISdcCsarHelper { * SDC (node template) type, tosca type as well as optional customizationUUID and UUID * @param topologyTemplateQuery parameters of the topology template containing the above entity. * Includes SDC type of the container and optional customizationUUID - * @param isRecursive indicates if the search is recursive or not + * @param isRecursive indicates if the search within the required topology template is recursive. * @return list of @{@link IEntityDetails} objects containing information about the found entities. * If either no entities found or the provided query is incorrect, an empty list is returned */ diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java b/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java index 91c7144..2567700 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java +++ b/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetails.java @@ -2,23 +2,24 @@ 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.NodeTemplate; import org.onap.sdc.toscaparser.api.Property; +import org.onap.sdc.toscaparser.api.RequirementAssignment; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public abstract class EntityDetails implements IEntityDetails { private final EntityTemplate entityTemplate; + private final IEntityDetails parentNodeTemplate; - private final IEntityDetails parentNode; - - EntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode) { + EntityDetails(EntityTemplate entityTemplate) { this.entityTemplate = entityTemplate; - this.parentNode = EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, parentNode, null); + this.parentNodeTemplate = EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, entityTemplate.getParentNodeTemplate()); } @Override @@ -36,27 +37,54 @@ public abstract class EntityDetails implements IEntityDetails { } @Override - public List getPropertyList() { - return entityTemplate.getPropertiesObjects(); + public List getMemberNodes() { + return Collections.emptyList(); } @Override - public List getMemberNodes() { - List ntList = new ArrayList<>(); - ntList.add(getParent()); - return ntList; + public IEntityDetails getParent() { + return parentNodeTemplate; } @Override - public IEntityDetails getParent() { - //todo - update after adding parent to the EntityTemplate class - return parentNode; + public Map getRequirements() { + return entityTemplate.getRequirements() + .getAll() + .stream() + .collect(Collectors.toMap(RequirementAssignment::getName, ra->ra)); + } + + @Override + public Map getCapabilities() { + return entityTemplate.getCapabilities() + .getAll() + .stream() + .collect(Collectors.toMap(CapabilityAssignment::getName, ca->ca)); + } + + @Override + public List getTargets() { + return Collections.emptyList(); + } + + @Override + public List getTargetNodes() { + return Collections.emptyList(); } @Override public String getPath() { - //todo - update after adding parent to the EntityTemplate class - return "jenny vTSBC vlan VNF 0#abstract_ssc#ssc_ssc_avpn_port_0"; + StringBuilder pathBld = new StringBuilder(""); + EntityTemplate currentEntityParent = entityTemplate.getParentNodeTemplate(); + + while (currentEntityParent != null) { + if (pathBld.length() != 0) { + pathBld.insert(0,"#"); + } + pathBld.insert(0, currentEntityParent.getName()); + currentEntityParent = currentEntityParent.getParentNodeTemplate(); + } + return pathBld.toString(); } diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactory.java b/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactory.java index 65968b8..e8477c6 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactory.java +++ b/src/main/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactory.java @@ -2,25 +2,25 @@ package org.onap.sdc.tosca.parser.elements; import org.onap.sdc.tosca.parser.enums.EntityTemplateType; import org.onap.sdc.toscaparser.api.EntityTemplate; -import org.onap.sdc.toscaparser.api.NodeTemplate; public class EntityDetailsFactory { private EntityDetailsFactory(){} - //TODO: the parent should be retrieved from the entityTemplate and not passed as a separate parameter - public static EntityDetails createEntityDetails(EntityTemplateType entityTemplateType, EntityTemplate entityTemplate, NodeTemplate parent) { + public static EntityDetails createEntityDetails(EntityTemplateType entityTemplateType, EntityTemplate entityTemplate) { EntityDetails entityDetails = null; - if (entityTemplate != null) { + if (entityTemplate != null && entityTemplateType != null) { switch (entityTemplateType) { case NODE_TEMPLATE: - entityDetails = new NodeTemplateEntityDetails(entityTemplate, parent); + entityDetails = new NodeTemplateEntityDetails(entityTemplate); break; case POLICY: - entityDetails = new PolicyEntityDetails(entityTemplate, parent); + entityDetails = new PolicyEntityDetails(entityTemplate); break; case GROUP: - entityDetails = new GroupEntityDetails(entityTemplate, parent); + entityDetails = new GroupEntityDetails(entityTemplate); + break; + default: break; } } diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/GroupEntityDetails.java b/src/main/java/org/onap/sdc/tosca/parser/elements/GroupEntityDetails.java index 82488a7..32a91aa 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/elements/GroupEntityDetails.java +++ b/src/main/java/org/onap/sdc/tosca/parser/elements/GroupEntityDetails.java @@ -4,18 +4,28 @@ import org.onap.sdc.tosca.parser.api.IEntityDetails; import org.onap.sdc.tosca.parser.enums.EntityTemplateType; import org.onap.sdc.toscaparser.api.EntityTemplate; import org.onap.sdc.toscaparser.api.Group; -import org.onap.sdc.toscaparser.api.NodeTemplate; import org.onap.sdc.toscaparser.api.elements.Metadata; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; public class GroupEntityDetails extends EntityDetails { private final Group group; + private final List memberNodes; - GroupEntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode) { - super(entityTemplate,parentNode); + GroupEntityDetails(EntityTemplate entityTemplate) { + super(entityTemplate); group = (Group)getEntityTemplate(); + if (group.getMemberNodes() != null) { + memberNodes = group.getMemberNodes() + .stream() + .map(m->EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, m)) + .collect(Collectors.toList()); + } + else { + memberNodes = Collections.emptyList(); + } } @Override @@ -25,10 +35,7 @@ public class GroupEntityDetails extends EntityDetails { @Override public List getMemberNodes() { - return group.getMemberNodes() - .stream() - .map(m->EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, m, null)) - .collect(Collectors.toList()); + return memberNodes; } @Override diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java b/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java index c6dd69f..ad3b1a0 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java +++ b/src/main/java/org/onap/sdc/tosca/parser/elements/NodeTemplateEntityDetails.java @@ -9,8 +9,8 @@ public class NodeTemplateEntityDetails extends EntityDetails { private final NodeTemplate nodeTemplate; - NodeTemplateEntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode) { - super(entityTemplate, parentNode); + NodeTemplateEntityDetails(EntityTemplate entityTemplate) { + super(entityTemplate); nodeTemplate = (NodeTemplate)getEntityTemplate(); } diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/PolicyEntityDetails.java b/src/main/java/org/onap/sdc/tosca/parser/elements/PolicyEntityDetails.java index 39027c3..7b97175 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/elements/PolicyEntityDetails.java +++ b/src/main/java/org/onap/sdc/tosca/parser/elements/PolicyEntityDetails.java @@ -1,17 +1,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.EntityTemplate; -import org.onap.sdc.toscaparser.api.NodeTemplate; import org.onap.sdc.toscaparser.api.Policy; import org.onap.sdc.toscaparser.api.elements.Metadata; +import java.util.List; +import java.util.stream.Collectors; + public class PolicyEntityDetails extends EntityDetails { + private static final String NODE_TEMPLATES_TARGET_TYPE = "node_templates"; + private final Policy policy; - PolicyEntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode) { - super(entityTemplate, parentNode); + PolicyEntityDetails(EntityTemplate entityTemplate) { + super(entityTemplate); policy = (Policy)getEntityTemplate(); } @@ -24,4 +29,26 @@ public class PolicyEntityDetails extends EntityDetails { public Metadata getMetadata() { return policy.getMetaDataObj(); } + + @Override + public List getTargets() { + if (policy.getTargets() != null) { + return policy.getTargets(); + } + return super.getTargets(); + } + + @Override + public List getTargetNodes() { + if (policy.getTargetsType().equals(NODE_TEMPLATES_TARGET_TYPE)) { + return policy.getTargetsList() + .stream() + .map(o->EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, (EntityTemplate)o)) + .collect(Collectors.toList()); + } + return policy.getTargetsList() + .stream() + .map(o->EntityDetailsFactory.createEntityDetails(EntityTemplateType.GROUP, (EntityTemplate)o)) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/AllEntitiesQuery.java b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/AllEntitiesQuery.java new file mode 100644 index 0000000..7c1cd25 --- /dev/null +++ b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/AllEntitiesQuery.java @@ -0,0 +1,46 @@ +package org.onap.sdc.tosca.parser.elements.queries; + +import com.google.common.collect.Lists; +import org.onap.sdc.tosca.parser.api.IEntityDetails; +import org.onap.sdc.tosca.parser.enums.EntityTemplateType; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.ToscaTemplate; + +import java.util.List; + +/** + * Implements EntityQuery object for NodeTemplates, Groups and Policies + */ + +public class AllEntitiesQuery extends EntityQuery { + + AllEntitiesQuery() { + super(EntityTemplateType.ALL, null, null); + } + + @Override + public List getEntitiesFromTopologyTemplate(NodeTemplate nodeTemplate) { + List allEntities = Lists.newArrayList(); + if (nodeTemplate.getSubMappingToscaTemplate() != null) { + allEntities.addAll(GroupEntityQuery.convertGroupLisToEntityDetailsList(nodeTemplate.getSubMappingToscaTemplate().getGroups().stream())); + allEntities.addAll(NodeTemplateEntityQuery.convertNodeTemplatesListToEntityDetailsList(nodeTemplate.getSubMappingToscaTemplate().getNodeTemplates().stream())); + } + if (nodeTemplate.getOriginComponentTemplate() != null) { + allEntities.addAll(PolicyEntityQuery.convertPolicyLisToEntityDetailsList(nodeTemplate.getOriginComponentTemplate().getPolicies().stream())); + } + return allEntities; + } + + + @Override + public List getEntitiesFromService(ToscaTemplate toscaTemplate) { + List allEntities = Lists.newArrayList(); + allEntities.addAll(GroupEntityQuery.convertGroupLisToEntityDetailsList(toscaTemplate.getGroups().stream())); + allEntities.addAll(NodeTemplateEntityQuery.convertNodeTemplatesListToEntityDetailsList(toscaTemplate.getNodeTemplates().stream())); + allEntities.addAll(PolicyEntityQuery.convertPolicyLisToEntityDetailsList(toscaTemplate.getPolicies().stream())); + return allEntities; + } + +} + + diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/EntityQuery.java b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/EntityQuery.java index ba17423..167a568 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/EntityQuery.java +++ b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/EntityQuery.java @@ -1,11 +1,17 @@ package org.onap.sdc.tosca.parser.elements.queries; -import org.apache.commons.lang3.StringUtils; +import org.onap.sdc.tosca.parser.api.IEntityDetails; import org.onap.sdc.tosca.parser.enums.EntityTemplateType; import org.onap.sdc.tosca.parser.enums.SdcTypes; -import org.onap.sdc.toscaparser.api.EntityTemplate; +import org.onap.sdc.tosca.parser.impl.SdcPropertyNames; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.ToscaTemplate; +import org.onap.sdc.toscaparser.api.elements.Metadata; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.List; +import java.util.Objects; /** * This class describes an entity searched and retrieved by SDC Tosca Parser API @@ -13,6 +19,8 @@ import java.util.List; */ public abstract class EntityQuery { + private static final Logger logger = LoggerFactory.getLogger(EntityQuery.class.getName()); + private final EntityTemplateType entityType; private final SdcTypes nodeTemplateType; @@ -37,9 +45,9 @@ public abstract class EntityQuery { this.customizationUUID = customizationUUID; } - public abstract List searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery); + public abstract List getEntitiesFromTopologyTemplate(NodeTemplate nodeTemplate); - public abstract EntityTemplateType getType(); + public abstract List getEntitiesFromService(ToscaTemplate toscaTemplate); public EntityTemplateType getEntityType() { return entityType; @@ -61,8 +69,19 @@ public abstract class EntityQuery { return customizationUUID; } - public boolean searchAllEntities() { - return StringUtils.isEmpty(toscaType) && nodeTemplateType == null; + boolean isSearchCriteriaMatched(Metadata metadata, String toscaType, String uuidKeyName, String cuuidKeyName) { + return Objects.nonNull(metadata) + && isStringMatchingOrNull(metadata.getValue(uuidKeyName), getUUID()) + && isStringMatchingOrNull(metadata.getValue(cuuidKeyName), getCustomizationUUID()) + && isStringMatchingOrNull(toscaType, getToscaType()); + } + + boolean isSearchCriteriaMatched(Metadata metadata, String toscaType) { + return isSearchCriteriaMatched(metadata, toscaType, SdcPropertyNames.PROPERTY_NAME_UUID, SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID); + } + + static boolean isStringMatchingOrNull(String currentUid, String uidInQuery) { + return uidInQuery == null || uidInQuery.equals(currentUid); } public static EntityQueryBuilder newBuilder(EntityTemplateType entityTemplateType) { @@ -73,6 +92,12 @@ public abstract class EntityQuery { return new EntityQueryBuilder(sdcType); } + @Override + public String toString() { + return String.format("EntityType=%s, nodeTemplateType=%s, toscaType=%s, uUID=%s, customizationUUID=%s", + entityType, nodeTemplateType, toscaType, uUID, customizationUUID); + } + public static EntityQueryBuilder newBuilder(String toscaType) { return new EntityQueryBuilder(toscaType); } @@ -97,8 +122,13 @@ public abstract class EntityQuery { case POLICY: entityQuery = new PolicyEntityQuery(); break; + case ALL: + entityQuery = new AllEntitiesQuery(); + break; default: - throw new IllegalArgumentException("Wrong entity query type: " + entityTemplateType); + String wrongTypeMsg = (String.format("Wrong entity query type: %s", entityTemplateType)); + logger.error(wrongTypeMsg); + throw new IllegalArgumentException(wrongTypeMsg); } } diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/GroupEntityQuery.java b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/GroupEntityQuery.java index 37a3ccd..8b1cd25 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/GroupEntityQuery.java +++ b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/GroupEntityQuery.java @@ -1,30 +1,55 @@ package org.onap.sdc.tosca.parser.elements.queries; +import com.google.common.collect.Lists; +import org.onap.sdc.tosca.parser.api.IEntityDetails; +import org.onap.sdc.tosca.parser.elements.EntityDetailsFactory; import org.onap.sdc.tosca.parser.enums.EntityTemplateType; -import org.onap.sdc.toscaparser.api.EntityTemplate; +import org.onap.sdc.toscaparser.api.Group; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.ToscaTemplate; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Implements EntityQuery object for Groups */ public class GroupEntityQuery extends EntityQuery { - public GroupEntityQuery() { + private static final String VF_MODULE_UUID = "vfModuleModelUUID"; + private static final String VF_MODULE_CUSTOMIZATION_UUID = "vfModuleModelCustomizationUUID"; + + GroupEntityQuery() { super(EntityTemplateType.GROUP, null, null); } @Override - public List searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery) { - return null; + public List getEntitiesFromTopologyTemplate(NodeTemplate nodeTemplate) { + if (nodeTemplate.getSubMappingToscaTemplate() != null) { + return convertGroupLisToEntityDetailsList(filter(nodeTemplate.getSubMappingToscaTemplate().getGroups())); + } + return Lists.newArrayList(); } @Override - public EntityTemplateType getType() { - return EntityTemplateType.GROUP; + public List getEntitiesFromService(ToscaTemplate toscaTemplate) { + return convertGroupLisToEntityDetailsList(filter(toscaTemplate.getGroups())); } - public GroupEntityQuery(String toscaType) { + GroupEntityQuery(String toscaType) { super(EntityTemplateType.GROUP, null, toscaType); } + + static List convertGroupLisToEntityDetailsList(Stream groups) { + return groups.map(gr->EntityDetailsFactory.createEntityDetails(EntityTemplateType.GROUP, gr)) + .collect(Collectors.toList()); + } + + private Stream filter(List groupList) { + return groupList.stream() + .filter(gr->isSearchCriteriaMatched(gr.getMetadata(), gr.getType()) || + isSearchCriteriaMatched(gr.getMetadata(), gr.getType(), VF_MODULE_UUID, VF_MODULE_CUSTOMIZATION_UUID)); + } + } diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/NodeTemplateEntityQuery.java b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/NodeTemplateEntityQuery.java index 4e01bd8..b5a7a2e 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/NodeTemplateEntityQuery.java +++ b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/NodeTemplateEntityQuery.java @@ -1,34 +1,61 @@ package org.onap.sdc.tosca.parser.elements.queries; +import com.google.common.collect.Lists; +import org.onap.sdc.tosca.parser.api.IEntityDetails; +import org.onap.sdc.tosca.parser.elements.EntityDetailsFactory; import org.onap.sdc.tosca.parser.enums.EntityTemplateType; import org.onap.sdc.tosca.parser.enums.SdcTypes; -import org.onap.sdc.toscaparser.api.EntityTemplate; +import org.onap.sdc.tosca.parser.impl.SdcPropertyNames; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.ToscaTemplate; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Implements EntityQuery object for NodeTemplates */ public class NodeTemplateEntityQuery extends EntityQuery { - public NodeTemplateEntityQuery() { + NodeTemplateEntityQuery() { super(EntityTemplateType.NODE_TEMPLATE, null, null); } + NodeTemplateEntityQuery(SdcTypes nodeTemplateType) { + super(EntityTemplateType.NODE_TEMPLATE, nodeTemplateType, null); + } + + NodeTemplateEntityQuery(String toscaType) { + super(EntityTemplateType.NODE_TEMPLATE, null, toscaType); + } + @Override - public EntityTemplateType getType() { - return EntityTemplateType.NODE_TEMPLATE; + public List getEntitiesFromTopologyTemplate(NodeTemplate nodeTemplate) { + if (nodeTemplate.getSubMappingToscaTemplate() != null) { + return convertNodeTemplatesListToEntityDetailsList(filter(nodeTemplate.getSubMappingToscaTemplate() + .getNodeTemplates())); + } + return Lists.newArrayList(); } @Override - public List searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery) { - return null; + public List getEntitiesFromService(ToscaTemplate toscaTemplate) { + return convertNodeTemplatesListToEntityDetailsList(filter(toscaTemplate.getNodeTemplates())); } - public NodeTemplateEntityQuery(SdcTypes nodeTemplateType) { - super(EntityTemplateType.NODE_TEMPLATE, nodeTemplateType, null); + static List convertNodeTemplatesListToEntityDetailsList(Stream nodeTemplates) { + return nodeTemplates + .map(nt->EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, nt)) + .collect(Collectors.toList()); } - public NodeTemplateEntityQuery(String toscaType) { - super(EntityTemplateType.NODE_TEMPLATE, null, toscaType); + private Stream filter(List nodeTemplateList) { + return nodeTemplateList.stream() + .filter(nt->isSearchCriteriaMatched(nt.getMetaData(), nt.getType())) + .filter(nt->getNodeTemplateType() == null || + isStringMatchingOrNull(nt.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE), + getNodeTemplateType().getValue())); } + + } diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/PolicyEntityQuery.java b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/PolicyEntityQuery.java index 8ab5e4c..2a0a0ab 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/PolicyEntityQuery.java +++ b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/PolicyEntityQuery.java @@ -1,30 +1,52 @@ package org.onap.sdc.tosca.parser.elements.queries; +import com.google.common.collect.Lists; +import org.onap.sdc.tosca.parser.api.IEntityDetails; +import org.onap.sdc.tosca.parser.elements.EntityDetailsFactory; import org.onap.sdc.tosca.parser.enums.EntityTemplateType; -import org.onap.sdc.toscaparser.api.EntityTemplate; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.Policy; +import org.onap.sdc.toscaparser.api.ToscaTemplate; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Implements EntityQuery object for Policies */ public class PolicyEntityQuery extends EntityQuery { - public PolicyEntityQuery() { + PolicyEntityQuery() { super(EntityTemplateType.POLICY, null, null); } + PolicyEntityQuery(String toscaType) { + super(EntityTemplateType.POLICY, null, toscaType); + } + @Override - public List searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery) { - return null; + public List getEntitiesFromTopologyTemplate(NodeTemplate nodeTemplate) { + if (nodeTemplate.getOriginComponentTemplate() != null) { + return convertPolicyLisToEntityDetailsList(filter(nodeTemplate.getOriginComponentTemplate().getPolicies())); + } + return Lists.newArrayList(); } @Override - public EntityTemplateType getType() { - return EntityTemplateType.POLICY; + public List getEntitiesFromService(ToscaTemplate toscaTemplate) { + return convertPolicyLisToEntityDetailsList(filter(toscaTemplate.getPolicies())); } - public PolicyEntityQuery(String toscaType) { - super(EntityTemplateType.POLICY, null, toscaType); + static List convertPolicyLisToEntityDetailsList(Stream policies) { + return policies + .map(p->EntityDetailsFactory.createEntityDetails(EntityTemplateType.POLICY, p)) + .collect(Collectors.toList()); } + + private Stream filter(List policyList) { + return policyList.stream() + .filter(p->isSearchCriteriaMatched(p.getMetaDataObj(), p.getType())); + } + } diff --git a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQuery.java b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQuery.java index 47b10a8..668345c 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQuery.java +++ b/src/main/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQuery.java @@ -1,14 +1,22 @@ package org.onap.sdc.tosca.parser.elements.queries; import org.onap.sdc.tosca.parser.enums.SdcTypes; +import org.onap.sdc.tosca.parser.impl.SdcPropertyNames; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.elements.Metadata; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Objects; /** * This class describes a node template instance containing an entity searched and retrieved by SDC Tosca Parser API * It is used as the API input parameter. See the {@link org.onap.sdc.tosca.parser.api.ISdcCsarHelper} */ public class TopologyTemplateQuery { + private static final Logger logger = LoggerFactory.getLogger(TopologyTemplateQuery.class.getName()); - public void setCustomizationUUID(String customizationUUID) { + void setCustomizationUUID(String customizationUUID) { this.customizationUUID = customizationUUID; } @@ -21,6 +29,11 @@ public class TopologyTemplateQuery { } public static TopologyTemplateQueryBuilder newBuilder(SdcTypes sdcType) { + if (!SdcTypes.isComplex(sdcType.getValue())) { + String wrongTypeMsg = (String.format("Given type is not Topology template %s", sdcType)); + logger.error(wrongTypeMsg); + throw new IllegalArgumentException(wrongTypeMsg); + } return new TopologyTemplateQueryBuilder(sdcType); } @@ -32,6 +45,37 @@ public class TopologyTemplateQuery { return customizationUUID; } + public Boolean isMatchingSearchCriteria(NodeTemplate nodeTemplate) { + boolean isMatched = Objects.nonNull(nodeTemplate.getMetaData()) && isSearchedTemplate(nodeTemplate.getMetaData()); + if(logger.isDebugEnabled()) { + logger.debug("Node template {} is{} matching search criteria", nodeTemplate.getName(), isMatched ? "" : " not"); + } + return isMatched; + } + + public boolean isSameSdcType(Metadata metadata) { + final String nodeType = metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE); + return Objects.nonNull(nodeType) && ( + sdcType.getValue().equals(nodeType) || isServiceSearched(nodeType)); + } + + private boolean isSearchedTemplate(Metadata metadata) { + return isSameSdcType(metadata) && + (sdcType == SdcTypes.SERVICE || + //don't check customizationUUID for service + EntityQuery.isStringMatchingOrNull(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID), + getCustomizationUUID())); + } + + private boolean isServiceSearched(String nodeType) { + return sdcType == SdcTypes.SERVICE && SdcTypes.isComplex(nodeType); + } + + @Override + public String toString() { + return String.format("sdcType=%s, customizationUUID=%s", sdcType.getValue(), customizationUUID); + } + public static class TopologyTemplateQueryBuilder { private TopologyTemplateQuery topologyTemplateQuery; private TopologyTemplateQueryBuilder(SdcTypes sdcType) { topologyTemplateQuery = new TopologyTemplateQuery(sdcType);} diff --git a/src/main/java/org/onap/sdc/tosca/parser/enums/EntityTemplateType.java b/src/main/java/org/onap/sdc/tosca/parser/enums/EntityTemplateType.java index 7f85673..925d58b 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/enums/EntityTemplateType.java +++ b/src/main/java/org/onap/sdc/tosca/parser/enums/EntityTemplateType.java @@ -6,6 +6,7 @@ package org.onap.sdc.tosca.parser.enums; public enum EntityTemplateType { NODE_TEMPLATE, GROUP, - POLICY; + POLICY, + ALL; } diff --git a/src/main/java/org/onap/sdc/tosca/parser/enums/SdcTypes.java b/src/main/java/org/onap/sdc/tosca/parser/enums/SdcTypes.java index 99bdd81..b041972 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/enums/SdcTypes.java +++ b/src/main/java/org/onap/sdc/tosca/parser/enums/SdcTypes.java @@ -26,7 +26,8 @@ import java.util.stream.Collectors; public enum SdcTypes { - CP("CP"), VL("VL"), VF("VF"), CR("CR"), VFC("VFC"), PNF("PNF"), SERVICE("Service"), CVFC("CVFC"), SERVICE_PROXY("Service Proxy"), CONFIGURATION("Configuration"); + CP("CP"), VL("VL"), VF("VF"), CR("CR"), VFC("VFC"), PNF("PNF"), SERVICE("Service"), CVFC("CVFC"), + SERVICE_PROXY("Service Proxy"), CONFIGURATION("Configuration"), VFC_ALLOTTED_RESOURCE("AllottedResource") ; private String value; diff --git a/src/main/java/org/onap/sdc/tosca/parser/impl/QueryProcessor.java b/src/main/java/org/onap/sdc/tosca/parser/impl/QueryProcessor.java new file mode 100644 index 0000000..42b499b --- /dev/null +++ b/src/main/java/org/onap/sdc/tosca/parser/impl/QueryProcessor.java @@ -0,0 +1,127 @@ +package org.onap.sdc.tosca.parser.impl; + +import com.google.common.collect.Lists; +import org.onap.sdc.tosca.parser.api.IEntityDetails; +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; +import org.onap.sdc.tosca.parser.enums.SdcTypes; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.ToscaTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Performs search for entity templates inside node template according to query criteria + */ +class QueryProcessor { + private static final Logger logger = LoggerFactory.getLogger(QueryProcessor.class.getName()); + + private final EntityQuery entityQuery; + private final TopologyTemplateQuery topologyTemplateQuery; + private final ToscaTemplate toscaTemplate; + private boolean isRecursive = false; + + QueryProcessor(ToscaTemplate toscaTemplate, EntityQuery entityQuery, TopologyTemplateQuery topologyTemplateQuery, boolean isRecursive) { + this.toscaTemplate = toscaTemplate; + this.entityQuery = entityQuery == null ? EntityQuery.newBuilder(EntityTemplateType.ALL).build() : entityQuery; + this.topologyTemplateQuery = topologyTemplateQuery; + this.isRecursive = isRecursive; + } + + List doQuery() { + List entityDetailsList = Lists.newArrayList(); + if (isServiceSearch()) { + //search for entities inside the service + if (logger.isDebugEnabled()) { + logger.debug("Service {} is searched for {}", toscaTemplate.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_NAME), entityQuery); + } + entityDetailsList.addAll(entityQuery.getEntitiesFromService(toscaTemplate)); + + if (!isRecursive) { + return entityDetailsList; + } + } + + List foundTopologyTemplates = getInternalTopologyTemplates(toscaTemplate.getNodeTemplates(), false); + if (isRecursive) { + if (logger.isDebugEnabled()) { + logger.debug("Search for entities recursively"); + } + //go over internal topology templates of the found templates + // and search for instances of the same type + //if the queried topology template is "SERVICE", search for all instances of templates in the service + List internalTopologyTemplates = foundTopologyTemplates.stream() + .filter(nt->nt.getSubMappingToscaTemplate() != null) + .map(nt->getInternalTopologyTemplates(nt.getSubMappingToscaTemplate().getNodeTemplates(), true)) + .flatMap(List::stream) + .collect(Collectors.toList()); + foundTopologyTemplates.addAll(internalTopologyTemplates); + } + if (logger.isDebugEnabled()) { + logger.debug("Found topology templates {} matching following query criteria: {}", + foundTopologyTemplates, topologyTemplateQuery); + } + //go over all node templates found according to query criteria and recursive flag and + // search for the requested entities. + entityDetailsList.addAll(searchEntitiesInsideTopologyTemplates(foundTopologyTemplates)); + + return entityDetailsList; + } + + private Map convertListToMap(List nodeTemplateList) { + // we use map to avoid duplicate search through same node templates + return nodeTemplateList.stream() + .collect(Collectors.toMap(NodeTemplate::getName, nt->nt, (nt1, nt2)->nt1)); + } + + private List searchEntitiesInsideTopologyTemplates(List foundTopologyTemplates) { + return convertListToMap(foundTopologyTemplates) + .values() + .stream() + .map(entityQuery::getEntitiesFromTopologyTemplate) + .flatMap(List::stream) + .collect(Collectors.toList()); + } + + private boolean isServiceSearch() { + return topologyTemplateQuery.getNodeTemplateType() == SdcTypes.SERVICE; + } + + private List getInternalTopologyTemplates(List nodeTemplateList, boolean searchTypeOnly) { + return nodeTemplateList + .stream() + .map(child->getTopologyTemplatesByQuery(child, searchTypeOnly)) + .flatMap(List::stream) + .collect(Collectors.toList()); + } + + private List getTopologyTemplatesByQuery(NodeTemplate current, boolean searchTypeOnly) { + List topologyTemplateList = Lists.newArrayList(); + + boolean isTopologyTemplateFound = searchTypeOnly ? + topologyTemplateQuery.isSameSdcType(current.getMetaData()) : topologyTemplateQuery.isMatchingSearchCriteria(current); + if (isTopologyTemplateFound) { + topologyTemplateList.add(current); + if (!isServiceSearch()) { + //recursion stop condition + return topologyTemplateList; + } + } + if (SdcTypes.isComplex(current.getMetaData().getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)) && current.getSubMappingToscaTemplate() != null) { + //search the node template inside a given topology template + topologyTemplateList.addAll(current.getSubMappingToscaTemplate().getNodeTemplates() + .stream() + .map(nt->getTopologyTemplatesByQuery(nt, searchTypeOnly)) + .flatMap(List::stream) + .collect(Collectors.toList())); + } + return topologyTemplateList; + } + + +} diff --git a/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java b/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java index 06bf48a..1ae3471 100644 --- a/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java +++ b/src/main/java/org/onap/sdc/tosca/parser/impl/SdcCsarHelperImpl.java @@ -39,11 +39,8 @@ 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.EntityDetailsFactory; -import org.onap.sdc.tosca.parser.elements.NodeTemplateEntityDetails; -import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery; import org.onap.sdc.tosca.parser.elements.queries.EntityQuery; -import org.onap.sdc.tosca.parser.enums.EntityTemplateType; +import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery; import org.onap.sdc.tosca.parser.enums.FilterType; import org.onap.sdc.tosca.parser.enums.PropertySchemaType; import org.onap.sdc.tosca.parser.enums.SdcTypes; @@ -1208,12 +1205,13 @@ public class SdcCsarHelperImpl implements ISdcCsarHelper { @Override public List getEntity(EntityQuery entityQuery, TopologyTemplateQuery topologyTemplateQuery, boolean isRecursive) { - List foundEntities = new ArrayList<>(); - List vfcList = getVfcListByVf("05e77410-a1d8-44fe-8440-b9410c8f98ee"); - NodeTemplate vfc = getNodeTemplateByCustomizationUuid(vfcList, "1fdc9625-dfec-48e1-aaf8-7b92f78ca854"); - NodeTemplate cp = getChildNodeTemplateByName(vfc, "ssc_ssc_avpn_port_0"); - foundEntities.add(EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, cp, vfc)); - return foundEntities; + + if (log.isDebugEnabled()) { + log.debug("getEntity request: EntityQuery <{}>, TopologyTemplateQuery <{}>, isRecursive<{}>", + entityQuery, topologyTemplateQuery, isRecursive); + } + return new QueryProcessor(toscaTemplate, entityQuery, topologyTemplateQuery, isRecursive).doQuery(); } + } diff --git a/src/test/java/org/onap/sdc/impl/GetEntityTest.java b/src/test/java/org/onap/sdc/impl/GetEntityTest.java index 8a2067d..830e67a 100644 --- a/src/test/java/org/onap/sdc/impl/GetEntityTest.java +++ b/src/test/java/org/onap/sdc/impl/GetEntityTest.java @@ -9,13 +9,17 @@ import org.onap.sdc.tosca.parser.elements.queries.TopologyTemplateQuery; import org.onap.sdc.tosca.parser.enums.EntityTemplateType; import org.onap.sdc.tosca.parser.enums.SdcTypes; import org.onap.sdc.tosca.parser.exceptions.SdcToscaParserException; +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 java.net.URL; import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; public class GetEntityTest { @@ -25,64 +29,319 @@ public class GetEntityTest { @BeforeClass public static void setUpClass() { try { - String filePath = GetEntityTest.class.getClassLoader().getResource("csars/service-JennyVtsbcVlanSvc-csar.csar").getFile(); - helper = SdcToscaParserFactory.getInstance().getSdcCsarHelper(filePath); + URL resource = GetEntityTest.class.getClassLoader().getResource("csars/service-JennyVtsbcVlanSvc-csar.csar"); + if (resource != null) { + helper = SdcToscaParserFactory.getInstance().getSdcCsarHelper(resource.getFile()); + } + } catch (SdcToscaParserException e) { e.printStackTrace(); } } - @Test - public void test1() { - //none recursive search for groups in the service - EntityQuery entityQuery1 = EntityQuery.newBuilder(EntityTemplateType.GROUP) - .uUID("1233456") + @Test + public void getCpEntitiesFromCVFC() { + EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.CP) + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) + .customizationUUID("1fdc9625-dfec-48e1-aaf8-7b92f78ca854") .build(); - TopologyTemplateQuery topologyTemplateQuery1 = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, false); + + assertEquals(6, entities.size()); + } + + @Test + public void getOneCpEntityFromCVFC() { + EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.resource.cp.v2.extNeutronCP") + .uUID("d5e13a34-c983-4a36-a44a-a53a6e850d73") + .customizationUUID("e97b3399-ab2d-4a34-b07a-9bd5f6461335") + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) + .customizationUUID("1fdc9625-dfec-48e1-aaf8-7b92f78ca854") .build(); - List entities = helper.getEntity(entityQuery1, topologyTemplateQuery1, false); - for (IEntityDetails entity: entities) { - List members = entity.getMemberNodes(); - } + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, false); - //recursive search for CPs in a specific CVFC - EntityQuery entityQuery2 = EntityQuery.newBuilder(SdcTypes.CP) - .customizationUUID("345678903456") + assertEquals(1, entities.size()); + assertEquals("ssc_ssc_avpn_port_0", entities.get(0).getName()); + assertEquals(18, entities.get(0).getProperties().size()); + assertEquals(1, entities.get(0).getRequirements().size()); + assertEquals(13, entities.get(0).getCapabilities().entrySet().size()); + Map capAssignments = entities.get(0).getCapabilities(); + CapabilityAssignment capabilityAssignment = capAssignments.get("network.outgoing.packets.rate"); + assertEquals("org.openecomp.capabilities.metric.Ceilometer", capabilityAssignment.getDefinition().getType()); + + } + + @Test + public void getCpsFromCVFCRecursively() { + EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.CP) + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) .build(); - TopologyTemplateQuery topologyTemplateQuery2 = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) - .customizationUUID("12346767676") + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, true); + + assertEquals(16, entities.size()); + assertEquals("jenny vTSBC vlan VNF 0#abstract_rtp_msc", entities.get(2).getPath()); + assertEquals("jenny vTSBC vlan VNF 0#abstract_rtp_msc#rtp_msc_rtp_msc_avpn_port_0_vlan_subinterface_rtp_msc_avpn", entities.get(7).getPath()); + } + + @Test + public void getCpByUuidsFromCVFCRecursively() { + EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.CP) + .customizationUUID("d674b231-34ba-4777-b83a-78be33960a69") + .uUID("f511e1c8-1f21-4370-b7b6-f57a61c15211") + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) .build(); - entities = helper.getEntity(entityQuery2, topologyTemplateQuery2, true); - for (IEntityDetails entity: entities) { - Map properties = entity.getProperties(); - Property property = properties.get("network_role"); - String network_role_value = (String) property.getValue(); - } + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, true); + assertEquals(1, entities.size()); + assertEquals("rtp_msc_subint_mis_vmi_0", entities.get(0).getName()); + assertEquals("ff9ae686-f030-4431-afb7-b65d1bf4733e", entities.get(0).getParent().getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_UUID)); + assertTrue(entities.get(0).getMemberNodes().isEmpty()); } @Test - public void getCpEntityMock() { + public void getCpByWrongUuidFromCVFCRecursively() { EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.CP) + .customizationUUID("d674b231-34ba-4777-b83a-78be33960a69") + .uUID("f511e1c8-1f21-4370-b7b6-f57a61c15213") .build(); TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) .build(); + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, true); + + assertEquals(0, entities.size()); + } + + @Test + public void getServiceGroups() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP) + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, false); + + assertEquals(4, entities.size()); + assertTrue(entities.get(0).getRequirements().isEmpty()); + assertTrue(entities.get(1).getCapabilities().isEmpty()); + assertTrue(entities.get(0).getPath().isEmpty() && entities.get(1).getPath().isEmpty() && + entities.get(2).getPath().isEmpty() && entities.get(3).getPath().isEmpty()); + } + + @Test + public void getVfGroupsByType1() { + EntityQuery entityQuery = EntityQuery.newBuilder("tosca.groups.Root") + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, false); + + assertEquals(2, entities.size()); + assertTrue(entities.get(0).getMemberNodes().get(0).getName().equals("abstract_rtp_msc") || + entities.get(1).getMemberNodes().get(0).getName().equals("abstract_rtp_msc")); + assertTrue(entities.get(0).getMemberNodes().get(0).getName().equals("abstract_ssc") || + entities.get(1).getMemberNodes().get(0).getName().equals("abstract_ssc")); + + } + + @Test + public void getVfGroupByType2() { + EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.groups.VfcInstanceGroup") + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, false); + + assertEquals(1, entities.size()); + assertTrue(entities.get(0).getName().equals("avpn_group")); + assertTrue(entities.get(0).getMemberNodes().get(0).getName().equals("abstract_ssc") || + entities.get(0).getMemberNodes().get(1).getName().equals("abstract_ssc")); + assertTrue(entities.get(0).getMemberNodes().get(0).getName().equals("abstract_rtp_msc") || + entities.get(0).getMemberNodes().get(1).getName().equals("abstract_rtp_msc")); + assertEquals(4, entities.get(0).getProperties().size()); + assertTrue(entities.get(0).getRequirements().isEmpty()); + + } + + @Test + public void getOneServiceGroup() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP) + .customizationUUID("94d27f05-a116-4662-b330-8758c2b049d7") + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, false); assertEquals(1, entities.size()); - assertEquals(1, entities.get(0).getMemberNodes().size()); - assertEquals(EntityTemplateType.NODE_TEMPLATE, entities.get(0).getType()); - assertEquals("28.0", entities.get(0).getMetadata().getValue("version")); - assertEquals("CP", entities.get(0).getMetadata().getValue("type")); - assertEquals("extNeutronCP", entities.get(0).getMetadata().getValue("name")); - assertEquals("abstract_ssc", entities.get(0).getParent().getName()); - assertEquals("jenny vTSBC vlan VNF 0#abstract_ssc#ssc_ssc_avpn_port_0", entities.get(0).getPath()); - assertTrue(entities.get(0).getProperties() != null && entities.get(0).getProperties().size() == 18); + assertNull(entities.get(0).getParent()); + } + @Test + public void getAllGroups() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP) + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, true); + + assertEquals(19, entities.size()); + assertTrue(entities.get(9).getTargetNodes().isEmpty()); + assertEquals("rtp_msc_subint_avpn_vmi_0", entities.get(5).getMemberNodes().get(0).getName()); } + + @Test + public void getAllPolicies() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.POLICY) + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, true); + + assertEquals(1, entities.size()); + assertEquals("jennyvtsbcvlanvnf..External..0", entities.get(0).getMetadata().getValue(SdcPropertyNames.PROPERTY_NAME_NAME)); + assertEquals(EntityTemplateType.GROUP, entities.get(0).getTargetNodes().get(0).getType()); + assertEquals("jenny vTSBC vlan VNF 0", entities.get(0).getPath()); + } + + @Test + public void getServicePolicy() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.POLICY) + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, false); + assertEquals(0, entities.size()); + } + + @Test + public void getVfPolicyByUUID() { + EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.policies.External") + .uUID("0181f46a-3c68-47dd-9839-8692726356e5") + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, false); + + assertEquals(1, entities.size()); + assertEquals(EntityTemplateType.GROUP, entities.get(0).getTargetNodes().get(0).getType()); + assertTrue(entities.get(0).getRequirements().isEmpty()); + assertTrue(entities.get(0).getCapabilities().isEmpty()); + assertEquals("jenny vTSBC vlan VNF 0", entities.get(0).getPath()); + } + + @Test + public void getVfPolicyByWrongToscaTypeAndUUID() { + EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.policies.External1") + .uUID("0181f46a-3c68-47dd-9839-8692726356e5") + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, false); + assertEquals(0, entities.size()); + } + + @Test + public void getCvfcPolicyByToscaTypeAndUUID() { + EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.policies.External") + .uUID("0181f46a-3c68-47dd-9839-8692726356e5") + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, true); + assertEquals(0, entities.size()); + } + + + @Test + public void getAllEntitiesInServiceOnly() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + + List entities = helper.getEntity(null, topologyTemplateQuery, false); + assertEquals(5, entities.size()); + } + + + @Test + public void getAllEntitiesInServiceRecursively() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + + List entities = helper.getEntity(null, topologyTemplateQuery, true); + assertEquals(48, entities.size()); + } + + @Test + public void getAllEntitiesInCvfcByCUUID() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) + .customizationUUID("b90c9f8a-9c07-4507-913f-70b533f5934d") + .build(); + + List entities = helper.getEntity(null, topologyTemplateQuery, false); + assertEquals(2, entities.size()); + assertTrue("ssc_subint_mis_vmi_0".equals(entities.get(0).getName()) || "ssc_subint_mis_vmi_0".equals(entities.get(1).getName())); + } + + @Test + public void getAllEntitiesInCvfcByUuidRecursively() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) + .customizationUUID("1fdc9625-dfec-48e1-aaf8-7b92f78ca854") + .build(); + + List entities = helper.getEntity(null, topologyTemplateQuery, true); + assertEquals(13, entities.size()); + } + + @Test + public void getCpPropertyWhenCpIsInInternalCVFC() { + EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.resource.cp.nodes.heat.network.neutron.Port") + .customizationUUID("c03b7d04-5457-4ad2-9102-1edb7806c7b2") + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, true); + + assertEquals(1, entities.size()); + Property p = entities.get(0).getProperties().get("ip_requirements"); + List valueList = p.getLeafPropertyValue("ip_version"); + assertEquals(1, valueList.size()); + assertEquals("4", valueList.get(0)); + } + + @Test + public void getCpPropertyOnCVFC() { + EntityQuery entityQuery = EntityQuery.newBuilder("org.openecomp.resource.cp.v2.extNeutronCP") + .customizationUUID("e56919d1-b23f-4334-93b0-1daa507fd2a9") + .build(); + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) + .customizationUUID("1fdc9625-dfec-48e1-aaf8-7b92f78ca854") + .build(); + + List entities = helper.getEntity(entityQuery, topologyTemplateQuery, false); + + assertEquals(1, entities.size()); + Property p = entities.get(0).getProperties().get("mac_requirements"); + List valueList = p.getLeafPropertyValue("mac_count_required#is_required"); + assertEquals(1, valueList.size()); + assertEquals("false", valueList.get(0)); + } + } diff --git a/src/test/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactoryTest.java b/src/test/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactoryTest.java new file mode 100644 index 0000000..4ecce9d --- /dev/null +++ b/src/test/java/org/onap/sdc/tosca/parser/elements/EntityDetailsFactoryTest.java @@ -0,0 +1,106 @@ +package org.onap.sdc.tosca.parser.elements; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.onap.sdc.tosca.parser.enums.EntityTemplateType; +import org.onap.sdc.toscaparser.api.Group; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.Policy; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class EntityDetailsFactoryTest { + + @Mock + private NodeTemplate nodeTemplate; + + @Mock + private Group group; + + @Mock + private Policy policy; + + + @Test + public void createNodeTemplateEntityDetailsWhenParentNodeIsNotNull() { + when(nodeTemplate.getParentNodeTemplate()) + .thenReturn(nodeTemplate) + .thenReturn(null); + EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, nodeTemplate); + assertTrue(entityDetails instanceof NodeTemplateEntityDetails); + assertTrue(entityDetails.getParent() instanceof NodeTemplateEntityDetails); + } + + @Test + public void createNodeTemplateEntityDetailsWhenParentNodeIsNull() { + EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, nodeTemplate); + assertTrue(entityDetails instanceof NodeTemplateEntityDetails); + assertEquals(null, entityDetails.getParent()); + } + + @Test + public void createNodeTemplateEntityDetailsWhenNnIsNull() { + assertEquals(null, EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, null)); + } + + @Test + public void createGroupEntityDetailsWhenParentNodeIsNotNull() { + when(group.getParentNodeTemplate()) + .thenReturn(nodeTemplate) + .thenReturn(null); + EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.GROUP, group); + assertTrue(entityDetails instanceof GroupEntityDetails); + assertTrue(entityDetails.getParent() instanceof NodeTemplateEntityDetails); + } + + @Test + public void createGroupEntityDetailsWhenParentNodeIsNull() { + EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.GROUP, group); + assertTrue(entityDetails instanceof GroupEntityDetails); + assertEquals(null, entityDetails.getParent()); + } + + @Test + public void createGroupEntityDetailsWhenNnIsNull() { + assertEquals(null, EntityDetailsFactory.createEntityDetails(EntityTemplateType.GROUP, null)); + } + + @Test + public void createPolicyEntityDetailsWhenParentNodeIsNotNull() { + when(policy.getParentNodeTemplate()) + .thenReturn(nodeTemplate) + .thenReturn(null); + EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.POLICY, policy); + assertTrue(entityDetails instanceof PolicyEntityDetails); + assertTrue(entityDetails.getParent() instanceof NodeTemplateEntityDetails); + } + + @Test + public void createPolicyEntityDetailsWhenParentNodeIsNull() { + EntityDetails entityDetails = EntityDetailsFactory.createEntityDetails(EntityTemplateType.POLICY, policy); + assertTrue(entityDetails instanceof PolicyEntityDetails); + assertEquals(null, entityDetails.getParent()); + } + + @Test + public void createPolicyEntityDetailsWhenNnIsNull() { + assertEquals(null, EntityDetailsFactory.createEntityDetails(EntityTemplateType.POLICY, null)); + } + + @Test(expected = ClassCastException.class) + public void createWrongEntityDetails() { + EntityDetailsFactory.createEntityDetails(EntityTemplateType.POLICY, group); + } + + + @Test + public void createEntityDetailsWhenTypeIsNull() { + assertEquals(null, EntityDetailsFactory.createEntityDetails(null, group)); + } + +} diff --git a/src/test/java/org/onap/sdc/tosca/parser/elements/queries/EntityQueryTest.java b/src/test/java/org/onap/sdc/tosca/parser/elements/queries/EntityQueryTest.java new file mode 100644 index 0000000..ecf764c --- /dev/null +++ b/src/test/java/org/onap/sdc/tosca/parser/elements/queries/EntityQueryTest.java @@ -0,0 +1,163 @@ +package org.onap.sdc.tosca.parser.elements.queries; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.onap.sdc.tosca.parser.enums.EntityTemplateType; +import org.onap.sdc.tosca.parser.impl.SdcPropertyNames; +import org.onap.sdc.toscaparser.api.elements.Metadata; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class EntityQueryTest { + @Mock + private Metadata metadata; + + @Test + public void findEntityWhenUuidAndCuudNotSetAndToscaTypeNotSet() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP) + .build(); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123"); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("12345"); + assertTrue(entityQuery.isSearchCriteriaMatched(metadata, "")); + } + + @Test + public void findEntityWhenMetadataIsNull() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP) + .build(); + assertFalse(entityQuery.isSearchCriteriaMatched(null,"abc")); + } + + @Test + public void findEntityWhenMetadataIsNullAndUuidsAreProvided() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.NODE_TEMPLATE) + .customizationUUID("2345") + .uUID("9700") + .build(); + assertFalse(entityQuery.isSearchCriteriaMatched(null, "")); + } + + @Test + public void findEntityWhenUuidIsSetAndMatchedAndToscaTypeNotSet() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP) + .uUID("123") + .build(); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123"); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("12345"); + + assertTrue(entityQuery.isSearchCriteriaMatched(metadata, "abc")); + } + + @Test + public void findEntityWhenUuidIsSetAndMatchedAndCuuidIsNullAndToscaTypeNotSet() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP) + .uUID("123") + .build(); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123"); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn(null); + + assertTrue(entityQuery.isSearchCriteriaMatched(metadata, "")); + } + + @Test + public void findEntityWhenUuidAndCuuidAreSetAndMatchedAndCuuidIsNullAndToscaTypeNotSet() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP) + .uUID("123") + .customizationUUID("567") + .build(); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123"); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn(null); + + assertFalse(entityQuery.isSearchCriteriaMatched(metadata, "")); + } + + + @Test + public void findEntityWhenUIDsAreSetAndMatchedAndToscaTypeNotSet() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.POLICY) + .uUID("123") + .customizationUUID("345") + .build(); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123"); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("345"); + + assertTrue(entityQuery.isSearchCriteriaMatched(metadata, "qwe")); + } + + @Test + public void findEntityWhenUIDsAreSetAndMatchedPartiallyAndToscaTypeNotSet() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.POLICY) + .uUID("123") + .customizationUUID("345") + .build(); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123"); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("444"); + + assertFalse(entityQuery.isSearchCriteriaMatched(metadata, "")); + } + + @Test + public void findEntityWhenUuidIsSetAndDoesNotMatchAndToscaTypeNotSet() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.GROUP) + .uUID("7890") + .build(); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123"); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("12345"); + + assertFalse(entityQuery.isSearchCriteriaMatched(metadata, "")); + } + + @Test + public void findEntityWhenUIDsAreSetAndMatchedAndToscaTypeIsNull() { + EntityQuery entityQuery = EntityQuery.newBuilder(EntityTemplateType.POLICY) + .uUID("123") + .customizationUUID("345") + .build(); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123"); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("345"); + + assertTrue(entityQuery.isSearchCriteriaMatched(metadata, null)); + } + + @Test + public void findEntityWhenUIDsAreSetAndMatchedAndToscaTypeIsNotMatched() { + EntityQuery entityQuery = EntityQuery.newBuilder("a.policies.b") + .uUID("123") + .customizationUUID("345") + .build(); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123"); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("345"); + + assertFalse(entityQuery.isSearchCriteriaMatched(metadata, "abc")); + } + + @Test + public void findEntityWhenUIDsAreSetAndMatchedAndToscaTypeIsMatched() { + EntityQuery entityQuery = EntityQuery.newBuilder("a.groups.b") + .uUID("123") + .customizationUUID("345") + .build(); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("123"); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("345"); + + assertTrue(entityQuery.isSearchCriteriaMatched(metadata, "a.groups.b")); + } + + @Test + public void findEntityWhenUIDsAreNotMatchedAndToscaTypeIsMatched() { + EntityQuery entityQuery = EntityQuery.newBuilder("a.groups.b") + .uUID("123") + .customizationUUID("345") + .build(); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_UUID))).thenReturn("12345"); + when(metadata.getValue(eq(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID))).thenReturn("3456"); + + assertFalse(entityQuery.isSearchCriteriaMatched(metadata, "a.groups.b")); + } +} diff --git a/src/test/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQueryTest.java b/src/test/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQueryTest.java new file mode 100644 index 0000000..08d3708 --- /dev/null +++ b/src/test/java/org/onap/sdc/tosca/parser/elements/queries/TopologyTemplateQueryTest.java @@ -0,0 +1,122 @@ +package org.onap.sdc.tosca.parser.elements.queries; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.onap.sdc.tosca.parser.enums.SdcTypes; +import org.onap.sdc.tosca.parser.impl.SdcPropertyNames; +import org.onap.sdc.toscaparser.api.NodeTemplate; +import org.onap.sdc.toscaparser.api.elements.Metadata; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.when; +import static org.testng.Assert.assertFalse; + +@RunWith(MockitoJUnitRunner.class) +public class TopologyTemplateQueryTest { + + @Mock + private Metadata metadata; + + @Mock + private NodeTemplate nodeTemplate; + + @Test(expected=IllegalArgumentException.class) + public void objectIsNotTopologyTemplate() { + TopologyTemplateQuery.newBuilder(SdcTypes.CP) + .build(); + } + + @Test + public void templateIsFoundByTypeOnly() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn("345"); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.SERVICE.getValue()); + assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); + } + + @Test + public void templateIsNotFoundWhenMetadataIsNull() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) + .build(); + when(nodeTemplate.getMetaData()).thenReturn(null); + assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); + } + + @Test + public void templateIsFoundIfItIsService() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE) + .build(); + when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.SERVICE.getValue()); + assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); + } + + @Test + public void templateIsFoundByTypeAndCUUID() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) + .customizationUUID("345") + .build(); + when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.CVFC.getValue()); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn("345"); + assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); + } + + @Test + public void templateIsNotFoundWhenTypeIsNotMatchedAndCuuidIsNotSet() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) + .build(); + when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.VF.getValue()); + assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); + } + + @Test + public void templateIsFoundWhenTypeIsMatchedCuuidIsProvidedAndCuuidIsNullInMetadata() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) + .customizationUUID("2345") + .build(); + when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn(null); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.VF.getValue()); + assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); + } + + @Test + public void templateIsFoundWhenTypeIsMatchedAndCuuidIsNullInMetadata() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.VF) + .build(); + when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn(null); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.VF.getValue()); + assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); + } + + @Test + public void templateIsNotFoundWhenTypeIsMatchedAndCuuidIsSet() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC) + .customizationUUID("345") + .build(); + when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.CVFC.getValue()); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn("345"); + assertTrue(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); + } + + @Test + public void templateIsNotFoundWhenTypeIsNotMatchedAndCuuidIsSet() { + TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CR) + .customizationUUID("345") + .build(); + when(nodeTemplate.getMetaData()).thenReturn(metadata); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_TYPE)).thenReturn(SdcTypes.CVFC.getValue()); + when(metadata.getValue(SdcPropertyNames.PROPERTY_NAME_CUSTOMIZATIONUUID)).thenReturn("345"); + assertFalse(topologyTemplateQuery.isMatchingSearchCriteria(nodeTemplate)); + } + + +} diff --git a/version.properties b/version.properties index 61bae76..3a44f58 100644 --- a/version.properties +++ b/version.properties @@ -5,7 +5,7 @@ major=1 minor=4 -patch=9 +patch=10 base_version=${major}.${minor}.${patch} -- cgit 1.2.3-korg