<artifactId>sdc-tosca</artifactId>
<name>sdc-sdc-tosca</name>
<description>SDC Tosca Parser JAR file for use by consumers</description>
- <version>1.4.7-SNAPSHOT</version>
+ <version>1.4.8-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<dependency>
<groupId>org.onap.sdc.jtosca</groupId>
<artifactId>jtosca</artifactId>
- <version>1.4.7</version>
+ <version>1.4.8</version>
</dependency>
--- /dev/null
+package org.onap.sdc.tosca.parser.api;
+
+import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.toscaparser.api.Property;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IEntityDetails {
+ EntityTemplateType getType();
+ String getName();
+ Metadata getMetadata();
+ Map<String, Property> getProperties();
+ List<Property> getPropertyList();
+ List<IEntityDetails> getMemberNodes();
+ IEntityDetails getParent();
+ String getPath();
+
+}
import java.util.Map;
import org.apache.commons.lang3.tuple.Pair;
+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.SdcTypes;
import org.onap.sdc.tosca.parser.enums.FilterType;
import org.onap.sdc.toscaparser.api.*;
List<String> getPropertyLeafValueByPropertyNamePathAndNodeTemplatePath(String propertyNamePath, String nodeTemplatePath);
boolean isNodeTypeSupported(NodeTemplate nodeTemplate);
+
+ /**
+ * Retrieves details of one or more entity templates according to provided query parameters from corresponding topology template
+ * @param entityQuery Object describing the searched entity parameters. Includes one of following parameters: entity type,
+ * 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
+ * @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
+ */
+ List<IEntityDetails> getEntity(EntityQuery entityQuery, TopologyTemplateQuery topologyTemplateQuery, boolean isRecursive);
}
\ No newline at end of file
--- /dev/null
+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.Property;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public abstract class EntityDetails implements IEntityDetails {
+
+ private final EntityTemplate entityTemplate;
+
+ private final IEntityDetails parentNode;
+
+ EntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode) {
+ this.entityTemplate = entityTemplate;
+ this.parentNode = EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, parentNode, null);
+ }
+
+ @Override
+ public String getName() {
+ return entityTemplate.getName();
+ }
+
+ EntityTemplate getEntityTemplate() {
+ return entityTemplate;
+ }
+
+ @Override
+ public Map<String, Property> getProperties() {
+ return entityTemplate.getProperties();
+ }
+
+ @Override
+ public List<Property> getPropertyList() {
+ return entityTemplate.getPropertiesObjects();
+ }
+
+ @Override
+ public List<IEntityDetails> getMemberNodes() {
+ List<IEntityDetails> ntList = new ArrayList<>();
+ ntList.add(getParent());
+ return ntList;
+ }
+
+ @Override
+ public IEntityDetails getParent() {
+ //todo - update after adding parent to the EntityTemplate class
+ return parentNode;
+ }
+
+ @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";
+ }
+
+
+
+}
--- /dev/null
+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) {
+ EntityDetails entityDetails = null;
+ if (entityTemplate != null) {
+ switch (entityTemplateType) {
+ case NODE_TEMPLATE:
+ entityDetails = new NodeTemplateEntityDetails(entityTemplate, parent);
+ break;
+ case POLICY:
+ entityDetails = new PolicyEntityDetails(entityTemplate, parent);
+ break;
+ case GROUP:
+ entityDetails = new GroupEntityDetails(entityTemplate, parent);
+ break;
+ }
+ }
+ return entityDetails;
+ }
+
+}
--- /dev/null
+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.Group;
+import org.onap.sdc.toscaparser.api.NodeTemplate;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class GroupEntityDetails extends EntityDetails {
+ private final Group group;
+
+ GroupEntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode) {
+ super(entityTemplate,parentNode);
+ group = (Group)getEntityTemplate();
+ }
+
+ @Override
+ public EntityTemplateType getType() {
+ return EntityTemplateType.GROUP;
+ }
+
+ @Override
+ public List<IEntityDetails> getMemberNodes() {
+ return group.getMemberNodes()
+ .stream()
+ .map(m->EntityDetailsFactory.createEntityDetails(EntityTemplateType.NODE_TEMPLATE, m, null))
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return group.getMetadata();
+ }
+}
--- /dev/null
+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;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
+
+public class NodeTemplateEntityDetails extends EntityDetails {
+
+ private final NodeTemplate nodeTemplate;
+
+ NodeTemplateEntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode) {
+ super(entityTemplate, parentNode);
+ nodeTemplate = (NodeTemplate)getEntityTemplate();
+ }
+
+ @Override
+ public EntityTemplateType getType() {
+ return EntityTemplateType.NODE_TEMPLATE;
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return nodeTemplate.getMetaData();
+ }
+}
--- /dev/null
+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;
+import org.onap.sdc.toscaparser.api.Policy;
+import org.onap.sdc.toscaparser.api.elements.Metadata;
+
+public class PolicyEntityDetails extends EntityDetails {
+
+ private final Policy policy;
+
+ PolicyEntityDetails(EntityTemplate entityTemplate, NodeTemplate parentNode) {
+ super(entityTemplate, parentNode);
+ policy = (Policy)getEntityTemplate();
+ }
+
+ @Override
+ public EntityTemplateType getType() {
+ return EntityTemplateType.POLICY;
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return policy.getMetaDataObj();
+ }
+}
--- /dev/null
+package org.onap.sdc.tosca.parser.elements.queries;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.tosca.parser.enums.SdcTypes;
+import org.onap.sdc.toscaparser.api.EntityTemplate;
+
+import java.util.List;
+
+/**
+ * This class describes 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 abstract class EntityQuery {
+
+ private final EntityTemplateType entityType;
+
+ private final SdcTypes nodeTemplateType;
+
+ private final String toscaType;
+
+ private String uUID;
+
+ private String customizationUUID;
+
+ EntityQuery(EntityTemplateType entityType, SdcTypes nodeTemplateType, String toscaType) {
+ this.entityType = entityType;
+ this.nodeTemplateType = nodeTemplateType;
+ this.toscaType = toscaType;
+ }
+
+ void setUUID(String uUID) {
+ this.uUID = uUID;
+ }
+
+ void setCustomizationUUID(String customizationUUID) {
+ this.customizationUUID = customizationUUID;
+ }
+
+ public abstract List<EntityTemplate> searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery);
+
+ public abstract EntityTemplateType getType();
+
+ public EntityTemplateType getEntityType() {
+ return entityType;
+ }
+
+ public SdcTypes getNodeTemplateType() {
+ return nodeTemplateType;
+ }
+
+ public String getToscaType() {
+ return toscaType;
+ }
+
+ public String getUUID() {
+ return uUID;
+ }
+
+ public String getCustomizationUUID() {
+ return customizationUUID;
+ }
+
+ public boolean searchAllEntities() {
+ return StringUtils.isEmpty(toscaType) && nodeTemplateType == null;
+ }
+
+ public static EntityQueryBuilder newBuilder(EntityTemplateType entityTemplateType) {
+ return new EntityQueryBuilder(entityTemplateType);
+ }
+
+ public static EntityQueryBuilder newBuilder(SdcTypes sdcType) {
+ return new EntityQueryBuilder(sdcType);
+ }
+
+ public static EntityQueryBuilder newBuilder(String toscaType) {
+ return new EntityQueryBuilder(toscaType);
+ }
+
+ /**
+ * Builds instance of EntityQuery object according to provided parameters
+ */
+ public static class EntityQueryBuilder {
+ private static final String GROUPS_NAME_SPACE = ".groups.";
+ private static final String POLICIES_NAME_SPACE = ".policies.";
+
+ private EntityQuery entityQuery;
+
+ private EntityQueryBuilder(EntityTemplateType entityTemplateType) {
+ switch(entityTemplateType) {
+ case NODE_TEMPLATE:
+ entityQuery = new NodeTemplateEntityQuery();
+ break;
+ case GROUP:
+ entityQuery = new GroupEntityQuery();
+ break;
+ case POLICY:
+ entityQuery = new PolicyEntityQuery();
+ break;
+ default:
+ throw new IllegalArgumentException("Wrong entity query type: " + entityTemplateType);
+ }
+ }
+
+ private EntityQueryBuilder(SdcTypes sdcType) {
+ entityQuery = new NodeTemplateEntityQuery(sdcType);
+ }
+
+ private EntityQueryBuilder(String toscaType) {
+ if (toscaType.contains(GROUPS_NAME_SPACE)) {
+ entityQuery = new GroupEntityQuery(toscaType);
+ }
+ else if (toscaType.contains(POLICIES_NAME_SPACE)) {
+ entityQuery = new PolicyEntityQuery(toscaType);
+ }
+ else {
+ entityQuery = new NodeTemplateEntityQuery(toscaType);
+ }
+ }
+
+ public EntityQueryBuilder uUID(String uUID) {
+ entityQuery.setUUID(uUID);
+ return this;
+ }
+
+ public EntityQueryBuilder customizationUUID(String customizationUUID) {
+ entityQuery.setCustomizationUUID(customizationUUID);
+ return this;
+ }
+
+ public EntityQuery build() {
+ return entityQuery;
+ }
+ }
+
+
+
+}
--- /dev/null
+package org.onap.sdc.tosca.parser.elements.queries;
+
+import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.toscaparser.api.EntityTemplate;
+
+import java.util.List;
+
+/**
+ * Implements EntityQuery object for Groups
+ */
+public class GroupEntityQuery extends EntityQuery {
+
+ public GroupEntityQuery() {
+ super(EntityTemplateType.GROUP, null, null);
+ }
+
+ @Override
+ public List<EntityTemplate> searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery) {
+ return null;
+ }
+
+ @Override
+ public EntityTemplateType getType() {
+ return EntityTemplateType.GROUP;
+ }
+
+ public GroupEntityQuery(String toscaType) {
+ super(EntityTemplateType.GROUP, null, toscaType);
+ }
+}
--- /dev/null
+package org.onap.sdc.tosca.parser.elements.queries;
+
+import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.tosca.parser.enums.SdcTypes;
+import org.onap.sdc.toscaparser.api.EntityTemplate;
+
+import java.util.List;
+
+/**
+ * Implements EntityQuery object for NodeTemplates
+ */
+public class NodeTemplateEntityQuery extends EntityQuery {
+ public NodeTemplateEntityQuery() {
+ super(EntityTemplateType.NODE_TEMPLATE, null, null);
+ }
+
+ @Override
+ public EntityTemplateType getType() {
+ return EntityTemplateType.NODE_TEMPLATE;
+ }
+
+ @Override
+ public List<EntityTemplate> searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery) {
+ return null;
+ }
+
+ public NodeTemplateEntityQuery(SdcTypes nodeTemplateType) {
+ super(EntityTemplateType.NODE_TEMPLATE, nodeTemplateType, null);
+ }
+
+ public NodeTemplateEntityQuery(String toscaType) {
+ super(EntityTemplateType.NODE_TEMPLATE, null, toscaType);
+ }
+}
--- /dev/null
+package org.onap.sdc.tosca.parser.elements.queries;
+
+import org.onap.sdc.tosca.parser.enums.EntityTemplateType;
+import org.onap.sdc.toscaparser.api.EntityTemplate;
+
+import java.util.List;
+
+/**
+ * Implements EntityQuery object for Policies
+ */
+public class PolicyEntityQuery extends EntityQuery {
+
+ public PolicyEntityQuery() {
+ super(EntityTemplateType.POLICY, null, null);
+ }
+
+ @Override
+ public List<EntityTemplate> searchByTopologyTemplate(TopologyTemplateQuery topologyTemplateQuery) {
+ return null;
+ }
+
+ @Override
+ public EntityTemplateType getType() {
+ return EntityTemplateType.POLICY;
+ }
+
+ public PolicyEntityQuery(String toscaType) {
+ super(EntityTemplateType.POLICY, null, toscaType);
+ }
+}
--- /dev/null
+package org.onap.sdc.tosca.parser.elements.queries;
+
+import org.onap.sdc.tosca.parser.enums.SdcTypes;
+
+/**
+ * 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 {
+
+ public void setCustomizationUUID(String customizationUUID) {
+ this.customizationUUID = customizationUUID;
+ }
+
+ private final SdcTypes sdcType;
+
+ private String customizationUUID;
+
+ private TopologyTemplateQuery(SdcTypes sdcType) {
+ this.sdcType = sdcType;
+ }
+
+ public static TopologyTemplateQueryBuilder newBuilder(SdcTypes sdcType) {
+ return new TopologyTemplateQueryBuilder(sdcType);
+ }
+
+ public SdcTypes getNodeTemplateType() {
+ return sdcType;
+ }
+
+ public String getCustomizationUUID() {
+ return customizationUUID;
+ }
+
+ public static class TopologyTemplateQueryBuilder {
+ private TopologyTemplateQuery topologyTemplateQuery;
+ private TopologyTemplateQueryBuilder(SdcTypes sdcType) { topologyTemplateQuery = new TopologyTemplateQuery(sdcType);}
+
+ public TopologyTemplateQueryBuilder customizationUUID(String customizationUUID) {
+ topologyTemplateQuery.setCustomizationUUID(customizationUUID);
+ return this;
+ }
+
+ public TopologyTemplateQuery build() {
+ return topologyTemplateQuery;
+ }
+ }
+
+}
--- /dev/null
+package org.onap.sdc.tosca.parser.enums;
+
+/**
+ * Describes types of entities for search
+ */
+public enum EntityTemplateType {
+ NODE_TEMPLATE,
+ GROUP,
+ POLICY;
+
+}
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
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.enums.FilterType;
import org.onap.sdc.tosca.parser.enums.PropertySchemaType;
import org.onap.sdc.tosca.parser.enums.SdcTypes;
}
@Override
- public List<Input> getInputsWithAnnotations() {
- return toscaTemplate.getInputs(true);
- }
+ public List<Input> getInputsWithAnnotations() {
+ return toscaTemplate.getInputs(true);
+ }
+
+ @Override
+ public List<IEntityDetails> getEntity(EntityQuery entityQuery, TopologyTemplateQuery topologyTemplateQuery, boolean isRecursive) {
+ List<IEntityDetails> foundEntities = new ArrayList<>();
+ List<NodeTemplate> 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;
+ }
}
--- /dev/null
+package org.onap.sdc.impl;
+
+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.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.tosca.parser.exceptions.SdcToscaParserException;
+import org.onap.sdc.tosca.parser.impl.SdcToscaParserFactory;
+import org.onap.sdc.toscaparser.api.Property;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class GetEntityTest {
+
+ private static ISdcCsarHelper helper = null;
+
+ @BeforeClass
+ public static void setUpClass() {
+ try {
+ String filePath = GetEntityTest.class.getClassLoader().getResource("csars/service-JennyVtsbcVlanSvc-csar.csar").getFile();
+ helper = SdcToscaParserFactory.getInstance().getSdcCsarHelper(filePath);
+ } 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")
+ .build();
+
+ TopologyTemplateQuery topologyTemplateQuery1 = TopologyTemplateQuery.newBuilder(SdcTypes.SERVICE)
+ .build();
+ List<IEntityDetails> entities = helper.getEntity(entityQuery1, topologyTemplateQuery1, false);
+
+ for (IEntityDetails entity: entities) {
+ List<IEntityDetails> members = entity.getMemberNodes();
+ }
+
+ //recursive search for CPs in a specific CVFC
+ EntityQuery entityQuery2 = EntityQuery.newBuilder(SdcTypes.CP)
+ .customizationUUID("345678903456")
+ .build();
+
+ TopologyTemplateQuery topologyTemplateQuery2 = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+ .customizationUUID("12346767676")
+ .build();
+ entities = helper.getEntity(entityQuery2, topologyTemplateQuery2, true);
+
+ for (IEntityDetails entity: entities) {
+ Map<String, Property> properties = entity.getProperties();
+ Property property = properties.get("network_role");
+ String network_role_value = (String) property.getValue();
+ }
+
+ }
+
+ @Test
+ public void getCpEntityMock() {
+ EntityQuery entityQuery = EntityQuery.newBuilder(SdcTypes.CP)
+ .build();
+ TopologyTemplateQuery topologyTemplateQuery = TopologyTemplateQuery.newBuilder(SdcTypes.CVFC)
+ .build();
+
+ List<IEntityDetails> 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);
+
+ }
+}
major=1
minor=4
-patch=7
+patch=8
base_version=${major}.${minor}.${patch}