From 86165fbdbadaa48a0512bd603297985dab0bafdf9a4060297f28164508800ea6 Mon Sep 17 00:00:00 2001 From: Xin Liang Date: Fri, 30 Sep 2022 03:24:29 +0000 Subject: [PATCH] Accepting request 1006552 from home:nicholasyang:branches:devel:languages:python - Dev: add parallax.run() to return non-zero rc without raising exceptions Add patch 0005-Dev-add-parallax.run-to-return-non-zero-rc-without-r.patch - Fix: Error: inherit from Exception instead of BaseExceptin Add patch 0004-Fix-Error-inherit-from-Exception-instead-of-BaseExce.patch OBS-URL: https://build.opensuse.org/request/show/1006552 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-parallax?expand=0&rev=41 --- ...t-from-Exception-instead-of-BaseExce.patch | 34 ++++++ ....run-to-return-non-zero-rc-without-r.patch | 115 ++++++++++++++++++ python-parallax.changes | 8 ++ python-parallax.spec | 4 + 4 files changed, 161 insertions(+) create mode 100644 0004-Fix-Error-inherit-from-Exception-instead-of-BaseExce.patch create mode 100644 0005-Dev-add-parallax.run-to-return-non-zero-rc-without-r.patch diff --git a/0004-Fix-Error-inherit-from-Exception-instead-of-BaseExce.patch b/0004-Fix-Error-inherit-from-Exception-instead-of-BaseExce.patch new file mode 100644 index 0000000..fa032fb --- /dev/null +++ b/0004-Fix-Error-inherit-from-Exception-instead-of-BaseExce.patch @@ -0,0 +1,34 @@ +From 31024ba3eafebbf73b188b6a102c4d8f00669705 Mon Sep 17 00:00:00 2001 +From: nicholasyang +Date: Tue, 27 Sep 2022 12:08:17 +0800 +Subject: [PATCH 4/5] Fix: Error: inherit from Exception instead of + BaseExceptin + +--- + parallax/__init__.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/parallax/__init__.py b/parallax/__init__.py +index aa6ebd9..209c6f7 100644 +--- a/parallax/__init__.py ++++ b/parallax/__init__.py +@@ -55,14 +55,14 @@ def to_ascii(s): + return s + + +-class Error(BaseException): ++class Error(Exception): + """ + Returned instead of a result for a host + in case of an error during the processing for + that host. + """ + def __init__(self, msg, task): +- super(BaseException, self).__init__() ++ super(Exception, self).__init__() + self.msg = msg + self.task = task + +-- +2.37.3 + diff --git a/0005-Dev-add-parallax.run-to-return-non-zero-rc-without-r.patch b/0005-Dev-add-parallax.run-to-return-non-zero-rc-without-r.patch new file mode 100644 index 0000000..bf8364d --- /dev/null +++ b/0005-Dev-add-parallax.run-to-return-non-zero-rc-without-r.patch @@ -0,0 +1,115 @@ +From 38bac0eb3cb20e9df8cbbf585cf9353793ffdba2 Mon Sep 17 00:00:00 2001 +From: nicholasyang +Date: Tue, 27 Sep 2022 12:08:17 +0800 +Subject: [PATCH 5/5] Dev: add parallax.run() to return non-zero rc without + raising exceptions + +--- + README.md | 15 ++++++++--- + parallax/__init__.py | 60 +++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 70 insertions(+), 5 deletions(-) + +diff --git a/README.md b/README.md +index beb5620..268f6db 100644 +--- a/README.md ++++ b/README.md +@@ -32,10 +32,17 @@ Share and enjoy! + + Executes the given command on a set of hosts, collecting the output. + +- Returns a dict mapping the hostname of +- each host either to a tuple containing a return code, +- stdout and stderr, or an `parallax.Error` instance +- describing the error. ++ Returns a dict mapping the hostname of each host either to a tuple containing ++ a return code, stdout and stderr when return code is 0, or an `parallax.Error` ++ instance describing the error when return code is not 0. ++ ++* `parallax.run(hosts, cmdline, opts)` ++ ++ Executes the given command on a set of hosts, collecting the output. ++ ++ Returns a dict mapping the hostname of each host either to a tuple containing ++ a return code, stdout and stderr, or an `parallax.Error` instance describing ++ the error when ssh error occurred. + + * `parallax.copy(hosts, src, dst, opts)` + +diff --git a/parallax/__init__.py b/parallax/__init__.py +index 209c6f7..a3dc75e 100644 +--- a/parallax/__init__.py ++++ b/parallax/__init__.py +@@ -162,7 +162,7 @@ def _build_call_cmd(host, port, user, cmdline, opts): + + def call(hosts, cmdline, opts=Options()): + """ +- Executes the given command on a set of hosts, collecting the output ++ Executes the given command on a set of hosts, collecting the output. Return Error when exit status != 0. + Returns {host: (rc, stdout, stdin) | Error} + """ + if opts.outdir and not os.path.exists(opts.outdir): +@@ -384,3 +384,61 @@ def is_local_host(host): + except: + hostname = host + return hostname == socket.gethostname() ++ ++def run(hosts, cmdline, opts=Options()): ++ """ ++ Executes the given command on a set of hosts, collecting the output. Return Error when ssh error occurred. ++ Returns {host: (rc, stdout, stdin) | Error} ++ """ ++ if opts.outdir and not os.path.exists(opts.outdir): ++ os.makedirs(opts.outdir) ++ if opts.errdir and not os.path.exists(opts.errdir): ++ os.makedirs(opts.errdir) ++ manager = Manager(limit=opts.limit, ++ timeout=opts.timeout, ++ askpass=opts.askpass, ++ outdir=opts.outdir, ++ errdir=opts.errdir, ++ warn_message=opts.warn_message, ++ callbacks=_RunOutputBuilder()) ++ for host, port, user in _expand_host_port_user(hosts): ++ is_local = is_local_host(host) ++ if is_local: ++ cmd = [cmdline] ++ else: ++ cmd = _build_call_cmd(host, port, user, cmdline, opts) ++ t = Task(host, port, user, cmd, ++ stdin=opts.input_stream, ++ verbose=opts.verbose, ++ quiet=opts.quiet, ++ print_out=opts.print_out, ++ inline=opts.inline, ++ inline_stdout=opts.inline_stdout, ++ default_user=opts.default_user, ++ is_local=is_local) ++ manager.add_task(t) ++ try: ++ return manager.run() ++ except FatalError as err: ++ raise IOError(str(err)) ++ ++ ++class _RunOutputBuilder(object): ++ def __init__(self): ++ self.finished_tasks = [] ++ ++ def finished(self, task, n): ++ """Called when Task is complete""" ++ self.finished_tasks.append(task) ++ ++ def result(self, manager): ++ """Called when all Tasks are complete to generate result""" ++ ret = {} ++ for task in self.finished_tasks: ++ if task.exitstatus == 255: ++ ret[task.host] = Error(', '.join(task.failures), task) ++ else: ++ ret[task.host] = (task.exitstatus, ++ task.outputbuffer or manager.outdir, ++ task.errorbuffer or manager.errdir) ++ return ret +-- +2.37.3 + diff --git a/python-parallax.changes b/python-parallax.changes index 155dea7..cfc0e14 100644 --- a/python-parallax.changes +++ b/python-parallax.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Wed Sep 28 02:34:51 UTC 2022 - Nicholas Yang + +- Dev: add parallax.run() to return non-zero rc without raising exceptions + Add patch 0005-Dev-add-parallax.run-to-return-non-zero-rc-without-r.patch +- Fix: Error: inherit from Exception instead of BaseExceptin + Add patch 0004-Fix-Error-inherit-from-Exception-instead-of-BaseExce.patch + ------------------------------------------------------------------- Thu Jul 28 01:42:06 UTC 2022 - XinLiang diff --git a/python-parallax.spec b/python-parallax.spec index d50f107..02b3b83 100644 --- a/python-parallax.spec +++ b/python-parallax.spec @@ -28,6 +28,8 @@ Source: https://files.pythonhosted.org/packages/source/p/parallax/parall Patch1: 0001-Add-ssh_key-option-used-by-i-option-of-ssh-scp.patch Patch2: 0002-Change-format-of-scp-command-for-ipv6-compatible.patch Patch3: 0003-Fix-task-Don-t-use-ssh-if-command-running-on-local-b.patch +Patch4: 0004-Fix-Error-inherit-from-Exception-instead-of-BaseExce.patch +Patch5: 0005-Dev-add-parallax.run-to-return-non-zero-rc-without-r.patch BuildRequires: %{python_module setuptools} BuildRequires: fdupes @@ -55,6 +57,8 @@ multiple nodes using SCP. %patch1 -p1 %patch2 -p1 %patch3 -p1 +%patch4 -p1 +%patch5 -p1 %build %python_build