Переглянути джерело

AMBARI-7898 Missing /usr/hdp/current dir when Knox is installed (dsen)

Dmytro Sen 10 роки тому
батько
коміт
06ff32dcd1

+ 20 - 0
ambari-agent/src/test/python/resource_management/TestExecuteResource.py

@@ -161,6 +161,26 @@ class TestExecuteResource(TestCase):
     self.assertEqual(popen_mock.call_args_list[0][1]["env"], expected_dict)
     pass
 
+  @patch.object(subprocess, "Popen")
+  def test_attribute_environment_non_root(self, popen_mock):
+    expected_user = 'test_user'
+
+    subproc_mock = MagicMock()
+    subproc_mock.returncode = 0
+    subproc_mock.communicate.side_effect = [["1"]]
+    popen_mock.return_value = subproc_mock
+
+    with Environment("/") as env:
+      execute_resource = Execute('echo "1"',
+                                 user=expected_user,
+                                 environment={'JAVA_HOME': '/test/java/home',
+                                              'PATH': "/bin"}
+      )
+    expected_command = 'export  PATH=$PATH:/bin JAVA_HOME=/test/java/home ; echo "1"'
+    self.assertEqual(popen_mock.call_args_list[0][0][0][4], expected_user)
+    self.assertEqual(popen_mock.call_args_list[0][0][0][6], expected_command)
+
+
   @patch.object(subprocess, "Popen")
   def test_attribute_cwd(self, popen_mock):
     expected_cwd = "/test/work/directory"

+ 5 - 1
ambari-common/src/main/python/resource_management/core/providers/system.py

@@ -225,8 +225,12 @@ class ExecuteProvider(Provider):
 
     for i in range (0, self.resource.tries):
       try:
+        env=self.resource.environment
+        if env and 'PATH' in env.keys():
+          env['PATH'] = "$PATH" + os.pathsep + env['PATH']
+
         shell.checked_call(self.resource.command, logoutput=self.resource.logoutput,
-                            cwd=self.resource.cwd, env=self.resource.environment,
+                            cwd=self.resource.cwd, env=env,
                             preexec_fn=_preexec_fn(self.resource), user=self.resource.user,
                             wait_for_finish=self.resource.wait_for_finish,
                             timeout=self.resource.timeout,

+ 7 - 1
ambari-common/src/main/python/resource_management/core/shell.py

@@ -61,6 +61,12 @@ def _call(command, logoutput=False, throw_on_failure=True,
     export_path_command = ""
 
   if user:
+    if env:
+      export_path_command += "export "
+      for var in env:
+        export_path_command += " " + var + "=" + env[var]
+      export_path_command += " ; "
+
     subprocess_command = ["su", "-s", "/bin/bash", "-", user, "-c", export_path_command + command]
   else:
     subprocess_command = ["/bin/bash","--login","-c", export_path_command + command]
@@ -112,4 +118,4 @@ def quote_bash_args(command):
   for char in command:
     if char not in valid:
       return "'" + command.replace("'", "'\"'\"'") + "'"
-  return command
+  return command

+ 8 - 1
ambari-server/src/main/resources/stacks/HDP/2.2/services/KNOX/package/scripts/knox.py

@@ -49,4 +49,11 @@ def knox():
          group=params.knox_group,
          owner=params.knox_user,
          content=InlineTemplate(params.topology_template)
-    )
+    )
+
+    cmd = format('{knox_client_bin} create-master --master {knox_master_secret}')
+    Execute(cmd,
+            user=params.knox_user,
+            environment={'JAVA_HOME': params.java_home},
+            not_if=format('test -f {knox_master_secret_path}')
+    )

+ 4 - 4
ambari-server/src/main/resources/stacks/HDP/2.2/services/KNOX/package/scripts/knox_gateway.py

@@ -28,10 +28,6 @@ class KnoxGateway(Script):
     self.install_packages(env)
     import params
     env.set_params(params)
-    cmd = format('{knox_client_bin} create-master --master {knox_master_secret}')
-    Execute(cmd,
-            user=params.knox_user
-    )
     cmd = format('rm -f {knox_conf_dir}/topologies/sandbox.xml')
     Execute(cmd)
 
