Beispiel #1
0
    def relationship(self):
        '''Return a dictionary of relationships to other node types.

        This method returns a dictionary of named relationships that nodes
        of the current node type (self) can have to other nodes (of specific
        types) in a TOSCA template.

        '''
        relationship = {}
        requires = self.get_all_requirements()
        if requires:
            # NOTE(sdmonov): Check if requires is a dict.
            # If it is a dict convert it to a list of dicts.
            # This is needed because currently the code below supports only
            # lists as requirements definition. The following check will
            # make sure if a map (dict) was provided it will be converted to
            # a list before proceeding to the parsing.
            if isinstance(requires, dict):
                requires = [{key: value} for key, value in requires.items()]

            keyword = None
            node_type = None
            for req in requires:
                #get all keys in requirement
                if 'relationship' in req:
                    keys = req.keys()
                    for k in keys:
                        if k not in self.SECTIONS:
                            relation = req.get('relationship')
                            node_type = req.get(k)
                            keyword = k
                            break
                else:
                    for key, value in req.items():
                        if key == 'type':
                            continue
                        if key == 'interfaces':
                            continue
                        else:
                            # If value is a dict and has a type key we need
                            # to lookup the node type using the capability type

                            if isinstance(value, dict) and \
                                    'type' in value:
                                captype = value['type']
                                value = \
                                    self._get_node_type_by_cap(key, captype)
                            relation = self._get_relation(key, value)
                            keyword = key
                            node_type = value
                rtype = RelationshipType(relation, keyword, req)
                relatednode = NodeType(node_type, self.custom_def)
                relationship[rtype] = relatednode
        return relationship
Beispiel #2
0
 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)
     if entity_name == 'node_type':
         self.type_definition = NodeType(self.entity_tpl['type'],
                                         custom_def)
     if entity_name == 'relationship_type':
         self.type_definition = RelationshipType(self.entity_tpl['type'],
                                                 None, custom_def)
     self._properties = None
     self._interfaces = None
     self._requirements = None
     self._capabilities = None
Beispiel #3
0
 def relationship(self):
     '''returns a dictionary containing relationship to a particular
      node type '''
     relationship = {}
     requirs = self.requirements
     if requirs is None:
         requirs = self._get_value(REQUIREMENTS, None, True)
     if requirs:
         for req in requirs:
             for x, y in req.iteritems():
                 relation = self._get_relation(x, y)
                 rtype = RelationshipType(relation, x)
                 relatednode = NodeType(y)
                 relationship[rtype] = relatednode
     return relationship
Beispiel #4
0
    def _get_explicit_relationship(self, req, value):
        """Handle explicit relationship

        For example,
        - req:
            node: DBMS
            relationship: tosca.relationships.HostedOn
        """
        explicit_relation = {}
        node = value.get('node')
        if node:
            #TODO(spzala) implement look up once Glance meta data is available
            #to find a matching TOSCA node using the TOSCA types
            msg = _('Lookup by TOSCA types are not supported. '
                    'Requirement for %s can not be full-filled.') % self.name
            if (node in list(self.type_definition.TOSCA_DEF.keys())
                    or node in self.custom_def):
                raise NotImplementedError(msg)
            related_tpl = NodeTemplate(node, self.templates, self.custom_def)
            relationship = value.get('relationship')
            if relationship:
                found_relationship_tpl = False
                #apply available relationship templates if found
                for tpl in self.available_rel_tpls:
                    if tpl.name == relationship:
                        rtype = RelationshipType(tpl.type)
                        explicit_relation[rtype] = related_tpl
                        self.relationship_tpl.append(tpl)
                        found_relationship_tpl = True
                #create relationship template object.
                if not found_relationship_tpl:
                    if isinstance(relationship, dict):
                        relationship = relationship.get('type')
                    for rtype in self.type_definition.relationship.keys():
                        if rtype.type == relationship:
                            explicit_relation[rtype] = related_tpl
                            related_tpl._add_relationship_template(
                                req, rtype.type)
        return explicit_relation