You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by ma...@apache.org on 2015/09/22 00:29:08 UTC

aurora git commit: Adding ssh options into "aurora task" commands.

Repository: aurora
Updated Branches:
  refs/heads/master 1ff336ed6 -> 9d780262d


Adding ssh options into "aurora task" commands.

Bugs closed: AURORA-1491

Reviewed at https://reviews.apache.org/r/38326/


Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/9d780262
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/9d780262
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/9d780262

Branch: refs/heads/master
Commit: 9d780262d6ac71470940a92215330f9ff3590a8e
Parents: 1ff336e
Author: Maxim Khutornenko <ma...@apache.org>
Authored: Mon Sep 21 15:22:47 2015 -0700
Committer: Maxim Khutornenko <ma...@apache.org>
Committed: Mon Sep 21 15:22:47 2015 -0700

----------------------------------------------------------------------
 .../apache/aurora/client/api/command_runner.py  | 26 ++++++++++++++++----
 .../python/apache/aurora/client/cli/options.py  | 12 +++++++++
 .../python/apache/aurora/client/cli/task.py     | 21 +++++++++++++---
 .../apache/aurora/client/cli/test_task.py       | 20 ++++++++++-----
 4 files changed, 64 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/9d780262/src/main/python/apache/aurora/client/api/command_runner.py
----------------------------------------------------------------------
diff --git a/src/main/python/apache/aurora/client/api/command_runner.py b/src/main/python/apache/aurora/client/api/command_runner.py
index c7238e2..bebb020 100644
--- a/src/main/python/apache/aurora/client/api/command_runner.py
+++ b/src/main/python/apache/aurora/client/api/command_runner.py
@@ -75,8 +75,7 @@ class DistributedCommandRunner(object):
   def query_from(cls, role, env, job):
     return TaskQuery(statuses=LIVE_STATES, jobKeys=[JobKey(role=role, environment=env, name=job)])
 
