Repository: incubator-ariatosca Updated Branches: refs/heads/ARIA-139-attributes [created] 3d3a446fc
Parse and store attributes Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/3d3a446f Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/3d3a446f Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/3d3a446f Branch: refs/heads/ARIA-139-attributes Commit: 3d3a446fc47650576e84576584249022eee02497 Parents: 3dadc9f Author: Tal Liron <[email protected]> Authored: Wed Apr 12 17:23:48 2017 -0500 Committer: Tal Liron <[email protected]> Committed: Wed Apr 12 17:23:48 2017 -0500 ---------------------------------------------------------------------- aria/modeling/service_common.py | 6 +++++- aria/modeling/service_instance.py | 8 ++++++++ aria/modeling/service_template.py | 16 ++++++++++++++++ .../simple_v1_0/modeling/__init__.py | 2 ++ .../simple_v1_0/modeling/properties.py | 17 ++++++++++------- .../aria_extension_tosca/simple_v1_0/templates.py | 7 ++++++- 6 files changed, 47 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3d3a446f/aria/modeling/service_common.py ---------------------------------------------------------------------- diff --git a/aria/modeling/service_common.py b/aria/modeling/service_common.py index 48c3170..ebbbe71 100644 --- a/aria/modeling/service_common.py +++ b/aria/modeling/service_common.py @@ -100,8 +100,12 @@ class ParameterBase(TemplateModelMixin): """ from . import models + if isinstance(value, basestring): + type_name = 'string' + else: + type_name = formatting.full_type_name(value) return models.Parameter(name=name, - type_name=formatting.full_type_name(value), + type_name=type_name, value=value, description=description) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3d3a446f/aria/modeling/service_instance.py ---------------------------------------------------------------------- diff --git a/aria/modeling/service_instance.py b/aria/modeling/service_instance.py index d15aa7e..283e466 100644 --- a/aria/modeling/service_instance.py +++ b/aria/modeling/service_instance.py @@ -511,6 +511,10 @@ class NodeBase(InstanceModelMixin): def properties(cls): return relationship.many_to_many(cls, 'parameter', prefix='properties', dict_key='name') + @declared_attr + def attributes(cls): + return relationship.many_to_many(cls, 'parameter', prefix='attributes', dict_key='name') + # endregion description = Column(Text) @@ -625,6 +629,7 @@ class NodeBase(InstanceModelMixin): ('name', self.name), ('type_name', self.type.name), ('properties', formatting.as_raw_dict(self.properties)), + ('attributes', formatting.as_raw_dict(self.properties)), ('interfaces', formatting.as_raw_list(self.interfaces)), ('artifacts', formatting.as_raw_list(self.artifacts)), ('capabilities', formatting.as_raw_list(self.capabilities)), @@ -643,6 +648,7 @@ class NodeBase(InstanceModelMixin): # TODO: validate that node template is of type? utils.validate_dict_values(self.properties) + utils.validate_dict_values(self.attributes) utils.validate_dict_values(self.interfaces) utils.validate_dict_values(self.artifacts) utils.validate_dict_values(self.capabilities) @@ -650,6 +656,7 @@ class NodeBase(InstanceModelMixin): def coerce_values(self, container, report_issues): utils.coerce_dict_values(self, self.properties, report_issues) + utils.coerce_dict_values(self, self.attributes, report_issues) utils.coerce_dict_values(self, self.interfaces, report_issues) utils.coerce_dict_values(self, self.artifacts, report_issues) utils.coerce_dict_values(self, self.capabilities, report_issues) @@ -662,6 +669,7 @@ class NodeBase(InstanceModelMixin): console.puts('Type: {0}'.format(context.style.type(self.type.name))) console.puts('Template: {0}'.format(context.style.node(self.node_template.name))) utils.dump_dict_values(self.properties, 'Properties') + utils.dump_dict_values(self.attributes, 'Attributes') utils.dump_interfaces(self.interfaces) utils.dump_dict_values(self.artifacts, 'Artifacts') utils.dump_dict_values(self.capabilities, 'Capabilities') http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3d3a446f/aria/modeling/service_template.py ---------------------------------------------------------------------- diff --git a/aria/modeling/service_template.py b/aria/modeling/service_template.py index 8355521..f8f155e 100644 --- a/aria/modeling/service_template.py +++ b/aria/modeling/service_template.py @@ -495,6 +495,10 @@ class NodeTemplateBase(TemplateModelMixin): return relationship.many_to_many(cls, 'parameter', prefix='properties', dict_key='name') @declared_attr + def attributes(cls): + return relationship.many_to_many(cls, 'parameter', prefix='attributes', dict_key='name') + + @declared_attr def interface_templates(cls): return relationship.one_to_many(cls, 'interface_template', dict_key='name') @@ -535,6 +539,7 @@ class NodeTemplateBase(TemplateModelMixin): ('min_instances', self.min_instances), ('max_instances', self.max_instances), ('properties', formatting.as_raw_dict(self.properties)), + ('attributes', formatting.as_raw_dict(self.properties)), ('interface_templates', formatting.as_raw_list(self.interface_templates)), ('artifact_templates', formatting.as_raw_list(self.artifact_templates)), ('capability_templates', formatting.as_raw_list(self.capability_templates)), @@ -550,13 +555,22 @@ class NodeTemplateBase(TemplateModelMixin): state=models.Node.INITIAL, node_template=self) utils.instantiate_dict(node, node.properties, self.properties) + utils.instantiate_dict(node, node.attributes, self.attributes) utils.instantiate_dict(node, node.interfaces, self.interface_templates) utils.instantiate_dict(node, node.artifacts, self.artifact_templates) utils.instantiate_dict(node, node.capabilities, self.capability_templates) + + # Default attributes + if 'tosca_name' in node.attributes: + node.attributes['tosca_name'].value = self.name + if 'tosca_id' in node.attributes: + node.attributes['tosca_id'].value = name + return node def validate(self): utils.validate_dict_values(self.properties) + utils.validate_dict_values(self.attributes) utils.validate_dict_values(self.interface_templates) utils.validate_dict_values(self.artifact_templates) utils.validate_dict_values(self.capability_templates) @@ -564,6 +578,7 @@ class NodeTemplateBase(TemplateModelMixin): def coerce_values(self, container, report_issues): utils.coerce_dict_values(self, self.properties, report_issues) + utils.coerce_dict_values(self, self.attributes, report_issues) utils.coerce_dict_values(self, self.interface_templates, report_issues) utils.coerce_dict_values(self, self.artifact_templates, report_issues) utils.coerce_dict_values(self, self.capability_templates, report_issues) @@ -583,6 +598,7 @@ class NodeTemplateBase(TemplateModelMixin): if self.max_instances is not None else ' or more')) utils.dump_dict_values(self.properties, 'Properties') + utils.dump_dict_values(self.attributes, 'Attributes') utils.dump_interfaces(self.interface_templates) utils.dump_dict_values(self.artifact_templates, 'Artifact templates') utils.dump_dict_values(self.capability_templates, 'Capability templates') http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3d3a446f/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py index 267f6de..e930f36 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py @@ -156,6 +156,8 @@ def create_node_template_model(context, service_template, node_template): create_parameter_models_from_values(model.properties, node_template._get_property_values(context)) + create_parameter_models_from_values(model.attributes, + node_template._get_attribute_default_values(context)) create_interface_template_models(context, service_template, model.interface_templates, node_template._get_interfaces(context)) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3d3a446f/extensions/aria_extension_tosca/simple_v1_0/modeling/properties.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/properties.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/properties.py index f61cb99..9c3ea42 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/properties.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/properties.py @@ -58,7 +58,8 @@ def get_inherited_property_definitions(context, presentation, field_name, for_pr # NodeTemplate, RelationshipTemplate, GroupTemplate, PolicyTemplate # -def get_assigned_and_defined_property_values(context, presentation): +def get_assigned_and_defined_property_values(context, presentation, field_name='property', + field_name_plural='properties'): """ Returns the assigned property values while making sure they are defined in our type. @@ -70,8 +71,9 @@ def get_assigned_and_defined_property_values(context, presentation): values = OrderedDict() the_type = presentation._get_type(context) - assignments = presentation.properties - definitions = the_type._get_properties(context) if the_type is not None else None + assignments = getattr(presentation, field_name_plural) + get_fn_name = '_get_{0}'.format(field_name_plural) + definitions = getattr(the_type, get_fn_name)(context) if the_type is not None else None # Fill in our assignments, but make sure they are defined if assignments: @@ -80,14 +82,14 @@ def get_assigned_and_defined_property_values(context, presentation): definition = definitions[name] values[name] = coerce_property_value(context, value, definition, value.value) else: - context.validation.report('assignment to undefined property "%s" in "%s"' - % (name, presentation._fullname), + context.validation.report('assignment to undefined {0} "{1}" in "{2}"' + .format(field_name, name, presentation._fullname), locator=value._locator, level=Issue.BETWEEN_TYPES) # Fill in defaults from the definitions if definitions: for name, definition in definitions.iteritems(): - if (values.get(name) is None) and (definition.default is not None): + if values.get(name) is None: values[name] = coerce_property_value(context, presentation, definition, definition.default) @@ -181,7 +183,8 @@ def merge_property_definitions(context, presentation, property_definitions, def coerce_property_value(context, presentation, definition, value, aspect=None): the_type = definition._get_type(context) if definition is not None else None entry_schema = definition.entry_schema if definition is not None else None - constraints = definition._get_constraints(context) if definition is not None else None + constraints = definition._get_constraints(context) \ + if ((definition is not None) and hasattr(definition, '_get_constraints')) else None value = coerce_value(context, presentation, the_type, entry_schema, constraints, value, aspect) if (the_type is not None) and hasattr(the_type, '_name'): type_name = the_type._name http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/3d3a446f/extensions/aria_extension_tosca/simple_v1_0/templates.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/templates.py b/extensions/aria_extension_tosca/simple_v1_0/templates.py index 6860b72..c0f9f23 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/templates.py +++ b/extensions/aria_extension_tosca/simple_v1_0/templates.py @@ -26,7 +26,7 @@ from .assignments import (PropertyAssignment, AttributeAssignment, RequirementAs from .definitions import ParameterDefinition from .filters import NodeFilter from .misc import (Description, MetaData, Repository, Import, SubstitutionMappings) -from .modeling.properties import get_assigned_and_defined_property_values, get_parameter_values +from .modeling.properties import (get_assigned_and_defined_property_values, get_parameter_values) from .modeling.interfaces import get_template_interfaces from .modeling.requirements import get_template_requirements from .modeling.capabilities import get_template_capabilities @@ -160,6 +160,11 @@ class NodeTemplate(ExtensiblePresentation): return FrozenDict(get_assigned_and_defined_property_values(context, self)) @cachedmethod + def _get_attribute_default_values(self, context): + return FrozenDict(get_assigned_and_defined_property_values(context, self, + 'attribute', 'attributes')) + + @cachedmethod def _get_requirements(self, context): return FrozenList(get_template_requirements(context, self))
