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/04/14 17:13:03 UTC

incubator-ariatosca git commit: Plugin policy enabled; store found plugin for spec [Forced Update!]

Repository: incubator-ariatosca
Updated Branches:
  refs/heads/ARIA-92-plugin-in-implementation-string d5b4bf02a -> 6e807d9ce (forced update)


Plugin policy enabled; store found plugin for spec


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

Branch: refs/heads/ARIA-92-plugin-in-implementation-string
Commit: 6e807d9ceff736408af3d3f51a33131d7feddd16
Parents: 08ecf43
Author: Tal Liron <ta...@gmail.com>
Authored: Fri Apr 14 12:10:01 2017 -0500
Committer: Tal Liron <ta...@gmail.com>
Committed: Fri Apr 14 12:12:57 2017 -0500

----------------------------------------------------------------------
 aria/modeling/service_template.py               | 65 ++++++++++++++------
 .../profiles/aria-1.0/aria-1.0.yaml             |  5 +-
 .../simple_v1_0/modeling/__init__.py            |  6 +-
 .../node-cellar/node-cellar.yaml                |  2 +-
 4 files changed, 53 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/6e807d9c/aria/modeling/service_template.py
----------------------------------------------------------------------
diff --git a/aria/modeling/service_template.py b/aria/modeling/service_template.py
index 6bd92b3..d0e776b 100644
--- a/aria/modeling/service_template.py
+++ b/aria/modeling/service_template.py
@@ -293,13 +293,14 @@ class ServiceTemplateBase(TemplateModelMixin):
         context.modeling.instance = service
 
         for plugin_specification in self.plugin_specifications.itervalues():
-            plugin = plugin_specification.find_plugin()
-            if plugin is not None:
-                service.plugins[plugin.name] = plugin
-            elif plugin_specification.required:
-                context = ConsumptionContext.get_thread_local()
-                context.validation.report('plugin not found for specification: {0}'.format(
-                    plugin_specification.name), level=validation.Issue.EXTERNAL)
+            if plugin_specification.enabled:
+                if plugin_specification.resolve():
+                    plugin = plugin_specification.plugin
+                    service.plugins[plugin.name] = plugin
+                else:
+                    context = ConsumptionContext.get_thread_local()
+                    context.validation.report('specified plugin not found: {0}'.format(
+                        plugin_specification.name), level=validation.Issue.EXTERNAL)
 
         utils.instantiate_dict(self, service.meta_data, self.meta_data)
 
@@ -1864,13 +1865,21 @@ class OperationTemplateBase(TemplateModelMixin):
 
     def instantiate(self, container):
         from . import models
-        plugin = self.plugin_specification.find_plugin() \
-            if self.plugin_specification is not None else None
+        if self.plugin_specification and self.plugin_specification.enabled:
+            plugin = self.plugin_specification.plugin
+            implementation = self.implementation if plugin is not None else None
+            # "plugin" would be none if a match was not found. In that case, a validation error
+            # should already have been reported in ServiceTemplateBase.instantiate, so we will
+            # continue silently here
+        else:
+            # If the plugin is disabled, the operation should be disabled, too
+            plugin = None
+            implementation = None
         operation = models.Operation(name=self.name,
                                      description=deepcopy_with_locators(self.description),
                                      relationship_edge=self.relationship_edge,
                                      plugin=plugin,
-                                     implementation=self.implementation,
+                                     implementation=implementation,
                                      configuration=self.configuration,
                                      dependencies=self.dependencies,
                                      executor=self.executor,
@@ -2061,14 +2070,19 @@ class PluginSpecificationBase(TemplateModelMixin):
     :vartype name: basestring
     :ivar version: Minimum plugin version
     :vartype version: basestring
+    :ivar enabled: Whether the plugin is enabled
+    :vartype enabled: bool
+    :ivar plugin: The matching plugin (or None if not matched)
+    :vartype plugin: :class:`Plugin`
     """
 
     __tablename__ = 'plugin_specification'
 
-    __private_fields__ = ['service_template_fk']
+    __private_fields__ = ['service_template_fk',
+                          'plugin_fk']
 
     version = Column(Text)
-    required = Column(Boolean, nullable=False, default=True)
+    enabled = Column(Boolean, nullable=False, default=True)
 
     # region foreign keys
 
@@ -2077,27 +2091,39 @@ class PluginSpecificationBase(TemplateModelMixin):
         """For ServiceTemplate one-to-many to PluginSpecification"""
         return relationship.foreign_key('service_template', nullable=True)
 
+    @declared_attr
+    def plugin_fk(cls):
+        """For PluginSpecification many-to-one to Plugin"""
+        return relationship.foreign_key('plugin', nullable=True)
+
     # endregion
 
+    # region many_to_one relationships
+
     @declared_attr
     def service_template(cls):
         return relationship.many_to_one(cls, 'service_template')
 
+    @declared_attr
+    def plugin(cls): # pylint: disable=method-hidden
+        return relationship.many_to_one(cls, 'plugin', back_populates=relationship.NO_BACK_POP)
+
+    # endregion
+
     @property
     def as_raw(self):
         return collections.OrderedDict((
             ('name', self.name),
-            ('version', self.version)))
+            ('version', self.version),
+            ('enabled', self.enabled)))
 
     def coerce_values(self, container, report_issues):
         pass
 
     def instantiate(self, container):
-        from . import models
-        return models.PluginSpecification(name=self.name,
-                                          version=self.version)
+        pass
 
-    def find_plugin(self):
+    def resolve(self):
         # TODO: we are planning a separate "instantiation" module where this will be called or
         # moved to. There, we will probably have a context with a storage manager. Until then,
         # this is the only potentially available context, which of course will only be available
@@ -2116,7 +2142,8 @@ class PluginSpecificationBase(TemplateModelMixin):
                 if (plugin.name == self.name) and \
                     ((self.version is None) or (plugin.package_version >= self.version)):
                     matching_plugins.append(plugin)
+        self.plugin = None
         if matching_plugins:
             # Return highest version of plugin
-            return sorted(matching_plugins, key=lambda plugin: plugin.package_version)[-1]
-        return None
+            self.plugin = sorted(matching_plugins, key=lambda plugin: plugin.package_version)[-1]
+        return self.plugin is not None

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/6e807d9c/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 a16e4af..8975436 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
@@ -31,9 +31,10 @@ policy_types:
           Minimum plugin version.
         type: version
         required: false
-      required:
+      enabled:
         description: >-
-          Whether the plugin is required.
+          If the policy is to disable the plugin then it will be ignored and all operations and
+          depending on it will also be disabled.
         type: boolean
         default: true
 

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/6e807d9c/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 7a20a2e..0e9177f 100644
--- a/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py
+++ b/extensions/aria_extension_tosca/simple_v1_0/modeling/__init__.py
@@ -463,13 +463,13 @@ def create_substitution_template_model(context, service_template, substitution_m
 def create_plugin_specification_model(context, policy):
     properties = policy.properties
 
-    def get(name):
+    def get(name, default=None):
         prop = properties.get(name)
-        return prop.value if prop is not None else None
+        return prop.value if prop is not None else default
 
     model = PluginSpecification(name=policy._name,
                                 version=get('version'),
-                                required=get('required'))
+                                enabled=get('enabled', True))
 
     return model
 

http://git-wip-us.apache.org/repos/asf/incubator-ariatosca/blob/6e807d9c/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 e21e1f0..349a166 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
@@ -276,7 +276,7 @@ topology_template:
       type: aria.Plugin
       properties:
         version: 1.0
-        required: false
+        enabled: false
 
     maintenance_on:
       type: MaintenanceWorkflow