You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by dm...@apache.org on 2013/11/01 16:28:22 UTC

[11/15] git commit: AMBARI-3661. Resource Management. Support adding parameters, beside the configurations. (Andrew Onischuk via dlysnichenko)

AMBARI-3661. Resource Management. Support adding parameters, beside the configurations. (Andrew Onischuk via dlysnichenko)


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

Branch: refs/heads/trunk
Commit: 0e7b987bcdfda2bde0fcc5fc174d9a758cba3cc2
Parents: 87ef3f4
Author: Lisnichenko Dmitro <dl...@hortonworks.com>
Authored: Fri Nov 1 17:19:37 2013 +0200
Committer: Lisnichenko Dmitro <dl...@hortonworks.com>
Committed: Fri Nov 1 17:19:37 2013 +0200

----------------------------------------------------------------------
 .../resource_management/core/environment.py     | 79 ++++----------------
 .../python/resource_management/core/script.py   |  1 -
 .../python/resource_management/core/utils.py    | 13 +++-
 3 files changed, 22 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/0e7b987b/ambari-agent/src/main/python/resource_management/core/environment.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/core/environment.py b/ambari-agent/src/main/python/resource_management/core/environment.py
index 8746ce8..d6557b0 100644
--- a/ambari-agent/src/main/python/resource_management/core/environment.py
+++ b/ambari-agent/src/main/python/resource_management/core/environment.py
@@ -33,7 +33,6 @@ class Environment(object):
     self.config = AttributeDictionary()
     self.resources = {}
     self.resource_list = []
-    Substitutor.default_prefixes = []
     self.delayed_actions = set()
     self.update_config({
       # current time
@@ -45,7 +44,7 @@ class Environment(object):
       # dir where templates,failes dirs are 
       'basedir': basedir, 
       # variables, which can be used in templates
-      'params': ParamsAttributeDictionary(Substitutor, params), 
+      'params': ParamsAttributeDictionary(Substitutor, params.copy()), 
     })
 
   def backup_file(self, path):
@@ -67,7 +66,17 @@ class Environment(object):
         attr = attr[pth]
       if overwrite or path[-1] not in attr:
         attr[path[-1]] = value
-
+        
+  def add_params(self, params):
+    variables = [item for item in dir(params) if not item.startswith("__")]
+
+    for variable in variables:
+      value = getattr(params, variable)
+      if not hasattr(value, '__call__'):
+        if variable in self.config.params:
+          raise Fail("Variable %s already exists in the resource management parameters" % variable)
+        self.config.params[variable] = value
+        
   def run_action(self, resource, action):
     self.log.debug("Performing action %s on %s" % (action, resource))
 
@@ -89,9 +98,6 @@ class Environment(object):
         self.log.info(
           "%s sending %s action to %s (delayed)" % (resource, action, res))
       self.delayed_actions |= resource.subscriptions['delayed']
-      
-  def set_default_prefixes(self, dict):
-    Substitutor.default_prefixes = dict
 
   def _check_condition(self, cond):
     if hasattr(cond, '__call__'):
@@ -166,72 +172,13 @@ class Environment(object):
 
 class Substitutor():
   log = logging.getLogger("resource_management.resource")
-  default_prefixes = []
-  
-  class ExtendedTemplate(Template):
-    """
-    This is done to support substitution of dictionaries in dictionaries 
-    ( ':' sign)
-    
-    default is:
-    idpattern = r'[_a-z][_a-z0-9]*'
-    """
-    idpattern = r'[_a-z][_a-z0-9:]*'
-    
-  @staticmethod 
-  def _get_subdict(name, dic):
-    """
-    "a:b:c" => a[b][c]
-    
-    doesn't use prefixes
-    """
-    name_parts = name.split(':')
-    curr = dic
-    
-    for x in name_parts:
-      curr = curr[x]
-    return curr
-      
-  @staticmethod
-  def get_subdict(name, dic):
-    """
-    "a:b:c" => a[b][c]
-    
-    can use prefixes
-    """
-    prefixes = list(Substitutor.default_prefixes)
-    prefixes.insert(0, None) # for not prefixed case
-    name_parts = name.split(':')
-    is_found = False
-    result = None
-    
-    for prefix in prefixes:
-      curr = Substitutor._get_subdict(prefix,dic) if prefix else dic
-      
-      try:
-        for x in name_parts:
-          curr = curr[x]
-      except (KeyError, TypeError):
-        continue
-      
-      if is_found:
-        raise Fail("Variable ${%s} found more than one time, please check your default prefixes!" % name)
-      
-      is_found = True
-      result = curr
-      
-    if not result:
-      raise Fail("Configuration on ${%s} cannot be resolved" % name)
-    
-    return result
-
   @staticmethod
   def substitute(val):
     env = Environment.get_instance()
     dic = env.config.params
     
     if dic and isinstance(val, str):
-      result = Substitutor.ExtendedTemplate(val).substitute(dic)
+      result = Template(val).substitute(dic)
       if '$' in val:
         Substitutor.log.debug("%s after substitution is %s", val, result)
       return result

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/0e7b987b/ambari-agent/src/main/python/resource_management/core/script.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/core/script.py b/ambari-agent/src/main/python/resource_management/core/script.py
index d64010a..44bdbcd 100644
--- a/ambari-agent/src/main/python/resource_management/core/script.py
+++ b/ambari-agent/src/main/python/resource_management/core/script.py
@@ -37,7 +37,6 @@ class Script():
 
 
   def start(self, env, params):  # TODO: just for test runs; remove
-    env.set_prefixes("ddd")
     print "Start!"
     pass
 

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/0e7b987b/ambari-agent/src/main/python/resource_management/core/utils.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/core/utils.py b/ambari-agent/src/main/python/resource_management/core/utils.py
index 856c2a6..4cd5207 100644
--- a/ambari-agent/src/main/python/resource_management/core/utils.py
+++ b/ambari-agent/src/main/python/resource_management/core/utils.py
@@ -1,3 +1,5 @@
+from resource_management.core.exceptions import Fail
+
 class AttributeDictionary(object):
   def __init__(self, *args, **kwargs):
     d = kwargs
@@ -76,11 +78,14 @@ class ParamsAttributeDictionary(AttributeDictionary):
     super(AttributeDictionary, self).__setattr__("substitutor", substitutor)
 
   def __getitem__(self, name):
-    val = self.substitutor.get_subdict(name, self._dict)
-    return self._convert_value(val)
-
+    try:
+      return self._convert_value(self._dict[name])
+    except KeyError as ex:
+      raise Fail("Configuration $%s not found!" % str(ex).strip("'"))
+  
   def copy(self):
-    return ParamsAttributeDictionary(self.substitutor, self._dict)
+    # don't allow real copying to be able to change params passed to jinja2
+    return self
 
   def __unicode__(self):
     if isinstance(self._dict, str):