You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ariatosca.apache.org by em...@apache.org on 2017/05/20 00:35:12 UTC

[3/4] incubator-ariatosca git commit: ARIA-149 Enhance operation configuration

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/b1c97e24/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/b1c97e24/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..6bdb5b1 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,8 +198,8 @@ 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,
-                                                           relationship_property_definitions)
+                    convert_parameter_definitions_to_values(context,
+                                                            relationship_property_definitions)
 
         # These are our interface definitions
         # InterfaceDefinition:
@@ -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/b1c97e24/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/b1c97e24/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..123a00e 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,12 +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_property_values(context, self,
-                                                                   'attribute', 'attributes'))
+        return FrozenDict(get_assigned_and_defined_parameter_values(context, self, 'attribute'))
 
     @cachedmethod
     def _get_requirements(self, context):
@@ -281,7 +280,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 +362,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 +426,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/b1c97e24/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/b1c97e24/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..ee9e094 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
@@ -104,6 +104,16 @@ topology_template:
         Maintenance:
           enable: juju > charm.maintenance_on
           disable: juju > charm.maintenance_off
+        Standard:
+          create:
+            implementation:
+              primary: create_node_cellar.sh
+              dependencies:
+                - "process.args.1 > { get_attribute: [ SELF, tosca_id ] }"
+                - "process.args.2 > { get_property: [ HOST, flavor_name ] }"
+                - ssh.user > admin
+                - ssh.password > '1234'
+                - ssh.use_sudo > true
       requirements:
         - database: node_cellar_database
       capabilities:
@@ -161,16 +171,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 +252,7 @@ topology_template:
         Standard:
           inputs:
             openstack_credential: { get_input: openstack_credential }
+          create: create_data_volume.sh
 
   groups:
   
@@ -309,7 +311,7 @@ policy_types:
       client connections cleanly and shut down services. 
     derived_from: aria.Workflow
     properties:
-      implementation:
+      function:
         type: string
         default: workflows.maintenance
       enabled: