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/06/16 22:27:51 UTC

[08/10] incubator-ariatosca git commit: Finally works

Finally works


Project: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/commit/76aa0843
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/tree/76aa0843
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/diff/76aa0843

Branch: refs/heads/ARIA-254-multiple-nodes-per-template
Commit: 76aa0843fc872ed759aa3c7282b45c75e576d82b
Parents: 334ea74
Author: Tal Liron <ta...@gmail.com>
Authored: Fri Jun 16 17:27:05 2017 -0500
Committer: Tal Liron <ta...@gmail.com>
Committed: Fri Jun 16 17:27:32 2017 -0500

----------------------------------------------------------------------
 aria/modeling/service_template.py               | 21 +++++----
 aria/parser/presentation/fields.py              |  4 --
 .../profiles/aria-1.0/aria-1.0.yaml             |  2 +
 .../simple_v1_0/modeling/artifacts.py           |  4 +-
 .../simple_v1_0/modeling/capabilities.py        | 47 +++++++++++++-------
 .../simple_v1_0/modeling/interfaces.py          |  8 ++--
 .../simple_v1_0/modeling/parameters.py          |  5 ++-
 tests/end2end/test_nodecellar.py                |  2 +-
 .../node-cellar/node-cellar.yaml                | 38 +++++++++-------
 .../node-cellar/types/nodejs.yaml               |  1 +
 10 files changed, 81 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/76aa0843/aria/modeling/service_template.py
----------------------------------------------------------------------
diff --git a/aria/modeling/service_template.py b/aria/modeling/service_template.py
index c9c7c6c..633b5bc 100644
--- a/aria/modeling/service_template.py
+++ b/aria/modeling/service_template.py
@@ -305,7 +305,6 @@ class ServiceTemplateBase(TemplateModelMixin):
         utils.instantiate_dict(self, service.meta_data, self.meta_data)
 
         for node_template in self.node_templates.itervalues():
-            print 'scaling', node_template.name, node_template.scaling['default_instances'] 
             for _ in range(node_template.scaling['default_instances']):
                 node = node_template.instantiate(container)
                 service.nodes[node.name] = node
@@ -616,12 +615,11 @@ class NodeTemplateBase(TemplateModelMixin):
 
     @property
     def scaling(self):
-        scaling = {
-           'min_instances': 0,
-           'max_instances': 1,
-           'default_instances': 1}
+        scaling = {}
 
         def extract_property(properties, name):
+            if name in scaling:
+                return
             prop = properties.get(name)
             if (prop is not None) and (prop.type_name == 'integer') and (prop.value is not None):
                 scaling[name] = prop.value
@@ -631,21 +629,28 @@ class NodeTemplateBase(TemplateModelMixin):
             extract_property(properties, 'max_instances')
             extract_property(properties, 'default_instances')
 
-        # TODO: currently finds the first matches capability or policy; but we should emit a
-        # validation error if more than one applies to the same node
+        def default_property(name, value):
+            if name not in scaling:
+                scaling[name] = value
 
         # From our scaling capabilities
         for capability_template in self.capability_templates.itervalues():
             if capability_template.type.role == 'scaling':
                 extract_properties(capability_template.properties)
 
-        # From service scaling policies (will override capabilities)
+        # From service scaling policies
         for policy_template in self.service_template.policy_templates.itervalues():
             if policy_template.type.role == 'scaling':
                 if policy_template.is_for_node_template(self.name):
                     extract_properties(policy_template.properties)
 
+        # Defaults
+        default_property('min_instances', 0)
+        default_property('max_instances', 1)
+        default_property('default_instances', 1)
+
         # Validate
+        # pylint: disable=too-many-boolean-expressions
         if (scaling['min_instances'] < 0) or \
             (scaling['max_instances'] < 0) or \
             (scaling['default_instances'] < 0) or \

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/76aa0843/aria/parser/presentation/fields.py
----------------------------------------------------------------------
diff --git a/aria/parser/presentation/fields.py b/aria/parser/presentation/fields.py
index 060c576..7f85723 100644
--- a/aria/parser/presentation/fields.py
+++ b/aria/parser/presentation/fields.py
@@ -680,10 +680,6 @@ class Field(object):
     # object dict
 
     def _get_object_dict(self, presentation, raw, value, context):
-        if self.cls.__name__ == 'CapabilityAssignment':
-            print '>>>>>>>>>>p', presentation._name
-            print '>>>>>>>>>>v', value
-            print '>>>>>>>>>>r', raw
         if not isinstance(value, dict):
             raise InvalidValueError('%s is not a dict: %s' % (self.full_name, safe_repr(value)),
                                     locator=self.get_locator(raw))

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/76aa0843/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml
----------------------------------------------------------------------
diff --git a/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml b/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml
index d7b0c61..e421150 100644
--- a/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml
+++ b/extensions/aria_extension_tosca/profiles/aria-1.0/aria-1.0.yaml
@@ -93,3 +93,5 @@ policy_types:
         constraints:
           - greater_or_equal: 0
         required: false
