You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ao...@apache.org on 2015/12/16 12:10:43 UTC

[5/5] ambari git commit: AMBARI-14396. Add support for recursive chown in resource management library. (aonishuk)

AMBARI-14396. Add support for recursive chown in resource management library. (aonishuk)


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

Branch: refs/heads/trunk
Commit: 92c054b1d6fcc0dc436ae4ff6b1cd9b8da68b459
Parents: 314bbc6
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Wed Dec 16 13:10:29 2015 +0200
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Wed Dec 16 13:10:29 2015 +0200

----------------------------------------------------------------------
 .../TestDirectoryResource.py                    |  2 +-
 .../core/providers/system.py                    | 32 ++++++-
 .../core/resources/system.py                    | 79 ++++++++++++++++-
 .../python/resource_management/core/sudo.py     | 35 +++++++-
 .../libraries/functions/conf_select.py          |  2 +-
 .../functions/setup_ranger_plugin_xml.py        |  2 +-
 .../libraries/script/script.py                  |  2 +-
 .../2.0.7/services/HIVE/package/scripts/hcat.py |  2 +-
 .../2.0.7/services/HIVE/package/scripts/hive.py |  4 +-
 .../package/scripts/accumulo_configuration.py   |  8 +-
 .../package/scripts/accumulo_service.py         | 12 ++-
 .../AMBARI_METRICS/0.1.0/package/scripts/ams.py | 38 ++++----
 .../0.1.0/package/scripts/hbase.py              | 37 +++-----
 .../ATLAS/0.1.0.2.3/package/scripts/metadata.py | 10 +--
 .../FALCON/0.5.0.2.1/package/scripts/falcon.py  | 26 +++---
 .../FLUME/1.4.0.2.0/package/scripts/flume.py    |  2 +-
 .../GANGLIA/3.5.0/package/scripts/ganglia.py    |  2 +-
 .../3.5.0/package/scripts/ganglia_monitor.py    |  2 +-
 .../3.5.0/package/scripts/ganglia_server.py     | 13 ++-
 .../HAWQ/2.0.0/package/scripts/common.py        |  4 +-
 .../HAWQ/2.0.0/package/scripts/utils.py         |  2 +-
 .../HBASE/0.96.0.2.0/package/scripts/hbase.py   | 12 +--
 .../HDFS/2.1.0.2.0/package/scripts/hdfs.py      |  8 +-
 .../2.1.0.2.0/package/scripts/hdfs_datanode.py  |  6 +-
 .../2.1.0.2.0/package/scripts/hdfs_namenode.py  | 10 +--
 .../2.1.0.2.0/package/scripts/hdfs_snamenode.py |  2 +-
 .../2.1.0.2.0/package/scripts/journalnode.py    |  2 +-
 .../HDFS/2.1.0.2.0/package/scripts/utils.py     |  4 +-
 .../HIVE/0.12.0.2.0/package/scripts/hcat.py     |  6 +-
 .../HIVE/0.12.0.2.0/package/scripts/hive.py     |  8 +-
 .../package/scripts/hive_metastore.py           |  2 +-
 .../HIVE/0.12.0.2.0/package/scripts/webhcat.py  |  8 +-
 .../KAFKA/0.8.1.2.2/package/scripts/kafka.py    | 48 +++-------
 .../package/scripts/kerberos_common.py          |  6 +-
 .../package/scripts/kerberos_server.py          |  4 +-
 .../KNOX/0.5.0.2.2/package/scripts/knox.py      | 40 +++------
 .../MAHOUT/1.0.0.2.3/package/scripts/mahout.py  |  2 +-
 .../OOZIE/4.0.0.2.0/package/scripts/oozie.py    | 26 ++++--
 .../PIG/0.12.0.2.0/package/scripts/pig.py       |  2 +-
 .../PXF/3.0.0/package/scripts/pxf.py            |  2 +-
 .../0.4.0/package/scripts/ranger_service.py     |  6 +-
 .../0.4.0/package/scripts/setup_ranger_xml.py   | 12 ++-
 .../RANGER_KMS/0.5.0.2.3/package/scripts/kms.py | 14 +--
 .../SLIDER/0.60.0.2.2/package/scripts/slider.py |  4 +-
 .../1.2.0.2.2/package/scripts/setup_spark.py    |  2 +-
 .../SQOOP/1.4.4.2.0/package/scripts/sqoop.py    |  2 +-
 .../STORM/0.9.1.2.1/package/scripts/storm.py    |  8 +-
 .../0.9.1.2.1/package/scripts/storm_upgrade.py  |  4 +-
 .../TEZ/0.4.0.2.1/package/scripts/tez.py        |  2 +-
 .../YARN/2.1.0.2.0/package/scripts/yarn.py      | 39 +++++----
 .../3.4.5.2.0/package/scripts/zookeeper.py      | 10 +--
 .../custom_actions/scripts/check_host.py        |  2 +-
 .../before-ANY/scripts/shared_initialization.py |  2 +-
 .../scripts/shared_initialization.py            |  6 +-
 .../0.8/services/FLUME/package/scripts/flume.py |  2 +-
 .../services/GANGLIA/package/scripts/ganglia.py |  2 +-
 .../GANGLIA/package/scripts/ganglia_monitor.py  |  2 +-
 .../GANGLIA/package/scripts/ganglia_server.py   |  6 +-
 .../0.8/services/HBASE/package/scripts/hbase.py | 10 +--
 .../0.8/services/HDFS/package/scripts/hdfs.py   |  2 +-
 .../HDFS/package/scripts/hdfs_datanode.py       |  4 +-
 .../HDFS/package/scripts/hdfs_namenode.py       |  4 +-
 .../HDFS/package/scripts/hdfs_snamenode.py      |  2 +-
 .../HDFS/package/scripts/journalnode.py         |  2 +-
 .../0.8/services/HDFS/package/scripts/utils.py  |  4 +-
 .../0.8/services/HIVE/package/scripts/hcat.py   |  6 +-
 .../0.8/services/HIVE/package/scripts/hive.py   |  4 +-
 .../services/HIVE/package/scripts/webhcat.py    |  6 +-
 .../0.8/services/OOZIE/package/scripts/oozie.py |  4 +-
 .../0.8/services/PIG/package/scripts/pig.py     |  2 +-
 .../package/scripts/mapred_service_check.py     |  2 +-
 .../0.8/services/YARN/package/scripts/yarn.py   | 10 +--
 .../ZOOKEEPER/package/scripts/zookeeper.py      |  8 +-
 .../before-ANY/scripts/shared_initialization.py | 18 ++--
 .../before-START/scripts/rack_awareness.py      |  4 +-
 .../scripts/shared_initialization.py            |  8 +-
 .../services/FALCON/package/scripts/falcon.py   |  4 +-
 .../services/STORM/package/scripts/storm.py     |  2 +-
 .../services/TEZ/package/scripts/tez.py         |  2 +-
 .../services/YARN/package/scripts/yarn.py       | 10 +--
 .../AMBARI_METRICS/test_metrics_collector.py    | 43 ++++-----
 .../python/stacks/2.0.6/FLUME/test_flume.py     |  8 +-
 .../2.0.6/GANGLIA/test_ganglia_monitor.py       |  4 +-
 .../stacks/2.0.6/GANGLIA/test_ganglia_server.py | 15 ++--
 .../stacks/2.0.6/HBASE/test_hbase_client.py     | 16 ++--
 .../stacks/2.0.6/HBASE/test_hbase_master.py     | 36 ++++----
 .../2.0.6/HBASE/test_hbase_regionserver.py      | 48 +++++-----
 .../2.0.6/HBASE/test_phoenix_queryserver.py     | 32 +++----
 .../python/stacks/2.0.6/HDFS/test_datanode.py   | 40 ++++-----
 .../stacks/2.0.6/HDFS/test_hdfs_client.py       |  2 +-
 .../stacks/2.0.6/HDFS/test_journalnode.py       | 24 ++---
 .../python/stacks/2.0.6/HDFS/test_namenode.py   | 60 ++++++-------
 .../python/stacks/2.0.6/HDFS/test_nfsgateway.py | 16 ++--
 .../python/stacks/2.0.6/HDFS/test_snamenode.py  | 26 +++---
 .../test/python/stacks/2.0.6/HDFS/test_zkfc.py  | 40 ++++-----
 .../stacks/2.0.6/HIVE/test_hcat_client.py       | 12 +--
 .../stacks/2.0.6/HIVE/test_hive_client.py       |  8 +-
 .../stacks/2.0.6/HIVE/test_hive_metastore.py    | 30 +++----
 .../stacks/2.0.6/HIVE/test_hive_server.py       | 20 ++---
 .../stacks/2.0.6/HIVE/test_webhcat_server.py    | 24 ++---
 .../stacks/2.0.6/OOZIE/test_oozie_client.py     |  6 +-
 .../stacks/2.0.6/OOZIE/test_oozie_server.py     | 92 ++++++++++----------
 .../python/stacks/2.0.6/PIG/test_pig_client.py  |  6 +-
 .../python/stacks/2.0.6/SQOOP/test_sqoop.py     |  4 +-
 .../stacks/2.0.6/YARN/test_historyserver.py     | 48 +++++-----
 .../stacks/2.0.6/YARN/test_mapreduce2_client.py | 36 ++++----
 .../stacks/2.0.6/YARN/test_nodemanager.py       | 82 +++++++++--------
 .../stacks/2.0.6/YARN/test_resourcemanager.py   | 36 ++++----
 .../stacks/2.0.6/YARN/test_yarn_client.py       | 54 ++++++------
 .../2.0.6/ZOOKEEPER/test_zookeeper_client.py    | 16 ++--
 .../2.0.6/ZOOKEEPER/test_zookeeper_server.py    | 16 ++--
 .../2.0.6/hooks/before-ANY/test_before_any.py   | 17 ++--
 .../hooks/before-START/test_before_start.py     | 24 ++---
 .../stacks/2.1/FALCON/test_falcon_client.py     | 12 +--
 .../stacks/2.1/FALCON/test_falcon_server.py     | 48 +++++-----
 .../stacks/2.1/HIVE/test_hive_metastore.py      | 30 +++----
 .../python/stacks/2.1/STORM/test_storm_base.py  | 16 ++--
 .../python/stacks/2.1/TEZ/test_tez_client.py    |  2 +-
 .../stacks/2.1/YARN/test_apptimelineserver.py   | 20 ++---
 .../stacks/2.2/KAFKA/test_kafka_broker.py       | 62 +++++--------
 .../stacks/2.2/KERBEROS/test_kerberos_client.py | 14 +--
 .../stacks/2.2/KERBEROS/test_kerberos_server.py | 24 ++---
 .../python/stacks/2.2/KNOX/test_knox_gateway.py | 55 +++++-------
 .../stacks/2.2/SLIDER/test_slider_client.py     |  4 +-
 .../stacks/2.2/SPARK/test_job_history_server.py |  8 +-
 .../stacks/2.2/SPARK/test_spark_client.py       |  8 +-
 .../stacks/2.3/ATLAS/test_metadata_server.py    | 10 +--
 .../stacks/2.3/MAHOUT/test_mahout_client.py     |  2 +-
 .../src/test/python/stacks/2.3/PXF/test_pxf.py  |  2 +-
 .../2.3/SPARK/test_spark_thrift_server.py       |  4 +-
 .../python/stacks/2.3/STORM/test_storm_base.py  | 16 ++--
 .../test/python/stacks/2.3/YARN/test_ats_1_5.py | 20 ++---
 .../HIVE/0.11.0.2.0.5.0/package/scripts/hcat.py |  2 +-
 .../HIVE/0.11.0.2.0.5.0/package/scripts/hive.py |  4 +-
 .../dummy_stack/HIVE/package/scripts/hcat.py    |  2 +-
 .../dummy_stack/HIVE/package/scripts/hive.py    |  4 +-
 .../2.0.7/services/HIVE/package/scripts/hcat.py |  2 +-
 .../2.0.7/services/HIVE/package/scripts/hive.py |  4 +-
 138 files changed, 1064 insertions(+), 1009 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py b/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py
index 011be6d..867fbc8 100644
--- a/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py
+++ b/ambari-agent/src/test/python/resource_management/TestDirectoryResource.py
@@ -63,7 +63,7 @@ class TestDirectoryResource(TestCase):
            mode=0777,
            owner="hdfs",
            group="hadoop",
-           recursive=True
+           create_parents = True
       )
       
     os_makedirs_mock.assert_called_with('/a/b/c/d', 0777)

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-common/src/main/python/resource_management/core/providers/system.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/core/providers/system.py b/ambari-common/src/main/python/resource_management/core/providers/system.py
index 4feacee..5066fa8 100644
--- a/ambari-common/src/main/python/resource_management/core/providers/system.py
+++ b/ambari-common/src/main/python/resource_management/core/providers/system.py
@@ -34,7 +34,12 @@ from resource_management.core import ExecuteTimeoutException
 from resource_management.core.providers import Provider
 from resource_management.core.logger import Logger
 
-def _ensure_metadata(path, user, group, mode=None, cd_access=None):
+def assert_not_safemode_folder(path, safemode_folders):
+  if os.path.abspath(path) in safemode_folders:
+    raise Fail(("Not performing recursive operation ('recursive_ownership' or 'recursive_mode_flags') on folder '%s'" +
+    " as this can damage the system. Please pass changed safemode_folders parameter to Directory resource if you really intend to do this.") % (path))
+
+def _ensure_metadata(path, user, group, mode=None, cd_access=None, recursive_ownership=False, recursive_mode_flags=None, recursion_follow_links=False, safemode_folders=[]):
   user_entity = group_entity = None
 
   if user or group:
@@ -62,7 +67,26 @@ def _ensure_metadata(path, user, group, mode=None, cd_access=None):
       Logger.info(
         "Changing group for %s from %d to %s" % (path, stat.st_gid, group))
   
+  if recursive_ownership:
+    assert_not_safemode_folder(path, safemode_folders)
+    sudo.chown_recursive(path, _user_entity, _group_entity, recursion_follow_links)
+  
   sudo.chown(path, user_entity, group_entity)
+  
+  if recursive_mode_flags:
+    if not isinstance(recursive_mode_flags, dict):
+      raise Fail("'recursion_follow_links' value should be a dictionary with 'f' and(or) 'd' key (for file and directory permission flags)")
+    
+    regexp_to_match = "^({0},)*({0})$".format("[ugoa]+[+=-][rwx]+" )
+    for key, flags in recursive_mode_flags.iteritems():
+      if key != 'd' and key != 'f':
+        raise Fail("'recursive_mode_flags' with value '%s' has unknown key '%s', only keys 'f' and 'd' are valid" % (str(recursive_mode_flags), str(key)))
+          
+      if not re.match(regexp_to_match, flags):
+        raise Fail("'recursive_mode_flags' found '%s', but should value format have the following format: [ugoa...][[+-=][perms...]...]." % (str(flags)))
+    
+    assert_not_safemode_folder(path, safemode_folders)
+    sudo.chmod_recursive(path, recursive_mode_flags, recursion_follow_links)
 
   if mode:
     stat = sudo.stat(path)
@@ -156,7 +180,7 @@ class DirectoryProvider(Provider):
         if path != self.resource.path:
           Logger.info("Following the link {0} to {1} to create the directory".format(self.resource.path, path))
 
-      if self.resource.recursive:
+      if self.resource.create_parents:
         sudo.makedirs(path, self.resource.mode or 0755)
       else:
         dirname = os.path.dirname(path)
@@ -169,7 +193,9 @@ class DirectoryProvider(Provider):
       raise Fail("Applying %s failed, file %s already exists" % (self.resource, path))
     
     _ensure_metadata(path, self.resource.owner, self.resource.group,
-                        mode=self.resource.mode, cd_access=self.resource.cd_access)
+                        mode=self.resource.mode, cd_access=self.resource.cd_access,
+                        recursive_ownership=self.resource.recursive_ownership, recursive_mode_flags=self.resource.recursive_mode_flags, 
+                        recursion_follow_links=self.resource.recursion_follow_links, safemode_folders=self.resource.safemode_folders)
 
   def action_delete(self):
     path = self.resource.path

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-common/src/main/python/resource_management/core/resources/system.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/core/resources/system.py b/ambari-common/src/main/python/resource_management/core/resources/system.py
index 558bb2b..6860735 100644
--- a/ambari-common/src/main/python/resource_management/core/resources/system.py
+++ b/ambari-common/src/main/python/resource_management/core/resources/system.py
@@ -60,10 +60,11 @@ class Directory(Resource):
   group = ResourceArgument()
   follow = BooleanArgument(default=True)  # follow links?
   """
-  this works for 'create', 'delete' is anyway recursive
-  recursive means only "mkdir -p", it does NOT perform recursive chown/chmod
+  Example:
+  Directory('/a/b/c/d', create_parents=False) # will fail unless /a/b/c exists
+  Directory('/a/b/c/d', create_parents=True) # will succeed if /a/b/c doesn't exists
   """
-  recursive = BooleanArgument(default=False)
+  create_parents = BooleanArgument(default=False)
   """
   Grants x-bit for all the folders up-to the directory
   
@@ -75,6 +76,78 @@ class Directory(Resource):
   The letters can be combined together.
   """
   cd_access = ResourceArgument()
+  """
+  If True sets the user and group mentioned in arguments, for all the contents of folder and its subfolder.
+  
+  CAUNTION: THIS IS NO RECOMENDED TO USE THIS, please treat such a usages as last resort hacks. 
+  The problem with using recursive permissions setting is that the system can be damaged badly by doing this,
+  imagine recursively setting for '/' or '/etc' (it can break the system) or other important for user folder.
+  This is partially fixed by 'safemode_folders' feature, but still is risky.
+  
+  See also: safemode_folders, recursion_follow_links
+  """
+  recursive_ownership = BooleanArgument(default=False)
+  
+  """
+  A dictionary, which gives the mode flags which should be set for files in key 'f', and for
+  directories in key 'd'.
+  
+  The format of those flags should be symbolic format used in chmod. From chmod man page:
+  the format of a symbolic mode is [ugoa...][[+-=][perms...]...], 
+  where perms is either zero or more letters from the set rwxXst, or a single letter from the set ugo.  
+  Multiple symbolic modes can be given, separated  by commas.
+  
+  u - user who is owner
+  g - user from group
+  o - other users
+  a - all
+  
+  Example:
+  recursive_mode_flags = {
+    'd': 'u+rwx,g+rx' # for subfolders, enforce 'rwx' (read,write,execute) for owner of the file, and 'rx' (read,execute) for group, don't change 'others' permissions
+    'f': 'u+rw,go+r' # for files in the directory, enforce 'rw' (read, write) for owner of the file, and 'r' (read) for group and others.
+  }
+  
+  recursive_mode_flags = {
+    'd': 'a+rwx' # for subfolders, enforce rwxrwxrwx (777) permisons. 
+    'f': 'a+rw' # for files in the directory, enforce adding 'rw' (read,write) to original permissions. If file had 'x' bit before it will stay there.
+  }
+  
+  CAUNTION: THIS IS NO RECOMENDED TO USE THIS, please treat such a usages as last resort hacks. 
+  The problem with using recursive permissions setting is that the system can be damaged badly by doing this,
+  imagine recursively setting permissions for '/' or '/etc' (it can break the system) or other important for user folder.
+  This is partially fixed by 'safemode_folders' feature, but still is risky. 
+  
+  See also: safemode_folders, recursion_follow_links   
+  """
+  recursive_mode_flags = ResourceArgument(default=None)
+  
+  """
+  This is the list folder which are not allowed to be recursively chmod-ed or chown-ed. (recursive_ownership and recursive_mode_flags).
+  Fail exception will appear if tried.
+  
+  Example of a dangerous code, which will not be succeed:
+  Directory("/",
+    owner="my_user", 
+    recursive_ownership=True
+  )
+  
+  This aims to the resolve the problem of mistakenly doing recursive actions for system necessary folders.
+  which results in damaging the operating system.
+  """
+  safemode_folders =  ForcedListArgument(default=["/", "/bin", "/sbin", "/etc", "/dev",
+                                                  "/proc", "/var", "/usr", "/home", "/boot", "/lib", "/opt",
+                                                  "/mnt", "/media", "/srv", "/root", "/sys" ])
+  
+  """
+  If True while recursive chown/chmod is done (recursive_ownership or recursive_mode_flags),
+  symlinks will be followed, duing recursion walking, also 
+  this will also make chmod/chown to set permissions for symlink targets, not for symlink itself.
+  
+  Note: if recursion_follow_links=False chmod will not set permissions nor on symlink neither on targets. 
+  As according to chmod man: 'This is not a problem since the permissions of symbolic links are never used'. 
+  """
+  recursion_follow_links = BooleanArgument(default=False)
 
   actions = Resource.actions + ["create", "delete"]
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-common/src/main/python/resource_management/core/sudo.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/core/sudo.py b/ambari-common/src/main/python/resource_management/core/sudo.py
index 46fa9d0..bb28d9f 100644
--- a/ambari-common/src/main/python/resource_management/core/sudo.py
+++ b/ambari-common/src/main/python/resource_management/core/sudo.py
@@ -36,6 +36,21 @@ if os.geteuid() == 0:
     gid = group.gr_gid if group else -1
     if uid != -1 or gid != -1:
       return os.chown(path, uid, gid)
+      
+  def chown_recursive(path, owner, group, follow_links=False):
+    uid = owner.pw_uid if owner else -1
+    gid = group.gr_gid if group else -1
+    
+    if uid == -1 and gid == -1:
+      return
+      
+    for root, dirs, files in os.walk(path, followlinks=follow_links):
+      for name in files + dirs:
+        if follow_links:
+          os.chown(os.path.join(root, name), uid, gid)
+        else:
+          os.lchown(os.path.join(root, name), uid, gid)
+            
   
   def chmod(path, mode):
     return os.chmod(path, mode)
@@ -112,7 +127,6 @@ if os.geteuid() == 0:
     
     
 else:
-
   # os.chown replacement
   def chown(path, owner, group):
     owner = owner.pw_name if owner else ""
@@ -120,6 +134,15 @@ else:
     if owner or group:
       shell.checked_call(["chown", owner+":"+group, path], sudo=True)
       
+  def chown_recursive(path, owner, group, follow_links=False):
+    owner = owner.pw_name if owner else ""
+    group = group.gr_name if group else ""
+    if owner or group:
+      flags = ["-R"]
+      if follow_links:
+        flags.append("-L")
+      shell.checked_call(["chown"] + flags + [owner+":"+group, path], sudo=True)
+      
   # os.chmod replacement
   def chmod(path, mode):
     shell.checked_call(["chmod", oct(mode), path], sudo=True)
@@ -226,4 +249,12 @@ else:
     
   # shutil.copy replacement
   def copy(src, dst):
-    shell.checked_call(["sudo", "cp", "-r", src, dst], sudo=True)
\ No newline at end of file
+    shell.checked_call(["sudo", "cp", "-r", src, dst], sudo=True)
+    
+def chmod_recursive(path, recursive_mode_flags, recursion_follow_links):
+  find_flags = []
+  if recursion_follow_links:
+    find_flags.append('-L')
+    
+  for key, flags in recursive_mode_flags.iteritems():
+    shell.checked_call(["find"] + find_flags + [path, "-type", key, "-exec" , "chmod", flags ,"{}" ,";"])
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py b/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py
index a3f64bf..2bc01ee 100644
--- a/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/conf_select.py
@@ -228,7 +228,7 @@ def create(stack_name, package, version, dry_run = False):
       Directory(d,
           mode=0755,
           cd_access='a',
-          recursive=True)
+          create_parents=True)
 
   return dirs
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py b/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py
index 29ffe0d..d6f6deb 100644
--- a/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/setup_ranger_plugin_xml.py
@@ -90,7 +90,7 @@ def setup_ranger_plugin(component_select_name, service_name,
       owner = component_user,
       group = component_group,
       mode=0775,
-      recursive = True,
+      create_parents = True,
       cd_access = 'a'
     )
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-common/src/main/python/resource_management/libraries/script/script.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/script/script.py b/ambari-common/src/main/python/resource_management/libraries/script/script.py
index 09ca118..c954a15 100644
--- a/ambari-common/src/main/python/resource_management/libraries/script/script.py
+++ b/ambari-common/src/main/python/resource_management/libraries/script/script.py
@@ -610,7 +610,7 @@ class Script(object):
     env_configs_list = config['commandParams']['env_configs_list']
     properties_configs_list = config['commandParams']['properties_configs_list']
 
-    Directory(self.get_tmp_dir(), recursive=True)
+    Directory(self.get_tmp_dir(), create_parents = True)
 
     conf_tmp_dir = tempfile.mkdtemp(dir=self.get_tmp_dir())
     output_filename = os.path.join(self.get_tmp_dir(), config['commandParams']['output_file'])

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py
index 2993d3a..29de1c0 100644
--- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py
+++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hcat.py
@@ -32,7 +32,7 @@ def hcat():
 
   Directory(params.hcat_pid_dir,
             owner=params.webhcat_user,
-            recursive=True
+            create_parents = True
   )
 
   hcat_TemplateConfig('hcat-env.sh')

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py
----------------------------------------------------------------------
diff --git a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py
index 63e7fa3..f813755 100644
--- a/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py
+++ b/ambari-funtest/src/test/resources/stacks/HDP/2.0.7/services/HIVE/package/scripts/hive.py
@@ -36,7 +36,7 @@ def hive(name=None):
   Directory(hive_config_dir,
             owner=params.hive_user,
             group=params.user_group,
-            recursive=True
+            create_parents = True
   )
 
   XmlConfig("hive-site.xml",
@@ -87,7 +87,7 @@ def crt_directory(name):
   import params
 
   Directory(name,
-            recursive=True,
+            create_parents = True,
             owner=params.hive_user,
             group=params.user_group,
             mode=0755)

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_configuration.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_configuration.py b/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_configuration.py
index acc340f..09a3d90 100644
--- a/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_configuration.py
+++ b/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_configuration.py
@@ -29,7 +29,7 @@ def setup_conf_dir(name=None): # 'master' or 'tserver' or 'monitor' or 'gc' or '
       mode=0755,
       owner = params.accumulo_user,
       group = params.user_group,
-      recursive = True
+      create_parents = True
   )
 
   if name == 'client':
@@ -65,7 +65,7 @@ def setup_conf_dir(name=None): # 'master' or 'tserver' or 'monitor' or 'gc' or '
                mode=0700,
                owner = params.accumulo_user,
                group = params.user_group,
-               recursive = True
+               create_parents = True
     )
     # create a site file for server processes
     configs = {}
@@ -85,7 +85,7 @@ def setup_conf_dir(name=None): # 'master' or 'tserver' or 'monitor' or 'gc' or '
     Directory( params.pid_dir,
                owner = params.accumulo_user,
                group = params.user_group,
-               recursive = True,
+               create_parents = True,
                cd_access = "a",
                mode = 0755,
     )
@@ -94,7 +94,7 @@ def setup_conf_dir(name=None): # 'master' or 'tserver' or 'monitor' or 'gc' or '
     Directory (params.log_dir,
                owner = params.accumulo_user,
                group = params.user_group,
-               recursive = True,
+               create_parents = True,
                cd_access = "a",
                mode = 0755,
     )

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_service.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_service.py b/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_service.py
index a4e9c54..0d9687b 100644
--- a/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_service.py
+++ b/ambari-server/src/main/resources/common-services/ACCUMULO/1.6.1.2.2.0/package/scripts/accumulo_service.py
@@ -20,6 +20,7 @@ limitations under the License.
 
 from resource_management import *
 import time
+import os
 
 def accumulo_service( name,
                       action = 'start'): # 'start' or 'stop' or 'status'
@@ -31,10 +32,13 @@ def accumulo_service( name,
     pid_exists = format("ls {pid_file} >/dev/null 2>&1 && ps `cat {pid_file}` >/dev/null 2>&1")
 
     if action == 'start':
-      Execute(as_sudo(['chown','-R',params.accumulo_user+":"+params.user_group,
-                       format("$(getent passwd {accumulo_user} | cut -d: -f6)")],
-                      auto_escape=False),
-              ignore_failures=True)
+      Directory(os.path.expanduser("~"), 
+                user = params.accumulo_user,
+                group = params.user_group,
+                recursive_ownership = True,
+                ignore_failures=True
+      )
+      
       if name != 'tserver':
         Execute(format("{daemon_script} org.apache.accumulo.master.state.SetGoalState NORMAL"),
                 not_if=as_user(pid_exists, params.accumulo_user),

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams.py
index 8fdf4ba..94b9fc9 100644
--- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams.py
+++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/ams.py
@@ -34,12 +34,12 @@ def ams(name=None):
 
     Directory(params.ams_collector_conf_dir,
               owner=params.ams_user,
-              recursive=True
+              create_parents = True
     )
 
     Directory(params.ams_checkpoint_dir,
               owner=params.ams_user,
-              recursive=True
+              create_parents = True
     )
 
     XmlConfig("ams-site.xml",
@@ -155,7 +155,7 @@ def ams(name=None):
 
     Directory(params.ams_monitor_conf_dir,
               owner=params.ams_user,
-              recursive=True
+              create_parents = True
     )
 
     TemplateConfig(
@@ -184,24 +184,18 @@ def ams(name=None):
     Directory(params.ams_collector_conf_dir,
               owner=params.ams_user,
               group=params.user_group,
-              recursive=True
+              create_parents = True,
+              recursive_ownership = True,
     )
-
-    Execute(('chown', '-R', params.ams_user, params.ams_collector_conf_dir),
-            sudo=True
-            )
-
+    
     Directory(params.ams_checkpoint_dir,
               owner=params.ams_user,
               group=params.user_group,
               cd_access="a",
-              recursive=True
+              create_parents = True,
+              recursive_ownership = True
     )
 
-    Execute(('chown', '-R', params.ams_user, params.ams_checkpoint_dir),
-            sudo=True
-            )
-
     XmlConfig("ams-site.xml",
               conf_dir=params.ams_collector_conf_dir,
               configurations=params.config['configurations']['ams-site'],
@@ -249,7 +243,7 @@ def ams(name=None):
               owner=params.ams_user,
               group=params.user_group,
               cd_access="a",
-              recursive=True,
+              create_parents = True,
               mode=0755,
     )
 
@@ -257,7 +251,7 @@ def ams(name=None):
               owner=params.ams_user,
               group=params.user_group,
               cd_access="a",
-              recursive=True,
+              create_parents = True,
               mode=0755,
     )
 
@@ -269,7 +263,7 @@ def ams(name=None):
 
     # On some OS this folder could be not exists, so we will create it before pushing there files
     Directory(params.limits_conf_dir,
-              recursive=True,
+              create_parents = True,
               owner='root',
               group='root'
     )
@@ -289,7 +283,7 @@ def ams(name=None):
                 mode = 0755,
                 group=params.user_group,
                 cd_access="a",
-                recursive=True
+                create_parents = True
       )
     pass
 
@@ -337,28 +331,28 @@ def ams(name=None):
     Directory(params.ams_monitor_conf_dir,
               owner=params.ams_user,
               group=params.user_group,
-              recursive=True
+              create_parents = True
     )
 
     Directory(params.ams_monitor_log_dir,
               owner=params.ams_user,
               group=params.user_group,
               mode=0755,
-              recursive=True
+              create_parents = True
     )
 
     Directory(params.ams_monitor_pid_dir,
               owner=params.ams_user,
               group=params.user_group,
               mode=0755,
-              recursive=True
+              create_parents = True
     )
 
     Directory(format("{ams_monitor_dir}/psutil/build"),
               owner=params.ams_user,
               group=params.user_group,
               cd_access="a",
-              recursive=True)
+              create_parents = True)
 
     Execute(format("{sudo} chown -R {ams_user}:{user_group} {ams_monitor_dir}")
     )

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase.py b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase.py
index 2ddb8fe..556380e 100644
--- a/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase.py
+++ b/ambari-server/src/main/resources/common-services/AMBARI_METRICS/0.1.0/package/scripts/hbase.py
@@ -27,16 +27,16 @@ def hbase(name=None, action = None):
   import params
   Directory(params.hbase_conf_dir,
             owner = params.hadoop_user,
-            recursive = True
+            create_parents = True
   )
   Directory(params.hbase_tmp_dir,
-             recursive = True,
+             create_parents = True,
              owner = params.hadoop_user
   )
 
   Directory (os.path.join(params.local_dir, "jars"),
              owner = params.hadoop_user,
-             recursive = True
+             create_parents = True
   )
 
   XmlConfig("hbase-site.xml",
@@ -73,7 +73,7 @@ def hbase(name=None, action = None):
   if name != "client":
     Directory (params.hbase_log_dir,
                owner = params.hadoop_user,
-               recursive = True
+               create_parents = True
     )
 
   if (params.hbase_log4j_props != None):
@@ -94,29 +94,23 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
   Directory(params.hbase_conf_dir,
       owner = params.hbase_user,
       group = params.user_group,
-      recursive = True
+      create_parents = True,
+      recursive_ownership = True,
   )
 
-  Execute(('chown', '-R', params.hbase_user, params.hbase_conf_dir),
-          sudo=True
-          )
-
   Directory (params.hbase_tmp_dir,
              owner = params.hbase_user,
              cd_access="a",
-             recursive = True
+             create_parents = True,
+             recursive_ownership = True,
   )
 
-  Execute(('chown', '-R', params.hbase_user, params.hbase_tmp_dir),
-          sudo=True
-          )
-
   Directory (os.path.join(params.local_dir, "jars"),
              owner = params.hbase_user,
              group = params.user_group,
              cd_access="a",
              mode=0775,
-             recursive = True
+             create_parents = True
   )
 
   merged_ams_hbase_site = {}
@@ -139,7 +133,7 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
               mode = 0755,
               group=params.user_group,
               cd_access="a",
-              recursive=True
+              create_parents = True
     )
   pass
 
@@ -184,14 +178,14 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
   if name != "client":
     Directory( params.hbase_pid_dir,
                owner = params.hbase_user,
-               recursive = True,
+               create_parents = True,
                cd_access = "a",
                mode = 0755,
     )
 
     Directory (params.hbase_log_dir,
                owner = params.hbase_user,
-               recursive = True,
+               create_parents = True,
                cd_access = "a",
                mode = 0755,
     )
@@ -237,13 +231,10 @@ def hbase(name=None # 'master' or 'regionserver' or 'client'
       Directory(local_root_dir,
                 owner = params.hbase_user,
                 cd_access="a",
-                recursive = True
+                create_parents = True,
+                recursive_ownership = True
       )
 
-      Execute(('chown', '-R', params.hbase_user, local_root_dir),
-              sudo=True
-              )
-
       File(format("{params.hbase_pid_dir}/distributed_mode"), action="delete", owner=params.hbase_user)
 
   if params.hbase_log4j_props is not None:

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/metadata.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/metadata.py b/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/metadata.py
index 2dbb273..8c17214 100644
--- a/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/metadata.py
+++ b/ambari-server/src/main/resources/common-services/ATLAS/0.1.0.2.3/package/scripts/metadata.py
@@ -30,7 +30,7 @@ def metadata():
               cd_access='a',
               owner=params.metadata_user,
               group=params.user_group,
-              recursive=True
+              create_parents = True
     )
 
     Directory(params.conf_dir,
@@ -38,7 +38,7 @@ def metadata():
               cd_access='a',
               owner=params.metadata_user,
               group=params.user_group,
-              recursive=True
+              create_parents = True
     )
 
     Directory(params.log_dir,
@@ -46,7 +46,7 @@ def metadata():
               cd_access='a',
               owner=params.metadata_user,
               group=params.user_group,
-              recursive=True
+              create_parents = True
     )
 
     Directory(params.data_dir,
@@ -54,7 +54,7 @@ def metadata():
               cd_access='a',
               owner=params.metadata_user,
               group=params.user_group,
-              recursive=True
+              create_parents = True
     )
 
     Directory(params.expanded_war_dir,
@@ -62,7 +62,7 @@ def metadata():
               cd_access='a',
               owner=params.metadata_user,
               group=params.user_group,
-              recursive=True
+              create_parents = True
     )
 
     File(format("{expanded_war_dir}/atlas.war"),

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon.py b/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon.py
index 6c8d5ff..81ea39e 100644
--- a/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon.py
+++ b/ambari-server/src/main/resources/common-services/FALCON/0.5.0.2.1/package/scripts/falcon.py
@@ -41,33 +41,33 @@ def falcon(type, action = None, upgrade_type=None):
   if action == 'config':
     Directory(params.falcon_pid_dir,
       owner = params.falcon_user,
-      recursive = True,
+      create_parents = True,
       mode = 0755,
       cd_access = "a",
     )
 
     Directory(params.falcon_log_dir,
       owner = params.falcon_user,
-      recursive = True,
+      create_parents = True,
       mode = 0755,
       cd_access = "a",
     )
 
     Directory(params.falcon_webapp_dir,
       owner = params.falcon_user,
-      recursive = True)
+      create_parents = True)
 
     Directory(params.falcon_home,
       owner = params.falcon_user,
-      recursive = True)
+      create_parents = True)
 
     Directory(params.etc_prefix_dir,
       mode = 0755,
-      recursive = True)
+      create_parents = True)
 
     Directory(params.falcon_conf_dir,
       owner = params.falcon_user,
-      recursive = True)
+      create_parents = True)
 
     File(params.falcon_conf_dir + '/falcon-env.sh',
       content = InlineTemplate(params.falcon_env_sh_template),
@@ -95,7 +95,7 @@ def falcon(type, action = None, upgrade_type=None):
         owner = params.falcon_user,
         group = params.user_group,
         mode = 0775,
-        recursive = True,
+        create_parents = True,
         cd_access = "a")
 
     if params.falcon_graph_serialize_path:
