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:50 UTC

[07/10] incubator-ariatosca git commit: wip

wip


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

Branch: refs/heads/ARIA-254-multiple-nodes-per-template
Commit: ba4460e2cefce13536114b0b5ad6072da5281dc5
Parents: b7ec71e
Author: Tal Liron <ta...@gmail.com>
Authored: Tue Jun 13 14:50:17 2017 -0500
Committer: Tal Liron <ta...@gmail.com>
Committed: Fri Jun 16 17:27:32 2017 -0500

----------------------------------------------------------------------
 aria/modeling/service_template.py               | 62 +++++++++++++++-----
 aria/parser/presentation/presentation.py        | 12 +++-
 .../profiles/aria-1.0/aria-1.0.yaml             | 23 ++++++--
 .../profiles/tosca-simple-1.0/capabilities.yaml |  1 +
 .../simple_v1_0/modeling/capabilities.py        | 15 +++--
 .../node-cellar/node-cellar.yaml                | 20 ++++---
 6 files changed, 99 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/aria/modeling/service_template.py
----------------------------------------------------------------------
diff --git a/aria/modeling/service_template.py b/aria/modeling/service_template.py
index dfef8d6..c9c7c6c 100644
--- a/aria/modeling/service_template.py
+++ b/aria/modeling/service_template.py
@@ -305,7 +305,8 @@ class ServiceTemplateBase(TemplateModelMixin):
         utils.instantiate_dict(self, service.meta_data, self.meta_data)
 
         for node_template in self.node_templates.itervalues():
-            for _ in range(node_template.default_instances):
+            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
 
@@ -581,12 +582,6 @@ class NodeTemplateBase(TemplateModelMixin):
             console.puts(context.style.meta(self.description))
         with context.style.indent:
             console.puts('Type: {0}'.format(context.style.type(self.type.name)))
-            console.puts('Instances: {0:d} ({1:d}{2})'.format(
-                self.default_instances,
-                self.min_instances,
-                ' to {0:d}'.format(self.max_instances)
-                if self.max_instances is not None
-                else ' or more'))
             utils.dump_dict_values(self.properties, 'Properties')
             utils.dump_dict_values(self.attributes, 'Attributes')
             utils.dump_interfaces(self.interface_templates)
@@ -620,18 +615,53 @@ class NodeTemplateBase(TemplateModelMixin):
         return '{name}_{index}'.format(name=self.name, index=self.next_index)
 
     @property
-    def default_instances(self):
-        # TODO: currently finds the first matching policy; but we should emit a validation error
-        # if more than one policy applies to the same node
+    def scaling(self):
+        scaling = {
+           'min_instances': 0,
+           'max_instances': 1,
+           'default_instances': 1}
+
+        def extract_property(properties, name):
+            prop = properties.get(name)
+            if (prop is not None) and (prop.type_name == 'integer') and (prop.value is not None):
+                scaling[name] = prop.value
+
+        def extract_properties(properties):
+            extract_property(properties, 'min_instances')
+            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
+
+        # 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)
         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):
-                    default_instances = policy_template.properties.get('default_instances')
-                    if (default_instances is not None) \
-                        and (default_instances.type_name == 'integer'):
-                        return default_instances.value
-                    break
-        return 1
+                    extract_properties(policy_template.properties)
+
+        # Validate
+        if (scaling['min_instances'] < 0) or \
+            (scaling['max_instances'] < 0) or \
+            (scaling['default_instances'] < 0) or \
+            (scaling['max_instances'] < scaling['min_instances']) or \
+            (scaling['default_instances'] < scaling['min_instances']) or \
+            (scaling['default_instances'] > scaling['max_instances']):
+            context = ConsumptionContext.get_thread_local()
+            context.validation.report('invalid scaling parameters for node template "{0}": '
+                                      'min={1}, max={2}, default={3}'.format(
+                                          self.name,
+                                          scaling['min_instances'],
+                                          scaling['max_instances'],
+                                          scaling['default_instances']),
+                                      level=validation.Issue.BETWEEN_TYPES)
+
+        return scaling
 
     def is_target_node_template_valid(self, target_node_template):
         """

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/aria/parser/presentation/presentation.py
----------------------------------------------------------------------
diff --git a/aria/parser/presentation/presentation.py b/aria/parser/presentation/presentation.py
index 644d880..495c42c 100644
--- a/aria/parser/presentation/presentation.py
+++ b/aria/parser/presentation/presentation.py
@@ -34,6 +34,14 @@ class Value(object):
         self.value = deepcopy_with_locators(value)
         self.description = deepcopy_with_locators(description)
 
+    def _dump(self, context):
+        if self.type is not None:
+            puts(context.style.type(self.type))
+        if self.value is not None:
+            puts(context.style.literal(self.value))
+        if self.description is not None:
+            puts(context.style.meta(self.description))
+
 
 class PresentationBase(HasCachedMethods):
     """
