diff options
5 files changed, 247 insertions, 0 deletions
diff --git a/app-admin/clustershell/Manifest b/app-admin/clustershell/Manifest index 6f30a4d35adf..782faba883bc 100644 --- a/app-admin/clustershell/Manifest +++ b/app-admin/clustershell/Manifest @@ -1 +1,2 @@ DIST clustershell-1.8.3.tar.gz 363975 BLAKE2B 3a7bb9103398e96f57f53d0d5d5edc6895ce02b6983e8fed34d65cad83a6d4e86f40b9576f41631e499a99adc8be5f4f422005b8ddc7ac8325fe11abd2c99477 SHA512 5108773e2958d1dae0aa6966d764e9af9d41024f65271005b202468f2bd1a3b63acc977729324fe1305d400dc8b06b0c4672e8d8ded207fa77cef69fb0005108 +DIST clustershell-1.8.4.gh.tar.gz 367622 BLAKE2B 1487697a49d37902f9763094da1a156f5e7cc2ab0487814207bb9da03b1109f1ce55034fc92e72262d4b9920d5c52b9f6de84ce1ff04b06d042b0a6d005f1049 SHA512 582393e56d94e62e126d91f8af074a7b57d0e781a5c929cfc374e61324c412c32fcf9a8e063a78cb805c2ff34641887a1adfc7ef9f377b881077f719dbc2adc3 diff --git a/app-admin/clustershell/clustershell-1.8.4.ebuild b/app-admin/clustershell/clustershell-1.8.4.ebuild new file mode 100644 index 000000000000..9ad14aaab935 --- /dev/null +++ b/app-admin/clustershell/clustershell-1.8.4.ebuild @@ -0,0 +1,67 @@ +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DISTUTILS_USE_PEP517=setuptools +PYTHON_COMPAT=( python3_{9..11} ) +PYTHON_REQ_USE="xml(+)" + +inherit distutils-r1 + +DESCRIPTION="Python framework for efficient cluster administration" +HOMEPAGE="https://github.com/cea-hpc/clustershell/" +SRC_URI=" + https://github.com/cea-hpc/clustershell/archive/v${PV}.tar.gz + -> ${P}.gh.tar.gz +" + +LICENSE="LGPL-2.1+" +SLOT="0" +KEYWORDS="~amd64 ~x86" + +BDEPEND=" + test? ( + app-shells/pdsh + net-misc/openssh + sys-devel/bc + ) +" + +RDEPEND="dev-python/pyyaml[${PYTHON_USEDEP}]" + +PATCHES=( + # python3.10 related fixes taken from upstream + "${FILESDIR}/${P}-setrlimit-division.patch" + "${FILESDIR}/${P}-current-thread.patch" + + "${FILESDIR}/${P}-skip-tests.patch" +) + +distutils_enable_tests unittest + +src_prepare() { + default + + # remove test sets that require working ssh connection + rm tests/{CLIClush,TaskDistant*,TreeWorker}Test.py || die +} + +python_test() { + cd tests || die + # Automatic discovery does not work + "${EPYTHON}" -m unittest_or_fail -v *.py || die "Tests failed with ${EPYTHON}" +} + +src_install() { + distutils-r1_src_install + + doman doc/man/man*/* + + mv "${ED}/usr/etc" "${ED}/etc" || die +} + +pkg_postinst() { + einfo "Some default system-wide config files have been installed into" + einfo "/etc/${PN}" +} diff --git a/app-admin/clustershell/files/clustershell-1.8.4-current-thread.patch b/app-admin/clustershell/files/clustershell-1.8.4-current-thread.patch new file mode 100644 index 000000000000..bf9c7edb6a90 --- /dev/null +++ b/app-admin/clustershell/files/clustershell-1.8.4-current-thread.patch @@ -0,0 +1,95 @@ +Backported from upstream commit 314767d65c39 ("Fix for python-3.10") [1]. + +[1] https://github.com/cea-hpc/clustershell/commit/314767d65c397fadc5ce0ae205a35d7bb47a68a8 + +diff --git a/lib/ClusterShell/Task.py b/lib/ClusterShell/Task.py +index b9142e6..8c9e1b9 100644 +--- a/lib/ClusterShell/Task.py ++++ b/lib/ClusterShell/Task.py +@@ -254,7 +254,7 @@ class Task(object): + self._cond.acquire() + try: + self.suspend_count = min(self.suspend_count, 0) +- self._cond.notifyAll() ++ self._cond.notify_all() + finally: + self._cond.release() + +@@ -347,7 +347,7 @@ class Task(object): + def _is_task_self(self): + """Private method used by the library to check if the task is + task_self(), but do not create any task_self() instance.""" +- return self.thread == threading.currentThread() ++ return self.thread == threading.current_thread() + + def default_excepthook(self, exc_type, exc_value, tb): + """Default excepthook for a newly Task. When an exception is +@@ -765,7 +765,7 @@ class Task(object): + + def _resume(self): + """Resume task - called from self thread.""" +- assert self.thread == threading.currentThread() ++ assert self.thread == threading.current_thread() + try: + try: + self._reset() +@@ -780,7 +780,7 @@ class Task(object): + # task becomes joinable + self._join_cond.acquire() + self._suspend_cond.atomic_inc() +- self._join_cond.notifyAll() ++ self._join_cond.notify_all() + self._join_cond.release() + + def resume(self, timeout=None): +@@ -954,14 +954,14 @@ class Task(object): + # termination (late join()s) + # must be called after _terminated is set to True + self._join_cond.acquire() +- self._join_cond.notifyAll() ++ self._join_cond.notify_all() + self._join_cond.release() + + # destroy task if needed + if kill: + Task._task_lock.acquire() + try: +- del Task._tasks[threading.currentThread()] ++ del Task._tasks[threading.current_thread()] + finally: + Task._task_lock.release() + +@@ -1376,7 +1376,7 @@ def task_self(defaults=None): + provided as a convenience is available in the top-level ClusterShell.Task + package namespace. + """ +- return Task(thread=threading.currentThread(), defaults=defaults) ++ return Task(thread=threading.current_thread(), defaults=defaults) + + def task_wait(): + """ +@@ -1385,7 +1385,7 @@ def task_wait(): + convenience and is available in the top-level ClusterShell.Task package + namespace. + """ +- Task.wait(threading.currentThread()) ++ Task.wait(threading.current_thread()) + + def task_terminate(): + """ +diff --git a/tests/TaskPortTest.py b/tests/TaskPortTest.py +index 697f144..4014a89 100644 +--- a/tests/TaskPortTest.py ++++ b/tests/TaskPortTest.py +@@ -28,7 +28,7 @@ class TaskPortTest(unittest.TestCase): + def ev_msg(self, port, msg): + # receive msg + assert msg == "toto" +- assert port.task.thread == threading.currentThread() ++ assert port.task.thread == threading.current_thread() + TaskPortTest.got_msg = True + port.task.abort() + +-- +2.35.1 + diff --git a/app-admin/clustershell/files/clustershell-1.8.4-setrlimit-division.patch b/app-admin/clustershell/files/clustershell-1.8.4-setrlimit-division.patch new file mode 100644 index 000000000000..9ecd807591a8 --- /dev/null +++ b/app-admin/clustershell/files/clustershell-1.8.4-setrlimit-division.patch @@ -0,0 +1,21 @@ +Python3.10 related fix taken from upstream [1,2]. + +[1] https://github.com/cea-hpc/clustershell/pull/487 +[2] https://github.com/cea-hpc/clustershell/commit/5ac85daf74056ec7e60778efec94c746a150142c + +diff --git a/tests/CLIConfigTest.py b/tests/CLIConfigTest.py +index 2853398..db6cec5 100644 +--- a/tests/CLIConfigTest.py ++++ b/tests/CLIConfigTest.py +@@ -229,7 +229,7 @@ class CLIClushConfigTest(unittest.TestCase): + display = Display(options, config) + + # force a lower soft limit +- resource.setrlimit(resource.RLIMIT_NOFILE, (hard2/2, hard)) ++ resource.setrlimit(resource.RLIMIT_NOFILE, (hard2//2, hard)) + # max_fdlimit should increase soft limit again + set_fdlimit(config.fd_max, display) + # verify +-- +2.35.1 + diff --git a/app-admin/clustershell/files/clustershell-1.8.4-skip-tests.patch b/app-admin/clustershell/files/clustershell-1.8.4-skip-tests.patch new file mode 100644 index 000000000000..4374ae4b525c --- /dev/null +++ b/app-admin/clustershell/files/clustershell-1.8.4-skip-tests.patch @@ -0,0 +1,63 @@ +This is a Gentoo specific patch for skipping tests that do not work due +to various reasons: +1. hostname may be set to localhost +2. test fails which are most probably caused by weird test interaction. + The issue is reported to upstream in [1]. + +[1] https://github.com/cea-hpc/clustershell/issues/488 + +diff --git a/tests/TaskEventTest.py b/tests/TaskEventTest.py +index f8a4048..900008b 100644 +--- a/tests/TaskEventTest.py ++++ b/tests/TaskEventTest.py +@@ -475,6 +475,7 @@ class TaskEventTest(unittest.TestCase): + self.assertEqual(eh.cnt_pickup, 3) + self.assertEqual(eh.cnt_hup, 3) + ++ @unittest.skip("because of an issue https://github.com/cea-hpc/clustershell/issues/488") + def test_ev_pickup_fanout_legacy(self): + """test ev_pickup event with fanout (legacy)""" + task = task_self() +@@ -498,6 +499,7 @@ class TaskEventTest(unittest.TestCase): + finally: + task.set_info("fanout", fanout) + ++ @unittest.skip("because of an issue https://github.com/cea-hpc/clustershell/issues/488") + def test_ev_pickup_fanout(self): + """test ev_pickup event with fanout""" + task = task_self() +diff --git a/tests/TreeWorkerTest.py b/tests/TreeWorkerTest.py +index d5c221a..969d3c9 100644 +--- a/tests/TreeWorkerTest.py ++++ b/tests/TreeWorkerTest.py +@@ -99,6 +99,7 @@ class TEventHandler(TEventHandlerBase): + self.ev_timedout_cnt += 1 + + ++@unittest.skipIf(HOSTNAME == 'localhost', "does not work with hostname set to 'localhost'") + class TreeWorkerTest(unittest.TestCase): + """ + TreeWorkerTest: test TreeWorker +diff --git a/tests/WorkerExecTest.py b/tests/WorkerExecTest.py +index 6f99f10..0894f99 100644 +--- a/tests/WorkerExecTest.py ++++ b/tests/WorkerExecTest.py +@@ -45,6 +45,7 @@ class ExecTest(unittest.TestCase): + self.assertEqual(task_self().max_retcode(), 1) + self.assertEqual(task_self().node_buffer('localhost'), b'') + ++ @unittest.skipIf(HOSTNAME == 'localhost', "does not work with hostname set to 'localhost'") + def test_timeout(self): + """test ExecWorker with a timeout""" + nodes = "localhost,%s" % HOSTNAME +@@ -67,6 +68,7 @@ class ExecTest(unittest.TestCase): + self.assertRaises(WorkerError, self.execw, + nodes="localhost", handler=None, command="echo %") + ++ @unittest.skipIf(HOSTNAME == 'localhost', "does not work with hostname set to 'localhost'") + def test_rank_placeholder(self): + """test ExecWorker with several nodes and %n (rank)""" + nodes = "localhost,%s" % HOSTNAME +-- +2.35.1 + |