@@ -103,7 +103,7 @@ def falcon(type, action = None, upgrade_type=None):
         owner = params.falcon_user,
         group = params.user_group,
         mode = 0775,
-        recursive = True,
+        create_parents = True,
         cd_access = "a")
 
   if type == 'server':
@@ -117,7 +117,7 @@ def falcon(type, action = None, upgrade_type=None):
       elif params.store_uri[0:4] == "file":
         Directory(params.store_uri[7:],
           owner = params.falcon_user,
-          recursive = True)
+          create_parents = True)
 
       # TODO change to proper mode
       params.HdfsResource(params.flacon_apps_dir,
@@ -135,7 +135,7 @@ def falcon(type, action = None, upgrade_type=None):
       elif params.falcon_store_uri[0:4] == "file":
         Directory(params.falcon_store_uri[7:],
           owner = params.falcon_user,
-          recursive = True)
+          create_parents = True)
 
       if params.supports_hive_dr:
         params.HdfsResource(params.dfs_data_mirroring_dir,
@@ -151,18 +151,18 @@ def falcon(type, action = None, upgrade_type=None):
       params.HdfsResource(None, action = "execute")
       Directory(params.falcon_local_dir,
         owner = params.falcon_user,
-        recursive = True,
+        create_parents = True,
         cd_access = "a")
 
       if params.falcon_embeddedmq_enabled == True:
         Directory(
           os.path.abspath(os.path.join(params.falcon_embeddedmq_data, "..")),
           owner = params.falcon_user,
-          recursive = True)
+          create_parents = True)
 
         Directory(params.falcon_embeddedmq_data,
           owner = params.falcon_user,
-          recursive = True)
+          create_parents = True)
 
     # although Falcon's falcon-config.sh will use 'which hadoop' to figure
     # this out, in an upgraded cluster, it's possible that 'which hadoop'

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume.py b/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume.py
index 293df58..b30b122 100644
--- a/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume.py
+++ b/ambari-server/src/main/resources/common-services/FLUME/1.4.0.2.0/package/scripts/flume.py
@@ -96,7 +96,7 @@ def flume(action = None):
     )
 
     Directory(params.flume_conf_dir,
-              recursive=True,
+              create_parents = True,
               owner=params.flume_user,
               )
     Directory(params.flume_log_dir, 

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia.py b/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia.py
index 69fde27..9a69b72 100644
--- a/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia.py
+++ b/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia.py
@@ -35,7 +35,7 @@ def config():
   Directory(shell_cmds_dir,
             owner="root",
             group="root",
-            recursive=True
+            create_parents = True
   )
   init_file("gmetad")
   init_file("gmond")

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_monitor.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_monitor.py b/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_monitor.py
index 05ceaff..feb0af3 100644
--- a/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_monitor.py
+++ b/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_monitor.py
@@ -71,7 +71,7 @@ class GangliaMonitor(Script):
     Directory(params.ganglia_conf_dir,
               owner="root",
               group=params.user_group,
-              recursive=True
+              create_parents = True
     )
 
     ganglia.config()

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_server.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_server.py b/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_server.py
index 1893483..8d75d7f 100644
--- a/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_server.py
+++ b/ambari-server/src/main/resources/common-services/GANGLIA/3.5.0/package/scripts/ganglia_server.py
@@ -83,14 +83,13 @@ def change_permission():
 
   Directory(os.path.abspath(os.path.join(params.ganglia_runtime_dir, "..")),
             mode=0755,
-            recursive=True
+            create_parents = True
   )
   Directory(params.dwoo_path,
             mode=0755,
-            recursive=True
-  )
-  Execute(('chown', '-R', params.web_user, params.dwoo_path),
-          sudo = True,
+            create_parents = True,
+            owner = params.web_user,
+            recursive_ownership = True,
   )
 
 def server_files():
@@ -98,7 +97,7 @@ def server_files():
 
   rrd_py_path = params.rrd_py_path
   Directory(rrd_py_path,
-            recursive=True
+            create_parents = True
   )
   rrd_py_file_path = path.join(rrd_py_path, "rrd.py")
   TemplateConfig(rrd_py_file_path,
@@ -112,7 +111,7 @@ def server_files():
             owner=rrd_file_owner,
             group=rrd_file_owner,
             mode=0755,
-            recursive=True
+            create_parents = True
   )
   
   if OSCheck.is_suse_family() or OSCheck.is_ubuntu_family():

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/common.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/common.py b/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/common.py
index ac81b11..5ca2049 100644
--- a/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/common.py
+++ b/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/common.py
@@ -223,7 +223,7 @@ def __update_limits_file():
   """
   import params
   # Ensure limits directory exists
-  Directory(hawq_constants.limits_conf_dir, recursive=True, owner=hawq_constants.root_user, group=hawq_constants.root_user)
+  Directory(hawq_constants.limits_conf_dir, create_parents = True, owner=hawq_constants.root_user, group=hawq_constants.root_user)
 
   # Generate limits for hawq user
   limits_file_content = "#### HAWQ Limits Parameters  ###########\n"
@@ -266,7 +266,7 @@ def __update_sysctl_file():
   Updates /etc/sysctl.d/hawq_sysctl.conf file with the HAWQ parameters on CentOS/RHEL.
   """
   # Ensure sys ctl sub-directory exists
-  Directory(hawq_constants.sysctl_conf_dir, recursive=True, owner=hawq_constants.root_user, group=hawq_constants.root_user)
+  Directory(hawq_constants.sysctl_conf_dir, create_parents = True, owner=hawq_constants.root_user, group=hawq_constants.root_user)
 
   # Generate temporary file with kernel parameters needed by hawq
   File(hawq_constants.hawq_sysctl_tmp_file, content=__convert_sysctl_dict_to_text(), owner=hawq_constants.hawq_user,

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/utils.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/utils.py b/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/utils.py
index 316c7f2..c1a38bb 100644
--- a/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/utils.py
+++ b/ambari-server/src/main/resources/common-services/HAWQ/2.0.0/package/scripts/utils.py
@@ -35,7 +35,7 @@ def create_dir_as_hawq_user(directory):
   """
   Creates directories with hawq_user and hawq_group (defaults to gpadmin:gpadmin)
   """
-  Directory(directory, recursive=True, owner=hawq_constants.hawq_user, group=hawq_constants.hawq_group)
+  Directory(directory, create_parents = True, owner=hawq_constants.hawq_user, group=hawq_constants.hawq_group)
 
 
 def exec_hawq_operation(operation, option, not_if=None, only_if=None, logoutput=True):

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
index 22b67e1..c407a93 100644
--- a/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
+++ b/ambari-server/src/main/resources/common-services/HBASE/0.96.0.2.0/package/scripts/hbase.py
@@ -53,13 +53,13 @@ def hbase(name=None):
   Directory( params.hbase_conf_dir,
       owner = params.hbase_user,
       group = params.user_group,
-      recursive = True
+      create_parents = True
   )
    
   Directory(params.java_io_tmpdir,
       owner = params.hbase_user,
       group = params.user_group,
-      recursive = True,
+      create_parents = True,
       mode=0777
   )
   parent_dir = os.path.dirname(params.tmp_dir)
@@ -68,7 +68,7 @@ def hbase(name=None):
     parent_dir = os.path.dirname(parent_dir)
   if parent_dir != os.path.abspath(os.sep) :
     Directory (parent_dir,
-          recursive = True,
+          create_parents = True,
           cd_access="a",
     )
     Execute(("chmod", "1777", parent_dir), sudo=True)
@@ -129,7 +129,7 @@ def hbase(name=None):
   
   # On some OS this folder could be not exists, so we will create it before pushing there files
   Directory(params.limits_conf_dir,
-            recursive=True,
+            create_parents = True,
             owner='root',
             group='root'
             )
@@ -153,14 +153,14 @@ def hbase(name=None):
   if name != "client":
     Directory( params.pid_dir,
       owner = params.hbase_user,
-      recursive = True,
+      create_parents = True,
       cd_access = "a",
       mode = 0755,
     )
   
     Directory (params.log_dir,
       owner = params.hbase_user,
-      recursive = True,
+      create_parents = True,
       cd_access = "a",
       mode = 0755,
     )

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs.py
index 1a34a24..246bf07 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs.py
@@ -33,7 +33,7 @@ def hdfs(name=None):
   
   # On some OS this folder could be not exists, so we will create it before pushing there files
   Directory(params.limits_conf_dir,
-            recursive=True,
+            create_parents = True,
             owner='root',
             group='root'
   )
@@ -71,7 +71,7 @@ def hdfs(name=None):
     )
 
     Directory(params.hadoop_conf_secure_dir,
-              recursive=True,
+              create_parents = True,
               owner='root',
               group=params.user_group,
               cd_access='a',
@@ -122,7 +122,7 @@ def hdfs(name=None):
 def install_snappy():
   import params
   Directory([params.so_target_dir_x86, params.so_target_dir_x64],
-            recursive=True,
+            create_parents = True,
   )    
   Link(params.so_target_x86,
        to=params.so_src_x86,
@@ -139,7 +139,7 @@ def hdfs(component=None):
     Directory(directories,
               owner=params.hdfs_user,
               mode="(OI)(CI)F",
-              recursive=True
+              create_parents = True
     )
     File(params.exclude_file_path,
          content=Template("exclude_hosts_list.j2"),

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_datanode.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_datanode.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_datanode.py
index e225927..a22fb99 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_datanode.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_datanode.py
@@ -30,7 +30,7 @@ def create_dirs(data_dir, params):
   :param params: parameters
   """
   Directory(data_dir,
-            recursive=True,
+            create_parents = True,
             cd_access="a",
             mode=0755,
             owner=params.hdfs_user,
@@ -43,14 +43,14 @@ def datanode(action=None):
   if action == "configure":
     import params
     Directory(params.dfs_domain_socket_dir,
-              recursive=True,
+              create_parents = True,
               mode=0751,
               owner=params.hdfs_user,
               group=params.user_group)
 
     if not os.path.isdir(os.path.dirname(params.data_dir_mount_file)):
       Directory(os.path.dirname(params.data_dir_mount_file),
-                recursive=True,
+                create_parents = True,
                 mode=0755,
                 owner=params.hdfs_user,
                 group=params.user_group)

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py
index 004caff..b91fdb5 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py
@@ -228,7 +228,7 @@ def create_name_dirs(directories):
             mode=0755,
             owner=params.hdfs_user,
             group=params.user_group,
-            recursive=True,
+            create_parents = True,
             cd_access="a",
   )
 
@@ -278,7 +278,7 @@ def format_namenode(force=None):
         )
         for m_dir in mark_dir:
           Directory(m_dir,
-            recursive = True
+            create_parents = True
           )
   else:
     if params.dfs_ha_namenode_active is not None and \
@@ -298,7 +298,7 @@ def format_namenode(force=None):
           )
           for m_dir in mark_dir:
             Directory(m_dir,
-              recursive = True
+              create_parents = True
             )
 
 def is_namenode_formatted(params):
@@ -316,7 +316,7 @@ def is_namenode_formatted(params):
   if marked:
     for mark_dir in mark_dirs:
       Directory(mark_dir,
-        recursive = True
+        create_parents = True
       )      
     return marked  
   
@@ -334,7 +334,7 @@ def is_namenode_formatted(params):
     elif os.path.isfile(old_mark_dir):
       for mark_dir in mark_dirs:
         Directory(mark_dir,
-                  recursive = True,
+                  create_parents = True,
         )
       Directory(old_mark_dir,
         action = "delete"

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_snamenode.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_snamenode.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_snamenode.py
index aded211..500ed15 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_snamenode.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_snamenode.py
@@ -28,7 +28,7 @@ def snamenode(action=None, format=False):
     import params
     for fs_checkpoint_dir in params.fs_checkpoint_dirs:
       Directory(fs_checkpoint_dir,
-                recursive=True,
+                create_parents = True,
                 cd_access="a",
                 mode=0755,
                 owner=params.hdfs_user,

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py
index 2ef1b69..ad4283c 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/journalnode.py
@@ -88,7 +88,7 @@ class JournalNodeDefault(JournalNode):
     import params
 
     Directory(params.jn_edits_dir,
-              recursive=True,
+              create_parents = True,
               cd_access="a",
               owner=params.hdfs_user,
               group=params.user_group

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/utils.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/utils.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/utils.py
index aa97af0..e59dd78 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/utils.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/utils.py
@@ -206,7 +206,7 @@ def service(action=None, name=None, user=None, options="", create_pid_dir=False,
     if create_pid_dir:
       Directory(pid_dir,
                 owner=user,
-                recursive=True)
+                create_parents = True)
     if create_log_dir:
       if name == "nfs3":
         Directory(log_dir,
@@ -216,7 +216,7 @@ def service(action=None, name=None, user=None, options="", create_pid_dir=False,
       else:
         Directory(log_dir,
                   owner=user,
-                  recursive=True)
+                  create_parents = True)
 
   if params.security_enabled and name == "datanode":
     ## The directory where pid files are stored in the secure data environment.

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat.py
index 5385099..45dcbe7 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hcat.py
@@ -43,21 +43,21 @@ def hcat():
   from setup_atlas_hive import setup_atlas_hive
 
   Directory(params.hive_conf_dir,
-            recursive=True,
+            create_parents = True,
             owner=params.hcat_user,
             group=params.user_group,
   )
 
 
   Directory(params.hcat_conf_dir,
-            recursive=True,
+            create_parents = True,
             owner=params.hcat_user,
             group=params.user_group,
   )
 
   Directory(params.hcat_pid_dir,
             owner=params.webhcat_user,
-            recursive=True
+            create_parents = True
   )
 
   XmlConfig("hive-site.xml",

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive.py
index 39b3433..a141185 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive.py
@@ -240,7 +240,7 @@ def hive(name=None):
 
   # On some OS this folder could be not exists, so we will create it before pushing there files
   Directory(params.limits_conf_dir,
-            recursive=True,
+            create_parents = True,
             owner='root',
             group='root'
             )
@@ -308,7 +308,7 @@ def fill_conf_dir(component_conf_dir):
   Directory(component_conf_dir,
             owner=params.hive_user,
             group=params.user_group,
-            recursive=True
+            create_parents = True
   )
 
   XmlConfig("mapred-site.xml",
@@ -359,7 +359,7 @@ def crt_directory(name):
   import params
 
   Directory(name,
-            recursive=True,
+            create_parents = True,
             cd_access='a',
             owner=params.hive_user,
             group=params.user_group,
@@ -398,7 +398,7 @@ def jdbc_connector():
       Execute(format("yes | {sudo} cp {jars_path_in_archive} {hive_lib}"))
 
       Directory(params.jdbc_libs_dir,
-                recursive=True)
+                create_parents = True)
 
       Execute(format("yes | {sudo} cp {libs_path_in_archive} {jdbc_libs_dir}"))
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
index e347e25..5866cd0 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/hive_metastore.py
@@ -207,7 +207,7 @@ class HiveMetastoreDefault(HiveMetastore):
 
         Execute(format("yes | {sudo} cp {jars_in_hive_lib} {target_directory}"))
 
-        Directory(target_native_libs_directory, recursive=True)
+        Directory(target_native_libs_directory, create_parents = True)
 
         Execute(format("yes | {sudo} cp {libs_in_hive_lib} {target_native_libs_directory}"))
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat.py
index b597852..401debc 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/scripts/webhcat.py
@@ -50,16 +50,16 @@ def webhcat():
             owner=params.webhcat_user,
             mode=0755,
             group=params.user_group,
-            recursive=True)
+            create_parents = True)
 
   Directory(params.templeton_log_dir,
             owner=params.webhcat_user,
             mode=0755,
             group=params.user_group,
-            recursive=True)
+            create_parents = True)
 
   Directory(params.config_dir,
-            recursive=True,
+            create_parents = True,
             owner=params.webhcat_user,
             group=params.user_group,
             cd_access="a")
@@ -116,7 +116,7 @@ def webhcat():
   
   Directory(params.webhcat_conf_dir,
        cd_access='a',
-       recursive=True
+       create_parents = True
   )
 
   log4j_webhcat_filename = 'webhcat-log4j.properties'

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/KAFKA/0.8.1.2.2/package/scripts/kafka.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/KAFKA/0.8.1.2.2/package/scripts/kafka.py b/ambari-server/src/main/resources/common-services/KAFKA/0.8.1.2.2/package/scripts/kafka.py
index faabee0..1c01174 100644
--- a/ambari-server/src/main/resources/common-services/KAFKA/0.8.1.2.2/package/scripts/kafka.py
+++ b/ambari-server/src/main/resources/common-services/KAFKA/0.8.1.2.2/package/scripts/kafka.py
@@ -82,8 +82,9 @@ def kafka(upgrade_type=None):
               cd_access='a',
               owner=params.kafka_user,
               group=params.user_group,
-              recursive=True)
-    set_dir_ownership(kafka_data_dirs)
+              create_parents = True,
+              recursive_ownership = True,
+    )
 
     PropertiesFile("server.properties",
                       dir=params.conf_dir,
@@ -114,7 +115,7 @@ def kafka(upgrade_type=None):
 
     # On some OS this folder could be not exists, so we will create it before pushing there files
     Directory(params.limits_conf_dir,
-              recursive=True,
+              create_parents = True,
               owner='root',
               group='root'
     )
@@ -150,7 +151,7 @@ def setup_symlink(kafka_managed_dir, kafka_ambari_managed_dir):
 
       Directory(kafka_managed_dir,
                 action="delete",
-                recursive=True)
+                create_parents = True)
 
     elif os.path.islink(kafka_managed_dir) and os.path.realpath(kafka_managed_dir) != kafka_ambari_managed_dir:
       Link(kafka_managed_dir,
@@ -169,8 +170,9 @@ def setup_symlink(kafka_managed_dir, kafka_ambari_managed_dir):
               cd_access='a',
               owner=params.kafka_user,
               group=params.user_group,
-              recursive=True)
-    set_dir_ownership(kafka_managed_dir)
+              create_parents = True,
+              recursive_ownership = True,
+    )
 
   if backup_folder_path:
     # Restore backed up files to current relevant dirs if needed - will be triggered only when changing to/from default path;
@@ -182,7 +184,7 @@ def setup_symlink(kafka_managed_dir, kafka_ambari_managed_dir):
     # Clean up backed up folder
     Directory(backup_folder_path,
               action="delete",
-              recursive=True)
+              create_parents = True)
 
 
 # Uses agent temp dir to store backup files
@@ -194,9 +196,9 @@ def backup_dir_contents(dir_path, backup_folder_suffix):
             cd_access='a',
             owner=params.kafka_user,
             group=params.user_group,
-            recursive=True
+            create_parents = True,
+            recursive_ownership = True,
   )
-  set_dir_ownership(backup_destination_path)
   # Safely copy top-level contents to backup folder
   for file in os.listdir(dir_path):
     File(os.path.join(backup_destination_path, file),
@@ -205,35 +207,13 @@ def backup_dir_contents(dir_path, backup_folder_suffix):
 
   return backup_destination_path
 
-
 def ensure_base_directories():
-  """
-  Make basic Kafka directories, and make sure that their ownership is correct
-  """
   import params
-  base_dirs = [params.kafka_log_dir, params.kafka_pid_dir, params.conf_dir]
-  Directory(base_dirs,
+  Directory([params.kafka_log_dir, params.kafka_pid_dir, params.conf_dir],
             mode=0755,
             cd_access='a',
             owner=params.kafka_user,
             group=params.user_group,
-            recursive=True
+            create_parents = True,
+            recursive_ownership = True,
             )
-  set_dir_ownership(base_dirs)
-
-
-def set_dir_ownership(targets):
-  import params
-  if isinstance(targets, collections.Iterable):
-    directories = targets
-  else:  # If target is a single object, convert it to list
-    directories = [targets]
-  for directory in directories:
-    # If path is empty or a single slash,
-    # may corrupt filesystem permissions
-    if len(directory) > 1:
-      Execute(('chown', '-R', format("{kafka_user}:{user_group}"), directory),
-            sudo=True)
-    else:
-      Logger.warning("Permissions for the folder \"%s\" were not updated due to "
-            "empty path passed: " % directory)

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_common.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_common.py b/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_common.py
index d40627a..b72c4bf 100644
--- a/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_common.py
+++ b/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_common.py
@@ -102,7 +102,7 @@ class KerberosScript(Script):
 
     Directory(params.krb5_conf_dir,
               owner='root',
-              recursive=True,
+              create_parents = True,
               group='root',
               mode=0755
     )
@@ -366,7 +366,7 @@ class KerberosScript(Script):
           if (keytab_file_path is not None) and (len(keytab_file_path) > 0):
             head, tail = os.path.split(keytab_file_path)
             if head:
-              Directory(head, recursive=True, mode=0755, owner="root", group="root")
+              Directory(head, create_parents = True, mode=0755, owner="root", group="root")
 
             owner = get_property_value(item, 'keytab_file_owner_name')
             owner_access = get_property_value(item, 'keytab_file_owner_access')
@@ -438,7 +438,7 @@ class KerberosScript(Script):
     if params.jce_policy_zip is not None:
       jce_curl_target = format("{artifact_dir}/{jce_policy_zip}")
       Directory(params.artifact_dir,
-                recursive = True,
+                create_parents = True,
                 )
       File(jce_curl_target,
            content = DownloadSource(format("{jce_location}/{jce_policy_zip}")),

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_server.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_server.py b/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_server.py
index 8cc4312..7fe02ab 100644
--- a/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_server.py
+++ b/ambari-server/src/main/resources/common-services/KERBEROS/1.10.3-10/package/scripts/kerberos_server.py
@@ -27,7 +27,7 @@ class KerberosServer(KerberosScript):
 
     Directory(params.kadm5_acl_dir,
               owner='root',
-              recursive=True,
+              create_parents = True,
               group='root',
               mode=0700
     )
@@ -50,7 +50,7 @@ class KerberosServer(KerberosScript):
 
     Directory(params.kdc_conf_dir,
               owner='root',
-              recursive=True,
+              create_parents = True,
               group='root',
               mode=0700
     )

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox.py b/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox.py
index 806cec8..5436e47 100644
--- a/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox.py
+++ b/ambari-server/src/main/resources/common-services/KNOX/0.5.0.2.2/package/scripts/knox.py
@@ -88,16 +88,14 @@ def knox():
 @OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT)
 def knox():
     import params
-
-    directories = [params.knox_data_dir, params.knox_logs_dir, params.knox_pid_dir, params.knox_conf_dir, os.path.join(params.knox_conf_dir, "topologies")]
-    for directory in directories:
-      Directory(directory,
-                owner = params.knox_user,
-                group = params.knox_group,
-                recursive = True,
-                cd_access = "a",
-                mode = 0755,
-      )
+    Directory([params.knox_data_dir, params.knox_logs_dir, params.knox_pid_dir, params.knox_conf_dir, os.path.join(params.knox_conf_dir, "topologies")],
+              owner = params.knox_user,
+              group = params.knox_group,
+              create_parents = True,
+              cd_access = "a",
+              mode = 0755,
+              recursive_ownership = True,
+    )
 
     XmlConfig("gateway-site.xml",
               conf_dir=params.knox_conf_dir,
@@ -139,12 +137,6 @@ def knox():
                       template_tag = None
       )
 
-    dirs_to_chown = tuple(directories)
-    cmd = ('chown','-R',format('{knox_user}:{knox_group}')) + dirs_to_chown
-    Execute(cmd,
-            sudo = True,
-    )
-
     cmd = format('{knox_client_bin} create-master --master {knox_master_secret!p}')
     master_secret_exist = as_user(format('test -f {knox_master_secret_path}'), params.knox_user)
 
@@ -181,20 +173,12 @@ def update_knox_logfolder_permissions():
    cluster in non-working state
   """
   import params
-  knox_dirs = [params.knox_logs_dir]
-
+  
   Directory(params.knox_logs_dir,
             owner = params.knox_user,
             group = params.knox_group,
-            recursive = True,
+            create_parents = True,
             cd_access = "a",
             mode = 0755,
-            )
-
-  for d in knox_dirs:
-    if len(d) > 1:  # If path is empty or a single slash, may corrupt filesystem permissions
-      Execute(('chown', '-R', format("{knox_user}:{knox_group}"), d),
-              sudo=True
-              )
-    else:
-      Logger.warning("Permissions for the Knox folder \"%s\" was not updated due to empty path passed" % d)
+            recursive_ownership = True,
+  )

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/mahout.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/mahout.py b/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/mahout.py
index 0fa937b..f2c3c18 100644
--- a/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/mahout.py
+++ b/ambari-server/src/main/resources/common-services/MAHOUT/1.0.0.2.3/package/scripts/mahout.py
@@ -26,7 +26,7 @@ def mahout():
   import params
 
   Directory( params.mahout_conf_dir,
-             recursive = True,
+             create_parents = True,
              owner = params.mahout_user,
              group = params.user_group
   )

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie.py b/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie.py
index ba56c26..b35eec0 100644
--- a/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie.py
+++ b/ambari-server/src/main/resources/common-services/OOZIE/4.0.0.2.0/package/scripts/oozie.py
@@ -57,7 +57,7 @@ def oozie(is_server=False):
 
   Directory(params.oozie_tmp_dir,
             owner=params.oozie_user,
-            recursive = True,
+            create_parents = True,
   )
 
   if is_server:
@@ -96,7 +96,7 @@ def oozie(is_server=False):
     )
     params.HdfsResource(None, action="execute")
   Directory(params.conf_dir,
-             recursive = True,
+             create_parents = True,
              owner = params.oozie_user,
              group = params.user_group
   )
@@ -193,12 +193,12 @@ def oozie_server_specific():
     owner = params.oozie_user,
     group = params.user_group,
     mode = 0755,
-    recursive = True,
+    create_parents = True,
     cd_access="a",
   )
   
   Directory(params.oozie_libext_dir,
-            recursive=True,
+            create_parents = True,
   )
   
   hashcode_file = format("{oozie_home}/.hashcode")
@@ -215,12 +215,18 @@ def oozie_server_specific():
   configure_cmds = []
   configure_cmds.append(('cp', params.ext_js_path, params.oozie_libext_dir))
   configure_cmds.append(('chown', format('{oozie_user}:{user_group}'), format('{oozie_libext_dir}/{ext_js_file}')))
-  configure_cmds.append(('chown', '-RL', format('{oozie_user}:{user_group}'), params.oozie_webapps_conf_dir))
   
   Execute( configure_cmds,
     not_if  = no_op_test,
     sudo = True,
   )
+  
+  Directory(params.oozie_webapps_conf_dir,
+            user = params.oozie_user,
+            group = params.user_group,
+            recursive_ownership = True,
+            recursion_follow_links = True,
+  )
 
   # download the database JAR
   download_database_library_if_needed()
@@ -259,7 +265,7 @@ def oozie_server_specific():
   if params.hdp_stack_version != "" and compare_versions(params.hdp_stack_version, '2.2') >= 0:
     # Create hive-site and tez-site configs for oozie
     Directory(params.hive_conf_dir,
-        recursive = True,
+        create_parents = True,
         owner = params.oozie_user,
         group = params.user_group
     )
@@ -281,8 +287,10 @@ def oozie_server_specific():
         group = params.user_group,
         mode = 0664
     )
-  Execute(('chown', '-R', format("{oozie_user}:{user_group}"), params.oozie_server_dir), 
-          sudo=True
+  Directory(params.oozie_server_dir,
+    owner = params.oozie_user,
+    group = params.user_group,
+    recursive_ownership = True,  
   )
 
 def download_database_library_if_needed(target_directory = None):
@@ -323,7 +331,7 @@ def download_database_library_if_needed(target_directory = None):
       Execute(format("yes | {sudo} cp {jars_path_in_archive} {oozie_libext_dir}"))
 
       Directory(params.jdbc_libs_dir,
-                recursive=True)
+                create_parents = True)
 
       Execute(format("yes | {sudo} cp {libs_path_in_archive} {jdbc_libs_dir}"))
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/pig.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/pig.py b/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/pig.py
index c5f095f..83f7048 100644
--- a/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/pig.py
+++ b/ambari-server/src/main/resources/common-services/PIG/0.12.0.2.0/package/scripts/pig.py
@@ -28,7 +28,7 @@ def pig():
   import params
 
   Directory( params.pig_conf_dir,
-    recursive = True,
+    create_parents = True,
     owner = params.hdfs_user,
     group = params.user_group
   )

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf.py b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf.py
index 08475fd..caae9bf 100644
--- a/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf.py
+++ b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/pxf.py
@@ -121,7 +121,7 @@ class Pxf(Script):
     Directory(params.pxf_instance_dir,
               owner=params.pxf_user,
               group=params.pxf_group,
-              recursive=True)
+              create_parents = True)
 
 
 if __name__ == "__main__":

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_service.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_service.py b/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_service.py
index 4f711c3..9270ea3 100644
--- a/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_service.py
+++ b/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/ranger_service.py
@@ -34,7 +34,11 @@ def ranger_service(name, action=None):
 
 
     if params.stack_is_hdp23_or_further:
-      Execute(('chown','-R', format('{unix_user}:{unix_group}'), format('{usersync_log_dir}/')), sudo=True)
+      Directory(format('{usersync_log_dir}/'),
+                user = params.unix_user,
+                group = params.unix_group,
+                recursive_ownership = True,
+      )
       Execute(params.usersync_start,
               environment=env_dict,
               not_if=no_op_test,

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger_xml.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger_xml.py b/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger_xml.py
index 8de0d80..81f93a1 100644
--- a/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger_xml.py
+++ b/ambari-server/src/main/resources/common-services/RANGER/0.4.0/package/scripts/setup_ranger_xml.py
@@ -52,7 +52,7 @@ def setup_ranger_admin(upgrade_type=None):
   Directory(ranger_conf,
     owner = params.unix_user,
     group = params.unix_group,
-    recursive = True
+    create_parents = True
   )
 
   if upgrade_type is not None:
@@ -95,7 +95,11 @@ def setup_ranger_admin(upgrade_type=None):
 
     Execute(('cp', '-f', src_file, dst_file), sudo=True)
 
-  Execute(('chown','-R',format('{unix_user}:{unix_group}'), format('{ranger_home}/')), sudo=True)
+  Directory(format('{ranger_home}/'),
+            user = params.unix_user,
+            group = params.unix_group,
+            recursive_ownership = True,
+  )
 
   Directory(params.admin_log_dir,
     owner = params.unix_user,
@@ -140,7 +144,7 @@ def setup_ranger_db(upgrade_type=None):
 
   Directory(params.java_share_dir,
     mode=0755,
-    recursive=True,
+    create_parents = True,
     cd_access="a"
   )
 
@@ -164,7 +168,7 @@ def setup_ranger_db(upgrade_type=None):
 
     Directory(params.jdbc_libs_dir,
       cd_access="a",
-      recursive=True)
+      create_parents = True)
 
     Execute(as_sudo(['yes', '|', 'cp', params.libs_path_in_archive, params.jdbc_libs_dir], auto_escape=False),
             path=["/bin", "/usr/bin/"])

http://git-wip-us.apache.org/repos/asf/ambari/blob/92c054b1/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms.py b/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms.py
index 25134df..a611f8e 100755
--- a/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms.py
+++ b/ambari-server/src/main/resources/common-services/RANGER_KMS/0.5.0.2.3/package/scripts/kms.py
@@ -61,7 +61,7 @@ def setup_kms_db():
 
     Directory(params.java_share_dir,
       mode=0755,
-      recursive=True,
+      create_parents = True,
       cd_access="a"
     )
     
@@ -85,7 +85,7 @@ def setup_kms_db():
 
       Directory(params.jdbc_libs_dir,
         cd_access="a",
-        recursive=True)
+        create_parents = True)
 
       Execute(as_sudo(['yes', '|', 'cp', params.libs_path_in_archive, params.jdbc_libs_dir], auto_escape=False),
         path=["/bin", "/usr/bin/"])
@@ -171,7 +171,7 @@ def kms():
     Directory(params.kms_conf_dir,
       owner = params.kms_user,
       group = params.kms_group,
-      recursive = True
+      create_parents = True
     )
 
     if params.xa_audit_db_is_enabled:
@@ -201,7 +201,11 @@ def kms():
       mode = 0755
     )
 
-    Execute(('chown','-R',format('{kms_user}:{kms_group}'), format('{kms_home}/')), sudo=True)
+    Directory(format('{kms_home}/'),
+              user = params.kms_user,
+              group = params.kms_group,
+              recursive_ownership = True,
+    )
 
     Directory(params.kms_log_dir,
       owner = params.kms_user,
@@ -301,7 +305,7 @@ def enable_kms_plugin():
       owner = params.kms_user,
       group = params.kms_group,
       mode=0775,
-      recursive = True
+      create_parents = True
     )
     
     File(os.path.join('/etc', 'ranger', params.repo_name, 'policycache',format('kms_{repo_name}.json')),