| from toscalib.templates.property_item import PropertyItem |
| from toscalib.templates.operation_item import OperationItem |
| from toscalib.types.property import PropertyDefinition |
| from toscalib.templates.constant import * |
| import logging |
| |
| class InterfaceItem(object): |
| def __init__(self, definition, name = None, content = None): |
| if definition is not None: |
| self.name = definition.name |
| self.type = definition.type |
| self.definition = definition |
| self.inputs = {} |
| self.operations = {} |
| self.parent_node = None |
| for prop in definition.inputs.keys(): |
| self.inputs[prop] = PropertyItem(definition.inputs[prop]) |
| for oper in definition.operations.keys(): |
| self.operations[oper] = OperationItem(definition.operations[oper]) |
| else: |
| self.name = name |
| self.type = None |
| self.definition = None |
| self.inputs = {} |
| self.operations = {} |
| self.parent_node = None |
| |
| self._parse_pre_defined_content(content) |
| |
| def _parse_pre_defined_content(self, content): |
| if content is None: |
| return |
| |
| for key_name in content.keys(): |
| if key_name == 'type': |
| if self.type is not None and self.type != content[key_name]: |
| logging.warning( 'interface: '+ self.name+ 'type is different in definition: '+ self.type+ ' overwritten here to '+ self.raw_content[key_name]) |
| self.type = content[key_name] |
| continue |
| if key_name == 'inputs': |
| input_sec = content['inputs'] |
| for input_item in input_sec.keys(): |
| self.inputs[input_item] = PropertyItem(PropertyDefinition(input_item)) |
| self.inputs[input_item]._assign(input_sec[input_item]) |
| continue |
| |
| # if self.operations.has_key(key_name): |
| if key_name in self.operations: |
| self.operations[key_name]._parse_pre_defined_content(content[key_name]) |
| else: |
| self.operations[key_name] = OperationItem(None, key_name, content[key_name]) |
| |
| def _update_parent_node(self, parent): |
| self.parent_node = parent |
| for prop in iter(self.inputs.values()): |
| prop._update_parent_node(parent) |
| for ops in iter(self.operations.values()): |
| ops._update_parent_node(parent) |
| |
| def _prepare_output(self, tags=''): |
| output = {} |
| if 'cloudify' not in tags: |
| if self.type is not None: |
| output[YMO_INT_TYPE] = self.type |
| if len(self.inputs) > 0: |
| inputs = {} |
| for prop_name in self.inputs.keys(): |
| prop_item = self.inputs[prop_name] |
| if prop_item.value is None: |
| prop_value = None |
| else: |
| prop_value = prop_item.value._get_value(tags)[0] |
| inputs[prop_name] = prop_value |
| output[YMO_INT_INPUTS] = inputs |
| if len(self.operations) > 0: |
| for op_name in self.operations.keys(): |
| output[op_name] = self.operations[op_name]._prepare_output(tags) |
| |
| return output |
| |