ClusterShell 1.9.3__tar.gz → 1.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ClusterShell-1.9.3 → clustershell-1.10}/ChangeLog +73 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/MANIFEST.in +1 -0
- clustershell-1.10/PKG-INFO +111 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/README.md +33 -26
- {ClusterShell-1.9.3 → clustershell-1.10}/bash_completion.d/cluset +5 -4
- clustershell-1.10/bash_completion.d/clush +159 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf +1 -1
- clustershell-1.10/conf/groups.conf.d/ansible.conf.example +25 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf.d/slurm.conf.example +7 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.d/cluster.yaml.example +1 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man1/clubak.1 +6 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man1/cluset.1 +6 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man1/clush.1 +9 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man1/nodeset.1 +6 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man5/clush.conf.5 +9 -2
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/man/man5/groups.conf.5 +21 -5
- clustershell-1.10/doc/sphinx/CHARTER.rst +233 -0
- clustershell-1.10/doc/sphinx/acknowledgments.rst +22 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/conf.py +3 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/config.rst +116 -6
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/further.rst +4 -9
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/guide/nodesets.rst +1 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/guide/taskmgnt.rst +8 -7
- clustershell-1.10/doc/sphinx/index.rst +34 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/install.rst +8 -6
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/release.rst +132 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/tools/clubak.rst +5 -2
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/tools/cluset.rst +63 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/tools/clush.rst +28 -2
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/tools/nodeset.rst +63 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/clubak.txt +6 -4
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/cluset.txt +5 -4
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/clush.conf.txt +12 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/clush.txt +8 -4
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/clustershell.rst +1 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/groups.conf.txt +21 -6
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/nodeset.txt +5 -4
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Clubak.py +7 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Clush.py +14 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Display.py +9 -8
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Nodeset.py +12 -8
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/OptionParser.py +7 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Utils.py +12 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Communication.py +24 -7
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/Engine.py +2 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Gateway.py +9 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/NodeSet.py +96 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/NodeUtils.py +87 -15
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Propagation.py +53 -31
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/RangeSet.py +99 -11
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Task.py +35 -6
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Topology.py +3 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/EngineClient.py +9 -4
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Tree.py +101 -25
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/__init__.py +3 -3
- clustershell-1.10/lib/ClusterShell.egg-info/PKG-INFO +111 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell.egg-info/SOURCES.txt +6 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell.egg-info/entry_points.txt +0 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/setup.cfg +0 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/setup.py +4 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLIClubakTest.py +33 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLIClushTest.py +67 -5
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLIConfigTest.py +1 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLINodesetTest.py +101 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/DefaultsTest.py +1 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/MisusageTest.py +1 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/NodeSetGroupTest.py +270 -27
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/NodeSetTest.py +60 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/RangeSetNDTest.py +34 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/RangeSetTest.py +66 -3
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/StreamWorkerTest.py +38 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TLib.py +21 -2
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskDistantMixin.py +1 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskDistantPdshMixin.py +1 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskDistantPdshTest.py +5 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskDistantTest.py +1 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskLocalTest.py +1 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskRLimitsTest.py +3 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskThreadJoinTest.py +35 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskTimerTest.py +1 -1
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TreeGatewayTest.py +14 -4
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TreeTaskTest.py +4 -4
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TreeTopologyTest.py +8 -2
- clustershell-1.10/tests/TreeWorkerTest.py +1157 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/WorkerExecTest.py +1 -1
- clustershell-1.10/tests/__init__.py +0 -0
- clustershell-1.10/tests/bin/hostname +4 -0
- ClusterShell-1.9.3/PKG-INFO +0 -96
- ClusterShell-1.9.3/bash_completion.d/clush +0 -91
- ClusterShell-1.9.3/doc/sphinx/clustershell-nautilus-logo200.png +0 -0
- ClusterShell-1.9.3/doc/sphinx/index.rst +0 -25
- ClusterShell-1.9.3/lib/ClusterShell.egg-info/PKG-INFO +0 -96
- ClusterShell-1.9.3/tests/TreeWorkerTest.py +0 -448
- {ClusterShell-1.9.3 → clustershell-1.10}/COPYING.LGPLv2.1 +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/clush.conf +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/clush.conf.d/README +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/clush.conf.d/sshpass.conf.example +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/clush.conf.d/sudo.conf.example +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf.d/README +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf.d/ace.conf.example +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf.d/genders.conf.example +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.conf.d/xcat.conf.example +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.d/README +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/groups.d/local.cfg +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/conf/topology.conf.example +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/epydoc/clustershell_epydoc.conf +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/examples/check_nodes.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/examples/defaults.conf-rsh +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/extras/vim/ftdetect/clustershell.vim +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/extras/vim/syntax/clushconf.vim +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/extras/vim/syntax/groupsconf.vim +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/Makefile +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/_static/clustershell-nautilus-logo200.png +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/_static/theme_overrides.css +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/Defaults.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/EngineTimer.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/Event.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/MsgTree.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/NodeSet.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/NodeUtils.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/RangeSet.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/Task.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/index.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/ExecWorker.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/StreamWorker.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/TreeWorker.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/Worker.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/WorkerPdsh.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/WorkerPopen.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/WorkerRsh.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/WorkerSsh.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/api/workers/index.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/guide/examples.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/guide/index.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/guide/rangesets.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/intro.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/sphinx/tools/index.rst +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/doc/txt/README +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Config.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/Error.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/CLI/__init__.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Defaults.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/EPoll.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/Factory.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/Poll.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/Select.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Engine/__init__.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Event.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/MsgTree.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Exec.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Pdsh.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Popen.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Rsh.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Ssh.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/Worker.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/__init__.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell/Worker/fastsubprocess.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell.egg-info/dependency_links.txt +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell.egg-info/requires.txt +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/lib/ClusterShell.egg-info/top_level.txt +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLIDisplayTest.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/CLIOptionParserTest.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/MsgTreeTest.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskEventTest.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskLocalMixin.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskMsgTreeTest.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskPortTest.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskThreadSuspendTest.py +0 -0
- {ClusterShell-1.9.3 → clustershell-1.10}/tests/TaskTimeoutTest.py +0 -0
|
@@ -1,3 +1,76 @@
|
|
|
1
|
+
2026-07-04 S. Thiell <sthiell@stanford.edu>
|
|
2
|
+
|
|
3
|
+
* Version 1.10 released. The main changes are listed below.
|
|
4
|
+
|
|
5
|
+
* NodeUtils: add the 'mapall' group source upcall to retrieve all group
|
|
6
|
+
mappings in a single call, greatly speeding up group resolution on slow
|
|
7
|
+
sources (#612, #613)
|
|
8
|
+
|
|
9
|
+
* NodeUtils: do not pass stdin to group source upcalls (#581)
|
|
10
|
+
|
|
11
|
+
* NodeSet, RangeSet: add a list-like index() method returning the position
|
|
12
|
+
of a node or element, the inverse of [i] (#631, #633)
|
|
13
|
+
|
|
14
|
+
* cluset, nodeset: add a --index command to output a node's position in the
|
|
15
|
+
set, the reverse of -I/--slice (#637)
|
|
16
|
+
|
|
17
|
+
* groups.conf: add mapall upcalls to the Slurm group bindings (#623)
|
|
18
|
+
|
|
19
|
+
* groups.conf: add an Ansible inventory group source example (#610)
|
|
20
|
+
|
|
21
|
+
* clush, clubak: add --axis to fold nD node sets along selected axis only,
|
|
22
|
+
as already supported by nodeset and cluset (#356)
|
|
23
|
+
|
|
24
|
+
* Display: fix line buffering on Python 3.6 (#597)
|
|
25
|
+
|
|
26
|
+
* Tree: implement TreeWorker.abort() and per-gateway abort, with gateway
|
|
27
|
+
failover fixes (#229, #566)
|
|
28
|
+
|
|
29
|
+
* Tree: fire ev_pickup only once the command can no longer be rerouted and
|
|
30
|
+
improve reroute event reporting (#594)
|
|
31
|
+
|
|
32
|
+
* Tree: fix rcopy when a remote node closes (#545)
|
|
33
|
+
|
|
34
|
+
* Tree: improve handling of MessageProcessingError (#596)
|
|
35
|
+
|
|
36
|
+
* Tree: keep tar/scp errors on stderr instead of stdout during forward
|
|
37
|
+
copy (#622)
|
|
38
|
+
|
|
39
|
+
* Tree: pass filter='fully_trusted' to tarfile.extractall() (PEP 706) (#617)
|
|
40
|
+
|
|
41
|
+
* EngineClient: properly honor the abort flag on close (#591)
|
|
42
|
+
|
|
43
|
+
* Engine: fix set_events debug logging to identify the client and stream (#630)
|
|
44
|
+
|
|
45
|
+
* Task: only terminate a task once when killed, fixing a double termination
|
|
46
|
+
(#110, #640)
|
|
47
|
+
|
|
48
|
+
* NodeUtils, Topology: emit a DeprecationWarning for set_verbosity() and the
|
|
49
|
+
topology.conf [Main] section (#226, #639)
|
|
50
|
+
|
|
51
|
+
* Gateway: fix a Python 2 syntax error (#625)
|
|
52
|
+
|
|
53
|
+
* RangeSet: accept unicode strings on Python 2 (#635)
|
|
54
|
+
|
|
55
|
+
* completion: complete copy paths and command, and short options without
|
|
56
|
+
spaces (#585, #586)
|
|
57
|
+
|
|
58
|
+
* completion: treat -b/-B and clush's other no-arg options as flags (#598, #619)
|
|
59
|
+
|
|
60
|
+
* completion: fix cluset no-arg option lists (#620)
|
|
61
|
+
|
|
62
|
+
* doc: clarify the '*' all-nodes wildcard versus the literal 'all' group
|
|
63
|
+
source (#552)
|
|
64
|
+
|
|
65
|
+
* doc: HPSF onboarding (charter, DCO, governance) and misc doc fixes
|
|
66
|
+
(#577, #604)
|
|
67
|
+
|
|
68
|
+
* setup: clean up wheel packaging metadata (#634)
|
|
69
|
+
|
|
70
|
+
* CI: add Python 3.14 to the test matrix; run the test suite with the
|
|
71
|
+
standard library unittest instead of the abandoned nosetests runner
|
|
72
|
+
(#603, #618)
|
|
73
|
+
|
|
1
74
|
2025-01-23 S. Thiell <sthiell@stanford.edu>
|
|
2
75
|
|
|
3
76
|
* Version 1.9.3 released. The main changes are listed below.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ClusterShell
|
|
3
|
+
Version: 1.10
|
|
4
|
+
Summary: ClusterShell library and tools
|
|
5
|
+
Home-page: https://clustershell.readthedocs.io/
|
|
6
|
+
Download-URL: https://github.com/clustershell/clustershell/archive/refs/tags/v1.10.tar.gz
|
|
7
|
+
Author: Stephane Thiell
|
|
8
|
+
Author-email: sthiell@stanford.edu
|
|
9
|
+
License: LGPLv2+
|
|
10
|
+
Keywords: clustershell,clush,clubak,nodeset
|
|
11
|
+
Platform: GNU/Linux
|
|
12
|
+
Platform: BSD
|
|
13
|
+
Platform: MacOSX
|
|
14
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Intended Audience :: System Administrators
|
|
17
|
+
Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)
|
|
18
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
19
|
+
Classifier: Operating System :: POSIX :: BSD
|
|
20
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
21
|
+
Classifier: Programming Language :: Python
|
|
22
|
+
Classifier: Programming Language :: Python :: 2.7
|
|
23
|
+
Classifier: Programming Language :: Python :: 3
|
|
24
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
25
|
+
Classifier: Topic :: System :: Clustering
|
|
26
|
+
Classifier: Topic :: System :: Distributed Computing
|
|
27
|
+
Description-Content-Type: text/x-rst
|
|
28
|
+
License-File: COPYING.LGPLv2.1
|
|
29
|
+
Requires-Dist: PyYAML
|
|
30
|
+
Dynamic: author
|
|
31
|
+
Dynamic: author-email
|
|
32
|
+
Dynamic: classifier
|
|
33
|
+
Dynamic: description
|
|
34
|
+
Dynamic: description-content-type
|
|
35
|
+
Dynamic: download-url
|
|
36
|
+
Dynamic: home-page
|
|
37
|
+
Dynamic: keywords
|
|
38
|
+
Dynamic: license
|
|
39
|
+
Dynamic: license-file
|
|
40
|
+
Dynamic: platform
|
|
41
|
+
Dynamic: requires-dist
|
|
42
|
+
Dynamic: summary
|
|
43
|
+
|
|
44
|
+
ClusterShell is an event-driven open source Python framework, designed to run
|
|
45
|
+
local or distant commands in parallel on server farms or on large Linux
|
|
46
|
+
clusters. It will take care of common issues encountered on HPC clusters, such
|
|
47
|
+
as operating on groups of nodes, running distributed commands using optimized
|
|
48
|
+
execution algorithms, as well as gathering results and merging identical
|
|
49
|
+
outputs, or retrieving return codes. ClusterShell takes advantage of existing
|
|
50
|
+
remote shell facilities already installed on your systems, like SSH.
|
|
51
|
+
|
|
52
|
+
ClusterShell provides clush, clubak and cluset/nodeset, convenient command-line
|
|
53
|
+
tools that allow traditional shell scripts to benefit from some of the
|
|
54
|
+
library's features:
|
|
55
|
+
|
|
56
|
+
- **clush**: issue commands to cluster nodes and format output
|
|
57
|
+
|
|
58
|
+
Example of use:
|
|
59
|
+
|
|
60
|
+
::
|
|
61
|
+
|
|
62
|
+
$ clush -abL uname -r
|
|
63
|
+
node[32-49,51-71,80,82-150,156-159]: 2.6.18-164.11.1.el5
|
|
64
|
+
node[3-7,72-79]: 2.6.18-164.11.1.el5_lustre1.10.0.36
|
|
65
|
+
node[2,151-155]: 2.6.31.6-145.fc11.2.x86_64
|
|
66
|
+
|
|
67
|
+
See *man clush* for more details.
|
|
68
|
+
|
|
69
|
+
- **clubak**: improved dshbak to gather and sort dsh-like outputs
|
|
70
|
+
|
|
71
|
+
See *man clubak* for more details.
|
|
72
|
+
|
|
73
|
+
- **nodeset** (or **cluset**): compute advanced nodeset/nodegroup operations
|
|
74
|
+
|
|
75
|
+
Examples of use:
|
|
76
|
+
|
|
77
|
+
::
|
|
78
|
+
|
|
79
|
+
$ echo node160 node161 node162 node163 | nodeset -f
|
|
80
|
+
node[160-163]
|
|
81
|
+
|
|
82
|
+
$ nodeset -f node[0-7,32-159] node[160-163]
|
|
83
|
+
node[0-7,32-163]
|
|
84
|
+
|
|
85
|
+
$ nodeset -e node[160-163]
|
|
86
|
+
node160 node161 node162 node163
|
|
87
|
+
|
|
88
|
+
$ nodeset -f node[32-159] -x node33
|
|
89
|
+
node[32,34-159]
|
|
90
|
+
|
|
91
|
+
$ nodeset -f node[32-159] -i node[0-7,20-21,32,156-159]
|
|
92
|
+
node[32,156-159]
|
|
93
|
+
|
|
94
|
+
$ nodeset -f node[33-159] --xor node[32-33,156-159]
|
|
95
|
+
node[32,34-155]
|
|
96
|
+
|
|
97
|
+
$ nodeset -l
|
|
98
|
+
@oss
|
|
99
|
+
@mds
|
|
100
|
+
@io
|
|
101
|
+
@compute
|
|
102
|
+
|
|
103
|
+
$ nodeset -e @mds
|
|
104
|
+
node6 node7
|
|
105
|
+
|
|
106
|
+
See *man nodeset* (or *man cluset*) for more details.
|
|
107
|
+
|
|
108
|
+
Please visit the ClusterShell website_.
|
|
109
|
+
|
|
110
|
+
.. _website: https://clustershell.readthedocs.io/
|
|
111
|
+
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
ClusterShell Python Library and Tools
|
|
2
2
|
=====================================
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
[](https://hpsf.io)
|
|
5
|
+
|
|
6
|
+
This project adheres to a [Technical Charter](https://clustershell.readthedocs.io/en/latest/CHARTER.html), which defines its governance model, decision-making process, and long-term vision.
|
|
7
|
+
|
|
8
|
+
ClusterShell is an event-driven open source Python library designed to run
|
|
5
9
|
local or distant commands in parallel on server farms or on large Linux
|
|
6
|
-
clusters. It
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
clusters. It is an [HPSF Established](https://hpsf.io) project under
|
|
11
|
+
[LF Europe](https://linuxfoundation.eu/) stewardship.
|
|
12
|
+
|
|
13
|
+
ClusterShell handles typical HPC cluster administration tasks: operating on
|
|
14
|
+
groups of nodes, executing distributed commands with optimized algorithms,
|
|
15
|
+
gathering and merging output, and collecting return codes. It leverages remote
|
|
16
|
+
shell facilities already present on your systems, such as SSH.
|
|
11
17
|
|
|
12
18
|
ClusterShell's primary goal is to improve the administration of high-
|
|
13
19
|
performance clusters by providing a lightweight but scalable Python API for
|
|
@@ -34,7 +40,7 @@ Documentation
|
|
|
34
40
|
|
|
35
41
|
Online documentation is available here:
|
|
36
42
|
|
|
37
|
-
|
|
43
|
+
https://clustershell.readthedocs.io/
|
|
38
44
|
|
|
39
45
|
The Sphinx documentation source is available under the doc/sphinx directory.
|
|
40
46
|
Type 'make' to see all available formats (you need Sphinx installed and
|
|
@@ -54,11 +60,13 @@ The following man pages are also provided:
|
|
|
54
60
|
Test Suite
|
|
55
61
|
----------
|
|
56
62
|
|
|
57
|
-
Regression testing scripts are available in the 'tests' directory
|
|
63
|
+
Regression testing scripts are available in the 'tests' directory. To run the
|
|
64
|
+
whole test suite from the source tree root:
|
|
58
65
|
|
|
59
|
-
$
|
|
60
|
-
|
|
61
|
-
|
|
66
|
+
$ python -m unittest discover -v -s tests -p '*Test.py' -t .
|
|
67
|
+
|
|
68
|
+
To run a single test module, narrow the discovery pattern, for example
|
|
69
|
+
`-p 'NodeSetTest.py'`.
|
|
62
70
|
|
|
63
71
|
You have to allow 'ssh localhost' and 'ssh $HOSTNAME' without any warnings for
|
|
64
72
|
"remote" tests to run as expected. $HOSTNAME should not be 127.0.0.1 nor ::1.
|
|
@@ -84,32 +92,22 @@ linux[4-6] 2.6.32-71.el6.x86_64
|
|
|
84
92
|
Links
|
|
85
93
|
-----
|
|
86
94
|
|
|
87
|
-
Web site:
|
|
88
|
-
|
|
89
|
-
http://cea-hpc.github.com/clustershell/
|
|
90
|
-
|
|
91
95
|
Online documentation:
|
|
92
96
|
|
|
93
|
-
|
|
97
|
+
https://clustershell.readthedocs.io/
|
|
94
98
|
|
|
95
99
|
Github source repository:
|
|
96
100
|
|
|
97
|
-
https://github.com/
|
|
98
|
-
|
|
99
|
-
Github Wiki:
|
|
100
|
-
|
|
101
|
-
https://github.com/cea-hpc/clustershell/wiki
|
|
101
|
+
https://github.com/clustershell/clustershell
|
|
102
102
|
|
|
103
103
|
Github Issue tracking system:
|
|
104
104
|
|
|
105
|
-
https://github.com/
|
|
105
|
+
https://github.com/clustershell/clustershell/issues
|
|
106
106
|
|
|
107
107
|
Python Package Index (PyPI) links:
|
|
108
108
|
|
|
109
109
|
https://pypi.org/project/ClusterShell/
|
|
110
110
|
|
|
111
|
-
http://pypi.python.org/pypi/ClusterShell
|
|
112
|
-
|
|
113
111
|
ClusterShell was born along with Shine, a scalable Lustre FS admin tool:
|
|
114
112
|
|
|
115
113
|
https://github.com/cea-hpc/shine
|
|
@@ -119,7 +117,16 @@ Core developers/reviewers
|
|
|
119
117
|
|
|
120
118
|
* Stephane Thiell
|
|
121
119
|
* Aurelien Degremont
|
|
122
|
-
* Henri Doreau
|
|
123
120
|
* Dominique Martinet
|
|
124
121
|
|
|
125
|
-
|
|
122
|
+
Acknowledgments
|
|
123
|
+
---------------
|
|
124
|
+
|
|
125
|
+
We would like to express our gratitude to [CEA](https://www.cea.fr/english)
|
|
126
|
+
for the resources and funding provided to the project over the years.
|
|
127
|
+
|
|
128
|
+
We would also like to thank [Stanford University](https://srcc.stanford.edu)
|
|
129
|
+
(SRC) for their long-term support and resources provided to the project.
|
|
130
|
+
|
|
131
|
+
See the full [Acknowledgments](https://clustershell.readthedocs.io/en/latest/acknowledgments.html)
|
|
132
|
+
page for more details.
|
|
@@ -25,8 +25,9 @@ _cluset()
|
|
|
25
25
|
"") ;;
|
|
26
26
|
--) return;;
|
|
27
27
|
# no-arg options
|
|
28
|
-
--version|-h|--help|-
|
|
29
|
-
-
|
|
28
|
+
--version|-h|--help|-l|--list|-L|--list-all|-r|--regroup|\
|
|
29
|
+
--list-sources|--groupsources|-d|--debug|-q|--quiet|\
|
|
30
|
+
-R|--rangeset|-G|--groupbase|--contiguous|-a|--all|--completion) ;;
|
|
30
31
|
# get source separately...
|
|
31
32
|
--groupsource=*) groupsource="${word#*=}";;
|
|
32
33
|
-s|--groupsource) skip=groupsource;;
|
|
@@ -39,7 +40,7 @@ _cluset()
|
|
|
39
40
|
done
|
|
40
41
|
|
|
41
42
|
case "$prev" in
|
|
42
|
-
-c|--count|-e|--expand|-f|--fold|\
|
|
43
|
+
-c|--count|-e|--expand|-f|--fold|--index|\
|
|
43
44
|
-x|--exclude|-i|--intersection|-X|--xor)
|
|
44
45
|
case "$cur" in
|
|
45
46
|
*:*)
|
|
@@ -63,7 +64,7 @@ _cluset()
|
|
|
63
64
|
# no-arg options
|
|
64
65
|
--version|-h|--help|-l|--list|-L|--list-all|-r|--regroup|\
|
|
65
66
|
--list-sources|--groupsources|-d|--debug|-q|--quiet|\
|
|
66
|
-
-R|--rangeset|-G|--groupbase|--contiguous) ;;
|
|
67
|
+
-R|--rangeset|-G|--groupbase|--contiguous|-a|--all|--completion) ;;
|
|
67
68
|
# any other option: just ignore.
|
|
68
69
|
-*)
|
|
69
70
|
return;;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# clush bash completion
|
|
2
|
+
#
|
|
3
|
+
# to install in /usr/share/bash-completion/completions/ or ~/.local/share/bash-completion/completions/
|
|
4
|
+
_clush_command_or_file() {
|
|
5
|
+
# undo our nospace setting...
|
|
6
|
+
compopt +o nospace
|
|
7
|
+
|
|
8
|
+
# skip if shortopt is set -- these helpers cannot "restore" shortopt at start of
|
|
9
|
+
# the completions they provide easily
|
|
10
|
+
[ -n "$shortopt" ] && return
|
|
11
|
+
|
|
12
|
+
# complete either files (copy mode) or commands (if target set)
|
|
13
|
+
case "$target_set,$mode" in
|
|
14
|
+
*,copy)
|
|
15
|
+
# available since bash-completion 2.12
|
|
16
|
+
if declare -F _comp_compgen_filedir >/dev/null; then
|
|
17
|
+
_comp_compgen_filedir
|
|
18
|
+
else
|
|
19
|
+
_filedir
|
|
20
|
+
fi
|
|
21
|
+
;;
|
|
22
|
+
1,command)
|
|
23
|
+
# available since bash-completion 2.12
|
|
24
|
+
if declare -F _comp_command_offset >/dev/null; then
|
|
25
|
+
_comp_command_offset "$i"
|
|
26
|
+
else
|
|
27
|
+
_command_offset "$i"
|
|
28
|
+
fi
|
|
29
|
+
;;
|
|
30
|
+
esac
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
_clush()
|
|
34
|
+
{
|
|
35
|
+
# shellcheck disable=SC2034 # set/used by _init_completion
|
|
36
|
+
local cur prev words cword split
|
|
37
|
+
local i word options="" compopts="" skip=argv0 groupsource="" cleangroup=""
|
|
38
|
+
local mode=command target_set=""
|
|
39
|
+
local shortopt=""
|
|
40
|
+
|
|
41
|
+
_init_completion -s -n : || return
|
|
42
|
+
|
|
43
|
+
# stop parsing if there had been any non-option before (or --)
|
|
44
|
+
for i in "${!words[@]}"; do
|
|
45
|
+
word="${words[i]}"
|
|
46
|
+
case "$skip" in
|
|
47
|
+
"") ;;
|
|
48
|
+
groupsource)
|
|
49
|
+
groupsource="$word"
|
|
50
|
+
;& # fallthrough
|
|
51
|
+
*)
|
|
52
|
+
skip=""
|
|
53
|
+
continue
|
|
54
|
+
;;
|
|
55
|
+
esac
|
|
56
|
+
case "$word" in
|
|
57
|
+
"") ;;
|
|
58
|
+
--)
|
|
59
|
+
i=$((i+1)) # command from next word!
|
|
60
|
+
_clush_command_or_file
|
|
61
|
+
return
|
|
62
|
+
;;
|
|
63
|
+
-c|--copy|--rcopy) mode=copy;;
|
|
64
|
+
-w|-g|--group) target_set=1; skip=any;;
|
|
65
|
+
# no-arg options
|
|
66
|
+
--version|-h|--help|-n|--nostdin|-a|--all|-q|--quiet|\
|
|
67
|
+
-b|-B|--dshbak|-G|--groupbase|-L|-N|-P|--progress|\
|
|
68
|
+
-r|--regroup|-S|--maxrc|--diff|-p|-v|--verbose|-d|--debug) ;;
|
|
69
|
+
# get source separately...
|
|
70
|
+
--groupsource=*) groupsource="${word#*=}";;
|
|
71
|
+
-s|--groupsource) skip=groupsource;;
|
|
72
|
+
# assume all the rest as options...
|
|
73
|
+
# options with = included in word
|
|
74
|
+
--*=*) ;;
|
|
75
|
+
-*) skip=any;;
|
|
76
|
+
*)
|
|
77
|
+
# likely non-option, in copy mode options like -w can come
|
|
78
|
+
# later so just skip, otherwise likely start of command
|
|
79
|
+
[ "$mode" = copy ] && continue
|
|
80
|
+
_clush_command_or_file
|
|
81
|
+
return;;
|
|
82
|
+
esac
|
|
83
|
+
done
|
|
84
|
+
|
|
85
|
+
# split short opts without space...
|
|
86
|
+
case "$cur" in
|
|
87
|
+
-[a-z]*)
|
|
88
|
+
shortopt="${cur:0:2}"
|
|
89
|
+
prev="$shortopt"
|
|
90
|
+
cur="${cur:2}"
|
|
91
|
+
;;
|
|
92
|
+
esac
|
|
93
|
+
|
|
94
|
+
case "$prev" in
|
|
95
|
+
-w|-x|-g|--group|-X)
|
|
96
|
+
case "$cur" in
|
|
97
|
+
*:*)
|
|
98
|
+
groupsource="${cur%%:*}"
|
|
99
|
+
groupsource="${groupsource#@}"
|
|
100
|
+
;;
|
|
101
|
+
*)
|
|
102
|
+
if [ -n "$groupsource" ]; then
|
|
103
|
+
cleangroup=1
|
|
104
|
+
fi
|
|
105
|
+
;;
|
|
106
|
+
esac
|
|
107
|
+
if [ "$prev" = "-w" ]; then
|
|
108
|
+
compopts="@*" # include all nodes
|
|
109
|
+
fi
|
|
110
|
+
# shellcheck disable=SC2086 ## $compopts expanded on purpose
|
|
111
|
+
options="$(cluset ${groupsource:+-s "$groupsource"} --completion $compopts)"
|
|
112
|
+
if [ -n "$cleangroup" ]; then
|
|
113
|
+
options=${options//@"$groupsource":/@}
|
|
114
|
+
fi
|
|
115
|
+
case "$prev" in
|
|
116
|
+
-g|--group|-X)
|
|
117
|
+
options=${options//@/}
|
|
118
|
+
;;
|
|
119
|
+
esac
|
|
120
|
+
;;
|
|
121
|
+
-s|--groupsource)
|
|
122
|
+
options=$(cluset --groupsources --quiet)
|
|
123
|
+
;;
|
|
124
|
+
--color)
|
|
125
|
+
options="never always auto"
|
|
126
|
+
;;
|
|
127
|
+
-R|--worker)
|
|
128
|
+
options="ssh exec rsh"
|
|
129
|
+
;;
|
|
130
|
+
# no-arg options
|
|
131
|
+
--version|-h|--help|-n|--nostdin|-a|--all|-q|--quiet|\
|
|
132
|
+
-b|-B|--dshbak|-G|--groupbase|-L|-N|-P|--progress|\
|
|
133
|
+
-r|--regroup|-S|--maxrc|--diff|-p|-v|--verbose|-d|--debug|-c|--copy|--rcopy) ;;
|
|
134
|
+
# any other option: ignore next word (likely argument)
|
|
135
|
+
-*)
|
|
136
|
+
return;;
|
|
137
|
+
esac
|
|
138
|
+
# new option or no option:
|
|
139
|
+
if [ -z "$options" ]; then
|
|
140
|
+
case "$cur" in
|
|
141
|
+
-*)
|
|
142
|
+
# starts with dash - get all options from help text...
|
|
143
|
+
options="$(clush --help | grep -oP -- '(?<=[ \t])(-[a-z]|--[^= \t]*)')"
|
|
144
|
+
;;
|
|
145
|
+
*)
|
|
146
|
+
# otherwise complete command or file if appropriate and stop here
|
|
147
|
+
_clush_command_or_file
|
|
148
|
+
return
|
|
149
|
+
esac
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
# append space for everything that doesn't end in `:` (likely a groupsource)
|
|
153
|
+
mapfile -t COMPREPLY \
|
|
154
|
+
< <(compgen -W "$options" -- "$cur" \
|
|
155
|
+
| sed -e 's/[^:]$/& /' -e "s/^/$shortopt/")
|
|
156
|
+
# remove the prefix from COMPREPLY if $cur contains colons and
|
|
157
|
+
# COMP_WORDBREAKS splits on colons...
|
|
158
|
+
__ltrim_colon_completions "$cur"
|
|
159
|
+
} && complete -o nospace -F _clush "${BASH_SOURCE##*/}"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# ClusterShell node groups main configuration file
|
|
2
2
|
#
|
|
3
3
|
# Please see `man 5 groups.conf` and
|
|
4
|
-
#
|
|
4
|
+
# https://clustershell.readthedocs.io/en/latest/config.html#node-groups
|
|
5
5
|
# for further details.
|
|
6
6
|
#
|
|
7
7
|
# NOTE: This is a simple group configuration example file, not a
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Additional ClusterShell group source config file
|
|
2
|
+
#
|
|
3
|
+
# Please see `man 5 groups.conf` for further details.
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
# Ansible inventory bindings
|
|
7
|
+
#
|
|
8
|
+
# Requirements: ansible-core (provides ansible-inventory), jq
|
|
9
|
+
#
|
|
10
|
+
# Replace /path/to/inventory with your inventory path or directory,
|
|
11
|
+
# or set ANSIBLE_INVENTORY in your environment to override it.
|
|
12
|
+
#
|
|
13
|
+
[ansible]
|
|
14
|
+
|
|
15
|
+
# Resolve group members, recursing into child groups
|
|
16
|
+
map: ANSIBLE_INVENTORY="${ANSIBLE_INVENTORY:-/path/to/inventory}" ansible-inventory --list 2>/dev/null | jq -r --arg g "$GROUP" 'def r(d;g): (d[g].hosts//[])[], ((d[g].children//[])[] as $c | r(d;$c)); r(.;$g)'
|
|
17
|
+
|
|
18
|
+
# Resolve all groups in a single call, recursing into child groups
|
|
19
|
+
mapall: ANSIBLE_INVENTORY="${ANSIBLE_INVENTORY:-/path/to/inventory}" ansible-inventory --list 2>/dev/null | jq -r 'def r(d;g): (d[g].hosts//[])[], ((d[g].children//[])[] as $c | r(d;$c)); . as $d | keys[] | select(. != "_meta" and . != "all" and (test("[[:space:]:]") | not)) | "\(.): \([r($d;.)] | join(" "))"'
|
|
20
|
+
|
|
21
|
+
# All inventory hosts
|
|
22
|
+
all: ANSIBLE_INVENTORY="${ANSIBLE_INVENTORY:-/path/to/inventory}" ansible-inventory --list 2>/dev/null | jq -r '.[].hosts // empty | .[]'
|
|
23
|
+
|
|
24
|
+
# All groups
|
|
25
|
+
list: ANSIBLE_INVENTORY="${ANSIBLE_INVENTORY:-/path/to/inventory}" ansible-inventory --list 2>/dev/null | jq -r 'keys[] | select(. != "_meta" and . != "all")'
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
#
|
|
9
9
|
[slurmpart,sp]
|
|
10
10
|
map: sinfo -h -o "%N" -p $GROUP
|
|
11
|
+
mapall: sinfo -h -o "%R:%N"
|
|
11
12
|
all: sinfo -h -o "%N"
|
|
12
13
|
list: sinfo -h -o "%R"
|
|
13
14
|
reverse: sinfo -h -N -o "%R" -n $NODE
|
|
@@ -17,6 +18,7 @@ reverse: sinfo -h -N -o "%R" -n $NODE
|
|
|
17
18
|
#
|
|
18
19
|
[slurmresv,sr]
|
|
19
20
|
map: scontrol -o show reservation $GROUP | grep -Po 'Nodes=\K[^ ]+'
|
|
21
|
+
mapall: scontrol -o show reservation | sed -n 's/^ReservationName=\([^ :]*\) .* Nodes=\([^ ]*\).*/\1:\2/p'
|
|
20
22
|
all: scontrol -o show reservation | grep -Po 'Nodes=\K[^ ]+'
|
|
21
23
|
list: scontrol -o show reservation | grep -Po 'ReservationName=\K[^ ]+'
|
|
22
24
|
cache_time: 60
|
|
@@ -26,6 +28,7 @@ cache_time: 60
|
|
|
26
28
|
#
|
|
27
29
|
[slurmstate,st]
|
|
28
30
|
map: sinfo -h -o "%N" -t $GROUP
|
|
31
|
+
mapall: sinfo -h -o "%T:%N" | sed 's/[*~#!%$@+^-]*:/:/'
|
|
29
32
|
all: sinfo -h -o "%N"
|
|
30
33
|
list: sinfo -h -o "%T" | tr -d '*~#!%$@+^-'
|
|
31
34
|
reverse: sinfo -h -N -o "%T" -n $NODE | tr -d '*~#!%$@+^-'
|
|
@@ -36,6 +39,7 @@ cache_time: 60
|
|
|
36
39
|
#
|
|
37
40
|
[slurmjob,sj]
|
|
38
41
|
map: squeue -h -j $GROUP -o "%N"
|
|
42
|
+
mapall: squeue -h -o "%i:%N" -t R
|
|
39
43
|
list: squeue -h -o "%i" -t R
|
|
40
44
|
reverse: squeue -h -w $NODE -o "%i"
|
|
41
45
|
cache_time: 60
|
|
@@ -45,6 +49,7 @@ cache_time: 60
|
|
|
45
49
|
#
|
|
46
50
|
[slurmuser,su]
|
|
47
51
|
map: squeue -h -u $GROUP -o "%N" -t R
|
|
52
|
+
mapall: squeue -h -o "%u:%N" -t R
|
|
48
53
|
list: squeue -h -o "%u" -t R
|
|
49
54
|
reverse: squeue -h -w $NODE -o "%u"
|
|
50
55
|
cache_time: 60
|
|
@@ -54,6 +59,7 @@ cache_time: 60
|
|
|
54
59
|
#
|
|
55
60
|
[slurmaccount,sa]
|
|
56
61
|
map: squeue -h -A $GROUP -o "%N" -t R
|
|
62
|
+
mapall: squeue -h -o "%a:%N" -t R
|
|
57
63
|
list: squeue -h -o "%a" -t R
|
|
58
64
|
reverse: squeue -h -w $NODE -o "%a" 2>/dev/null || true
|
|
59
65
|
cache_time: 60
|
|
@@ -63,6 +69,7 @@ cache_time: 60
|
|
|
63
69
|
#
|
|
64
70
|
[slurmqos,sq]
|
|
65
71
|
map: squeue -h -q $GROUP -o "%N" -t R
|
|
72
|
+
mapall: squeue -h -o "%q:%N" -t R
|
|
66
73
|
list: squeue -h -o "%q" -t R
|
|
67
74
|
reverse: squeue -h -w $NODE -o "%q" 2>/dev/null || true
|
|
68
75
|
cache_time: 60
|
|
@@ -24,6 +24,7 @@ roles:
|
|
|
24
24
|
io: '@racks:rack2,example2'
|
|
25
25
|
compute: '@racks:rack[3-4]'
|
|
26
26
|
gpu: '@racks:rack4'
|
|
27
|
+
# '*' is the all-nodes wildcard, e.g. @roles:* or clush -a, not 'all'
|
|
27
28
|
# the 'all' special group is only needed if we don't want all nodes from
|
|
28
29
|
# this group source included, here we don't want example0 for clush -a
|
|
29
30
|
all: '@io,@compute'
|
|
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|
|
27
27
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|
28
28
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
|
29
29
|
..
|
|
30
|
-
.TH "CLUBAK"
|
|
30
|
+
.TH "CLUBAK" 1 "2026-07-04" "1.10" "ClusterShell User Manual"
|
|
31
31
|
.SH NAME
|
|
32
32
|
clubak \- format output from clush/pdsh-like output and more
|
|
33
33
|
.SH SYNOPSIS
|
|
@@ -68,6 +68,9 @@ disable header block and order output by nodes
|
|
|
68
68
|
.B \-r\fP,\fB \-\-regroup
|
|
69
69
|
fold nodeset using node groups
|
|
70
70
|
.TP
|
|
71
|
+
.BI \-\-axis\fB= RANGESET
|
|
72
|
+
for nD nodesets, fold the displayed nodeset (eg. in gathered output headers) along provided axis only. Axis are indexed from 1 to n and can be specified here either using the rangeset syntax, eg. \(aq1\(aq, \(aq1\-2\(aq, \(aq1,3\(aq, or by a single negative number meaning that the index is counted from the end. Because some nodesets may have several different dimensions, axis indices are silently truncated to fall in the allowed range. This is the per\-invocation equivalent of the \fBfold_axis\fP library default.
|
|
73
|
+
.TP
|
|
71
74
|
.BI \-s \ GROUPSOURCE\fR,\fB \ \-\-groupsource\fB= GROUPSOURCE
|
|
72
75
|
optional \fBgroups.conf\fP(5) group source to use
|
|
73
76
|
.TP
|
|
@@ -133,12 +136,12 @@ node2: 9
|
|
|
133
136
|
.sp
|
|
134
137
|
\fBcluset\fP(1), \fBclush\fP(1), \fBnodeset\fP(1), \fBgroups.conf\fP(5).
|
|
135
138
|
.sp
|
|
136
|
-
|
|
139
|
+
\fI\%https://clustershell.readthedocs.io/\fP
|
|
137
140
|
.SH BUG REPORTS
|
|
138
141
|
.INDENT 0.0
|
|
139
142
|
.TP
|
|
140
143
|
.B Use the following URL to submit a bug report or feedback:
|
|
141
|
-
|
|
144
|
+
\fI\%https://github.com/clustershell/clustershell/issues\fP
|
|
142
145
|
.UNINDENT
|
|
143
146
|
.SH AUTHOR
|
|
144
147
|
Stephane Thiell <sthiell@stanford.edu>
|
|
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|
|
27
27
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|
28
28
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
|
29
29
|
..
|
|
30
|
-
.TH "CLUSET"
|
|
30
|
+
.TH "CLUSET" 1 "2026-07-04" "1.10" "ClusterShell User Manual"
|
|
31
31
|
.SH NAME
|
|
32
32
|
cluset \- compute advanced cluster node set operations
|
|
33
33
|
.SH SYNOPSIS
|
|
@@ -88,6 +88,9 @@ list node groups from all group sources (\fB\-LL\fP shows nodes and \fB\-LLL\fP
|
|
|
88
88
|
.B \-r\fP,\fB \-\-regroup
|
|
89
89
|
fold nodes using node groups (see \-s \fIGROUPSOURCE\fP)
|
|
90
90
|
.TP
|
|
91
|
+
.BI \-\-index\fB= NODE
|
|
92
|
+
output the index of NODE in the nodeset (reverse of \-I/\-\-slice)
|
|
93
|
+
.TP
|
|
91
94
|
.B \-\-groupsources
|
|
92
95
|
list all active group sources (see \fBgroups.conf\fP(5))
|
|
93
96
|
.UNINDENT
|
|
@@ -477,12 +480,12 @@ command and also to conform with ClusterShell\(aqs \(dqclu*\(dq command nomencla
|
|
|
477
480
|
.sp
|
|
478
481
|
\fBclubak\fP(1), \fBclush\fP(1), \fBnodeset\fP(1), \fBgroups.conf\fP(5).
|
|
479
482
|
.sp
|
|
480
|
-
|
|
483
|
+
\fI\%https://clustershell.readthedocs.io/\fP
|
|
481
484
|
.SH BUG REPORTS
|
|
482
485
|
.INDENT 0.0
|
|
483
486
|
.TP
|
|
484
487
|
.B Use the following URL to submit a bug report or feedback:
|
|
485
|
-
|
|
488
|
+
\fI\%https://github.com/clustershell/clustershell/issues\fP
|
|
486
489
|
.UNINDENT
|
|
487
490
|
.SH AUTHOR
|
|
488
491
|
Stephane Thiell <sthiell@stanford.edu>
|