-  def __init__(self, cluster, role, env, jobs, ssh_user=None,
-      log_fn=log.log):
+  def __init__(self, cluster, role, env, jobs, ssh_user=None, ssh_options=None, log_fn=log.log):
     self._cluster = cluster
     self._api = AuroraClientAPI(
         cluster=cluster,
@@ -85,11 +84,14 @@ class DistributedCommandRunner(object):
     self._env = env
     self._jobs = jobs
     self._ssh_user = ssh_user if ssh_user else self._role
+    self._ssh_options = ssh_options if ssh_options else []
     self._log = log_fn
 
   def execute(self, args):
     hostname, role, command = args
-    ssh_command = ['ssh', '-n', '-q', '%s@%s' % (role, hostname), command]
+    ssh_command = ['ssh', '-n', '-q']
+    ssh_command += self._ssh_options
+    ssh_command += ['%s@%s' % (role, hostname), command]
     self._log(logging.DEBUG, "Running command: %s" % ssh_command)
     po = subprocess.Popen(ssh_command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
     output = po.communicate()
@@ -125,8 +127,22 @@ class InstanceDistributedCommandRunner(DistributedCommandRunner):
         jobKeys=[JobKey(role=role, environment=env, name=job)],
         instanceIds=instances)
 
-  def __init__(self, cluster, role, env, job, ssh_user=None, instances=None, log_fn=logging.log):
-    super(InstanceDistributedCommandRunner, self).__init__(cluster, role, env, [job], ssh_user,
+  def __init__(self,
+               cluster,
+               role,
+               env,
+               job,
+               ssh_user=None,
+               ssh_options=None,
+               instances=None,
+               log_fn=logging.log):
+    super(InstanceDistributedCommandRunner, self).__init__(
+        cluster,
+        role,
+        env,
+        [job],
+        ssh_user,
+        ssh_options,
         log_fn)
     self._job = job
     self._ssh_user = ssh_user if ssh_user else self._role

http://git-wip-us.apache.org/repos/asf/aurora/blob/9d780262/src/main/python/apache/aurora/client/cli/options.py
----------------------------------------------------------------------
diff --git a/src/main/python/apache/aurora/client/cli/options.py b/src/main/python/apache/aurora/client/cli/options.py
index 41b13d6..2263978 100644
--- a/src/main/python/apache/aurora/client/cli/options.py
+++ b/src/main/python/apache/aurora/client/cli/options.py
@@ -157,6 +157,16 @@ def binding_parser(binding):
   return {ref: binding_parts[1]}
 
 
+def parse_options(options):
+  """Parses list of space separated options.
+
+  :param options: String of options
+  :type options: string
+  :rtype: list of options
+  """
+  return options.split() if options is not None else []
+
+
 BATCH_OPTION = CommandOption('--batch-size', type=int, default=1,
         help='Number of instances to be operate on in one iteration')
 
@@ -251,6 +261,8 @@ ROLE_OPTION = CommandOption('--role', metavar='ROLENAME', default=None,
 SSH_USER_OPTION = CommandOption('--ssh-user', '-l', default=None, metavar="ssh_username",
     help='ssh as this username instead of the job\'s role')
 
+SSH_OPTIONS = CommandOption('--ssh-options', type=parse_options, dest='ssh_options',
+    default=None, metavar="ssh_options", help='A string of space separated system ssh options.')
 
 STRICT_OPTION = CommandOption('--strict', default=False, action='store_true',
     help=("Check instances and generate an error for instance ranges in parameters "

http://git-wip-us.apache.org/repos/asf/aurora/blob/9d780262/src/main/python/apache/aurora/client/cli/task.py
----------------------------------------------------------------------
diff --git a/src/main/python/apache/aurora/client/cli/task.py b/src/main/python/apache/aurora/client/cli/task.py
index d1f2568..b722cd8 100644
--- a/src/main/python/apache/aurora/client/cli/task.py
+++ b/src/main/python/apache/aurora/client/cli/task.py
@@ -29,6 +29,7 @@ from apache.aurora.client.cli.context import AuroraCommandContext
 from apache.aurora.client.cli.options import (
     EXECUTOR_SANDBOX_OPTION,
     INSTANCES_SPEC_ARGUMENT,
+    SSH_OPTIONS,
     SSH_USER_OPTION,
     TASK_INSTANCE_ARGUMENT,
     CommandOption
@@ -54,6 +55,7 @@ class RunCommand(Verb):
         CommandOption('--threads', '-t', type=int, default=1, dest='num_threads',
             help='Number of threads to use'),
         SSH_USER_OPTION,
+        SSH_OPTIONS,
         EXECUTOR_SANDBOX_OPTION,
         INSTANCES_SPEC_ARGUMENT,
         CommandOption('cmd', type=str, metavar="unix_command_line")
@@ -62,8 +64,14 @@ class RunCommand(Verb):
   def execute(self, context):
     (cluster_name, role, env, name), instances = context.options.instance_spec
     cluster = CLUSTERS[cluster_name]
-    dcr = InstanceDistributedCommandRunner(cluster, role, env, name,
-        context.options.ssh_user, instances)
+    dcr = InstanceDistributedCommandRunner(
+        cluster,
+        role,
+        env,
+        name,
+        context.options.ssh_user,
+        context.options.ssh_options,
+        instances)
     dcr.run(context.options.cmd, parallelism=context.options.num_threads,
         executor_sandbox=context.options.executor_sandbox)
     return EXIT_OK
@@ -82,6 +90,7 @@ class SshCommand(Verb):
   def get_options(self):
     return [
         SSH_USER_OPTION,
+        SSH_OPTIONS,
         EXECUTOR_SANDBOX_OPTION,
         CommandOption('--tunnels', '-L', dest='tunnels', action='append', metavar='PORT:NAME',
             default=[],
@@ -106,10 +115,14 @@ class SshCommand(Verb):
           "Job %s not found" % context.options.task_instance.jobkey)
     first_task = resp.result.scheduleStatusResult.tasks[0]
     remote_cmd = context.options.command or 'bash'
-    command = DistributedCommandRunner.substitute(remote_cmd, first_task,
-        api.cluster, executor_sandbox=context.options.executor_sandbox)
+    command = DistributedCommandRunner.substitute(
+        remote_cmd,
+        first_task,
+        api.cluster,
+        executor_sandbox=context.options.executor_sandbox)
 
     ssh_command = ['ssh', '-t']
+    ssh_command += context.options.ssh_options if context.options.ssh_options else []
     assigned = first_task.assignedTask
     role = assigned.task.job.role if assigned.task.job else assigned.task.owner.role
     slave_host = assigned.slaveHost

http://git-wip-us.apache.org/repos/asf/aurora/blob/9d780262/src/test/python/apache/aurora/client/cli/test_task.py
----------------------------------------------------------------------
diff --git a/src/test/python/apache/aurora/client/cli/test_task.py b/src/test/python/apache/aurora/client/cli/test_task.py
index 3ad0b70..5432a3d 100644
--- a/src/test/python/apache/aurora/client/cli/test_task.py
+++ b/src/test/python/apache/aurora/client/cli/test_task.py
@@ -58,7 +58,13 @@ class TestRunCommand(AuroraClientCommandTest):
     """Test the run command."""
     self.generic_test_successful_run(['task', 'run', 'west/bozo/test/hello/1-3', 'ls'], [1, 2, 3])
 
-  def generic_test_successful_run(self, cmd_args, instances):
+  def test_successful_run_with_ssh_options(self):
+    self.generic_test_successful_run(
+        ['task', 'run', '--ssh-options=-v -k', 'west/bozo/test/hello', 'ls'],
+        None,
+        ssh_options=['-v', '-k'])
+
+  def generic_test_successful_run(self, cmd_args, instances, ssh_options=None):
     """Common structure of all successful run tests.
     Params:
       cmd_args: the arguments to pass to the aurora command line to run this test.
@@ -92,10 +98,12 @@ class TestRunCommand(AuroraClientCommandTest):
 
       # The mock status call returns 3 three ScheduledTasks, so three commands should have been run
       assert mock_subprocess.call_count == 3
-      mock_subprocess.assert_called_with(['ssh', '-n', '-q', 'bozo@slavehost',
+      expected = ['ssh', '-n', '-q']
+      expected += ssh_options if ssh_options else []
+      expected += ['bozo@slavehost',
           'cd /slaveroot/slaves/*/frameworks/*/executors/thermos-1287391823/runs/'
-          'slaverun/sandbox;ls'],
-          stderr=-2, stdout=-1)
+          'slaverun/sandbox;ls']
+      mock_subprocess.assert_called_with(expected, stderr=-2, stdout=-1)
 
 
 class TestSshCommand(AuroraClientCommandTest):
@@ -131,7 +139,7 @@ class TestSshCommand(AuroraClientCommandTest):
             mock_runner_args_patch,
             mock_subprocess):
       cmd = AuroraCommandLine()
-      cmd.execute(['task', 'ssh', 'west/bozo/test/hello/1', '--command=ls'])
+      cmd.execute(['task', 'ssh', '--ssh-options=-v', 'west/bozo/test/hello/1', '--command=ls'])
 
       # The status command sends a getTasksStatus query to the scheduler,
       # and then prints the result.
@@ -141,7 +149,7 @@ class TestSshCommand(AuroraClientCommandTest):
           statuses=set([ScheduleStatus.RUNNING, ScheduleStatus.KILLING, ScheduleStatus.RESTARTING,
               ScheduleStatus.PREEMPTING, ScheduleStatus.DRAINING
               ])))
-      mock_subprocess.assert_called_with(['ssh', '-t', 'bozo@slavehost',
+      mock_subprocess.assert_called_with(['ssh', '-t', '-v', 'bozo@slavehost',
           'cd /slaveroot/slaves/*/frameworks/*/executors/thermos-1287391823/runs/'
           'slaverun/sandbox;ls'])