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

[02/15] git commit: AMBARI-3653. File: refactor, handle special exceptional situations, support replace attribute, support absolute path for source files, default don't backup (Andrew Onischuk via dlysnichenko)

AMBARI-3653. File: refactor, handle special exceptional situations, support replace attribute, support absolute path for source files, default don't backup (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/99ac88e1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/99ac88e1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/99ac88e1

Branch: refs/heads/trunk
Commit: 99ac88e1c60a54163df693160539e4d4e62f6d4e
Parents: 85bdf2b
Author: Lisnichenko Dmitro <dl...@hortonworks.com>
Authored: Fri Nov 1 17:06:41 2013 +0200
Committer: Lisnichenko Dmitro <dl...@hortonworks.com>
Committed: Fri Nov 1 17:06:41 2013 +0200

----------------------------------------------------------------------
 .../resource_management/providers/system.py     | 32 ++++++++++++++------
 .../resource_management/resources/system.py     |  4 ++-
 .../main/python/resource_management/source.py   | 20 +++++++++---
 3 files changed, 42 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/99ac88e1/ambari-agent/src/main/python/resource_management/providers/system.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/providers/system.py b/ambari-agent/src/main/python/resource_management/providers/system.py
index b1ce3b9..d366942 100644
--- a/ambari-agent/src/main/python/resource_management/providers/system.py
+++ b/ambari-agent/src/main/python/resource_management/providers/system.py
@@ -13,7 +13,10 @@ def _coerce_uid(user):
   try:
     uid = int(user)
   except ValueError:
-    uid = pwd.getpwnam(user).pw_uid
+    try:
+      uid = pwd.getpwnam(user).pw_uid
+    except KeyError:
+      raise Fail("User %s doesn't exist." % user)
   return uid
 
 
@@ -21,7 +24,10 @@ def _coerce_gid(group):
   try:
     gid = int(group)
   except ValueError:
-    gid = grp.getgrnam(group).gr_gid
+    try:
+      gid = grp.getgrnam(group).gr_gid
+    except KeyError:
+      raise Fail("Group %s doesn't exist." % group)
   return gid
 
 
@@ -59,19 +65,28 @@ def _ensure_metadata(path, user, group, mode=None, log=None):
 class FileProvider(Provider):
   def action_create(self):
     path = self.resource.path
+    
+    if os.path.isdir(path):
+      raise Fail("Applying %s failed, directory with name %s exists" % (self.resource, path))
+    
+    dirname = os.path.dirname(path)
+    if not os.path.isdir(dirname):
+      raise Fail("Applying %s failed, parent directory %s doesn't exist" % (self.resource, dirname))
+    
     write = False
     content = self._get_content()
     if not os.path.exists(path):
       write = True
       reason = "it doesn't exist"
-    else:
+    elif self.resource.replace:
       if content is not None:
         with open(path, "rb") as fp:
           old_content = fp.read()
         if content != old_content:
           write = True
           reason = "contents don't match"
-          self.resource.env.backup_file(path)
+          if self.resource.backup:
+            self.resource.env.backup_file(path)
 
     if write:
       self.log.info("Writing %s because %s" % (self.resource, reason))
@@ -87,16 +102,15 @@ class FileProvider(Provider):
 
   def action_delete(self):
     path = self.resource.path
+    
+    if os.path.isdir(path):
+      raise Fail("Applying %s failed, %s is directory not file!" % (self.resource, path))
+    
     if os.path.exists(path):
       self.log.info("Deleting %s" % self.resource)
       os.unlink(path)
       self.resource.updated()
 
-  def action_touch(self):
-    path = self.resource.path
-    with open(path, "a"):
-      pass
-
   def _get_content(self):
     content = self.resource.content
     if content is None:

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/99ac88e1/ambari-agent/src/main/python/resource_management/resources/system.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/resources/system.py b/ambari-agent/src/main/python/resource_management/resources/system.py
index 96da5e4..7765102 100644
--- a/ambari-agent/src/main/python/resource_management/resources/system.py
+++ b/ambari-agent/src/main/python/resource_management/resources/system.py
@@ -11,8 +11,10 @@ class File(Resource):
   owner = ResourceArgument()
   group = ResourceArgument()
   content = ResourceArgument()
+  # whether to replace files with different content
+  replace = ResourceArgument(default=True)
 
-  actions = Resource.actions + ["create", "delete", "touch"]
+  actions = Resource.actions + ["create", "delete"]
 
 
 class Directory(Resource):

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/99ac88e1/ambari-agent/src/main/python/resource_management/source.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/resource_management/source.py b/ambari-agent/src/main/python/resource_management/source.py
index ea3a25f..925bd65 100644
--- a/ambari-agent/src/main/python/resource_management/source.py
+++ b/ambari-agent/src/main/python/resource_management/source.py
@@ -27,8 +27,14 @@ class StaticFile(Source):
     self.env = env or environment.Environment.get_instance()
 
   def get_content(self):
-    basedir = self.env.config.basedir
-    path = os.path.join(basedir, "files", self.name)
+    # absolute path
+    if self.name.startswith(os.path.sep):
+      path = self.name
+    # relative path
+    else:
+      basedir = self.env.config.basedir
+      path = os.path.join(basedir, "files", self.name)
+      
     with open(path, "rb") as fp:
       return fp.read()
 
@@ -45,8 +51,14 @@ else:
       self.env = env or environment.Environment.get_instance()
 
     def get_source(self, environment, template_name):
-      basedir = self.env.config.basedir
-      path = os.path.join(basedir, "templates", template_name)
+      # absolute path
+      if template_name.startswith(os.path.sep):
+        path = template_name
+      # relative path
+      else:
+        basedir = self.env.config.basedir
+        path = os.path.join(basedir, "templates", template_name)
+      
       if not os.path.exists(path):
         raise TemplateNotFound("%s at %s" % (template_name, path))
       mtime = os.path.getmtime(path)