Просмотр исходного кода

AMBARI-3659. Resource Management. Support inline templates (Andrew Onischuk via dlysnichenko)

Lisnichenko Dmitro 11 лет назад
Родитель
Сommit
267239e401

+ 16 - 6
ambari-agent/src/main/python/resource_management/core/source.py

@@ -1,7 +1,7 @@
 from __future__ import with_statement
 from resource_management.core import environment
 
-__all__ = ["Source", "Template", "StaticFile", "DownloadSource"]
+__all__ = ["Source", "Template", "InlineTemplate", "StaticFile", "DownloadSource"]
 
 import hashlib
 import os
@@ -39,11 +39,15 @@ class StaticFile(Source):
 
 
 try:
-  from jinja2 import Environment, BaseLoader, TemplateNotFound
+  from jinja2 import Environment, BaseLoader, TemplateNotFound, FunctionLoader
 except ImportError:
   class Template(Source):
     def __init__(self, name, variables=None, env=None):
-      raise Exception("Jinja2 required for Template")
+      raise Exception("Jinja2 required for Template/InlineTemplate")
+    
+  class InlineTemplate(Source):
+    def __init__(self, name, variables=None, env=None):
+      raise Exception("Jinja2 required for Template/InlineTemplate")
 else:
   class TemplateLoader(BaseLoader):
     def __init__(self, env=None):
@@ -72,9 +76,10 @@ else:
       params = self.env.config.params
       variables = params if params else variables
       self.context = variables.copy() if variables else {}
-      self.template_env = Environment(loader=TemplateLoader(self.env),
-                                      autoescape=False)
-      self.template = self.template_env.get_template(self.name)
+      if not hasattr(self, 'template_env'):
+        self.template_env = Environment(loader=TemplateLoader(self.env),
+                                        autoescape=False)
+      self.template = self.template_env.get_template(self.name)     
 
     def get_content(self):
       self.context.update(
@@ -85,6 +90,11 @@ else:
       )
       rendered = self.template.render(self.context)
       return rendered + "\n" if not rendered.endswith('\n') else rendered
+    
+  class InlineTemplate(Template):
+    def __init__(self, name, variables=None, env=None):
+      self.template_env = Environment(loader=FunctionLoader(lambda text: text))
+      super(InlineTemplate, self).__init__(name, variables, env) 
 
 
 class DownloadSource(Source):

+ 9 - 53
ambari-agent/src/main/python/resource_management/core/utils.py

@@ -66,68 +66,24 @@ class AttributeDictionary(object):
   def __setstate__(self, state):
     super(AttributeDictionary, self).__setattr__("_dict", state)
     
-class ParamsAttributeDictionary(object):
+class ParamsAttributeDictionary(AttributeDictionary):
   """
   This class can store user parameters
-  and support some features necessary for substitution to work.
+  and it supports some features necessary for substitution to work.
   """
   def __init__(self, substitutor, *args, **kwargs):
-    d = kwargs
-    if len(args)==1:
-      d = args[0]
-    super(ParamsAttributeDictionary, self).__setattr__("_dict", d)
-    super(ParamsAttributeDictionary, self).__setattr__("substitutor", substitutor)
-
-  def __setattr__(self, name, value):
-    self[name] = value
-
-  def __setitem__(self, name, value):
-    self._dict[name] = self._convert_value(value)
+    super(ParamsAttributeDictionary, self).__init__(*args, **kwargs)
+    super(AttributeDictionary, self).__setattr__("substitutor", substitutor)
 
   def __getitem__(self, name):
     val = self.substitutor.get_subdict(name, self._dict)
     return self._convert_value(val)
 
-  def _convert_value(self, value):
-    if isinstance(value, dict) and not isinstance(value, ParamsAttributeDictionary):
-      return ParamsAttributeDictionary(self.substitutor, value)
-    return value
-
   def copy(self):
-    return self.__class__(self._dict.copy())
-
-  def update(self, *args, **kwargs):
-    self._dict.update(*args, **kwargs)
-
-  def items(self):
-    return self._dict.items()
-
-  def values(self):
-    return self._dict.values()
-
-  def keys(self):
-    return self._dict.keys()
-
-  def pop(self, *args, **kwargs):
-    return self._dict.pop(*args, **kwargs)
-
-  def get(self, *args, **kwargs):
-    return self._dict.get(*args, **kwargs)
-
-  def __repr__(self):
-    return self._dict.__repr__()
+    return ParamsAttributeDictionary(self.substitutor, self._dict)
 
   def __unicode__(self):
-    return self._dict.__unicode__()
-
-  def __str__(self):
-    return self._dict.__str__()
-
-  def __iter__(self):
-    return self._dict.__iter__()
-
-  def __getstate__(self):
-    return self._dict
-
-  def __setstate__(self, state):
-    super(ParamsAttributeDictionary, self).__setattr__("_dict", state)
+    if isinstance(self._dict, str):
+      return self._dict.__unicode__()
+    else:
+      return str(self._dict)