@@ -49,6 +45,7 @@ class KnoxGateway(Script):
     no_op_test = format('ls {knox_pid_file} >/dev/null 2>&1 && ps `cat {knox_pid_file}` >/dev/null 2>&1')
     Execute(daemon_cmd,
             user=params.knox_user,
+            environment={'JAVA_HOME': params.java_home},
             not_if=no_op_test
     )
 
@@ -58,6 +55,7 @@ class KnoxGateway(Script):
     self.configure(env)
     daemon_cmd = format('{knox_bin} stop')
     Execute(daemon_cmd,
+            environment={'JAVA_HOME': params.java_home},
             user=params.knox_user,
     )
     Execute (format("rm -f {knox_pid_file}"))
@@ -82,6 +80,7 @@ class KnoxGateway(Script):
     no_op_test = format('ls {ldap_pid_file} >/dev/null 2>&1 && ps `cat {ldap_pid_file}` >/dev/null 2>&1')
     Execute(daemon_cmd,
             user=params.knox_user,
+            environment={'JAVA_HOME': params.java_home},
             not_if=no_op_test
     )
 
@@ -91,6 +90,7 @@ class KnoxGateway(Script):
     self.configureldap(env)
     daemon_cmd = format('{ldap_bin} stop')
     Execute(daemon_cmd,
+            environment={'JAVA_HOME': params.java_home},
             user=params.knox_user,
             )
     Execute (format("rm -f {ldap_pid_file}"))

+ 5 - 2
ambari-server/src/main/resources/stacks/HDP/2.2/services/KNOX/package/scripts/params.py

@@ -24,9 +24,10 @@ import status_params
 
 config = Script.get_config()
 
-rpm_version = default("/configurations/cluster-env/rpm_version", None)
+hdp_stack_version = str(config['hostLevelParams']['stack_version'])
+stack_is_hdp22_or_further = not (hdp_stack_version.startswith('2.0') or hdp_stack_version.startswith('2.1'))
 
-if rpm_version:
+if stack_is_hdp22_or_further:
   knox_bin = '/usr/hdp/current/knox-server/bin/gateway.sh'
   ldap_bin = '/usr/hdp/current/knox-server/bin/ldap.sh'
   knox_client_bin = '/usr/hdp/current/knox-server/bin/knoxcli.sh'
@@ -111,10 +112,12 @@ knox_group = default("/configurations/knox-env/knox_group", "knox")
 knox_pid_file = status_params.knox_pid_file
 ldap_pid_file = status_params.ldap_pid_file
 knox_master_secret = config['configurations']['knox-env']['knox_master_secret']
+knox_master_secret_path = '/var/lib/knox/data/security/master'
 knox_host_name = config['clusterHostInfo']['knox_gateway_hosts'][0]
 knox_host_port = config['configurations']['gateway-site']['gateway.port']
 topology_template = config['configurations']['ambari-topology']['content']
 gateway_log4j = config['configurations']['gateway-log4j']['content']
 ldap_log4j = config['configurations']['ldap-log4j']['content']
 users_ldif = config['configurations']['users-ldif']['content']
+java_home = config['hostLevelParams']['java_home']
 

+ 5 - 0
ambari-server/src/test/python/stacks/2.2/KNOX/test_knox_gateway.py

@@ -53,6 +53,11 @@ class TestKnoxGateway(RMFTestCase):
                               owner = 'knox',
                               content = InlineTemplate(self.getConfig()['configurations']['ambari-topology']['content'])
     )
+    self.assertResourceCalled('Execute', '/usr/lib/knox/bin/knoxcli.sh create-master --master sa',
+                              user='knox',
+                              environment={'JAVA_HOME': '/usr/jdk64/jdk1.7.0_45'},
+                              not_if='test -f /var/lib/knox/data/security/master'
+    )
     self.assertResourceCalled('File', '/etc/knox/conf/ldap-log4j.properties',
                               mode=0644,
                               group='knox',