Update tosca parser for node template artifacts
[sdc/sdc-tosca.git] / jtosca / src / main / java / org / onap / sdc / toscaparser / api / EntityTemplate.java
index 93bfe2b..9f8ccbd 100644 (file)
@@ -107,12 +107,12 @@ public abstract class EntityTemplate {
             }
         }
         if (_entityName.equals("relationship_type")) {
-            Object relationship = _template.get("relationship");
+            Object relationship = _template.get(RELATIONSHIP);
             type = null;
             if (relationship != null && relationship instanceof LinkedHashMap) {
                 type = (String) ((LinkedHashMap<String, Object>) relationship).get("type");
             } else if (relationship instanceof String) {
-                type = (String) entityTpl.get("relationship");
+                type = (String) entityTpl.get(RELATIONSHIP);
             } else {
                 type = (String) entityTpl.get("type");
             }
@@ -197,10 +197,9 @@ public abstract class EntityTemplate {
             for (String reqName : req.keySet()) {
                 Object reqItem = req.get(reqName);
                 if (reqItem instanceof LinkedHashMap) {
-                    Object rel = ((LinkedHashMap<String, Object>) reqItem).get("relationship");
-//                                     LinkedHashMap relationship = rel instanceof LinkedHashMap ? (LinkedHashMap) rel : null;
+                    Object rel = ((LinkedHashMap<String, Object>) reqItem).get(RELATIONSHIP);
                     String nodeName = ((LinkedHashMap<String, Object>) reqItem).get("node").toString();
-                    Object capability = ((LinkedHashMap<String, Object>) reqItem).get("capability");
+                    Object capability = ((LinkedHashMap<String, Object>) reqItem).get(CAPABILITY);
                     String capabilityString = capability != null ? capability.toString() : null;
 
                     reqs.add(new RequirementAssignment(reqName, nodeName, capabilityString, rel));
@@ -314,7 +313,7 @@ public abstract class EntityTemplate {
                         }
                     }
                     // then update (if available) with the node properties
-                    LinkedHashMap<String, Object> pp = (LinkedHashMap<String, Object>) props.get("properties");
+                    LinkedHashMap<String, Object> pp = (LinkedHashMap<String, Object>) props.get(PROPERTIES);
                     if (pp != null) {
                         properties.putAll(pp);
                     }
@@ -343,7 +342,7 @@ public abstract class EntityTemplate {
         LinkedHashMap<String, Object> capabilities = (LinkedHashMap<String, Object>)
                 ((EntityType) typeDefinition).getValue(CAPABILITIES, entityTpl, false);
         if (capabilities != null) {
-            _commonValidateField(capabilities, allowedCaps, "capabilities");
+            _commonValidateField(capabilities, allowedCaps, CAPABILITIES);
             _validateCapabilitiesProperties(capabilities);
         }
     }
@@ -370,7 +369,7 @@ public abstract class EntityTemplate {
                     int maxInstances = (int) propDict.get("max_instances");
                     int defaultInstances = (int) propDict.get("default_instances");
                     if (defaultInstances < minInstances || defaultInstances > maxInstances) {
-                        //err_msg = ('"properties" of template "%s": '
+                        //err_msg = ('PROPERTIES of template "%s": '
                         //           '"default_instances" value is not between '
                         //           '"min_instances" and "max_instances".' %
                         //           self.name)
@@ -396,7 +395,7 @@ public abstract class EntityTemplate {
         // validate all required properties have values
         if (properties != null) {
             ArrayList<String> reqPropsNoValueOrDefault = new ArrayList<String>();
-            _commonValidateField(properties, allowedProps, "properties");
+            _commonValidateField(properties, allowedProps, PROPERTIES);
             // make sure it's not missing any property required by a tosca type
             for (String r : requiredProps) {
                 if (properties.get(r) == null) {
@@ -427,12 +426,12 @@ public abstract class EntityTemplate {
             return;//???
         }
         boolean bBad = false;
-        Object relationship = ((LinkedHashMap<String, Object>) template).get("relationship");
+        Object relationship = ((LinkedHashMap<String, Object>) template).get(RELATIONSHIP);
         if (relationship != null) {
             if (!(relationship instanceof String)) {
                 bBad = (((LinkedHashMap<String, Object>) relationship).get(TYPE) == null);
             } else if (relationship instanceof String) {
-                bBad = (template.get("relationship") == null);
+                bBad = (template.get(RELATIONSHIP) == null);
             }
         } else {
             bBad = (template.get(TYPE) == null);
@@ -503,7 +502,7 @@ public abstract class EntityTemplate {
                             Object relDef = relValue;
                             LinkedHashMap<String, Object> rel = null;
                             if (relDef instanceof LinkedHashMap) {
-                                Object relob = ((LinkedHashMap<String, Object>) relDef).get("relationship");
+                                Object relob = ((LinkedHashMap<String, Object>) relDef).get(RELATIONSHIP);
                                 if (relob instanceof LinkedHashMap) {
                                     rel = (LinkedHashMap<String, Object>) relob;
                                 }
@@ -576,310 +575,3 @@ public abstract class EntityTemplate {
                 '}';
     }
 }
-
-/*python
-
-class EntityTemplate(object):
-    '''Base class for TOSCA templates.'''
-
-    SECTIONS = (DERIVED_FROM, PROPERTIES, REQUIREMENTS,
-                INTERFACES, CAPABILITIES, TYPE, DESCRIPTION, DIRECTIVES,
-                ATTRIBUTES, ARTIFACTS, NODE_FILTER, COPY) = \
-               ('derived_from', 'properties', 'requirements', 'interfaces',
-                'capabilities', 'type', 'description', 'directives',
-                'attributes', 'artifacts', 'node_filter', 'copy')
-    REQUIREMENTS_SECTION = (NODE, CAPABILITY, RELATIONSHIP, OCCURRENCES, NODE_FILTER) = \
-                           ('node', 'capability', 'relationship',
-                            'occurrences', 'node_filter')
-    # Special key names
-    SPECIAL_SECTIONS = (METADATA) = ('metadata')
-
-    def __init__(self, name, template, entity_name, custom_def=None):
-        self.name = name
-        self.entity_tpl = template
-        self.custom_def = custom_def
-        self._validate_field(self.entity_tpl)
-        type = self.entity_tpl.get('type')
-        UnsupportedType.validate_type(type)
-        if entity_name == 'node_type':
-            self.type_definition = NodeType(type, custom_def) \
-                if type is not None else None
-        if entity_name == 'relationship_type':
-            relationship = template.get('relationship')
-            type = None
-            if relationship and isinstance(relationship, dict):
-                type = relationship.get('type')
-            elif isinstance(relationship, str):
-                type = self.entity_tpl['relationship']
-            else:
-                type = self.entity_tpl['type']
-            UnsupportedType.validate_type(type)
-            self.type_definition = RelationshipType(type,
-                                                    None, custom_def)
-        if entity_name == 'policy_type':
-            if not type:
-                msg = (_('Policy definition of "%(pname)s" must have'
-                       ' a "type" ''attribute.') % dict(pname=name))
-                ValidationIssueCollector.appendException(
-                    ValidationError(msg))
-
-            self.type_definition = PolicyType(type, custom_def)
-        if entity_name == 'group_type':
-            self.type_definition = GroupType(type, custom_def) \
-                if type is not None else None
-        self._properties = None
-        self._interfaces = None
-        self._requirements = None
-        self._capabilities = None
-
-    @property
-    def type(self):
-        if self.type_definition:
-            return self.type_definition.type
-
-    @property
-    def parent_type(self):
-        if self.type_definition:
-            return self.type_definition.parent_type
-
-    @property
-    def requirements(self):
-        if self._requirements is None:
-            self._requirements = self.type_definition.get_value(
-                self.REQUIREMENTS,
-                self.entity_tpl) or []
-        return self._requirements
-
-    def get_properties_objects(self):
-        '''Return properties objects for this template.'''
-        if self._properties is None:
-            self._properties = self._create_properties()
-        return self._properties
-
-    def get_properties(self):
-        '''Return a dictionary of property name-object pairs.'''
-        return {prop.name: prop
-                for prop in self.get_properties_objects()}
-
-    def get_property_value(self, name):
-        '''Return the value of a given property name.'''
-        props = self.get_properties()
-        if props and name in props.keys():
-            return props[name].value
-
-    @property
-    def interfaces(self):
-        if self._interfaces is None:
-            self._interfaces = self._create_interfaces()
-        return self._interfaces
-
-    def get_capabilities_objects(self):
-        '''Return capabilities objects for this template.'''
-        if not self._capabilities:
-            self._capabilities = self._create_capabilities()
-        return self._capabilities
-
-    def get_capabilities(self):
-        '''Return a dictionary of capability name-object pairs.'''
-        return {cap.name: cap
-                for cap in self.get_capabilities_objects()}
-
-    def is_derived_from(self, type_str):
-        '''Check if object inherits from the given type.
-
-        Returns true if this object is derived from 'type_str'.
-        False otherwise.
-        '''
-        if not self.type:
-            return False
-        elif self.type == type_str:
-            return True
-        elif self.parent_type:
-            return self.parent_type.is_derived_from(type_str)
-        else:
-            return False
-
-    def _create_capabilities(self):
-        capability = []
-        caps = self.type_definition.get_value(self.CAPABILITIES,
-                                              self.entity_tpl, True)
-        if caps:
-            for name, props in caps.items():
-                capabilities = self.type_definition.get_capabilities()
-                if name in capabilities.keys():
-                    c = capabilities[name]
-                    properties = {}
-                    # first use the definition default value
-                    if c.properties:
-                        for property_name in c.properties.keys():
-                            prop_def = c.properties[property_name]
-                            if 'default' in prop_def:
-                                properties[property_name] = prop_def['default']
-                    # then update (if available) with the node properties
-                    if 'properties' in props and props['properties']:
-                        properties.update(props['properties'])
-
-                    cap = CapabilityAssignment(name, properties, c)
-                    capability.append(cap)
-        return capability
-
-    def _validate_properties(self, template, entitytype):
-        properties = entitytype.get_value(self.PROPERTIES, template)
-        self._common_validate_properties(entitytype, properties)
-
-    def _validate_capabilities(self):
-        type_capabilities = self.type_definition.get_capabilities()
-        allowed_caps = \
-            type_capabilities.keys() if type_capabilities else []
-        capabilities = self.type_definition.get_value(self.CAPABILITIES,
-                                                      self.entity_tpl)
-        if capabilities:
-            self._common_validate_field(capabilities, allowed_caps,
-                                        'capabilities')
-            self._validate_capabilities_properties(capabilities)
-
-    def _validate_capabilities_properties(self, capabilities):
-        for cap, props in capabilities.items():
-            capability = self.get_capability(cap)
-            if not capability:
-                continue
-            capabilitydef = capability.definition
-            self._common_validate_properties(capabilitydef,
-                                             props[self.PROPERTIES])
-
-            # validating capability properties values
-            for prop in self.get_capability(cap).get_properties_objects():
-                prop.validate()
-
-                # tODO(srinivas_tadepalli): temporary work around to validate
-                # default_instances until standardized in specification
-                if cap == "scalable" and prop.name == "default_instances":
-                    prop_dict = props[self.PROPERTIES]
-                    min_instances = prop_dict.get("min_instances")
-                    max_instances = prop_dict.get("max_instances")
-                    default_instances = prop_dict.get("default_instances")
-                    if not (min_instances <= default_instances
-                            <= max_instances):
-                        err_msg = ('"properties" of template "%s": '
-                                   '"default_instances" value is not between '
-                                   '"min_instances" and "max_instances".' %
-                                   self.name)
-                        ValidationIssueCollector.appendException(
-                            ValidationError(message=err_msg))
-
-    def _common_validate_properties(self, entitytype, properties):
-        allowed_props = []
-        required_props = []
-        for p in entitytype.get_properties_def_objects():
-            allowed_props.append(p.name)
-            # If property is 'required' and has no 'default' value then record
-            if p.required and p.default is None:
-                required_props.append(p.name)
-        # validate all required properties have values
-        if properties:
-            req_props_no_value_or_default = []
-            self._common_validate_field(properties, allowed_props,
-                                        'properties')
-            # make sure it's not missing any property required by a tosca type
-            for r in required_props:
-                if r not in properties.keys():
-                    req_props_no_value_or_default.append(r)
-            # Required properties found without value or a default value
-            if req_props_no_value_or_default:
-                ValidationIssueCollector.appendException(
-                    MissingRequiredFieldError(
-                        what='"properties" of template "%s"' % self.name,
-                        required=req_props_no_value_or_default))
-        else:
-            # Required properties in schema, but not in template
-            if required_props:
-                ValidationIssueCollector.appendException(
-                    MissingRequiredFieldError(
-                        what='"properties" of template "%s"' % self.name,
-                        required=required_props))
-
-    def _validate_field(self, template):
-        if not isinstance(template, dict):
-            ValidationIssueCollector.appendException(
-                MissingRequiredFieldError(
-                    what='Template "%s"' % self.name, required=self.TYPE))
-        try:
-            relationship = template.get('relationship')
-            if relationship and not isinstance(relationship, str):
-                relationship[self.TYPE]
-            elif isinstance(relationship, str):
-                template['relationship']
-            else:
-                template[self.TYPE]
-        except KeyError:
-            ValidationIssueCollector.appendException(
-                MissingRequiredFieldError(
-                    what='Template "%s"' % self.name, required=self.TYPE))
-
-    def _common_validate_field(self, schema, allowedlist, section):
-        for name in schema:
-            if name not in allowedlist:
-                ValidationIssueCollector.appendException(
-                    UnknownFieldError(
-                        what=('"%(section)s" of template "%(nodename)s"'
-                              % {'section': section, 'nodename': self.name}),
-                        field=name))
-
-    def _create_properties(self):
-        props = []
-        properties = self.type_definition.get_value(self.PROPERTIES,
-                                                    self.entity_tpl) or {}
-        for name, value in properties.items():
-            props_def = self.type_definition.get_properties_def()
-            if props_def and name in props_def:
-                prop = Property(name, value,
-                                props_def[name].schema, self.custom_def)
-                props.append(prop)
-        for p in self.type_definition.get_properties_def_objects():
-            if p.default is not None and p.name not in properties.keys():
-                prop = Property(p.name, p.default, p.schema, self.custom_def)
-                props.append(prop)
-        return props
-
-    def _create_interfaces(self):
-        interfaces = []
-        type_interfaces = None
-        if isinstance(self.type_definition, RelationshipType):
-            if isinstance(self.entity_tpl, dict):
-                if self.INTERFACES in self.entity_tpl:
-                    type_interfaces = self.entity_tpl[self.INTERFACES]
-                else:
-                    for rel_def, value in self.entity_tpl.items():
-                        if rel_def != 'type':
-                            rel_def = self.entity_tpl.get(rel_def)
-                            rel = None
-                            if isinstance(rel_def, dict):
-                                rel = rel_def.get('relationship')
-                            if rel:
-                                if self.INTERFACES in rel:
-                                    type_interfaces = rel[self.INTERFACES]
-                                    break
-        else:
-            type_interfaces = self.type_definition.get_value(self.INTERFACES,
-                                                             self.entity_tpl)
-        if type_interfaces:
-            for interface_type, value in type_interfaces.items():
-                for op, op_def in value.items():
-                    iface = InterfacesDef(self.type_definition,
-                                          interfacetype=interface_type,
-                                          node_template=self,
-                                          name=op,
-                                          value=op_def)
-                    interfaces.append(iface)
-        return interfaces
-
-    def get_capability(self, name):
-        """Provide named capability
-
-        :param name: name of capability
-        :return: capability object if found, None otherwise
-        """
-        caps = self.get_capabilities()
-        if caps and name in caps.keys():
-            return caps[name]
-*/