+    targets:
+      - tosca.nodes.Root

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/76aa0843/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 dd9eeb4..b45615a 100644
--- a/extensions/aria_extension_tosca/simple_v1_0/modeling/artifacts.py
+++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/artifacts.py
@@ -21,6 +21,8 @@ from aria.utils.collections import OrderedDict
 #
 
 def get_inherited_artifact_definitions(context, presentation, for_presentation=None):
+    if for_presentation is None:
+        for_presentation = presentation
 
     if hasattr(presentation, '_get_type'):
         # In NodeTemplate
@@ -30,7 +32,7 @@ def get_inherited_artifact_definitions(context, presentation, for_presentation=N
         parent = presentation._get_parent(context)
 
     # Get artifact definitions from parent
-    artifacts = get_inherited_artifact_definitions(context, parent, for_presentation=presentation) \
+    artifacts = get_inherited_artifact_definitions(context, parent, for_presentation) \
         if parent is not None else OrderedDict()
 
     # Add/override our artifact definitions

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/76aa0843/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 e61fc81..bf75f7d 100644
--- a/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py
+++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py
@@ -52,12 +52,13 @@ def get_inherited_capability_definitions(context, presentation, for_presentation
     Allows overriding all aspects of parent capability properties except data type.
     """
 
+    if for_presentation is None:
+        for_presentation = presentation
+
     # Get capability definitions from parent
     parent = presentation._get_parent(context)
-    capability_definitions = get_inherited_capability_definitions(context, parent,
-                                                                  for_presentation=presentation) \
-                                                                  if parent is not None \
-                                                                  else OrderedDict()
+    capability_definitions = get_inherited_capability_definitions(
+        context, parent, for_presentation) if parent is not None else OrderedDict()
 
     # Add/merge our capability definitions
     our_capability_definitions = presentation.capabilities
@@ -75,9 +76,8 @@ def get_inherited_capability_definitions(context, presentation, for_presentation
                         .format(type1, type2, presentation._fullname),
                         locator=our_capability_definition._locator, level=Issue.BETWEEN_TYPES)
 
-                # Already cloned?
-                #capability_definition = capability_definition._clone(for_presentation)
-                #capability_definitions[capability_name] = capability_definition
+                merge_capability_definition(context, presentation, capability_definition,
+                                            our_capability_definition)
             else:
                 capability_definition = our_capability_definition._clone(for_presentation)
                 if isinstance(capability_definition._raw, basestring):
@@ -129,20 +129,11 @@ def get_template_capabilities(context, presentation):
             if capability_name in capability_assignments:
                 capability_assignment = capability_assignments[capability_name]
 
-                print
-                print presentation._name
-                print 'raw1', our_capability_assignment._raw
-                print 'raw2', presentation._raw['capabilities'][our_capability_assignment._name]
-
                 # Assign properties
                 values = get_assigned_and_defined_parameter_values(context,
                                                                    our_capability_assignment,
                                                                    'property')
 
-                print 'our', [(k, v.value) for k, v in our_capability_assignment.properties.iteritems()]
-                print 'def', [(k, v.value.value) for k, v in capability_assignment.properties.iteritems()]
-                print 'val', [(k, v.value) for k, v in values.iteritems()]
-                
                 if values:
                     capability_assignment._raw['properties'] = values
                     capability_assignment._reset_method_cache()
@@ -173,6 +164,30 @@ def convert_capability_from_definition_to_assignment(context, presentation, cont
     return CapabilityAssignment(name=presentation._name, raw=raw, container=container)
 
 
+def merge_capability_definition(context, presentation, capability_definition,
+                                from_capability_definition):
+    raw_properties = OrderedDict()
+
+    # Merge properties from type
+    from_property_defintions = from_capability_definition.properties
+    merge_raw_parameter_definitions(context, presentation, raw_properties, from_property_defintions,
+                                    'properties')
+
+    # Merge our properties
+    merge_raw_parameter_definitions(context, presentation, raw_properties,
+                                    capability_definition.properties, 'properties')
+
+    if raw_properties:
+        capability_definition._raw['properties'] = raw_properties
+        capability_definition._reset_method_cache()
+
+    # Merge occurrences
+    occurrences = from_capability_definition._raw.get('occurrences')
+    if (occurrences is not None) and (capability_definition._raw.get('occurrences') is None):
+        capability_definition._raw['occurrences'] = \
+            deepcopy_with_locators(occurrences)
+
+
 def merge_capability_definition_from_type(context, presentation, capability_definition):
     raw_properties = OrderedDict()
 

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/76aa0843/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 e04ac4a..d5f447c 100644
--- a/extensions/aria_extension_tosca/simple_v1_0/modeling/interfaces.py
+++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/interfaces.py
@@ -113,9 +113,12 @@ def get_inherited_interface_definitions(context, presentation, type_name, for_pr
     types.
     """
 
+    if for_presentation is None:
+        for_presentation = presentation
+
     # Get interfaces from parent
     parent = presentation._get_parent(context)
-    interfaces = get_inherited_interface_definitions(context, parent, type_name, presentation) \
+    interfaces = get_inherited_interface_definitions(context, parent, type_name, for_presentation) \
         if parent is not None else OrderedDict()
 
     # Add/merge interfaces from their types
@@ -123,8 +126,7 @@ def get_inherited_interface_definitions(context, presentation, type_name, for_pr
 
     # Add/merge our interfaces
     our_interfaces = presentation.interfaces
-    merge_interface_definitions(context, interfaces, our_interfaces, presentation,
-                                for_presentation=for_presentation)
+    merge_interface_definitions(context, interfaces, our_interfaces, presentation, for_presentation)
 
     return interfaces
 

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/76aa0843/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
index c910956..87c1a3b 100644
--- a/extensions/aria_extension_tosca/simple_v1_0/modeling/parameters.py
+++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/parameters.py
@@ -33,11 +33,14 @@ def get_inherited_parameter_definitions(context, presentation, field_name, for_p
     Allows overriding all aspects of parent properties except data type.
     """
 
+    if for_presentation is None:
+        for_presentation = presentation
+
     # 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) \
+                                                      for_presentation) \
                                                       if parent is not None else OrderedDict()
 
     # Add/merge our definitions

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/76aa0843/tests/end2end/test_nodecellar.py
----------------------------------------------------------------------
diff --git a/tests/end2end/test_nodecellar.py b/tests/end2end/test_nodecellar.py
index a2b6797..e8cfa84 100644
--- a/tests/end2end/test_nodecellar.py
+++ b/tests/end2end/test_nodecellar.py
@@ -39,4 +39,4 @@ def _verify_deployed_service_in_storage(service_name, model_storage):
     service = service_templates[0].services[service_name]
     assert service.name == service_name
     assert len(service.executions) == 0  # dry executions leave no traces
-    assert len(service.nodes) == 13
+    assert len(service.nodes) == 15

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/76aa0843/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 de57d3c..2d39967 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
@@ -155,7 +155,7 @@ topology_template:
         capabilities:
           - scalable:
               properties:
-                - max_instances: { greater_or_equal: 8 }
+                - max_instances: { greater_or_equal: 5 }
 
     mongodb:
       description: >-
@@ -171,7 +171,7 @@ topology_template:
               capabilities:
                 - scalable:
                     properties:
-                      - max_instances: { greater_or_equal: 8 }
+                      - max_instances: { greater_or_equal: 5 }
             relationship:
               interfaces:
                 Configure:
@@ -201,11 +201,6 @@ topology_template:
         os_users: # map of os.UserInfo
           root:
             password: admin123
-      capabilities:
-        scalable: # will be overriden by policy
-          properties:
-            max_instances: 5
-            default_instances: 3
       interfaces:
         Standard:
           inputs:
@@ -230,7 +225,7 @@ topology_template:
       capabilities:
         scalable:
           properties:
-            max_instances: 10
+            max_instances: 5 # overrides the policy
 
     data_host:
       copy: loadbalancer_host
@@ -251,7 +246,7 @@ topology_template:
       capabilities:
         scalable:
           properties:
-            max_instances: 10
+            max_instances: 6 # overrides the policy
 
     data_volume:
       type: openstack.Volume
@@ -278,14 +273,23 @@ topology_template:
 
   policies:
   
-#    scaling:
-#      type: openstack.Scaling
-#      properties:
-#        bandwidth_threshold: 2 GB
-#        max_instances: 2
-#        default_instances: 2
-#      targets: # node templates or groups
-#        - node_cellar_group
+    app_scaling:
+      type: aria.Scaling
+      properties:
+        max_instances: 10
+        default_instances: 2
+      targets:
+        - node_cellar
+        - nodejs
+  
+    host_scaling:
+      type: openstack.Scaling
+      properties:
+        bandwidth_threshold: 2 GB
+        max_instances: 10
+        default_instances: 2
+      targets: # node templates or groups
+        - node_cellar_group
     
     juju:
       description: >-

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/76aa0843/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nodejs.yaml
----------------------------------------------------------------------
diff --git a/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nodejs.yaml b/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nodejs.yaml
index 4fd4e72..19cc7b9 100644
--- a/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nodejs.yaml
+++ b/tests/resources/service-templates/tosca-simple-1.0/node-cellar/types/nodejs.yaml
@@ -51,6 +51,7 @@ node_types:
       host: # @override
         type: tosca.capabilities.Container
         valid_source_types: [ nodejs.Application ]
+        occurrences: [ 0, 1 ]
 
   nodejs.Application:
     derived_from: tosca.nodes.WebApplication