@@ -234,6 +242,8 @@ class AsIsPresentation(PresentationBase):
 
     def _dump(self, context):
         if hasattr(self._raw, '_dump'):
-            self._raw._dump(context)
+            puts(context.style.node(self._name))
+            with context.style.indent:
+                self._raw._dump(context)
         else:
             super(AsIsPresentation, self)._dump(context)

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/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 71d6e8e..d7b0c61 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
@@ -67,18 +67,29 @@ policy_types:
       Scaling.
     derived_from: tosca.policies.Scaling
     properties:
-      default_instances:
+      min_instances:
+        description: >-
+          This property is used to indicate the minimum number of instances that should be created
+          for the associated TOSCA Node Template by a TOSCA orchestrator.
         type: integer
         default: 1
         constraints:
           - greater_or_equal: 0
-      min_instances:
+      max_instances:
+        description: >-
+          This property is used to indicate the maximum number of instances that should be created
+          for the associated TOSCA Node Template by a TOSCA orchestrator.
         type: integer
-        default: 0
+        default: 1
         constraints:
           - greater_or_equal: 0
-      max_instances:
+      default_instances:
+        description: >-
+          An optional property that indicates the requested default number of instances that should
+          be the starting number of instances a TOSCA orchestrator should attempt to allocate. Note:
+          The value for this property MUST be in the range between the values set for
+          "min_instances" and "max_instances" properties.
         type: integer
-        default: -1
         constraints:
-          - greater_or_equal: -1
+          - greater_or_equal: 0
+        required: false

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml
----------------------------------------------------------------------
diff --git a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml
index 30abe10..b705d47 100644
--- a/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml
+++ b/extensions/aria_extension_tosca/profiles/tosca-simple-1.0/capabilities.yaml
@@ -132,6 +132,7 @@ capability_types:
       specification: tosca-simple-1.0
       specification_section: 5.4.10
       specification_url: 'http://docs.oasis-open.org/tosca/TOSCA-Simple-Profile-YAML/v1.0/cos01/TOSCA-Simple-Profile-YAML-v1.0-cos01.html#DEFN_TYPE_CAPABILITIES_SCALABLE'
+      role: scaling
     description: >-
       This is the default TOSCA type that should be used to express a scalability capability for a node.
     derived_from: tosca.capabilities.Root

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/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 a90a9fc..18a4541 100644
--- a/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py
+++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/capabilities.py
@@ -71,8 +71,8 @@ def get_inherited_capability_definitions(context, presentation, for_presentation
                 type2 = our_capability_definition.type
                 if type1 != type2:
                     context.validation.report(
-                        'capability definition changes type from "%s" to "%s" in "%s"'
-                        % (type1, type2, presentation._fullname),
+                        'capability definition changes type from "{0}" to "{1}" in "{2}"'
+                        .format(type1, type2, presentation._fullname),
                         locator=our_capability_definition._locator, level=Issue.BETWEEN_TYPES)
 
                 # Already cloned?
@@ -133,12 +133,19 @@ def get_template_capabilities(context, presentation):
                 values = get_assigned_and_defined_parameter_values(context,
                                                                    our_capability_assignment,
                                                                    'property')
+
+                print presentation._name
+                print 'our', [(k, v.value) for k, v in our_capability_assignment.properties.iteritems()]
+                print 'ass', [(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()
             else:
                 context.validation.report(
-                    'capability "%s" not declared at node type "%s" in "%s"'
-                    % (capability_name, presentation.type, presentation._fullname),
+                    'capability "{0}" not declared at node type "{1}" in "{2}"'
+                    .format(capability_name, presentation.type, presentation._fullname),
                     locator=our_capability_assignment._locator, level=Issue.BETWEEN_TYPES)
 
     return capability_assignments

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/ba4460e2/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 e130b13..de57d3c 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
@@ -201,6 +201,11 @@ 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:
@@ -273,13 +278,14 @@ topology_template:
 
   policies:
   
-    scaling:
-      type: openstack.Scaling
-      properties:
-        bandwidth_threshold: 2 GB
-        default_instances: 2
-      targets: # node templates or groups
-        - node_cellar_group
+#    scaling:
+#      type: openstack.Scaling
+#      properties:
+#        bandwidth_threshold: 2 GB
+#        max_instances: 2
+#        default_instances: 2
+#      targets: # node templates or groups
+#        - node_cellar_group
     
     juju:
       description: >-