ARIA-149 Enhance operation configuration
Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/88587f82 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/88587f82 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/88587f82 Branch: refs/heads/ARIA-149-functions-in-operation-configuration Commit: 88587f8280df12fb228cbed524ce95e652ba2441 Parents: 13bcb0e Author: Tal Liron <[email protected]> Authored: Wed Apr 19 20:07:33 2017 -0500 Committer: Tal Liron <[email protected]> Committed: Thu May 18 13:18:27 2017 -0500 ---------------------------------------------------------------------- aria/modeling/contraints.py | 18 ++ aria/modeling/service_common.py | 6 + aria/modeling/service_instance.py | 7 +- aria/modeling/service_template.py | 2 +- .../execution_plugin/instantiation.py | 20 +- .../simple_v1_0/assignments.py | 4 +- .../simple_v1_0/modeling/__init__.py | 14 ++ .../simple_v1_0/modeling/artifacts.py | 2 +- .../simple_v1_0/modeling/capabilities.py | 22 +- .../simple_v1_0/modeling/data_types.py | 16 ++ .../simple_v1_0/modeling/interfaces.py | 30 ++- .../simple_v1_0/modeling/parameters.py | 211 +++++++++++++++++++ .../simple_v1_0/modeling/policies.py | 2 + .../simple_v1_0/modeling/properties.py | 202 ------------------ .../simple_v1_0/modeling/requirements.py | 18 +- .../modeling/substitution_mappings.py | 4 + .../simple_v1_0/templates.py | 14 +- .../aria_extension_tosca/simple_v1_0/types.py | 24 +-- .../node-cellar/node-cellar.yaml | 20 +- 19 files changed, 374 insertions(+), 262 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/aria/modeling/contraints.py ---------------------------------------------------------------------- diff --git a/aria/modeling/contraints.py b/aria/modeling/contraints.py index 107b010..4f53fac 100644 --- a/aria/modeling/contraints.py +++ b/aria/modeling/contraints.py @@ -26,3 +26,21 @@ class NodeTemplateConstraint(object): Returns true is the target matches the constraint for the source. """ raise NotImplementedError +<<<<<<< HEAD +======= + + +class NodeTemplateContainerHolder(object): + """ + Wrapper that allows using a :class:`aria.modeling.models.NodeTemplate` model directly as the + ``container_holder`` argument for :func:`evaluate`. + """ + + def __init__(self, node_template): + self.container = node_template + self.service = None + + @property + def service_template(self): + return self.container.service_template +>>>>>>> ARIA-139 Support attributes http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/aria/modeling/service_common.py ---------------------------------------------------------------------- diff --git a/aria/modeling/service_common.py b/aria/modeling/service_common.py index e9c96a4..8504451 100644 --- a/aria/modeling/service_common.py +++ b/aria/modeling/service_common.py @@ -15,6 +15,8 @@ # pylint: disable=no-self-argument, no-member, abstract-method +import datetime + from sqlalchemy import ( Column, Text, @@ -211,6 +213,10 @@ class ParameterBase(TemplateModelMixin, caching.HasCachedMethods): """ Wraps an arbitrary value as a parameter. The type will be guessed via introspection. + For primitive types, we will prefer their TOSCA aliases. See the `TOSCA Simple Profile v1.0 + cos01 specification <http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01 + /TOSCA-Simple-Profile-YAML-v1.0-cos01.html#_Toc373867862>`__ + :param name: Parameter name :type name: basestring :param value: Parameter value http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/aria/modeling/service_instance.py ---------------------------------------------------------------------- diff --git a/aria/modeling/service_instance.py b/aria/modeling/service_instance.py index 41a388d..633023a 100644 --- a/aria/modeling/service_instance.py +++ b/aria/modeling/service_instance.py @@ -20,7 +20,8 @@ from sqlalchemy import ( Text, Integer, Enum, - Boolean + Boolean, + PickleType ) from sqlalchemy import DateTime from sqlalchemy.ext.associationproxy import association_proxy @@ -1733,7 +1734,7 @@ class OperationBase(InstanceModelMixin): description = Column(Text) relationship_edge = Column(Boolean) implementation = Column(Text) - configuration = Column(modeling_types.StrictDict(key_cls=basestring)) + configuration = Column(PickleType) dependencies = Column(modeling_types.StrictList(item_cls=basestring)) executor = Column(Text) max_attempts = Column(Integer) @@ -1756,6 +1757,8 @@ class OperationBase(InstanceModelMixin): if arguments: for k, v in arguments.iteritems(): self.inputs[k] = models.Parameter.wrap(k, v) + # TEMP + self.inputs[k].coerce_values(True) @property def as_raw(self): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/aria/modeling/service_template.py ---------------------------------------------------------------------- diff --git a/aria/modeling/service_template.py b/aria/modeling/service_template.py index 1eb95a3..82860e8 100644 --- a/aria/modeling/service_template.py +++ b/aria/modeling/service_template.py @@ -1864,7 +1864,7 @@ class OperationTemplateBase(TemplateModelMixin): description = Column(Text) relationship_edge = Column(Boolean) implementation = Column(Text) - configuration = Column(modeling_types.StrictDict(key_cls=basestring)) + configuration = Column(PickleType) dependencies = Column(modeling_types.StrictList(item_cls=basestring)) executor = Column(Text) max_attempts = Column(Integer) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/aria/orchestrator/execution_plugin/instantiation.py ---------------------------------------------------------------------- diff --git a/aria/orchestrator/execution_plugin/instantiation.py b/aria/orchestrator/execution_plugin/instantiation.py index c09434e..96ddbe1 100644 --- a/aria/orchestrator/execution_plugin/instantiation.py +++ b/aria/orchestrator/execution_plugin/instantiation.py @@ -19,6 +19,7 @@ from ...utils.type import full_type_name from ...utils.collections import OrderedDict from ...parser import validation from ...parser.consumption import ConsumptionContext +from ...modeling.functions import Function def configure_operation(operation): @@ -50,6 +51,7 @@ def configure_operation(operation): return arguments + def _configure_local(operation): """ Local operation. @@ -110,7 +112,7 @@ def _get_process(value): _validate_type(value, dict, 'process') for k, v in value.iteritems(): if k == 'eval_python': - value[k] = _str_to_bool(v, 'process.eval_python') + value[k] = _coerce_bool(v, 'process.eval_python') elif k == 'cwd': _validate_type(v, basestring, 'process.cwd') elif k == 'command_prefix': @@ -132,11 +134,11 @@ def _get_ssh(value): _validate_type(value, dict, 'ssh') for k, v in value.iteritems(): if k == 'use_sudo': - value[k] = _str_to_bool(v, 'ssh.use_sudo') + value[k] = _coerce_bool(v, 'ssh.use_sudo') elif k == 'hide_output': value[k] = _dict_to_list(v, 'ssh.hide_output') elif k == 'warn_only': - value[k] = _str_to_bool(v, 'ssh.warn_only') + value[k] = _coerce_bool(v, 'ssh.warn_only') elif k == 'user': _validate_type(v, basestring, 'ssh.user') elif k == 'password': @@ -155,6 +157,8 @@ def _get_ssh(value): def _validate_type(value, the_type, name): + if isinstance(value, Function): + return if not isinstance(value, the_type): context = ConsumptionContext.get_thread_local() context.validation.report('"{0}" configuration is not a {1}' @@ -162,9 +166,11 @@ def _validate_type(value, the_type, name): level=validation.Issue.BETWEEN_TYPES) -def _str_to_bool(value, name): +def _coerce_bool(value, name): if value is None: return None + if isinstance(value, bool): + return value _validate_type(value, basestring, name) if value == 'true': return True @@ -182,10 +188,6 @@ def _dict_to_list(the_dict, name): value = [] for k in sorted(the_dict): v = the_dict[k] - if not isinstance(v, basestring): - context = ConsumptionContext.get_thread_local() - context.validation.report('"{0}.{1}" configuration is not a string: {2}' - .format(name, k, repr(v)), - level=validation.Issue.BETWEEN_TYPES) + _validate_type(v, basestring, '{0}.{1}'.format(name, k)) value.append(v) return value http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/extensions/aria_extension_tosca/simple_v1_0/assignments.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/assignments.py b/extensions/aria_extension_tosca/simple_v1_0/assignments.py index d929ce0..79f6377 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/assignments.py +++ b/extensions/aria_extension_tosca/simple_v1_0/assignments.py @@ -23,7 +23,7 @@ from aria.parser.presentation import (AsIsPresentation, has_fields, allow_unknow from .filters import NodeFilter from .misc import Description, OperationImplementation -from .modeling.properties import get_assigned_and_defined_property_values +from .modeling.parameters import get_assigned_and_defined_parameter_values from .presentation.extensible import ExtensiblePresentation from .presentation.field_validators import (node_template_or_type_validator, relationship_template_or_type_validator, @@ -428,7 +428,7 @@ class ArtifactAssignment(ExtensiblePresentation): @cachedmethod def _get_property_values(self, context): - return FrozenDict(get_assigned_and_defined_property_values(context, self)) + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'property')) @cachedmethod def _validate(self, context): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/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 99389e4..e53c706 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py @@ -26,6 +26,8 @@ import re from types import FunctionType from datetime import datetime +from ruamel import yaml + from aria.parser.validation import Issue from aria.utils.collections import StrictDict from aria.modeling.models import (Type, ServiceTemplate, NodeTemplate, @@ -34,6 +36,7 @@ from aria.modeling.models import (Type, ServiceTemplate, NodeTemplate, SubstitutionTemplateMapping, InterfaceTemplate, OperationTemplate, ArtifactTemplate, Metadata, Parameter, PluginSpecification) +from .parameters import coerce_parameter_value from .constraints import (Equal, GreaterThan, GreaterOrEqual, LessThan, LessOrEqual, InRange, ValidValues, Length, MinLength, MaxLength, Pattern) from ..data_types import coerce_value @@ -388,6 +391,17 @@ def create_operation_template_model(context, service_template, operation): for dependency in dependencies: key, value = split_prefix(dependency) if key is not None: + # Parse as YAML + try: + value = yaml.load(value) + except yaml.parser.MarkedYAMLError as e: + context.validation.report( + 'YAML parser {0} in operation configuration: {1}' + .format(e.problem, value), + locator=implementation._locator, + level=Issue.FIELD) + continue + value = coerce_parameter_value(context, implementation, None, value).value if model.configuration is None: model.configuration = {} set_nested(model.configuration, key.split('.'), value) http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/extensions/aria_extension_tosca/simple_v1_0/modeling/artifacts.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/artifacts.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/artifacts.py index 4f61ef5..dd9eeb4 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/artifacts.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/artifacts.py @@ -15,11 +15,11 @@ from aria.utils.collections import OrderedDict + # # NodeType, NodeTemplate # - def get_inherited_artifact_definitions(context, presentation, for_presentation=None): if hasattr(presentation, '_get_type'): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py index 6df7177..0d83d94 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py @@ -16,8 +16,9 @@ from aria.utils.collections import deepcopy_with_locators, OrderedDict from aria.parser.validation import Issue -from .properties import (convert_property_definitions_to_values, merge_raw_property_definitions, - get_assigned_and_defined_property_values) +from .parameters import (convert_parameter_definitions_to_values, merge_raw_parameter_definitions, + get_assigned_and_defined_parameter_values) + # # CapabilityType @@ -38,6 +39,7 @@ def get_inherited_valid_source_types(context, presentation): return valid_source_types + # # NodeType # @@ -92,6 +94,7 @@ def get_inherited_capability_definitions(context, presentation, for_presentation return capability_definitions + # # NodeTemplate # @@ -127,8 +130,9 @@ def get_template_capabilities(context, presentation): capability_assignment = capability_assignments[capability_name] # Assign properties - values = get_assigned_and_defined_property_values(context, - our_capability_assignment) + values = get_assigned_and_defined_parameter_values(context, + our_capability_assignment, + 'property') if values: capability_assignment._raw['properties'] = values else: @@ -139,6 +143,7 @@ def get_template_capabilities(context, presentation): return capability_assignments + # # Utils # @@ -150,24 +155,25 @@ def convert_capability_from_definition_to_assignment(context, presentation, cont properties = presentation.properties if properties is not None: - raw['properties'] = convert_property_definitions_to_values(context, properties) + raw['properties'] = convert_parameter_definitions_to_values(context, properties) # TODO attributes return CapabilityAssignment(name=presentation._name, raw=raw, container=container) + def merge_capability_definition_from_type(context, presentation, capability_definition): raw_properties = OrderedDict() # Merge properties from type the_type = capability_definition._get_type(context) type_property_defintions = the_type._get_properties(context) - merge_raw_property_definitions(context, presentation, raw_properties, type_property_defintions, + merge_raw_parameter_definitions(context, presentation, raw_properties, type_property_defintions, 'properties') # Merge our properties - merge_raw_property_definitions(context, presentation, raw_properties, - capability_definition.properties, 'properties') + merge_raw_parameter_definitions(context, presentation, raw_properties, + capability_definition.properties, 'properties') if raw_properties: capability_definition._raw['properties'] = raw_properties http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py index 3952785..c0d79e5 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/data_types.py @@ -26,6 +26,7 @@ from aria.parser.validation import Issue from .functions import get_function from ..presentation.types import get_type_by_full_or_shorthand_name + # # DataType # @@ -50,6 +51,7 @@ def get_inherited_constraints(context, presentation): return constraints + def coerce_data_type_value(context, presentation, data_type, entry_schema, constraints, value, # pylint: disable=unused-argument aspect): """ @@ -121,6 +123,7 @@ def coerce_data_type_value(context, presentation, data_type, entry_schema, const return value + def validate_data_type_name(context, presentation): """ Makes sure the complex data type's name is not that of a built-in type. @@ -132,6 +135,7 @@ def validate_data_type_name(context, presentation): % safe_repr(name), locator=presentation._locator, level=Issue.BETWEEN_TYPES) + # # PropertyDefinition, AttributeDefinition, EntrySchema, DataType # @@ -172,6 +176,7 @@ def get_data_type(context, presentation, field_name, allow_none=False): # Try primitive data type return get_primitive_data_type(type_name) + # # PropertyDefinition, EntrySchema # @@ -195,6 +200,7 @@ def get_property_constraints(context, presentation): return constraints + # # ConstraintClause # @@ -310,6 +316,7 @@ def apply_constraint_to_value(context, presentation, constraint_clause, value): return True + # # Repository # @@ -326,6 +333,7 @@ def get_data_type_value(context, presentation, field_name, type_name): locator=presentation._locator, level=Issue.BETWEEN_TYPES) return None + # # Utils # @@ -345,6 +353,7 @@ PRIMITIVE_DATA_TYPES = { 'boolean': bool, 'null': None.__class__} + @implements_specification('3.2.1-3', 'tosca-simple-1.0') def get_primitive_data_type(type_name): """ @@ -358,6 +367,7 @@ def get_primitive_data_type(type_name): return PRIMITIVE_DATA_TYPES.get(type_name) + def get_data_type_name(the_type): """ Returns the name of the type, whether it's a DataType, a primitive type, or another class. @@ -365,6 +375,7 @@ def get_data_type_name(the_type): return the_type._name if hasattr(the_type, '_name') else full_type_name(the_type) + def coerce_value(context, presentation, the_type, entry_schema, constraints, value, aspect=None): # pylint: disable=too-many-return-statements """ Returns the value after it's coerced to its type, reporting validation errors if it cannot be @@ -410,6 +421,7 @@ def coerce_value(context, presentation, the_type, entry_schema, constraints, val # Coerce to primitive type return coerce_to_primitive(context, presentation, the_type, constraints, value, aspect) + def coerce_to_primitive(context, presentation, primitive_type, constraints, value, aspect=None): """ Returns the value after it's coerced to a primitive type, translating exceptions to validation @@ -435,6 +447,7 @@ def coerce_to_primitive(context, presentation, primitive_type, constraints, valu return value + def coerce_to_data_type_class(context, presentation, cls, entry_schema, constraints, value, aspect=None): """ @@ -463,6 +476,7 @@ def coerce_to_data_type_class(context, presentation, cls, entry_schema, constrai return value + def apply_constraints_to_value(context, presentation, constraints, value): """ Applies all constraints to the value. If the value conforms, returns the value. If it does not @@ -478,6 +492,7 @@ def apply_constraints_to_value(context, presentation, constraints, value): value = None return value + def get_container_data_type(presentation): if presentation is None: return None @@ -485,6 +500,7 @@ def get_container_data_type(presentation): return presentation return get_container_data_type(presentation._container) + def report_issue_for_bad_format(context, presentation, the_type, value, aspect, e): if aspect == 'default': aspect = '"default" value' http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/extensions/aria_extension_tosca/simple_v1_0/modeling/interfaces.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/interfaces.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/interfaces.py index 3e6aa6f..abf2c64 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/interfaces.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/interfaces.py @@ -13,11 +13,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -from aria.utils.collections import merge, deepcopy_with_locators, OrderedDict +from aria.utils.collections import (merge, deepcopy_with_locators, OrderedDict) from aria.parser.presentation import get_locator from aria.parser.validation import Issue -from .properties import (coerce_property_value, convert_property_definitions_to_values) +from .parameters import (coerce_parameter_value, convert_parameter_definitions_to_values) + # # InterfaceType @@ -45,6 +46,7 @@ def get_inherited_operations(context, presentation): return operations + # # InterfaceDefinition # @@ -73,6 +75,7 @@ def get_and_override_input_definitions_from_type(context, presentation): return inputs + def get_and_override_operation_definitions_from_type(context, presentation): """ Returns our operation definitions added on top of those of the interface type, if specified. @@ -96,6 +99,7 @@ def get_and_override_operation_definitions_from_type(context, presentation): return operations + # # NodeType, RelationshipType, GroupType # @@ -124,6 +128,7 @@ def get_inherited_interface_definitions(context, presentation, type_name, for_pr return interfaces + # # NodeTemplate, RelationshipTemplate, GroupTemplate # @@ -186,6 +191,7 @@ def get_template_interfaces(context, presentation, type_name): return template_interfaces + # # Utils # @@ -200,13 +206,14 @@ def convert_interface_definition_from_type_to_template(context, presentation, co raw = convert_interface_definition_from_type_to_raw_template(context, presentation) return InterfaceAssignment(name=presentation._name, raw=raw, container=container) + def convert_interface_definition_from_type_to_raw_template(context, presentation): # pylint: disable=invalid-name raw = OrderedDict() # Copy default values for inputs inputs = presentation._get_inputs(context) if inputs is not None: - raw['inputs'] = convert_property_definitions_to_values(context, inputs) + raw['inputs'] = convert_parameter_definitions_to_values(context, inputs) # Copy operations operations = presentation._get_operations(context) @@ -221,11 +228,12 @@ def convert_interface_definition_from_type_to_raw_template(context, presentation raw[operation_name]['implementation'] = deepcopy_with_locators(implementation._raw) inputs = operation.inputs if inputs is not None: - raw[operation_name]['inputs'] = convert_property_definitions_to_values(context, + raw[operation_name]['inputs'] = convert_parameter_definitions_to_values(context, inputs) return raw + def convert_requirement_interface_definitions_from_type_to_raw_template(context, raw_requirement, # pylint: disable=invalid-name interface_definitions): if not interface_definitions: @@ -240,6 +248,7 @@ def convert_requirement_interface_definitions_from_type_to_raw_template(context, else: raw_requirement['interfaces'][interface_name] = raw_interface + def merge_interface(context, presentation, interface_assignment, our_interface_assignment, interface_definition, interface_name): # Assign/merge interface inputs @@ -282,6 +291,7 @@ def merge_interface(context, presentation, interface_assignment, our_interface_a our_input_assignments, input_definitions, interface_name, operation_name, presentation) + def merge_raw_input_definition(context, the_raw_input, our_input, interface_name, operation_name, presentation, type_name): # Check if we changed the type @@ -305,6 +315,7 @@ def merge_raw_input_definition(context, the_raw_input, our_input, interface_name # Merge merge(the_raw_input, our_input._raw) + def merge_input_definitions(context, inputs, our_inputs, interface_name, operation_name, presentation, type_name): for input_name, our_input in our_inputs.iteritems(): @@ -314,6 +325,7 @@ def merge_input_definitions(context, inputs, our_inputs, interface_name, operati else: inputs[input_name] = our_input._clone(presentation) + def merge_raw_input_definitions(context, raw_inputs, our_inputs, interface_name, operation_name, presentation, type_name): for input_name, our_input in our_inputs.iteritems(): @@ -323,6 +335,7 @@ def merge_raw_input_definitions(context, raw_inputs, our_inputs, interface_name, else: raw_inputs[input_name] = deepcopy_with_locators(our_input._raw) + def merge_raw_operation_definition(context, raw_operation, our_operation, interface_name, presentation, type_name): if not isinstance(our_operation._raw, dict): @@ -353,6 +366,7 @@ def merge_raw_operation_definition(context, raw_operation, our_operation, interf raw_operation['implementation'] = \ deepcopy_with_locators(our_operation._raw['implementation']) + def merge_operation_definitions(context, operations, our_operations, interface_name, presentation, type_name): if not our_operations: @@ -364,6 +378,7 @@ def merge_operation_definitions(context, operations, our_operations, interface_n else: operations[operation_name] = our_operation._clone(presentation) + def merge_raw_operation_definitions(context, raw_operations, our_operations, interface_name, presentation, type_name): for operation_name, our_operation in our_operations.iteritems(): @@ -378,6 +393,7 @@ def merge_raw_operation_definitions(context, raw_operations, our_operations, int else: raw_operations[operation_name] = deepcopy_with_locators(our_operation._raw) + # From either an InterfaceType or an InterfaceDefinition: def merge_interface_definition(context, interface, our_source, presentation, type_name): if hasattr(our_source, 'type'): @@ -408,6 +424,7 @@ def merge_interface_definition(context, interface, our_source, presentation, typ merge_raw_operation_definitions(context, interface._raw, our_operations, our_source._name, presentation, type_name) + def merge_interface_definitions(context, interfaces, our_interfaces, presentation, for_presentation=None): if not our_interfaces: @@ -419,12 +436,14 @@ def merge_interface_definitions(context, interfaces, our_interfaces, presentatio else: interfaces[name] = our_interface._clone(for_presentation) + def merge_interface_definitions_from_their_types(context, interfaces, presentation): for interface in interfaces.itervalues(): the_type = interface._get_type(context) # InterfaceType if the_type is not None: merge_interface_definition(context, interface, the_type, presentation, 'type') + def assign_raw_inputs(context, values, assignments, definitions, interface_name, operation_name, presentation): if not assignments: @@ -454,9 +473,10 @@ def assign_raw_inputs(context, values, assignments, definitions, interface_name, # Note: default value has already been assigned # Coerce value - values['inputs'][input_name] = coerce_property_value(context, assignment, definition, + values['inputs'][input_name] = coerce_parameter_value(context, assignment, definition, assignment.value) + def validate_required_inputs(context, presentation, assignment, definition, original_assignment, interface_name, operation_name=None): input_definitions = definition.inputs http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/extensions/aria_extension_tosca/simple_v1_0/modeling/parameters.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/parameters.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/parameters.py new file mode 100644 index 0000000..52d074c --- /dev/null +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/parameters.py @@ -0,0 +1,211 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from aria.utils.collections import (merge, deepcopy_with_locators, OrderedDict) +from aria.utils.formatting import pluralize +from aria.parser.presentation import Value +from aria.parser.validation import Issue + +from .data_types import coerce_value + + +# +# ArtifactType, DataType, CapabilityType, RelationshipType, NodeType, GroupType, PolicyType +# + +def get_inherited_parameter_definitions(context, presentation, field_name, for_presentation=None): + """ + Returns our parameter definitions added on top of those of our parent, if we have one + (recursively). + + Allows overriding all aspects of parent properties except data type. + """ + + # Get definitions from parent + # If we inherit from a primitive, it does not have a parent: + parent = presentation._get_parent(context) if hasattr(presentation, '_get_parent') else None + definitions = get_inherited_parameter_definitions(context, parent, field_name, + for_presentation=presentation) \ + if parent is not None else OrderedDict() + + # Add/merge our definitions + # If we inherit from a primitive, it does not have our field + our_definitions = getattr(presentation, field_name, None) + if our_definitions: + our_definitions_clone = OrderedDict() + for name, our_definition in our_definitions.iteritems(): + our_definitions_clone[name] = our_definition._clone(for_presentation) + our_definitions = our_definitions_clone + merge_parameter_definitions(context, presentation, definitions, our_definitions, field_name) + + for definition in definitions.itervalues(): + definition._reset_method_cache() + + return definitions + + +# +# NodeTemplate, RelationshipTemplate, GroupTemplate, PolicyTemplate +# + +def get_assigned_and_defined_parameter_values(context, presentation, field_name): + """ + Returns the assigned property values while making sure they are defined in our type. + + The property definition's default value, if available, will be used if we did not assign it. + + Makes sure that required properties indeed end up with a value. + """ + + values = OrderedDict() + + the_type = presentation._get_type(context) + field_name_plural = pluralize(field_name) + 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: + for name, value in assignments.iteritems(): + if (definitions is not None) and (name in definitions): + definition = definitions[name] + values[name] = coerce_parameter_value(context, value, definition, value.value) + else: + 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: + values[name] = coerce_parameter_value(context, presentation, definition, + definition.default) + + validate_required_values(context, presentation, values, definitions) + + return values + + +# +# TopologyTemplate +# + +def get_parameter_values(context, presentation, field_name): + values = OrderedDict() + + parameters = getattr(presentation, field_name) + + # Fill in defaults and values + if parameters: + for name, parameter in parameters.iteritems(): + if values.get(name) is None: + if hasattr(parameter, 'value') and (parameter.value is not None): + # For parameters only: + values[name] = coerce_parameter_value(context, presentation, parameter, + parameter.value) + else: + default = parameter.default if hasattr(parameter, 'default') else None + values[name] = coerce_parameter_value(context, presentation, parameter, default) + + return values + + +# +# Utils +# + +def validate_required_values(context, presentation, values, definitions): + """ + Check if required properties have not been assigned. + """ + + if not definitions: + return + for name, definition in definitions.iteritems(): + if getattr(definition, 'required', False) \ + and ((values is None) or (values.get(name) is None)): + context.validation.report('required property "%s" is not assigned a value in "%s"' + % (name, presentation._fullname), + locator=presentation._get_child_locator('properties'), + level=Issue.BETWEEN_TYPES) + + +def merge_raw_parameter_definition(context, presentation, raw_property_definition, + our_property_definition, field_name, property_name): + # Check if we changed the type + # TODO: allow a sub-type? + type1 = raw_property_definition.get('type') + type2 = our_property_definition.type + if type1 != type2: + context.validation.report( + 'override changes type from "%s" to "%s" for property "%s" in "%s"' + % (type1, type2, property_name, presentation._fullname), + locator=presentation._get_child_locator(field_name, property_name), + level=Issue.BETWEEN_TYPES) + + merge(raw_property_definition, our_property_definition._raw) + + +def merge_raw_parameter_definitions(context, presentation, raw_property_definitions, + our_property_definitions, field_name): + if not our_property_definitions: + return + for property_name, our_property_definition in our_property_definitions.iteritems(): + if property_name in raw_property_definitions: + raw_property_definition = raw_property_definitions[property_name] + merge_raw_parameter_definition(context, presentation, raw_property_definition, + our_property_definition, field_name, property_name) + else: + raw_property_definitions[property_name] = \ + deepcopy_with_locators(our_property_definition._raw) + + +def merge_parameter_definitions(context, presentation, property_definitions, + our_property_definitions, field_name): + if not our_property_definitions: + return + for property_name, our_property_definition in our_property_definitions.iteritems(): + if property_name in property_definitions: + property_definition = property_definitions[property_name] + merge_raw_parameter_definition(context, presentation, property_definition._raw, + our_property_definition, field_name, property_name) + else: + property_definitions[property_name] = our_property_definition + + +# Works on properties, inputs, and parameters +def coerce_parameter_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) 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 + else: + type_name = getattr(definition, 'type', None) + description = getattr(definition, 'description', None) + description = description.value if description is not None else None + return Value(type_name, value, description) + + +def convert_parameter_definitions_to_values(context, definitions): + values = OrderedDict() + for name, definition in definitions.iteritems(): + default = definition.default + values[name] = coerce_parameter_value(context, definition, definition, default) + return values http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/extensions/aria_extension_tosca/simple_v1_0/modeling/policies.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/policies.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/policies.py index fba1972..7dd803b 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/policies.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/policies.py @@ -15,6 +15,7 @@ from ..presentation.types import convert_shorthand_to_full_type_name + # # PolicyType # @@ -49,6 +50,7 @@ def get_inherited_targets(context, presentation): return node_types, group_types + # # PolicyTemplate # http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/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 deleted file mode 100644 index 9c3ea42..0000000 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/properties.py +++ /dev/null @@ -1,202 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from aria.utils.collections import merge, deepcopy_with_locators, OrderedDict -from aria.parser.presentation import Value -from aria.parser.validation import Issue - -from .data_types import coerce_value - -# -# ArtifactType, DataType, CapabilityType, RelationshipType, NodeType, GroupType, PolicyType -# - -# Works on properties, parameters, inputs, and attributes -def get_inherited_property_definitions(context, presentation, field_name, for_presentation=None): - """ - Returns our property definitions added on top of those of our parent, if we have one - (recursively). - - Allows overriding all aspects of parent properties except data type. - """ - - # Get definitions from parent - # If we inherit from a primitive, it does not have a parent: - parent = presentation._get_parent(context) if hasattr(presentation, '_get_parent') else None - definitions = get_inherited_property_definitions(context, parent, field_name, - for_presentation=presentation) \ - if parent is not None else OrderedDict() - - # Add/merge our definitions - # If we inherit from a primitive, it does not have our field - our_definitions = getattr(presentation, field_name, None) - if our_definitions: - our_definitions_clone = OrderedDict() - for name, our_definition in our_definitions.iteritems(): - our_definitions_clone[name] = our_definition._clone(for_presentation) - our_definitions = our_definitions_clone - merge_property_definitions(context, presentation, definitions, our_definitions, field_name) - - for definition in definitions.itervalues(): - definition._reset_method_cache() - - return definitions - -# -# NodeTemplate, RelationshipTemplate, GroupTemplate, PolicyTemplate -# - -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. - - The property definition's default value, if available, will be used if we did not assign it. - - Makes sure that required properties indeed end up with a value. - """ - - values = OrderedDict() - - the_type = presentation._get_type(context) - 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: - for name, value in assignments.iteritems(): - if (definitions is not None) and (name in definitions): - definition = definitions[name] - values[name] = coerce_property_value(context, value, definition, value.value) - else: - 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: - values[name] = coerce_property_value(context, presentation, definition, - definition.default) - - validate_required_values(context, presentation, values, definitions) - - return values - -# -# TopologyTemplate -# - -def get_parameter_values(context, presentation, field_name): - values = OrderedDict() - - parameters = getattr(presentation, field_name) - - # Fill in defaults and values - if parameters: - for name, parameter in parameters.iteritems(): - if values.get(name) is None: - if hasattr(parameter, 'value') and (parameter.value is not None): - # For parameters only: - values[name] = coerce_property_value(context, presentation, parameter, - parameter.value) - else: - default = parameter.default if hasattr(parameter, 'default') else None - values[name] = coerce_property_value(context, presentation, parameter, default) - - return values - -# -# Utils -# - -def validate_required_values(context, presentation, values, definitions): - """ - Check if required properties have not been assigned. - """ - - if not definitions: - return - for name, definition in definitions.iteritems(): - if getattr(definition, 'required', False) \ - and ((values is None) or (values.get(name) is None)): - context.validation.report('required property "%s" is not assigned a value in "%s"' - % (name, presentation._fullname), - locator=presentation._get_child_locator('properties'), - level=Issue.BETWEEN_TYPES) - -def merge_raw_property_definition(context, presentation, raw_property_definition, - our_property_definition, field_name, property_name): - # Check if we changed the type - # TODO: allow a sub-type? - type1 = raw_property_definition.get('type') - type2 = our_property_definition.type - if type1 != type2: - context.validation.report( - 'override changes type from "%s" to "%s" for property "%s" in "%s"' - % (type1, type2, property_name, presentation._fullname), - locator=presentation._get_child_locator(field_name, property_name), - level=Issue.BETWEEN_TYPES) - - merge(raw_property_definition, our_property_definition._raw) - -def merge_raw_property_definitions(context, presentation, raw_property_definitions, - our_property_definitions, field_name): - if not our_property_definitions: - return - for property_name, our_property_definition in our_property_definitions.iteritems(): - if property_name in raw_property_definitions: - raw_property_definition = raw_property_definitions[property_name] - merge_raw_property_definition(context, presentation, raw_property_definition, - our_property_definition, field_name, property_name) - else: - raw_property_definitions[property_name] = \ - deepcopy_with_locators(our_property_definition._raw) - -def merge_property_definitions(context, presentation, property_definitions, - our_property_definitions, field_name): - if not our_property_definitions: - return - for property_name, our_property_definition in our_property_definitions.iteritems(): - if property_name in property_definitions: - property_definition = property_definitions[property_name] - merge_raw_property_definition(context, presentation, property_definition._raw, - our_property_definition, field_name, property_name) - else: - property_definitions[property_name] = our_property_definition - -# Works on properties, inputs, and parameters -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) 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 - else: - type_name = getattr(definition, 'type', None) - description = getattr(definition, 'description', None) - description = description.value if description is not None else None - return Value(type_name, value, description) - -def convert_property_definitions_to_values(context, definitions): - values = OrderedDict() - for name, definition in definitions.iteritems(): - default = definition.default - values[name] = coerce_property_value(context, definition, definition, default) - return values http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/extensions/aria_extension_tosca/simple_v1_0/modeling/requirements.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/requirements.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/requirements.py index 2a68da2..7181549 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/requirements.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/requirements.py @@ -14,13 +14,14 @@ # limitations under the License. from aria.parser.validation import Issue -from aria.utils.collections import deepcopy_with_locators, OrderedDict +from aria.utils.collections import (deepcopy_with_locators, OrderedDict) -from .properties import (convert_property_definitions_to_values, validate_required_values, - coerce_property_value) +from .parameters import (convert_parameter_definitions_to_values, validate_required_values, + coerce_parameter_value) from .interfaces import (convert_requirement_interface_definitions_from_type_to_raw_template, merge_interface_definitions, merge_interface, validate_required_inputs) + # # NodeType # @@ -49,6 +50,7 @@ def get_inherited_requirement_definitions(context, presentation): return requirement_definitions + # # NodeTemplate # @@ -127,6 +129,7 @@ def get_template_requirements(context, presentation): return requirement_assignments + # # Utils # @@ -195,7 +198,7 @@ def convert_requirement_from_definition_to_assignment(context, requirement_defin if relationship_property_definitions: # Convert property definitions to values raw['relationship']['properties'] = \ - convert_property_definitions_to_values(context, + convert_parameter_definitions_to_values(context, relationship_property_definitions) # These are our interface definitions @@ -229,6 +232,7 @@ def convert_requirement_from_definition_to_assignment(context, requirement_defin relationship_property_definitions, \ relationship_interface_definitions + def add_requirement_assignments(context, presentation, requirement_assignments, requirement_definitions, our_requirement_assignments): for requirement_name, our_requirement_assignment in our_requirement_assignments: @@ -258,6 +262,7 @@ def add_requirement_assignments(context, presentation, requirement_assignments, locator=our_requirement_assignment._locator, level=Issue.BETWEEN_TYPES) + def merge_requirement_assignment(context, relationship_property_definitions, relationship_interface_definitions, requirement, our_requirement): our_capability = our_requirement.capability @@ -283,6 +288,7 @@ def merge_requirement_assignment(context, relationship_property_definitions, relationship_interface_definitions, requirement, our_relationship) + def merge_requirement_assignment_relationship(context, presentation, property_definitions, interface_definitions, requirement, our_relationship): our_relationship_properties = our_relationship._raw.get('properties') @@ -296,7 +302,7 @@ def merge_requirement_assignment_relationship(context, presentation, property_de if property_name in property_definitions: definition = property_definitions[property_name] requirement._raw['relationship']['properties'][property_name] = \ - coerce_property_value(context, presentation, definition, prop) + coerce_parameter_value(context, presentation, definition, prop) else: context.validation.report( 'relationship property "%s" not declared at definition of requirement "%s"' @@ -330,6 +336,7 @@ def merge_requirement_assignment_relationship(context, presentation, property_de presentation._container._container._fullname), locator=our_relationship._locator, level=Issue.BETWEEN_TYPES) + def validate_requirement_assignment(context, presentation, requirement_assignment, relationship_property_definitions, relationship_interface_definitions): @@ -348,6 +355,7 @@ def validate_requirement_assignment(context, presentation, requirement_assignmen validate_required_inputs(context, presentation, interface_assignment, relationship_interface_definition, None, interface_name) + def get_first_requirement(requirement_definitions, name): if requirement_definitions is not None: for requirement_name, requirement_definition in requirement_definitions: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/extensions/aria_extension_tosca/simple_v1_0/modeling/substitution_mappings.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/modeling/substitution_mappings.py b/extensions/aria_extension_tosca/simple_v1_0/modeling/substitution_mappings.py index c1e21de..8f7ec4c 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/modeling/substitution_mappings.py +++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/substitution_mappings.py @@ -16,6 +16,7 @@ from aria.utils.formatting import safe_repr from aria.parser.validation import Issue + def validate_subtitution_mappings_requirement(context, presentation): if not validate_format(context, presentation, 'requirement'): return @@ -57,6 +58,7 @@ def validate_subtitution_mappings_requirement(context, presentation): locator=presentation._locator, level=Issue.BETWEEN_TYPES) return + def validate_subtitution_mappings_capability(context, presentation): if not validate_format(context, presentation, 'capability'): return @@ -99,6 +101,7 @@ def validate_subtitution_mappings_capability(context, presentation): % (capability_type._name, presentation._name, type_capability_type._name), locator=presentation._locator, level=Issue.BETWEEN_TYPES) + # # Utils # @@ -114,6 +117,7 @@ def validate_format(context, presentation, name): return False return True + def get_node_template(context, presentation, name): node_template_name = presentation._raw[0] node_template = context.presentation.get_from_dict('service_template', 'topology_template', http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/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 ce6b5d9..0e80fbb 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.parameters import (get_assigned_and_defined_parameter_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 @@ -157,7 +157,11 @@ class NodeTemplate(ExtensiblePresentation): @cachedmethod def _get_property_values(self, context): - return FrozenDict(get_assigned_and_defined_property_values(context, self)) + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'property')) + + @cachedmethod + def _get_attribute_default_values(self, context): + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'attribute')) @cachedmethod def _get_attribute_default_values(self, context): @@ -281,7 +285,7 @@ class RelationshipTemplate(ExtensiblePresentation): @cachedmethod def _get_property_values(self, context): - return FrozenDict(get_assigned_and_defined_property_values(context, self)) + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'property')) @cachedmethod def _get_interfaces(self, context): @@ -363,7 +367,7 @@ class GroupTemplate(ExtensiblePresentation): @cachedmethod def _get_property_values(self, context): - return FrozenDict(get_assigned_and_defined_property_values(context, self)) + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'property')) @cachedmethod def _get_interfaces(self, context): @@ -427,7 +431,7 @@ class PolicyTemplate(ExtensiblePresentation): @cachedmethod def _get_property_values(self, context): - return FrozenDict(get_assigned_and_defined_property_values(context, self)) + return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'property')) @cachedmethod def _get_targets(self, context): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/extensions/aria_extension_tosca/simple_v1_0/types.py ---------------------------------------------------------------------- diff --git a/extensions/aria_extension_tosca/simple_v1_0/types.py b/extensions/aria_extension_tosca/simple_v1_0/types.py index bc80eb9..d97b89c 100644 --- a/extensions/aria_extension_tosca/simple_v1_0/types.py +++ b/extensions/aria_extension_tosca/simple_v1_0/types.py @@ -33,9 +33,9 @@ from .modeling.capabilities import (get_inherited_valid_source_types, get_inherited_capability_definitions) from .modeling.data_types import (get_data_type, get_inherited_constraints, coerce_data_type_value, validate_data_type_name) -from .modeling.interfaces import get_inherited_interface_definitions, get_inherited_operations +from .modeling.interfaces import (get_inherited_interface_definitions, get_inherited_operations) from .modeling.policies import get_inherited_targets -from .modeling.properties import get_inherited_property_definitions +from .modeling.parameters import get_inherited_parameter_definitions from .modeling.requirements import get_inherited_requirement_definitions from .presentation.extensible import ExtensiblePresentation from .presentation.field_getters import data_type_class_getter @@ -115,7 +115,7 @@ class ArtifactType(ExtensiblePresentation): @cachedmethod def _get_properties(self, context): - return FrozenDict(get_inherited_property_definitions(context, self, 'properties')) + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) def _validate(self, context): super(ArtifactType, self)._validate(context) @@ -201,7 +201,7 @@ class DataType(ExtensiblePresentation): @cachedmethod def _get_properties(self, context): - return FrozenDict(get_inherited_property_definitions(context, self, 'properties')) + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) @cachedmethod def _get_constraints(self, context): @@ -307,7 +307,7 @@ class CapabilityType(ExtensiblePresentation): @cachedmethod def _get_properties(self, context): - return FrozenDict(get_inherited_property_definitions(context, self, 'properties')) + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) @cachedmethod def _get_valid_source_types(self, context): @@ -385,7 +385,7 @@ class InterfaceType(ExtensiblePresentation): @cachedmethod def _get_inputs(self, context): - return FrozenDict(get_inherited_property_definitions(context, self, 'inputs')) + return FrozenDict(get_inherited_parameter_definitions(context, self, 'inputs')) @cachedmethod def _get_operations(self, context): @@ -493,11 +493,11 @@ class RelationshipType(ExtensiblePresentation): @cachedmethod def _get_properties(self, context): - return FrozenDict(get_inherited_property_definitions(context, self, 'properties')) + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) @cachedmethod def _get_attributes(self, context): - return FrozenDict(get_inherited_property_definitions(context, self, 'attributes')) + return FrozenDict(get_inherited_parameter_definitions(context, self, 'attributes')) @cachedmethod def _get_interfaces(self, context): @@ -624,11 +624,11 @@ class NodeType(ExtensiblePresentation): @cachedmethod def _get_properties(self, context): - return FrozenDict(get_inherited_property_definitions(context, self, 'properties')) + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) @cachedmethod def _get_attributes(self, context): - return FrozenDict(get_inherited_property_definitions(context, self, 'attributes')) + return FrozenDict(get_inherited_parameter_definitions(context, self, 'attributes')) @cachedmethod def _get_requirements(self, context): @@ -760,7 +760,7 @@ class GroupType(ExtensiblePresentation): @cachedmethod def _get_properties(self, context): - return FrozenDict(get_inherited_property_definitions(context, self, 'properties')) + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) @cachedmethod def _get_interfaces(self, context): @@ -848,7 +848,7 @@ class PolicyType(ExtensiblePresentation): @cachedmethod def _get_properties(self, context): - return FrozenDict(get_inherited_property_definitions(context, self, 'properties')) + return FrozenDict(get_inherited_parameter_definitions(context, self, 'properties')) @cachedmethod def _get_targets(self, context): http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/88587f82/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml ---------------------------------------------------------------------- diff --git a/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml b/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml index 8e80640..6bbff79 100644 --- a/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml +++ b/tests/resources/service-templates/tosca-simple-1.0/node-cellar/node-cellar.yaml @@ -161,16 +161,7 @@ topology_template: relationship: interfaces: Configure: - target_changed: - implementation: - primary: changed.sh - dependencies: - #- { concat: [ process.args.1 >, mongodb ] } - - process.args.1 > mongodb - - process.args.2 > host - - ssh.user > admin - - ssh.password > 1234 - - ssh.use_sudo > true + target_changed: changed.sh nginx: type: nginx.Nginx @@ -251,6 +242,15 @@ topology_template: Standard: inputs: openstack_credential: { get_input: openstack_credential } + create: + implementation: + primary: create_data_volume.sh + dependencies: + - "process.args.1 > { get_property: [ SELF, size ] }" + - "process.args.2 > { get_attribute: [ SELF, tosca_id ] }" + - ssh.user > admin + - ssh.password > '1234' + - ssh.use_sudo > true groups:
