Repository: ambari Updated Branches: refs/heads/trunk 3c6647e09 -> d331e8532
AMBARI-10280. Need to check if rpcbind or portmap is started before starting NFS Gateway (Brandon Li via alejandro) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/d331e853 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/d331e853 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/d331e853 Branch: refs/heads/trunk Commit: d331e853295e60928174cf0a7c4ffa558b65813a Parents: 3c6647e Author: Alejandro Fernandez <[email protected]> Authored: Wed Apr 1 17:21:40 2015 -0700 Committer: Alejandro Fernandez <[email protected]> Committed: Wed Apr 1 17:22:05 2015 -0700 ---------------------------------------------------------------------- .../package/scripts/hdfs_nfsgateway.py | 42 ++++++++- .../HDFS/2.1.0.2.0/package/scripts/params.py | 2 + .../2.1.0.2.0/package/scripts/status_params.py | 2 +- .../HDFS/2.1.0.2.0/package/scripts/utils.py | 19 +++- .../python/stacks/2.0.6/HDFS/test_nfsgateway.py | 99 ++++++++++---------- 5 files changed, 109 insertions(+), 55 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/d331e853/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_nfsgateway.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_nfsgateway.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_nfsgateway.py index e908ecf..ad5ef89 100644 --- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_nfsgateway.py +++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_nfsgateway.py @@ -17,26 +17,62 @@ limitations under the License. """ +from resource_management.core.exceptions import Fail +from resource_management.core.logger import Logger from resource_management.core.resources import Directory +from resource_management.core import shell from utils import service from utils import hdfs_directory +import subprocess,os + +# NFS GATEWAY is always started by root using jsvc due to rpcbind bugs +# on Linux such as CentOS6.2. https://bugzilla.redhat.com/show_bug.cgi?id=731542 + +def prepare_rpcbind(): + Logger.info("check if native nfs server is running") + p, output = shell.call("pgrep nfsd") + if p == 0 : + Logger.info("native nfs server is running. shutting it down...") + # shutdown nfs + shell.call("service nfs stop") + shell.call("service nfs-kernel-server stop") + Logger.info("check if the native nfs server is down...") + p, output = shell.call("pgrep nfsd") + if p == 0 : + raise Fail("Failed to shutdown native nfs service") + + Logger.info("check if rpcbind or portmap is running") + p, output = shell.call("pgrep rpcbind") + q, output = shell.call("pgrep portmap") + + if p!=0 and q!=0 : + Logger.info("no portmap or rpcbind running. starting one...") + p, output = shell.call("service rpcbind start") + q, output = shell.call("service portmap start") + if p!=0 and q!=0 : + raise Fail("Failed to start rpcbind or portmap") + + Logger.info("now we are ready to start nfs gateway") def nfsgateway(action=None, format=False): import params + if action== "start": + prepare_rpcbind() + if action == "configure": return elif action == "start" or action == "stop": Directory(params.hadoop_pid_dir_prefix, mode=0755, - owner=params.hdfs_user, - group=params.user_group + owner=params.root_user, + group=params.root_group ) service( action=action, name="nfs3", - user=params.hdfs_user, + user=params.root_user, create_pid_dir=True, create_log_dir=True ) http://git-wip-us.apache.org/repos/asf/ambari/blob/d331e853/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params.py index 58773bd..3fbc55c 100644 --- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params.py +++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/params.py @@ -41,6 +41,7 @@ version = default("/commandParams/version", None) security_enabled = config['configurations']['cluster-env']['security_enabled'] hdfs_user = status_params.hdfs_user +root_user = "root" hadoop_pid_dir_prefix = status_params.hadoop_pid_dir_prefix # Some datanode settings @@ -157,6 +158,7 @@ mapred_user = config['configurations']['mapred-env']['mapred_user'] hdfs_principal_name = default('/configurations/hadoop-env/hdfs_principal_name', None) user_group = config['configurations']['cluster-env']['user_group'] +root_group = "root" proxyuser_group = config['configurations']['hadoop-env']['proxyuser_group'] #hadoop params http://git-wip-us.apache.org/repos/asf/ambari/blob/d331e853/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/status_params.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/status_params.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/status_params.py index c7c5325..f87f895 100644 --- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/status_params.py +++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/status_params.py @@ -29,7 +29,7 @@ namenode_pid_file = format("{hdp_pid_dir}/hadoop-{hdfs_user}-namenode.pid") snamenode_pid_file = format("{hdp_pid_dir}/hadoop-{hdfs_user}-secondarynamenode.pid") journalnode_pid_file = format("{hdp_pid_dir}/hadoop-{hdfs_user}-journalnode.pid") zkfc_pid_file = format("{hdp_pid_dir}/hadoop-{hdfs_user}-zkfc.pid") -nfsgateway_pid_file = format("{hdp_pid_dir}/hadoop-{hdfs_user}-nfs3.pid") +nfsgateway_pid_file = format("{hadoop_pid_dir_prefix}/root/hadoop_privileged_nfs3.pid") # Security related/required params hostname = config['hostname'] http://git-wip-us.apache.org/repos/asf/ambari/blob/d331e853/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 0b9af6b..156a0ed 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 @@ -147,6 +147,21 @@ def service(action=None, name=None, user=None, options="", create_pid_dir=False, options = options if options else "" pid_dir = format("{hadoop_pid_dir_prefix}/{user}") pid_file = format("{pid_dir}/hadoop-{user}-{name}.pid") + hadoop_env_exports = { + 'HADOOP_LIBEXEC_DIR': params.hadoop_libexec_dir + } + # NFS GATEWAY is always started by root using jsvc due to rpcbind bugs + # on Linux such as CentOS6.2. https://bugzilla.redhat.com/show_bug.cgi?id=731542 + if name == "nfs3" : + pid_file = format( + "{hadoop_pid_dir_prefix}/root/hadoop_privileged_nfs3.pid") + + print pid_file + custom_export = { + 'HADOOP_PRIVILEGED_NFS_USER': params.hdfs_user + } + hadoop_env_exports.update(custom_export) + log_dir = format("{hdfs_log_dir_prefix}/{user}") check_process = format( "ls {pid_file} >/dev/null 2>&1 &&" @@ -161,10 +176,6 @@ def service(action=None, name=None, user=None, options="", create_pid_dir=False, owner=user, recursive=True) - hadoop_env_exports = { - 'HADOOP_LIBEXEC_DIR': params.hadoop_libexec_dir - } - if params.security_enabled and name == "datanode": ## The directory where pid files are stored in the secure data environment. hadoop_secure_dn_pid_dir = format("{hadoop_pid_dir_prefix}/{hdfs_user}") http://git-wip-us.apache.org/repos/asf/ambari/blob/d331e853/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_nfsgateway.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_nfsgateway.py b/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_nfsgateway.py index 4fdf740..e58f7be 100644 --- a/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_nfsgateway.py +++ b/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_nfsgateway.py @@ -21,7 +21,8 @@ import os from stacks.utils.RMFTestCase import * from mock.mock import MagicMock, patch - +# NFS GATEWAY is always started by root using jsvc due to rpcbind bugs +# on Linux such as CentOS6.2. https://bugzilla.redhat.com/show_bug.cgi?id=731542 class TestNFSGateway(RMFTestCase): COMMON_SERVICES_PACKAGE_DIR = "HDFS/2.1.0.2.0/package" STACK_VERSION = "2.0.6" @@ -38,7 +39,9 @@ class TestNFSGateway(RMFTestCase): self.assert_configure_default() self.assertNoMoreResources() - def test_start_default(self): + @patch("hdfs_nfsgateway.prepare_rpcbind") + def test_start_default(self, prepare_rpcbind_mock): + prepare_rpcbind_mock.returnvalue = 0 self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nfsgateway.py", classname = "NFSGateway", command = "start", @@ -48,25 +51,25 @@ class TestNFSGateway(RMFTestCase): ) self.assert_configure_default() self.assertResourceCalled('Directory', '/var/run/hadoop', - owner = 'hdfs', - group = 'hadoop', + owner = 'root', + group = 'root', mode = 0755 ) - self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', - owner = 'hdfs', + self.assertResourceCalled('Directory', '/var/run/hadoop/root', + owner = 'root', recursive = True, ) - self.assertResourceCalled('Directory', '/var/log/hadoop/hdfs', - owner = 'hdfs', + self.assertResourceCalled('Directory', '/var/log/hadoop/root', + owner = 'root', recursive = True, ) - self.assertResourceCalled('File', '/var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid', + self.assertResourceCalled('File', '/var/run/hadoop/root/hadoop_privileged_nfs3.pid', action = ['delete'], - not_if='ls /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid` >/dev/null 2>&1', + not_if='ls /var/run/hadoop/root/hadoop_privileged_nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/root/hadoop_privileged_nfs3.pid` >/dev/null 2>&1', ) - self.assertResourceCalled('Execute', "ambari-sudo.sh su hdfs -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]ulimit -c unlimited ; /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start nfs3'", - environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec'}, - not_if = 'ls /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid` >/dev/null 2>&1', + self.assertResourceCalled('Execute', "ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start nfs3", + environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec', 'HADOOP_PRIVILEGED_NFS_USER': 'hdfs'}, + not_if = 'ls /var/run/hadoop/root/hadoop_privileged_nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/root/hadoop_privileged_nfs3.pid` >/dev/null 2>&1', ) self.assertNoMoreResources() @@ -79,27 +82,27 @@ class TestNFSGateway(RMFTestCase): target = RMFTestCase.TARGET_COMMON_SERVICES ) self.assertResourceCalled('Directory', '/var/run/hadoop', - owner = 'hdfs', - group = 'hadoop', + owner = 'root', + group = 'root', mode = 0755 ) - self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', - owner = 'hdfs', + self.assertResourceCalled('Directory', '/var/run/hadoop/root', + owner = 'root', recursive = True, ) - self.assertResourceCalled('Directory', '/var/log/hadoop/hdfs', - owner = 'hdfs', + self.assertResourceCalled('Directory', '/var/log/hadoop/root', + owner = 'root', recursive = True, ) - self.assertResourceCalled('File', '/var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid', + self.assertResourceCalled('File', '/var/run/hadoop/root/hadoop_privileged_nfs3.pid', action = ['delete'], - not_if='ls /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid` >/dev/null 2>&1', + not_if='ls /var/run/hadoop/root/hadoop_privileged_nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/root/hadoop_privileged_nfs3.pid` >/dev/null 2>&1', ) - self.assertResourceCalled('Execute', "ambari-sudo.sh su hdfs -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]ulimit -c unlimited ; /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop nfs3'", - environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec'}, + self.assertResourceCalled('Execute', "ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop nfs3", + environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec', 'HADOOP_PRIVILEGED_NFS_USER': 'hdfs'}, not_if = None, ) - self.assertResourceCalled('File', '/var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid', + self.assertResourceCalled('File', '/var/run/hadoop/root/hadoop_privileged_nfs3.pid', action = ['delete'], ) self.assertNoMoreResources() @@ -115,7 +118,9 @@ class TestNFSGateway(RMFTestCase): self.assert_configure_secured() self.assertNoMoreResources() - def test_start_secured(self): + @patch("hdfs_nfsgateway.prepare_rpcbind") + def test_start_secured(self, prepare_rpcbind_mock): + prepare_rpcbind_mock.returnvalue = 0 self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/nfsgateway.py", classname = "NFSGateway", command = "start", @@ -125,25 +130,25 @@ class TestNFSGateway(RMFTestCase): ) self.assert_configure_secured() self.assertResourceCalled('Directory', '/var/run/hadoop', - owner = 'hdfs', - group = 'hadoop', + owner = 'root', + group = 'root', mode = 0755 ) - self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', - owner = 'hdfs', + self.assertResourceCalled('Directory', '/var/run/hadoop/root', + owner = 'root', recursive = True, ) - self.assertResourceCalled('Directory', '/var/log/hadoop/hdfs', - owner = 'hdfs', + self.assertResourceCalled('Directory', '/var/log/hadoop/root', + owner = 'root', recursive = True, ) - self.assertResourceCalled('File', '/var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid', + self.assertResourceCalled('File', '/var/run/hadoop/root/hadoop_privileged_nfs3.pid', action = ['delete'], - not_if='ls /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid` >/dev/null 2>&1', + not_if='ls /var/run/hadoop/root/hadoop_privileged_nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/root/hadoop_privileged_nfs3.pid` >/dev/null 2>&1', ) - self.assertResourceCalled('Execute', "ambari-sudo.sh su hdfs -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]ulimit -c unlimited ; /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start nfs3'", - environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec'}, - not_if = 'ls /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid` >/dev/null 2>&1', + self.assertResourceCalled('Execute', "ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start nfs3", + environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec', 'HADOOP_PRIVILEGED_NFS_USER': 'hdfs'}, + not_if = 'ls /var/run/hadoop/root/hadoop_privileged_nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/root/hadoop_privileged_nfs3.pid` >/dev/null 2>&1', ) self.assertNoMoreResources() @@ -156,27 +161,27 @@ class TestNFSGateway(RMFTestCase): target = RMFTestCase.TARGET_COMMON_SERVICES ) self.assertResourceCalled('Directory', '/var/run/hadoop', - owner = 'hdfs', - group = 'hadoop', + owner = 'root', + group = 'root', mode = 0755 ) - self.assertResourceCalled('Directory', '/var/run/hadoop/hdfs', - owner = 'hdfs', + self.assertResourceCalled('Directory', '/var/run/hadoop/root', + owner = 'root', recursive = True, ) - self.assertResourceCalled('Directory', '/var/log/hadoop/hdfs', - owner = 'hdfs', + self.assertResourceCalled('Directory', '/var/log/hadoop/root', + owner = 'root', recursive = True, ) - self.assertResourceCalled('File', '/var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid', + self.assertResourceCalled('File', '/var/run/hadoop/root/hadoop_privileged_nfs3.pid', action = ['delete'], - not_if='ls /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid` >/dev/null 2>&1', + not_if='ls /var/run/hadoop/root/hadoop_privileged_nfs3.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/root/hadoop_privileged_nfs3.pid` >/dev/null 2>&1', ) - self.assertResourceCalled('Execute', "ambari-sudo.sh su hdfs -l -s /bin/bash -c '[RMF_EXPORT_PLACEHOLDER]ulimit -c unlimited ; /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop nfs3'", - environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec'}, + self.assertResourceCalled('Execute', "ambari-sudo.sh [RMF_ENV_PLACEHOLDER] -H -E /usr/lib/hadoop/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop nfs3", + environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec', 'HADOOP_PRIVILEGED_NFS_USER': 'hdfs'}, not_if = None, ) - self.assertResourceCalled('File', '/var/run/hadoop/hdfs/hadoop-hdfs-nfs3.pid', + self.assertResourceCalled('File', '/var/run/hadoop/root/hadoop_privileged_nfs3.pid', action = ['delete'], ) self.assertNoMoreResources()
