From 679be377db8b4a48c432dda3cb8a026469b2a837 Mon Sep 17 00:00:00 2001 From: Mehdi Dogguy <mehdi@debian.org> Date: Mon, 8 Sep 2014 21:32:40 +0200 Subject: [PATCH] Imported Upstream version 2.0.7 --- META | 4 +- NEWS | 45 +- configure | 4 +- configure.ac | 4 +- contribs/python/Makefile.am | 2 +- contribs/python/Makefile.in | 2 +- contribs/python/hostlist/CHANGES | 46 -- contribs/python/hostlist/COPYING | 339 ---------- contribs/python/hostlist/Makefile.am | 10 - contribs/python/hostlist/Makefile.in | 596 ------------------ contribs/python/hostlist/PKG-INFO | 18 - contribs/python/hostlist/README | 67 -- contribs/python/hostlist/hostlist.py | 362 ----------- .../hostlist/python-hostlist-1.6.tar.gz | Bin 0 -> 18058 bytes contribs/python/hostlist/python-hostlist.spec | 51 -- contribs/python/hostlist/setup.py | 48 -- contribs/python/hostlist/test/Makefile.am | 2 - contribs/python/hostlist/test/Makefile.in | 430 ------------- .../python/hostlist/test/test_hostlist.py | 123 ---- doc/html/configurator.html.in | 2 +- doc/man/man1/sacct.1 | 2 +- doc/man/man1/sacctmgr.1 | 2 +- doc/man/man1/smap.1 | 8 +- doc/man/man1/sreport.1 | 2 +- doc/man/man5/bluegene.conf.5 | 12 +- doc/man/man5/slurm.conf.5 | 5 +- slurm.spec | 6 +- src/common/read_config.c | 13 +- src/common/stepd_api.c | 5 +- .../mysql/mysql_jobacct_process.c | 13 + src/plugins/sched/backfill/backfill.c | 8 +- src/plugins/sched/wiki/get_jobs.c | 8 +- .../block_allocator/block_allocator.c | 31 +- .../bluegene/block_allocator/bridge_linker.c | 22 +- .../select/bluegene/plugin/bg_block_info.c | 40 +- src/plugins/select/bluegene/plugin/bluegene.c | 19 +- src/plugins/select/bluegene/plugin/sfree.c | 11 +- .../select/bluegene/plugin/state_test.c | 4 +- src/plugins/select/cons_res/job_test.c | 35 +- src/scontrol/info_job.c | 10 +- src/slurmctld/job_mgr.c | 8 +- src/slurmctld/job_scheduler.c | 4 +- src/slurmctld/node_mgr.c | 12 +- src/slurmctld/proc_req.c | 5 + src/slurmctld/slurmctld.h | 3 +- src/smap/configure_functions.c | 10 +- src/smap/opts.c | 2 +- src/srun/srun.c | 22 +- src/sview/block_info.c | 2 +- src/sview/job_info.c | 8 - src/sview/node_info.c | 2 +- src/sview/part_info.c | 2 +- testsuite/expect/test1.59 | 10 +- testsuite/expect/test7.3.prog.c | 9 +- 54 files changed, 271 insertions(+), 2239 deletions(-) delete mode 100644 contribs/python/hostlist/CHANGES delete mode 100644 contribs/python/hostlist/COPYING delete mode 100644 contribs/python/hostlist/Makefile.am delete mode 100644 contribs/python/hostlist/Makefile.in delete mode 100644 contribs/python/hostlist/PKG-INFO delete mode 100644 contribs/python/hostlist/README delete mode 100755 contribs/python/hostlist/hostlist.py create mode 100644 contribs/python/hostlist/python-hostlist-1.6.tar.gz delete mode 100644 contribs/python/hostlist/python-hostlist.spec delete mode 100644 contribs/python/hostlist/setup.py delete mode 100644 contribs/python/hostlist/test/Makefile.am delete mode 100644 contribs/python/hostlist/test/Makefile.in delete mode 100644 contribs/python/hostlist/test/test_hostlist.py diff --git a/META b/META index 04e43caa0..4221e7c1d 100644 --- a/META +++ b/META @@ -3,9 +3,9 @@ Api_revision: 0 Major: 2 Meta: 1 - Micro: 5 + Micro: 7 Minor: 0 Name: slurm Release: 1 Release_tags: dist - Version: 2.0.5 + Version: 2.0.7 diff --git a/NEWS b/NEWS index 55e1b1b0d..7ab950bb3 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,47 @@ This file describes changes in recent versions of SLURM. It primarily documents those changes that are of interest to users and admins. +* Changes in SLURM 2.0.7 +======================== + -- Fix bug in select/cons_res when nodes are configured in more than one + partition and those partitions have different priorities and sched/gang + is not configured. CPUs were previously over-allocated. + -- Fix core of smap when specifying -i option with invalid argument. + -- Fix issue when using srun --test-only to not put an entry of test + job into accounting. + -- For OpenMPI use of SLURM reserved ports. If any of the tasks fails to + acquire a reserved port and has an exit code of 108 then srun will + kill all remaining tasks and respawn the tasks. Previous code waited + for tasks to exit. + -- MySQL plugin - When doing archiving we now get a correct end time. + Previously it would grab an extra day to archive. + -- BLUEGENE - Handle initial state correctly, previously was setting initial + state to IDLE if UNKNOWN which would make it not set a registration + message to accounting, which could lead to nodes not being listed as up + when they really were. + -- Fixed buffer size issue with scontrol show hostlist. + -- Fixed issue with copy in smap -Dc previously command wouldn't work. + -- BLUEGENE - Update documentation about small blocks in the bluegene.conf + file. + -- In sched/wiki plugin (for Maui) fix possible message truncation on very + large cluster. + -- BLUEGENE - Fix for handling undocumented Deallocating to Configuring to + Free block transition state. + -- BLUEGENE - Fix for overlap mode loading blocks when midplane is in an + error state. + -- Add range check for SuspendTime configuration parameter. + -- Moved unzipped python-hostname tarball out and the tarball in. + -- BLUEGENE - Patched memory leak when running state test. + -- BLUEGENE - fixed slow down generated by slow call rm_get_BG + and polling thread. + +* Changes in SLURM 2.0.6 +======================== + -- Fixed seg fault when "scontrol listpids" is invoked for a specific job step + on a node on which a stepd is not running. + -- Fix bug in sched/backfill which could result in invalid memory reference + when trying to schedule jobs submitted with --exclude option. + * Changes in SLURM 2.0.5 ======================== -- BLUEGENE - Added support for emulating systems with a X-dimension of 4. @@ -64,7 +105,7 @@ documents those changes that are of interest to users and admins. -- BLUEGENE - Added SLURM_BG_NUM_NODES with cnode count of allocation, SLURM_JOB_NUM_NODES represents midplane counts until 2.1. -- BLUEGENE - Added fix for if a block is in error state and the midplane - containning the block is also set to drain/down. This previously + containing the block is also set to drain/down. This previously prevented dynamic creation of new blocks when this state was present. -- Fixed bug where a users association limits were not enforced, only parent limits were being enforced. @@ -4315,4 +4356,4 @@ documents those changes that are of interest to users and admins. -- Change directory to /tmp in slurmd if daemonizing. -- Logfiles are reopened on reconfigure. -$Id: NEWS 18691 2009-09-11 22:41:00Z jette $ +$Id: NEWS 18901 2009-10-14 22:34:30Z da $ diff --git a/configure b/configure index 8545d4906..00457ede2 100755 --- a/configure +++ b/configure @@ -23644,7 +23644,7 @@ fi -ac_config_files="$ac_config_files Makefile config.xml auxdir/Makefile contribs/Makefile contribs/perlapi/Makefile contribs/perlapi/libslurm-perl/Makefile.PL contribs/torque/Makefile contribs/phpext/Makefile contribs/phpext/slurm_php/config.m4 contribs/python/Makefile contribs/python/hostlist/Makefile contribs/python/hostlist/test/Makefile contribs/slurmdb-direct/Makefile src/Makefile src/api/Makefile src/common/Makefile src/database/Makefile src/sacct/Makefile src/sacctmgr/Makefile src/sreport/Makefile src/sstat/Makefile src/sshare/Makefile src/salloc/Makefile src/sbatch/Makefile src/sattach/Makefile src/sprio/Makefile src/srun/Makefile src/srun_cr/Makefile src/slurmd/Makefile src/slurmd/slurmd/Makefile src/slurmd/slurmstepd/Makefile src/slurmdbd/Makefile src/slurmctld/Makefile src/sbcast/Makefile src/scontrol/Makefile src/scancel/Makefile src/squeue/Makefile src/sinfo/Makefile src/smap/Makefile src/strigger/Makefile src/sview/Makefile src/plugins/Makefile src/plugins/accounting_storage/Makefile src/plugins/accounting_storage/filetxt/Makefile src/plugins/accounting_storage/mysql/Makefile src/plugins/accounting_storage/pgsql/Makefile src/plugins/accounting_storage/none/Makefile src/plugins/accounting_storage/slurmdbd/Makefile src/plugins/auth/Makefile src/plugins/auth/authd/Makefile src/plugins/auth/munge/Makefile src/plugins/auth/none/Makefile src/plugins/checkpoint/Makefile src/plugins/checkpoint/aix/Makefile src/plugins/checkpoint/none/Makefile src/plugins/checkpoint/ompi/Makefile src/plugins/checkpoint/xlch/Makefile src/plugins/checkpoint/blcr/Makefile src/plugins/checkpoint/blcr/cr_checkpoint.sh src/plugins/checkpoint/blcr/cr_restart.sh src/plugins/crypto/Makefile src/plugins/crypto/munge/Makefile src/plugins/crypto/openssl/Makefile src/plugins/jobacct_gather/Makefile src/plugins/jobacct_gather/linux/Makefile src/plugins/jobacct_gather/aix/Makefile src/plugins/jobacct_gather/none/Makefile src/plugins/jobcomp/Makefile src/plugins/jobcomp/filetxt/Makefile src/plugins/jobcomp/none/Makefile src/plugins/jobcomp/script/Makefile src/plugins/jobcomp/mysql/Makefile src/plugins/jobcomp/pgsql/Makefile src/plugins/priority/Makefile src/plugins/priority/basic/Makefile src/plugins/priority/multifactor/Makefile src/plugins/proctrack/Makefile src/plugins/proctrack/aix/Makefile src/plugins/proctrack/pgid/Makefile src/plugins/proctrack/linuxproc/Makefile src/plugins/proctrack/rms/Makefile src/plugins/proctrack/sgi_job/Makefile src/plugins/sched/Makefile src/plugins/sched/backfill/Makefile src/plugins/sched/builtin/Makefile src/plugins/sched/gang/Makefile src/plugins/sched/hold/Makefile src/plugins/sched/wiki/Makefile src/plugins/sched/wiki2/Makefile src/plugins/select/Makefile src/plugins/select/bluegene/Makefile src/plugins/select/bluegene/block_allocator/Makefile src/plugins/select/bluegene/plugin/Makefile src/plugins/select/cons_res/Makefile src/plugins/select/linear/Makefile src/plugins/switch/Makefile src/plugins/switch/elan/Makefile src/plugins/switch/none/Makefile src/plugins/switch/federation/Makefile src/plugins/mpi/Makefile src/plugins/mpi/mpich1_p4/Makefile src/plugins/mpi/mpich1_shmem/Makefile src/plugins/mpi/mpichgm/Makefile src/plugins/mpi/mpichmx/Makefile src/plugins/mpi/mvapich/Makefile src/plugins/mpi/lam/Makefile src/plugins/mpi/none/Makefile src/plugins/mpi/openmpi/Makefile src/plugins/task/Makefile src/plugins/task/affinity/Makefile src/plugins/task/none/Makefile src/plugins/topology/Makefile src/plugins/topology/3d_torus/Makefile src/plugins/topology/none/Makefile src/plugins/topology/tree/Makefile doc/Makefile doc/man/Makefile doc/html/Makefile doc/html/configurator.html testsuite/Makefile testsuite/expect/Makefile testsuite/slurm_unit/Makefile testsuite/slurm_unit/api/Makefile testsuite/slurm_unit/api/manual/Makefile testsuite/slurm_unit/common/Makefile testsuite/slurm_unit/slurmctld/Makefile testsuite/slurm_unit/slurmd/Makefile testsuite/slurm_unit/slurmdbd/Makefile" +ac_config_files="$ac_config_files Makefile config.xml auxdir/Makefile contribs/Makefile contribs/perlapi/Makefile contribs/perlapi/libslurm-perl/Makefile.PL contribs/torque/Makefile contribs/phpext/Makefile contribs/phpext/slurm_php/config.m4 contribs/python/Makefile contribs/slurmdb-direct/Makefile src/Makefile src/api/Makefile src/common/Makefile src/database/Makefile src/sacct/Makefile src/sacctmgr/Makefile src/sreport/Makefile src/sstat/Makefile src/sshare/Makefile src/salloc/Makefile src/sbatch/Makefile src/sattach/Makefile src/sprio/Makefile src/srun/Makefile src/srun_cr/Makefile src/slurmd/Makefile src/slurmd/slurmd/Makefile src/slurmd/slurmstepd/Makefile src/slurmdbd/Makefile src/slurmctld/Makefile src/sbcast/Makefile src/scontrol/Makefile src/scancel/Makefile src/squeue/Makefile src/sinfo/Makefile src/smap/Makefile src/strigger/Makefile src/sview/Makefile src/plugins/Makefile src/plugins/accounting_storage/Makefile src/plugins/accounting_storage/filetxt/Makefile src/plugins/accounting_storage/mysql/Makefile src/plugins/accounting_storage/pgsql/Makefile src/plugins/accounting_storage/none/Makefile src/plugins/accounting_storage/slurmdbd/Makefile src/plugins/auth/Makefile src/plugins/auth/authd/Makefile src/plugins/auth/munge/Makefile src/plugins/auth/none/Makefile src/plugins/checkpoint/Makefile src/plugins/checkpoint/aix/Makefile src/plugins/checkpoint/none/Makefile src/plugins/checkpoint/ompi/Makefile src/plugins/checkpoint/xlch/Makefile src/plugins/checkpoint/blcr/Makefile src/plugins/checkpoint/blcr/cr_checkpoint.sh src/plugins/checkpoint/blcr/cr_restart.sh src/plugins/crypto/Makefile src/plugins/crypto/munge/Makefile src/plugins/crypto/openssl/Makefile src/plugins/jobacct_gather/Makefile src/plugins/jobacct_gather/linux/Makefile src/plugins/jobacct_gather/aix/Makefile src/plugins/jobacct_gather/none/Makefile src/plugins/jobcomp/Makefile src/plugins/jobcomp/filetxt/Makefile src/plugins/jobcomp/none/Makefile src/plugins/jobcomp/script/Makefile src/plugins/jobcomp/mysql/Makefile src/plugins/jobcomp/pgsql/Makefile src/plugins/priority/Makefile src/plugins/priority/basic/Makefile src/plugins/priority/multifactor/Makefile src/plugins/proctrack/Makefile src/plugins/proctrack/aix/Makefile src/plugins/proctrack/pgid/Makefile src/plugins/proctrack/linuxproc/Makefile src/plugins/proctrack/rms/Makefile src/plugins/proctrack/sgi_job/Makefile src/plugins/sched/Makefile src/plugins/sched/backfill/Makefile src/plugins/sched/builtin/Makefile src/plugins/sched/gang/Makefile src/plugins/sched/hold/Makefile src/plugins/sched/wiki/Makefile src/plugins/sched/wiki2/Makefile src/plugins/select/Makefile src/plugins/select/bluegene/Makefile src/plugins/select/bluegene/block_allocator/Makefile src/plugins/select/bluegene/plugin/Makefile src/plugins/select/cons_res/Makefile src/plugins/select/linear/Makefile src/plugins/switch/Makefile src/plugins/switch/elan/Makefile src/plugins/switch/none/Makefile src/plugins/switch/federation/Makefile src/plugins/mpi/Makefile src/plugins/mpi/mpich1_p4/Makefile src/plugins/mpi/mpich1_shmem/Makefile src/plugins/mpi/mpichgm/Makefile src/plugins/mpi/mpichmx/Makefile src/plugins/mpi/mvapich/Makefile src/plugins/mpi/lam/Makefile src/plugins/mpi/none/Makefile src/plugins/mpi/openmpi/Makefile src/plugins/task/Makefile src/plugins/task/affinity/Makefile src/plugins/task/none/Makefile src/plugins/topology/Makefile src/plugins/topology/3d_torus/Makefile src/plugins/topology/none/Makefile src/plugins/topology/tree/Makefile doc/Makefile doc/man/Makefile doc/html/Makefile doc/html/configurator.html testsuite/Makefile testsuite/expect/Makefile testsuite/slurm_unit/Makefile testsuite/slurm_unit/api/Makefile testsuite/slurm_unit/api/manual/Makefile testsuite/slurm_unit/common/Makefile testsuite/slurm_unit/slurmctld/Makefile testsuite/slurm_unit/slurmd/Makefile testsuite/slurm_unit/slurmdbd/Makefile" cat >confcache <<\_ACEOF @@ -24800,8 +24800,6 @@ do "contribs/phpext/Makefile") CONFIG_FILES="$CONFIG_FILES contribs/phpext/Makefile" ;; "contribs/phpext/slurm_php/config.m4") CONFIG_FILES="$CONFIG_FILES contribs/phpext/slurm_php/config.m4" ;; "contribs/python/Makefile") CONFIG_FILES="$CONFIG_FILES contribs/python/Makefile" ;; - "contribs/python/hostlist/Makefile") CONFIG_FILES="$CONFIG_FILES contribs/python/hostlist/Makefile" ;; - "contribs/python/hostlist/test/Makefile") CONFIG_FILES="$CONFIG_FILES contribs/python/hostlist/test/Makefile" ;; "contribs/slurmdb-direct/Makefile") CONFIG_FILES="$CONFIG_FILES contribs/slurmdb-direct/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/api/Makefile") CONFIG_FILES="$CONFIG_FILES src/api/Makefile" ;; diff --git a/configure.ac b/configure.ac index ae2e82c4e..6f4899019 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -# $Id: configure.ac 16996 2009-03-24 20:21:41Z jette $ +# $Id: configure.ac 18850 2009-10-08 22:23:44Z da $ # This file is to be processed with autoconf to generate a configure script dnl Prologue @@ -286,8 +286,6 @@ AC_CONFIG_FILES([Makefile contribs/phpext/Makefile contribs/phpext/slurm_php/config.m4 contribs/python/Makefile - contribs/python/hostlist/Makefile - contribs/python/hostlist/test/Makefile contribs/slurmdb-direct/Makefile src/Makefile src/api/Makefile diff --git a/contribs/python/Makefile.am b/contribs/python/Makefile.am index 60fb9a077..741f85085 100644 --- a/contribs/python/Makefile.am +++ b/contribs/python/Makefile.am @@ -1 +1 @@ -SUBDIRS = hostlist +SUBDIRS = diff --git a/contribs/python/Makefile.in b/contribs/python/Makefile.in index 77d727911..fd7380226 100644 --- a/contribs/python/Makefile.in +++ b/contribs/python/Makefile.in @@ -268,7 +268,7 @@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUBDIRS = hostlist +SUBDIRS = all: all-recursive .SUFFIXES: diff --git a/contribs/python/hostlist/CHANGES b/contribs/python/hostlist/CHANGES deleted file mode 100644 index 86f30ec84..000000000 --- a/contribs/python/hostlist/CHANGES +++ /dev/null @@ -1,46 +0,0 @@ -Version 1.5 (2009-02-22) - - Make each "-" on the command line count as one hostlist argument. - If multiple hostslists are given on stdin they are combined to a - union hostlist before being used in the way requested by the - options. - - Add hostgrep utility to search for lines matching a hostlist. - - Make the build system (used when building tar.gz and RPMs from the - source code held in git) smarter. - -Version 1.4 (2008-12-28) - - Support Python 3. - - Import reduce from functools if possible. - Use Python 2/3 installation trick from .../Demo/distutils/test2to3 - -Version 1.3 (2008-09-30) - - Add -s/--separator, -p/--prepend, -a/--append and --version - options contributed by Pär Andersson at NSC. - - Let -e be the short form of the --expand option (-w is now - deprecated). - - Add a manual page for hostlist(1). - -Version 1.2 (2008-09-18) - - Add "--prefix /usr" in the installation script of the spec file - (needed on SUSE Linux where the default is /usr/local). - -Version 1.1 (2008-09-17) - - Move the command line utility to a separate 'hostlist' command. - - Provide a python-hostlist.spec file to build RPM packages. - Inspired by a contribution by Dr. Holger Obermaier at - Rechenzentrum, Universität Karlsruhe. - -Version 1.0 (2008-07-25) - - Initial version. - diff --git a/contribs/python/hostlist/COPYING b/contribs/python/hostlist/COPYING deleted file mode 100644 index d511905c1..000000000 --- a/contribs/python/hostlist/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/contribs/python/hostlist/Makefile.am b/contribs/python/hostlist/Makefile.am deleted file mode 100644 index 72676f515..000000000 --- a/contribs/python/hostlist/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -SUBDIRS = test - -EXTRA_DIST = \ - CHANGES \ - COPYING \ - hostlist.py \ - PKG-INFO \ - python-hostlist.spec \ - README \ - setup.py diff --git a/contribs/python/hostlist/Makefile.in b/contribs/python/hostlist/Makefile.in deleted file mode 100644 index d16ae1485..000000000 --- a/contribs/python/hostlist/Makefile.in +++ /dev/null @@ -1,596 +0,0 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = contribs/python/hostlist -DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - COPYING -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ - $(top_srcdir)/auxdir/libtool.m4 \ - $(top_srcdir)/auxdir/ltoptions.m4 \ - $(top_srcdir)/auxdir/ltsugar.m4 \ - $(top_srcdir)/auxdir/ltversion.m4 \ - $(top_srcdir)/auxdir/lt~obsolete.m4 \ - $(top_srcdir)/auxdir/slurm.m4 \ - $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ - $(top_srcdir)/auxdir/x_ac_affinity.m4 \ - $(top_srcdir)/auxdir/x_ac_aix.m4 \ - $(top_srcdir)/auxdir/x_ac_blcr.m4 \ - $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ - $(top_srcdir)/auxdir/x_ac_cflags.m4 \ - $(top_srcdir)/auxdir/x_ac_cray.m4 \ - $(top_srcdir)/auxdir/x_ac_databases.m4 \ - $(top_srcdir)/auxdir/x_ac_debug.m4 \ - $(top_srcdir)/auxdir/x_ac_elan.m4 \ - $(top_srcdir)/auxdir/x_ac_env.m4 \ - $(top_srcdir)/auxdir/x_ac_federation.m4 \ - $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ - $(top_srcdir)/auxdir/x_ac_gtk.m4 \ - $(top_srcdir)/auxdir/x_ac_iso.m4 \ - $(top_srcdir)/auxdir/x_ac_munge.m4 \ - $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ - $(top_srcdir)/auxdir/x_ac_pam.m4 \ - $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ - $(top_srcdir)/auxdir/x_ac_readline.m4 \ - $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ - $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ - $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ - $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ - $(top_srcdir)/auxdir/x_ac_sun_const.m4 \ - $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ - html-recursive info-recursive install-data-recursive \ - install-dvi-recursive install-exec-recursive \ - install-html-recursive install-info-recursive \ - install-pdf-recursive install-ps-recursive install-recursive \ - installcheck-recursive installdirs-recursive pdf-recursive \ - ps-recursive uninstall-recursive -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = $(SUBDIRS) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTHD_CFLAGS = @AUTHD_CFLAGS@ -AUTHD_LIBS = @AUTHD_LIBS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BG_INCLUDES = @BG_INCLUDES@ -BLCR_CPPFLAGS = @BLCR_CPPFLAGS@ -BLCR_HOME = @BLCR_HOME@ -BLCR_LDFLAGS = @BLCR_LDFLAGS@ -BLCR_LIBS = @BLCR_LIBS@ -BLUEGENE_LOADED = @BLUEGENE_LOADED@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CMD_LDFLAGS = @CMD_LDFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ELAN_LIBS = @ELAN_LIBS@ -EXEEXT = @EXEEXT@ -FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ -FGREP = @FGREP@ -GREP = @GREP@ -GTK2_CFLAGS = @GTK2_CFLAGS@ -GTK2_LIBS = @GTK2_LIBS@ -HAVEMYSQLCONFIG = @HAVEMYSQLCONFIG@ -HAVEPGCONFIG = @HAVEPGCONFIG@ -HAVEPKGCONFIG = @HAVEPKGCONFIG@ -HAVE_AIX = @HAVE_AIX@ -HAVE_ELAN = @HAVE_ELAN@ -HAVE_FEDERATION = @HAVE_FEDERATION@ -HAVE_OPENSSL = @HAVE_OPENSSL@ -HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_LDFLAGS = @LIB_LDFLAGS@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ -MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ -MUNGE_LIBS = @MUNGE_LIBS@ -MYSQL_CFLAGS = @MYSQL_CFLAGS@ -MYSQL_LIBS = @MYSQL_LIBS@ -NCURSES = @NCURSES@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NUMA_LIBS = @NUMA_LIBS@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PAM_LIBS = @PAM_LIBS@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PGSQL_CFLAGS = @PGSQL_CFLAGS@ -PGSQL_LIBS = @PGSQL_LIBS@ -PLPA_LIBS = @PLPA_LIBS@ -PROCTRACKDIR = @PROCTRACKDIR@ -PROJECT = @PROJECT@ -PTHREAD_CC = @PTHREAD_CC@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LIBS = @PTHREAD_LIBS@ -RANLIB = @RANLIB@ -READLINE_LIBS = @READLINE_LIBS@ -RELEASE = @RELEASE@ -SED = @SED@ -SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ -SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLURMCTLD_PORT = @SLURMCTLD_PORT@ -SLURMDBD_PORT = @SLURMDBD_PORT@ -SLURMD_PORT = @SLURMD_PORT@ -SLURM_API_AGE = @SLURM_API_AGE@ -SLURM_API_CURRENT = @SLURM_API_CURRENT@ -SLURM_API_MAJOR = @SLURM_API_MAJOR@ -SLURM_API_REVISION = @SLURM_API_REVISION@ -SLURM_API_VERSION = @SLURM_API_VERSION@ -SLURM_MAJOR = @SLURM_MAJOR@ -SLURM_MICRO = @SLURM_MICRO@ -SLURM_MINOR = @SLURM_MINOR@ -SLURM_PREFIX = @SLURM_PREFIX@ -SLURM_VERSION = @SLURM_VERSION@ -SO_LDFLAGS = @SO_LDFLAGS@ -SSL_CPPFLAGS = @SSL_CPPFLAGS@ -SSL_LDFLAGS = @SSL_LDFLAGS@ -SSL_LIBS = @SSL_LIBS@ -STRIP = @STRIP@ -UTIL_LIBS = @UTIL_LIBS@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUBDIRS = test -EXTRA_DIST = \ - CHANGES \ - COPYING \ - hostlist.py \ - PKG-INFO \ - python-hostlist.spec \ - README \ - setup.py - -all: all-recursive - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu contribs/python/hostlist/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu contribs/python/hostlist/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. -$(RECURSIVE_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -$(RECURSIVE_CLEAN_TARGETS): - @failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ - dot_seen=no; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done -ctags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ - done - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ - include_option=--etags-include; \ - empty_fix=.; \ - else \ - include_option=--include; \ - empty_fix=; \ - fi; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test ! -f $$subdir/TAGS || \ - tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in files) print i; }; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - distdir=`$(am__cd) $(distdir) && pwd`; \ - top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ - (cd $$subdir && \ - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$$top_distdir" \ - distdir="$$distdir/$$subdir" \ - am__remove_distdir=: \ - am__skip_length_check=: \ - distdir) \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-recursive -all-am: Makefile -installdirs: installdirs-recursive -installdirs-am: -install: install-recursive -install-exec: install-exec-recursive -install-data: install-data-recursive -uninstall: uninstall-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-recursive -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-recursive - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-recursive - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -info: info-recursive - -info-am: - -install-data-am: - -install-dvi: install-dvi-recursive - -install-exec-am: - -install-html: install-html-recursive - -install-info: install-info-recursive - -install-man: - -install-pdf: install-pdf-recursive - -install-ps: install-ps-recursive - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: - -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ - install-strip - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am check check-am clean clean-generic clean-libtool \ - ctags ctags-recursive distclean distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am install-info \ - install-info-am install-man install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ - uninstall uninstall-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contribs/python/hostlist/PKG-INFO b/contribs/python/hostlist/PKG-INFO deleted file mode 100644 index f66980ccb..000000000 --- a/contribs/python/hostlist/PKG-INFO +++ /dev/null @@ -1,18 +0,0 @@ -Metadata-Version: 1.0 -Name: python-hostlist -Version: 1.5 -Summary: Python module for hostlist handling -Home-page: http://www.nsc.liu.se/~kent/python-hostlist/ -Author: Kent Engström -Author-email: kent@nsc.liu.se -License: GPL2+ -Description: The hostlist.py module knows how to expand and collect hostlist expressions. -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Science/Research -Classifier: Intended Audience :: System Administrators -Classifier: License :: OSI Approved :: GNU General Public License (GPL) -Classifier: Topic :: System :: Clustering -Classifier: Topic :: System :: Systems Administration -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 3 diff --git a/contribs/python/hostlist/README b/contribs/python/hostlist/README deleted file mode 100644 index ebb9d5278..000000000 --- a/contribs/python/hostlist/README +++ /dev/null @@ -1,67 +0,0 @@ -INTRODUCTION -============ - -The Python module hostlist.py knows how to expand and collect hostlist -expressions. Example: - - % python - Python 2.5.1 (r251:54863, Jul 10 2008, 17:24:48) - [GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2 - Type "help", "copyright", "credits" or "license" for more information. - >>> import hostlist - >>> hosts = hostlist.expand_hostlist("n[1-10,17]") - >>> hosts - ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9', 'n10', 'n17'] - >>> hostlist.collect_hostlist(hosts) - 'n[1-10,17]' - >>> hostlist.collect_hostlist(["x1y1","x2y2", "x1y2", "x2y1"]) - 'x[1-2]y[1-2]' - -Bad hostlists or hostnames will result in the hostlist.BadHostlist -exception being raised. - -The 'hostlist' command is provided to expand/collect hostlists and -perform set operations on them. Example: - - % hostlist n[1-10] n[5-20] - n[1-20] - % hostlist --difference n[1-10] n[5-20] - n[1-4] - % hostlist --expand --intersection n[1-10] n[5-20] - n5 - n6 - n7 - n8 - n9 - n10 - - -BUILDING -======== - -Build RPM packages from the tar.gz archive by running: - - rpmbuild -ta python-hostlist-1.5.tar.gz - -If you do not have the tar archive, create it first: - - python setup.py sdist - rpmbuild -ta dist/python-hostlist-1.5.tar.gz - -You may also install directly by running: - - python setup.py build (as yourself) - python setup.py install (as root) - - -RELEASES AND FEEDBACK -===================== - -You will find new releases at: - - http://www.nsc.liu.se/~kent/python-hostlist/ - -If you have questions, suggestions, bug reports or patches, please -send them to: - - kent@nsc.liu.se. diff --git a/contribs/python/hostlist/hostlist.py b/contribs/python/hostlist/hostlist.py deleted file mode 100755 index b3b520336..000000000 --- a/contribs/python/hostlist/hostlist.py +++ /dev/null @@ -1,362 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Hostlist library -# -# Copyright (C) 2008 Kent Engström <kent@nsc.liu.se>, -# Thomas Bellman <bellman@nsc.liu.se> and -# Pär Andersson <paran@nsc.liu.se>, -# National Supercomputer Centre -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -"""Handle hostlist expressions. - -This module provides operations to expand and collect hostlist -expressions. - -The hostlist expression syntax is the same as in several programs -developed at LLNL (https://computing.llnl.gov/linux/). However in -corner cases the behaviour of this module have not been compared for -compatibility with pdsh/dshbak/SLURM et al. -""" - -__version__ = "1.5" - -import re -import itertools - -# Exception used for error reporting to the caller -class BadHostlist(Exception): pass - -# Configuration to guard against ridiculously long expanded lists -MAX_SIZE = 100000 - -# Hostlist expansion - -def expand_hostlist(hostlist, allow_duplicates=False, sort=False): - """Expand a hostlist expression string to a Python list. - - Example: expand_hostlist("n[9-11],d[01-02]") ==> - ['n9', 'n10', 'n11', 'd01', 'd02'] - - Unless allow_duplicates is true, duplicates will be purged - from the results. If sort is true, the output will be sorted. - """ - - results = [] - bracket_level = 0 - part = "" - - for c in hostlist + ",": - if c == "," and bracket_level == 0: - # Comma at top level, split! - if part: results.extend(expand_part(part)) - part = "" - bad_part = False - else: - part += c - - if c == "[": bracket_level += 1 - elif c == "]": bracket_level -= 1 - - if bracket_level > 1: - raise BadHostlist, "nested brackets" - elif bracket_level < 0: - raise BadHostlist, "unbalanced brackets" - - if bracket_level > 0: - raise BadHostlist, "unbalanced brackets" - - if not allow_duplicates: - results = remove_duplicates(results) - if sort: - results = numerically_sorted(results) - return results - -def expand_part(s): - """Expand a part (e.g. "x[1-2]y[1-3][1-3]") (no outer level commas).""" - - # Base case: the empty part expand to the singleton list of "" - if s == "": - return [""] - - # Split into: - # 1) prefix string (may be empty) - # 2) rangelist in brackets (may be missing) - # 3) the rest - - m = re.match(r'([^,\[]*)(\[[^\]]*\])?(.*)', s) - (prefix, rangelist, rest) = m.group(1,2,3) - - # Expand the rest first (here is where we recurse!) - rest_expanded = expand_part(rest) - - # Expand our own part - if not rangelist: - # If there is no rangelist, our own contribution is the prefix only - us_expanded = [prefix] - else: - # Otherwise expand the rangelist (adding the prefix before) - us_expanded = expand_rangelist(prefix, rangelist[1:-1]) - - # Combine our list with the list from the expansion of the rest - # (but guard against too large results first) - if len(us_expanded) * len(rest_expanded) > MAX_SIZE: - raise BadHostlist, "results too large" - - return [us_part + rest_part - for us_part in us_expanded - for rest_part in rest_expanded] - -def expand_rangelist(prefix, rangelist): - """ Expand a rangelist (e.g. "1-10,14"), putting a prefix before.""" - - # Split at commas and expand each range separately - results = [] - for range_ in rangelist.split(","): - results.extend(expand_range(prefix, range_)) - return results - -def expand_range(prefix, range_): - """ Expand a range (e.g. 1-10 or 14), putting a prefix before.""" - - # Check for a single number first - m = re.match(r'^[0-9]+$', range_) - if m: - return ["%s%s" % (prefix, range_)] - - # Otherwise split low-high - m = re.match(r'^([0-9]+)-([0-9]+)$', range_) - if not m: - raise BadHostlist, "bad range" - - (s_low, s_high) = m.group(1,2) - low = int(s_low) - high = int(s_high) - width = len(s_low) - - if high < low: - raise BadHostlist, "start > stop" - elif high - low > MAX_SIZE: - raise BadHostlist, "range too large" - - results = [] - for i in xrange(low, high+1): - results.append("%s%0*d" % (prefix, width, i)) - return results - -def remove_duplicates(l): - """Remove duplicates from a list (but keep the order).""" - seen = set() - results = [] - for e in l: - if e not in seen: - results.append(e) - seen.add(e) - return results - -# Hostlist collection - -def collect_hostlist(hosts, silently_discard_bad = False): - """Collect a hostlist string from a Python list of hosts. - - We start grouping from the rightmost numerical part. - Duplicates are removed. - - A bad hostname raises an exception (unless silently_discard_bad - is true causing the bad hostname to be silently discarded instead). - """ - - # Split hostlist into a list of (host, "") for the iterative part. - # (Also check for bad node names now) - # The idea is to move already collected numerical parts from the - # left side (seen by each loop) to the right side (just copied). - - left_right = [] - for host in hosts: - # We remove leading and trailing whitespace first, and skip empty lines - host = host.strip() - if host == "": continue - - # We cannot accept a host containing any of the three special - # characters in the hostlist syntax (comma and flat brackets) - if re.search(r'[][,]', host): - if silently_discard_bad: - continue - else: - raise BadHostlist, "forbidden character" - - left_right.append((host, "")) - - # Call the iterative function until it says it's done - looping = True - while looping: - left_right, looping = collect_hostlist_1(left_right) - return ",".join([left + right for left, right in left_right]) - -def collect_hostlist_1(left_right): - """Collect a hostlist string from a list of hosts (left+right). - - The input is a list of tuples (left, right). The left part - is analyzed, while the right part is just passed along - (it can contain already collected range expressions). - """ - - # Scan the list of hosts (left+right) and build two things: - # *) a set of all hosts seen (used later) - # *) a list where each host entry is preprocessed for correct sorting - - sortlist = [] - remaining = set() - for left, right in left_right: - host = left + right - remaining.add(host) - - # Match the left part into parts - m = re.match(r'^(.*?)([0-9]+)?([^0-9]*)$', left) - (prefix, num_str, suffix) = m.group(1,2,3) - - # Add the right part unprocessed to the suffix. - # This ensures than an already computed range expression - # in the right part is not analyzed again. - suffix = suffix + right - - if num_str is None: - # A left part with no numeric part at all gets special treatment! - # The regexp matches with the whole string as the suffix, - # with nothing in the prefix or numeric parts. - # We do not want that, so we move it to the prefix and put - # None as a special marker where the suffix should be. - assert prefix == "" - sortlist.append(((host, None), None, None, host)) - else: - # A left part with at least an numeric part - # (we care about the rightmost numeric part) - num_int = int(num_str) - num_width = len(num_str) # This width includes leading zeroes - sortlist.append(((prefix, suffix), num_int, num_width, host)) - - # Sort lexicographically, first on prefix, then on suffix, then on - # num_int (numerically), then... - # This determines the order of the final result. - - sortlist.sort() - - # We are ready to collect the result parts as a list of new (left, - # right) tuples. - - results = [] - needs_another_loop = False - - # Now group entries with the same prefix+suffix combination (the - # key is the first element in the sortlist) to loop over them and - # then to loop over the list of hosts sharing the same - # prefix+suffix combination. - - for ((prefix, suffix), group) in itertools.groupby(sortlist, - key=lambda x:x[0]): - - if suffix is None: - # Special case: a host with no numeric part - results.append(("", prefix)) # Move everything to the right part - remaining.remove(prefix) - else: - # The general case. We prepare to collect a list of - # ranges expressed as (low, high, width) for later - # formatting. - range_list = [] - - for ((prefix2, suffix2), num_int, num_width, host) in group: - if host not in remaining: - # Below, we will loop internally to enumate a whole range - # at a time. We then remove the covered hosts from the set. - # Therefore, skip the host here if it is gone from the set. - continue - assert num_int is not None - - # Scan for a range starting at the current host - low = num_int - while True: - host = "%s%0*d%s" % (prefix, num_width, num_int, suffix) - if host in remaining: - remaining.remove(host) - num_int += 1 - else: - break - high = num_int - 1 - assert high >= low - range_list.append((low, high, num_width)) - - # We have a list of ranges to format. We make sure - # we move our handled numerical part to the right to - # stop it from being processed again. - needs_another_loop = True - if len(range_list) == 1 and range_list[0][0] == range_list[0][1]: - # Special case to make sure that n1 is not shown as n[1] etc - results.append((prefix, - "%0*d%s" % - (range_list[0][2], range_list[0][0], suffix))) - else: - # General case where high > low - results.append((prefix, "[" + \ - ",".join([format_range(l, h, w) - for l, h, w in range_list]) + \ - "]" + suffix)) - - # At this point, the set of remaining hosts should be empty and we - # are ready to return the result, together with the flag that says - # if we need to loop again (we do if we have added something to a - # left part). - assert not remaining - return results, needs_another_loop - -def format_range(low, high, width): - """Format a range from low to high inclusively, with a certain width.""" - - if low == high: - return "%0*d" % (width, low) - else: - return "%0*d-%0*d" % (width, low, width, high) - -# Sort a list of hosts numerically - -def numerically_sorted(l): - """Sort a list of hosts numerically. - - E.g. sorted order should be n1, n2, n10; not n1, n10, n2. - """ - - return sorted(l, key=numeric_sort_key) - -def int_if_possible(x): - try: - return int(x) - except: - return x - -def numeric_sort_key(x): - return [int_if_possible(n) for n in re.findall("([0-9]+|[^0-9]+)", x)] - - -# -# Keep this part to tell users where the command line interface went -# - -if __name__ == '__main__': - import os, sys - sys.stderr.write("The command line utility has been moved to a separate 'hostlist' program.\n") - sys.exit(os.EX_USAGE) diff --git a/contribs/python/hostlist/python-hostlist-1.6.tar.gz b/contribs/python/hostlist/python-hostlist-1.6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..82faea290b2ca0355ade5c5e27a451d1fa012580 GIT binary patch literal 18058 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 literal 0 HcmV?d00001 diff --git a/contribs/python/hostlist/python-hostlist.spec b/contribs/python/hostlist/python-hostlist.spec deleted file mode 100644 index 9c2ce0df1..000000000 --- a/contribs/python/hostlist/python-hostlist.spec +++ /dev/null @@ -1,51 +0,0 @@ -%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} - -Name: python-hostlist -Version: 1.5 -Release: 1 -Summary: Python module for hostlist handling -Vendor: NSC - -Group: Development/Languages -License: GPL2+ -URL: http://www.nsc.liu.se/~kent/python-hostlist/ -Source0: http://www.nsc.liu.se/~kent/python-hostlist/%{name}-%{version}.tar.gz -BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) - -BuildArch: noarch -BuildRequires: python-devel - -%description -The hostlist.py module knows how to expand and collect hostlist -expressions. The package also includes the 'hostlist' binary which can -be used to collect/expand hostlists and perform set operations on -them. - -%prep -%setup -q - - -%build -%{__python} setup.py build - - -%install -rm -rf $RPM_BUILD_ROOT -%{__python} setup.py install -O1 --skip-build --prefix /usr --root $RPM_BUILD_ROOT - - -%clean -rm -rf $RPM_BUILD_ROOT - - -%files -%defattr(-,root,root,-) -%doc README -%doc COPYING -%doc CHANGES -%{python_sitelib}/* -/usr/bin/hostlist -/usr/bin/hostgrep -/usr/share/man/man1/hostlist.1.gz -/usr/share/man/man1/hostgrep.1.gz -%changelog diff --git a/contribs/python/hostlist/setup.py b/contribs/python/hostlist/setup.py deleted file mode 100644 index 57199e707..000000000 --- a/contribs/python/hostlist/setup.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- - -from distutils.core import setup - -# Python 2/3 installation trick from .../Demo/distutils/test2to3 -try: - from distutils.command.build_py import build_py_2to3 as build_py -except ImportError: - from distutils.command.build_py import build_py - -try: - from distutils.command.build_scripts import build_scripts_2to3 as build_scripts -except ImportError: - from distutils.command.build_scripts import build_scripts - -# Version -VERSION = "1.5" -if "#" in VERSION: - import sys - sys.stderr.write("Bad version %s\n" % VERSION) - sys.exit(1) - - -setup(name = "python-hostlist", - version = VERSION, - description = "Python module for hostlist handling", - long_description = "The hostlist.py module knows how to expand and collect hostlist expressions.", - author = "Kent Engström", - author_email = "kent@nsc.liu.se", - url = "http://www.nsc.liu.se/~kent/python-hostlist/", - license = "GPL2+", - classifiers = ['Development Status :: 5 - Production/Stable', - 'Intended Audience :: Science/Research', - 'Intended Audience :: System Administrators', - 'License :: OSI Approved :: GNU General Public License (GPL)', - 'Topic :: System :: Clustering', - 'Topic :: System :: Systems Administration', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 3', - ], - py_modules = ["hostlist"], - scripts = ["hostlist", "hostgrep"], - data_files = [("share/man/man1", ["hostlist.1", - "hostgrep.1"])], - cmdclass = {'build_py':build_py, - 'build_scripts':build_scripts, - } - ) diff --git a/contribs/python/hostlist/test/Makefile.am b/contribs/python/hostlist/test/Makefile.am deleted file mode 100644 index c795271fb..000000000 --- a/contribs/python/hostlist/test/Makefile.am +++ /dev/null @@ -1,2 +0,0 @@ -EXTRA_DIST = \ - test_hostlist.py diff --git a/contribs/python/hostlist/test/Makefile.in b/contribs/python/hostlist/test/Makefile.in deleted file mode 100644 index f6afe23be..000000000 --- a/contribs/python/hostlist/test/Makefile.in +++ /dev/null @@ -1,430 +0,0 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -target_triplet = @target@ -subdir = contribs/python/hostlist/test -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/auxdir/acx_pthread.m4 \ - $(top_srcdir)/auxdir/libtool.m4 \ - $(top_srcdir)/auxdir/ltoptions.m4 \ - $(top_srcdir)/auxdir/ltsugar.m4 \ - $(top_srcdir)/auxdir/ltversion.m4 \ - $(top_srcdir)/auxdir/lt~obsolete.m4 \ - $(top_srcdir)/auxdir/slurm.m4 \ - $(top_srcdir)/auxdir/x_ac__system_configuration.m4 \ - $(top_srcdir)/auxdir/x_ac_affinity.m4 \ - $(top_srcdir)/auxdir/x_ac_aix.m4 \ - $(top_srcdir)/auxdir/x_ac_blcr.m4 \ - $(top_srcdir)/auxdir/x_ac_bluegene.m4 \ - $(top_srcdir)/auxdir/x_ac_cflags.m4 \ - $(top_srcdir)/auxdir/x_ac_cray.m4 \ - $(top_srcdir)/auxdir/x_ac_databases.m4 \ - $(top_srcdir)/auxdir/x_ac_debug.m4 \ - $(top_srcdir)/auxdir/x_ac_elan.m4 \ - $(top_srcdir)/auxdir/x_ac_env.m4 \ - $(top_srcdir)/auxdir/x_ac_federation.m4 \ - $(top_srcdir)/auxdir/x_ac_gpl_licensed.m4 \ - $(top_srcdir)/auxdir/x_ac_gtk.m4 \ - $(top_srcdir)/auxdir/x_ac_iso.m4 \ - $(top_srcdir)/auxdir/x_ac_munge.m4 \ - $(top_srcdir)/auxdir/x_ac_ncurses.m4 \ - $(top_srcdir)/auxdir/x_ac_pam.m4 \ - $(top_srcdir)/auxdir/x_ac_ptrace.m4 \ - $(top_srcdir)/auxdir/x_ac_readline.m4 \ - $(top_srcdir)/auxdir/x_ac_setpgrp.m4 \ - $(top_srcdir)/auxdir/x_ac_setproctitle.m4 \ - $(top_srcdir)/auxdir/x_ac_sgi_job.m4 \ - $(top_srcdir)/auxdir/x_ac_slurm_ssl.m4 \ - $(top_srcdir)/auxdir/x_ac_sun_const.m4 \ - $(top_srcdir)/auxdir/x_ac_xcpu.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h $(top_builddir)/slurm/slurm.h -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTHD_CFLAGS = @AUTHD_CFLAGS@ -AUTHD_LIBS = @AUTHD_LIBS@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BG_INCLUDES = @BG_INCLUDES@ -BLCR_CPPFLAGS = @BLCR_CPPFLAGS@ -BLCR_HOME = @BLCR_HOME@ -BLCR_LDFLAGS = @BLCR_LDFLAGS@ -BLCR_LIBS = @BLCR_LIBS@ -BLUEGENE_LOADED = @BLUEGENE_LOADED@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CMD_LDFLAGS = @CMD_LDFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -ELAN_LIBS = @ELAN_LIBS@ -EXEEXT = @EXEEXT@ -FEDERATION_LDFLAGS = @FEDERATION_LDFLAGS@ -FGREP = @FGREP@ -GREP = @GREP@ -GTK2_CFLAGS = @GTK2_CFLAGS@ -GTK2_LIBS = @GTK2_LIBS@ -HAVEMYSQLCONFIG = @HAVEMYSQLCONFIG@ -HAVEPGCONFIG = @HAVEPGCONFIG@ -HAVEPKGCONFIG = @HAVEPKGCONFIG@ -HAVE_AIX = @HAVE_AIX@ -HAVE_ELAN = @HAVE_ELAN@ -HAVE_FEDERATION = @HAVE_FEDERATION@ -HAVE_OPENSSL = @HAVE_OPENSSL@ -HAVE_SOME_CURSES = @HAVE_SOME_CURSES@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_LDFLAGS = @LIB_LDFLAGS@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MKDIR_P = @MKDIR_P@ -MUNGE_CPPFLAGS = @MUNGE_CPPFLAGS@ -MUNGE_LDFLAGS = @MUNGE_LDFLAGS@ -MUNGE_LIBS = @MUNGE_LIBS@ -MYSQL_CFLAGS = @MYSQL_CFLAGS@ -MYSQL_LIBS = @MYSQL_LIBS@ -NCURSES = @NCURSES@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NUMA_LIBS = @NUMA_LIBS@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PAM_LIBS = @PAM_LIBS@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PGSQL_CFLAGS = @PGSQL_CFLAGS@ -PGSQL_LIBS = @PGSQL_LIBS@ -PLPA_LIBS = @PLPA_LIBS@ -PROCTRACKDIR = @PROCTRACKDIR@ -PROJECT = @PROJECT@ -PTHREAD_CC = @PTHREAD_CC@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LIBS = @PTHREAD_LIBS@ -RANLIB = @RANLIB@ -READLINE_LIBS = @READLINE_LIBS@ -RELEASE = @RELEASE@ -SED = @SED@ -SEMAPHORE_LIBS = @SEMAPHORE_LIBS@ -SEMAPHORE_SOURCES = @SEMAPHORE_SOURCES@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLURMCTLD_PORT = @SLURMCTLD_PORT@ -SLURMDBD_PORT = @SLURMDBD_PORT@ -SLURMD_PORT = @SLURMD_PORT@ -SLURM_API_AGE = @SLURM_API_AGE@ -SLURM_API_CURRENT = @SLURM_API_CURRENT@ -SLURM_API_MAJOR = @SLURM_API_MAJOR@ -SLURM_API_REVISION = @SLURM_API_REVISION@ -SLURM_API_VERSION = @SLURM_API_VERSION@ -SLURM_MAJOR = @SLURM_MAJOR@ -SLURM_MICRO = @SLURM_MICRO@ -SLURM_MINOR = @SLURM_MINOR@ -SLURM_PREFIX = @SLURM_PREFIX@ -SLURM_VERSION = @SLURM_VERSION@ -SO_LDFLAGS = @SO_LDFLAGS@ -SSL_CPPFLAGS = @SSL_CPPFLAGS@ -SSL_LDFLAGS = @SSL_LDFLAGS@ -SSL_LIBS = @SSL_LIBS@ -STRIP = @STRIP@ -UTIL_LIBS = @UTIL_LIBS@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -builddir = @builddir@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -srcdir = @srcdir@ -sysconfdir = @sysconfdir@ -target = @target@ -target_alias = @target_alias@ -target_cpu = @target_cpu@ -target_os = @target_os@ -target_vendor = @target_vendor@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -EXTRA_DIST = \ - test_hostlist.py - -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu contribs/python/hostlist/test/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu contribs/python/hostlist/test/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-dvi: install-dvi-am - -install-exec-am: - -install-html: install-html-am - -install-info: install-info-am - -install-man: - -install-pdf: install-pdf-am - -install-ps: install-ps-am - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-dvi install-dvi-am \ - install-exec install-exec-am install-html install-html-am \ - install-info install-info-am install-man install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contribs/python/hostlist/test/test_hostlist.py b/contribs/python/hostlist/test/test_hostlist.py deleted file mode 100644 index d539742df..000000000 --- a/contribs/python/hostlist/test/test_hostlist.py +++ /dev/null @@ -1,123 +0,0 @@ -from hostlist import expand_hostlist, collect_hostlist, BadHostlist -import unittest - -class TestExpand1(unittest.TestCase): - - def expand_eq(self, hostlist, expanded_list): - self.assertEqual(expand_hostlist(hostlist), expanded_list) - - def expand_sort_eq(self, hostlist, expanded_list): - self.assertEqual(expand_hostlist(hostlist, sort=True), expanded_list) - - def expand_length(self, hostlist, expanded_length): - self.assertEqual(len(expand_hostlist(hostlist)), expanded_length) - - def expand_bad(self, hostlist): - self.assertRaises(BadHostlist, expand_hostlist, hostlist) - - def test_expand(self): - self.expand_eq("n[9-11]", ["n9", "n10", "n11"]) - self.expand_sort_eq("n[9-11]", ["n9", "n10", "n11"]) - self.expand_eq("n[09-11]", ["n09", "n10", "n11"]) - self.expand_eq("n[009-11]", ["n009", "n010", "n011"]) - self.expand_sort_eq("n[009-11]", ["n009", "n010", "n011"]) - self.expand_eq("n[009-011]", ["n009", "n010", "n011"]) - - self.expand_eq("n[17-17]", ["n17"]) - self.expand_eq("n1,n3", ["n1", "n3"]) - self.expand_sort_eq("n1,n3", ["n1", "n3"]) - self.expand_eq("n3,n1", ["n3", "n1"]) - self.expand_sort_eq("n3,n1", ["n1", "n3"]) - self.expand_eq("n1,n3,n1", ["n1", "n3"]) - self.expand_sort_eq("n1,n3,n1", ["n1", "n3"]) - self.expand_eq("n3,n1,n3", ["n3", "n1"]) - self.expand_sort_eq("n3,n1,n3", ["n1", "n3"]) - - self.expand_eq("n[1],n3", ["n1", "n3"]) - self.expand_eq("n[1,3]", ["n1", "n3"]) - self.expand_eq("n[3,1]", ["n3", "n1"]) - self.expand_sort_eq("n[3,1]", ["n1", "n3"]) - self.expand_eq("n[1,3,1]", ["n1", "n3"]) - - self.expand_eq("n1,n2,n[9-11],n3", ["n1", "n2", "n9", "n10", "n11", "n3"]) - - self.expand_eq("n[1-3]m[4-6]", ["n1m4", "n1m5", "n1m6", - "n2m4", "n2m5", "n2m6", - "n3m4", "n3m5", "n3m6"]) - self.expand_eq("n[1-2][4-5]m", ["n14m", "n15m", - "n24m", "n25m"]) - self.expand_eq("[1-2][4-5]", ["14", "15", - "24", "25"]) - - self.expand_length("n[1-100]m[1-100]", 100*100) - self.expand_length("[1-10][1-10][1-10]", 10*10*10) - - self.expand_eq("n[1-5,3-8]", ["n1", "n2", "n3", "n4", "n5", "n6", "n7", "n8"]) - self.expand_eq("n[3-8,1-5]", ["n3", "n4", "n5", "n6", "n7", "n8", "n1", "n2"]) - self.expand_sort_eq("n[3-8,1-5]", ["n1", "n2", "n3", "n4", "n5", "n6", "n7", "n8"]) - - self.expand_eq("", []) - - self.expand_bad("n[]") - self.expand_bad("n[-]") - self.expand_bad("n[1-]") - self.expand_bad("n[-1]") - self.expand_bad("n[1,]") - self.expand_bad("n[,1]") - self.expand_bad("n[1-3,]") - self.expand_bad("n[,1-3]") - self.expand_bad("n[3-1]") - self.expand_bad("n[") - self.expand_bad("n]") - self.expand_bad("n[[]]") - self.expand_bad("n[1,[]]") - self.expand_bad("n[x]") - self.expand_bad("n[1-10x]") - - self.expand_bad("n[1-1000000]") - self.expand_bad("n[1-1000][1-1000]") - - def collect_eq(self, hostlist, expanded_list): - # Note the order of the arguments! This makes it easier to - # copy tests between the expand and collect parts! - self.assertEqual(hostlist, collect_hostlist(expanded_list)) - - def test_collect(self): - self.collect_eq("n[9-11]", ["n9", "n10", "n11"]) - self.collect_eq("n[09-11]", ["n09", "n10", "n11"]) - self.collect_eq("n[009-011]", ["n009", "n010", "n011"]) - - self.collect_eq("n[1-3,9-11]", ["n1", "n2", "n9", "n10", "n11", "n3"]) - - self.collect_eq("m1,n[9-11],p[7-8]", ["n9", "n10", "p7", "m1", "n11", "p8"]) - - self.collect_eq("x[1-2]y[4-5]", ["x1y4", "x1y5", - "x2y4", "x2y5"]) - self.collect_eq("[1-2]y[4-5]z", ["1y4z", "1y5z", - "2y4z", "2y5z"]) - - self.collect_eq("x1y[4-5],x2y4", ["x1y4", "x1y5", "x2y4"]) - self.collect_eq("x1y5,x2y[4-5]", ["x1y5", "x2y4", "x2y5"]) - self.collect_eq("x1y5,x2y4", ["x1y5", "x2y4"]) - - self.collect_eq("", [""]) - - self.collect_eq("n[9,09]", ["n09","n9"]) - self.collect_eq("n[9,09]", ["n9","n09"]) - self.collect_eq("n[9-10]", ["n9","n10"]) - self.collect_eq("n[09-10]", ["n09","n10"]) - self.collect_eq("n[009,10]", ["n009","n10"]) - - self.collect_eq("x", ["x"]) - self.collect_eq("x", ["x", "x"]) - self.collect_eq("x,y", ["x", "y", "x"]) - - self.collect_eq("n1", ["n1"]) - self.collect_eq("n1", ["n1", "n1"]) - self.collect_eq("n[1-2]", ["n1", "n2", "n1"]) - - self.collect_eq("x,y[10-12],z", ["z","y10","y12", "x", "y11"]) - - -if __name__ == '__main__': - unittest.main() diff --git a/doc/html/configurator.html.in b/doc/html/configurator.html.in index c1a22288f..6619d7f8a 100644 --- a/doc/html/configurator.html.in +++ b/doc/html/configurator.html.in @@ -162,7 +162,7 @@ function displayfile() "#MailProg=/bin/mail <br>" + "#MaxJobCount=5000 <br>" + "MpiDefault=" + get_radio_value(document.config.mpi_default) + "<br>" + - "#MpiParams=ports:#-# <br>" + + "#MpiParams=ports=#-# <br>" + "#PluginDir= <br>" + "#PlugStackConfig= <br>" + "#PrivateData=jobs <br>" + diff --git a/doc/man/man1/sacct.1 b/doc/man/man1/sacct.1 index a1821d37b..a67e5db4c 100644 --- a/doc/man/man1/sacct.1 +++ b/doc/man/man1/sacct.1 @@ -242,7 +242,7 @@ NOTE: When using the format option for listing various fields you can put a %NUMBER afterwards to specify how many characters should be printed. i.e. format=name%30 will print 30 characters of field name right -justified. A -30 will print 30 characters left justified. +justified. A \-30 will print 30 characters left justified. .IP .TP diff --git a/doc/man/man1/sacctmgr.1 b/doc/man/man1/sacctmgr.1 index 8d88b7b7c..c4abf1106 100644 --- a/doc/man/man1/sacctmgr.1 +++ b/doc/man/man1/sacctmgr.1 @@ -686,7 +686,7 @@ When using the format option for listing various fields you can put a %NUMBER afterwards to specify how many characters should be printed. i.e. format=name%30 will print 30 characters of field name right -justified. A -30 will print 30 characters left justified. +justified. A \-30 will print 30 characters left justified. .SH "FLAT FILE DUMP AND LOAD" sacctmgr has the capability to load and dump SLURM association data to and diff --git a/doc/man/man1/smap.1 b/doc/man/man1/smap.1 index c0522ab6c..44b20942b 100644 --- a/doc/man/man1/smap.1 +++ b/doc/man/man1/smap.1 @@ -269,8 +269,12 @@ The default value is TORUS. \fBSmall\fR Equivalent to "Connection=Small". If a small connection is specified the base partition chosen will create -smaller partitions based on options \fBNodeCards\fR and \fBQuarters\fR -within the base partition. These number will be altered to take up the +smaller partitions based on options \fB32CNBlocks\fR and +\fB128CNBlocks\fR respectively for a Bluegene L system. +\fB16CNBlocks\fR, \fB64CNBlocks\fR, and \fB256CNBlocks\fR are also +available for Bluegene P systems. Keep in mind you +must have enough ionodes to make all these configurations possible. + These number will be altered to take up the entire base partition. Size does not need to be specified with a small request, we will always default to 1 base partition for allocation. .TP diff --git a/doc/man/man1/sreport.1 b/doc/man/man1/sreport.1 index ba5d2224d..e4c071972 100644 --- a/doc/man/man1/sreport.1 +++ b/doc/man/man1/sreport.1 @@ -227,7 +227,7 @@ When using the format option for listing various fields you can put a %NUMBER afterwards to specify how many characters should be printed. i.e. format=name%30 will print 30 characters of field name right -justified. A -30 will print 30 characters left justified. +justified. A \-30 will print 30 characters left justified. .TP .B Start=<OPT> diff --git a/doc/man/man5/bluegene.conf.5 b/doc/man/man5/bluegene.conf.5 index 484360c51..41973e3ff 100644 --- a/doc/man/man5/bluegene.conf.5 +++ b/doc/man/man5/bluegene.conf.5 @@ -198,8 +198,12 @@ The default value is TORUS. .TP \fBSMALL\fR: The base partition is divided into more than one bgblock. The administrator should define the number of single node cards and -quarter base partition blocks using the options \fBNodeCards\fR and -\fBQuarters\fR respectively. +quarter base partition blocks using the options \fB32CNBlocks\fR and +\fB128CNBlocks\fR respectively for a Bluegene L system. \fB16CNBlocks\fR, +\fB64CNBlocks\fR, and \fB256CNBlocks\fR are also available for +Bluegene P systems. Keep in mind you +must have enough ionodes to make all these configurations possible. + The total number of c\-nodes in defined blocks must not exceed \fBBasePartitionNodeCnt\fR. If not specified, the base partition will be divided into four @@ -259,9 +263,9 @@ BPs=[320x323] Type=TORUS # 1x1x4 = 4 .br BPs=[330x331] Type=TORUS # 1x1x2 = 2 .br -BPs=[332x332] Type=TORUS # 1x1x1 = 1 +BPs=[332] Type=TORUS # 1x1x1 = 1 .br -BPs=[333x333] Type=SMALL NodeCards=4 Quarters=3 # 1/16 * 4 + 1/4 * 3 +BPs=[333] Type=SMALL 32CNBlocks=4 128CNBlocks=3 # 1/16 * 4 + 1/4 * 3 .SH "COPYING" Copyright (C) 2006 The Regents of the University of California. diff --git a/doc/man/man5/slurm.conf.5 b/doc/man/man5/slurm.conf.5 index 1fc3d6d6c..089c2d479 100644 --- a/doc/man/man5/slurm.conf.5 +++ b/doc/man/man5/slurm.conf.5 @@ -566,13 +566,13 @@ Also see \fBDefaultStorageUser\fR. \fBJobCredentialPrivateKey\fR Fully qualified pathname of a file containing a private key used for authentication by SLURM daemons. -This parameter is ignored if \fBCryptType=munge\fR. +This parameter is ignored if \fBCryptoType=crypto/munge\fR. .TP \fBJobCredentialPublicCertificate\fR Fully qualified pathname of a file containing a public key used for authentication by SLURM daemons. -This parameter is ignored if \fBCryptType=munge\fR. +This parameter is ignored if \fBCryptoType=crypto/munge\fR. .TP \fBJobFileAppend\fR @@ -1467,6 +1467,7 @@ Related configuration options include \fBResumeTimeout\fR, \fBResumeProgram\fR, Nodes which remain idle for this number of seconds will be placed into power save mode by \fBSuspendProgram\fR. A value of \-1 disables power save mode and is the default. +The maximum value is 65534 (18.2 hours). Related configuration options include \fBResumeTimeout\fR, \fBResumeProgram\fR, \fBResumeRate\fR, \fBSuspendProgram\fR, \fBSuspendRate\fR, \fBSuspendTimeout\fR, \fBSuspendExcNodes\fR, and \fBSuspendExcParts\fR. diff --git a/slurm.spec b/slurm.spec index 6c8700830..18f5691cb 100644 --- a/slurm.spec +++ b/slurm.spec @@ -75,14 +75,14 @@ %endif Name: slurm -Version: 2.0.5 +Version: 2.0.7 Release: 1%{?dist} Summary: Simple Linux Utility for Resource Management License: GPL Group: System Environment/Base -Source: slurm-2.0.5.tar.bz2 +Source: slurm-2.0.7.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release} URL: https://computing.llnl.gov/linux/slurm/ @@ -269,7 +269,7 @@ SLURM process tracking plugin for SGI job containers. ############################################################################# %prep -%setup -n slurm-2.0.5 +%setup -n slurm-2.0.7 %build %configure --program-prefix=%{?_program_prefix:%{_program_prefix}} \ diff --git a/src/common/read_config.c b/src/common/read_config.c index ec6e36d76..f8e396aa9 100644 --- a/src/common/read_config.c +++ b/src/common/read_config.c @@ -2378,9 +2378,16 @@ _validate_and_set_defaults(slurm_ctl_conf_t *conf, s_p_hashtbl_t *hashtbl) s_p_get_string(&conf->suspend_program, "SuspendProgram", hashtbl); if (!s_p_get_uint16(&conf->suspend_rate, "SuspendRate", hashtbl)) conf->suspend_rate = DEFAULT_SUSPEND_RATE; - if (s_p_get_long(&long_suspend_time, "SuspendTime", hashtbl)) - conf->suspend_time = long_suspend_time + 1; - else + if (s_p_get_long(&long_suspend_time, "SuspendTime", hashtbl)) { + if (long_suspend_time >= 0xfffe) { + error("SuspendTime value (%ld) is greater than 65534", + long_suspend_time); + } else if (long_suspend_time < -1) { + error("SuspendTime value (%ld) is less than -1", + long_suspend_time); + } else + conf->suspend_time = long_suspend_time + 1; + } else conf->suspend_time = 0; if (!s_p_get_uint16(&conf->suspend_timeout, "SuspendTimeout", hashtbl)) conf->suspend_timeout = DEFAULT_SUSPEND_TIMEOUT; diff --git a/src/common/stepd_api.c b/src/common/stepd_api.c index 939974569..0c446152d 100644 --- a/src/common/stepd_api.c +++ b/src/common/stepd_api.c @@ -1,6 +1,6 @@ /*****************************************************************************\ * src/common/stepd_api.c - slurmstepd message API - * $Id: stepd_api.c 16867 2009-03-12 16:35:42Z jette $ + * $Id: stepd_api.c 18732 2009-09-21 21:34:51Z lipari $ ***************************************************************************** * Copyright (C) 2005-2007 The Regents of the University of California. * Copyright (C) 2008-2009 Lawrence Livermore National Security. @@ -203,7 +203,8 @@ stepd_connect(const char *directory, const char *nodename, int len; if (nodename == NULL) { - nodename = _guess_nodename(); + if (!(nodename = _guess_nodename())) + return -1; } if (directory == NULL) { slurm_ctl_conf_t *cf; diff --git a/src/plugins/accounting_storage/mysql/mysql_jobacct_process.c b/src/plugins/accounting_storage/mysql/mysql_jobacct_process.c index 938c163ee..1a679da66 100644 --- a/src/plugins/accounting_storage/mysql/mysql_jobacct_process.c +++ b/src/plugins/accounting_storage/mysql/mysql_jobacct_process.c @@ -1640,6 +1640,9 @@ extern int mysql_jobacct_process_archive(mysql_conn_t *mysql_conn, last_submit); return SLURM_ERROR; } + time_tm.tm_sec = 0; + time_tm.tm_min = 0; + time_tm.tm_hour = 0; time_tm.tm_mday = 1; time_tm.tm_mon -= arch_cond->purge_event; time_tm.tm_isdst = -1; @@ -1724,6 +1727,9 @@ exit_events: last_submit); return SLURM_ERROR; } + time_tm.tm_sec = 0; + time_tm.tm_min = 0; + time_tm.tm_hour = 0; time_tm.tm_mday = 1; time_tm.tm_mon -= arch_cond->purge_suspend; time_tm.tm_isdst = -1; @@ -1807,6 +1813,10 @@ exit_suspend: last_submit); return SLURM_ERROR; } + time_tm.tm_sec = 0; + time_tm.tm_min = 0; + time_tm.tm_hour = 0; + time_tm.tm_mday = 1; time_tm.tm_mon -= arch_cond->purge_step; time_tm.tm_isdst = -1; curr_end = mktime(&time_tm); @@ -1891,6 +1901,9 @@ exit_steps: last_submit); return SLURM_ERROR; } + time_tm.tm_sec = 0; + time_tm.tm_min = 0; + time_tm.tm_hour = 0; time_tm.tm_mday = 1; time_tm.tm_mon -= arch_cond->purge_job; time_tm.tm_isdst = -1; diff --git a/src/plugins/sched/backfill/backfill.c b/src/plugins/sched/backfill/backfill.c index 730247c93..fde0b4696 100644 --- a/src/plugins/sched/backfill/backfill.c +++ b/src/plugins/sched/backfill/backfill.c @@ -386,7 +386,7 @@ static void _attempt_backfill(void) if ((part_ptr->root_only) && filter_root) continue; - if ((!job_independent(job_ptr)) || + if ((!job_independent(job_ptr, 0)) || (license_job_test(job_ptr) != SLURM_SUCCESS)) continue; @@ -438,8 +438,8 @@ static void _attempt_backfill(void) bit_and(avail_bitmap, up_node_bitmap); for (j=0; ; ) { if (node_space[j].end_time < start_res) - continue; - if (node_space[j].begin_time <= end_time) { + ; + else if (node_space[j].begin_time <= end_time) { bit_and(avail_bitmap, node_space[j].avail_bitmap); } else @@ -534,7 +534,7 @@ static int _start_job(struct job_record *job_ptr, bitstr_t *resv_bitmap) static uint32_t fail_jobid = 0; if (job_ptr->details->exc_node_bitmap) { - orig_exc_nodes = job_ptr->details->exc_node_bitmap; + orig_exc_nodes = bit_copy(job_ptr->details->exc_node_bitmap); bit_or(job_ptr->details->exc_node_bitmap, resv_bitmap); } else job_ptr->details->exc_node_bitmap = bit_copy(resv_bitmap); diff --git a/src/plugins/sched/wiki/get_jobs.c b/src/plugins/sched/wiki/get_jobs.c index 3362472cb..b428234e8 100644 --- a/src/plugins/sched/wiki/get_jobs.c +++ b/src/plugins/sched/wiki/get_jobs.c @@ -2,7 +2,7 @@ * get_jobs.c - Process Wiki get job info request ***************************************************************************** * Copyright (C) 2006-2007 The Regents of the University of California. - * Copyright (C) 2008 Lawrence Livermore National Security. + * Copyright (C) 2008-2009 Lawrence Livermore National Security. * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). * Written by Morris Jette <jette1@llnl.gov> * CODE-OCEC-09-009. All rights reserved. @@ -240,9 +240,9 @@ static char * _dump_job(struct job_record *job_ptr, time_t update_time) } } else if (!IS_JOB_FINISHED(job_ptr)) { char *hosts = _task_list(job_ptr); - snprintf(tmp, sizeof(tmp), - "TASKLIST=%s;", hosts); - xstrcat(buf, tmp); + xstrcat(buf,"TASKLIST="); + xstrcat(buf, hosts); + xstrcat(buf, ";"); xfree(hosts); } diff --git a/src/plugins/select/bluegene/block_allocator/block_allocator.c b/src/plugins/select/bluegene/block_allocator/block_allocator.c index 90d701274..a2b8719d4 100644 --- a/src/plugins/select/bluegene/block_allocator/block_allocator.c +++ b/src/plugins/select/bluegene/block_allocator/block_allocator.c @@ -1,7 +1,7 @@ /*****************************************************************************\ * block_allocator.c - Assorted functions for layout of bluegene blocks, * wiring, mapping for smap, etc. - * $Id: block_allocator.c 18612 2009-09-02 19:00:21Z da $ + * $Id: block_allocator.c 18838 2009-10-08 16:59:14Z da $ ***************************************************************************** * Copyright (C) 2004 The Regents of the University of California. * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). @@ -1839,9 +1839,8 @@ extern int reset_all_removed_bps() int y, z; for (y = 0; y < DIM_SIZE[Y]; y++) for (z = 0; z < DIM_SIZE[Z]; z++) - if(ba_system_ptr->grid[x][y][z].used == 2) { + if(ba_system_ptr->grid[x][y][z].used == 2) ba_system_ptr->grid[x][y][z].used = 0; - } #else if(ba_system_ptr->grid[x].used == 2) ba_system_ptr->grid[x].used = 0; @@ -1851,10 +1850,11 @@ extern int reset_all_removed_bps() } /* - * IN: hostlist of midplanes we do not want + * IN: hostlist of midplanes we want to be able to use, mark all + * others as used. * RET: SLURM_SUCCESS on success, or SLURM_ERROR on error * - * Need to call rest_all_removed_bps before starting another + * Need to call reset_all_removed_bps before starting another * allocation attempt if possible use removable_set_bps since it is * faster. It does basically the opposite of this function. If you * have to come up with this list though it is faster to use this @@ -1894,22 +1894,13 @@ extern int set_all_bps_except(char *bps) y = temp; temp = start % HOSTLIST_BASE; z = temp; - if(ba_system_ptr->grid[x][y][z].state != NODE_STATE_IDLE) { - error("we can't use this node %c%c%c", - alpha_num[x], - alpha_num[y], - alpha_num[z]); - - return SLURM_ERROR; - } - ba_system_ptr->grid[x][y][z].state = NODE_STATE_END; + if((ba_system_ptr->grid[x][y][z].state == NODE_STATE_UNKNOWN) + || (ba_system_ptr->grid[x][y][z].state == NODE_STATE_IDLE)) + ba_system_ptr->grid[x][y][z].state = NODE_STATE_END; #else - if(ba_system_ptr->grid[x].state != NODE_STATE_IDLE) { - error("we can't use this node %d", x); - - return SLURM_ERROR; - } - ba_system_ptr->grid[x].state = NODE_STATE_END; + if((ba_system_ptr->grid[x].state == NODE_STATE_UNKNOWN) + || (ba_system_ptr->grid[x].state == NODE_STATE_IDLE)) + ba_system_ptr->grid[x].state = NODE_STATE_END; #endif free(host); } diff --git a/src/plugins/select/bluegene/block_allocator/bridge_linker.c b/src/plugins/select/bluegene/block_allocator/bridge_linker.c index 43ef5210f..5b386bc44 100644 --- a/src/plugins/select/bluegene/block_allocator/bridge_linker.c +++ b/src/plugins/select/bluegene/block_allocator/bridge_linker.c @@ -223,12 +223,14 @@ extern int bridge_init() "setSayMessageParams" }; #endif - int n_syms = sizeof( syms ) / sizeof( char * ); + int n_syms; int rc; if(initialized) return 1; + n_syms = sizeof( syms ) / sizeof( char * ); + initialized = true; if(!_get_syms(n_syms, syms, (void **) &bridge_api)) return 0; @@ -249,8 +251,9 @@ extern int bridge_fini() { if(handle) dlclose(handle); - - return SLURM_ERROR; + initialized = false; + + return SLURM_SUCCESS; } extern status_t bridge_get_bg(my_bluegene_t **bg) @@ -298,8 +301,19 @@ extern status_t bridge_get_block_info(pm_partition_id_t pid, int rc = CONNECTION_ERROR; if(!bridge_init()) return rc; + + /* this is here to make sure we don't lock up things with + polling and the long running get_BG call */ + rc = pthread_mutex_trylock(&api_file_mutex); + if (rc == EBUSY) + return rc; + else if(rc) { + errno = rc; + error("%s:%d %s: pthread_mutex_trylock(): %m", + __FILE__, __LINE__, __CURRENT_FUNC__); + } - slurm_mutex_lock(&api_file_mutex); + //slurm_mutex_lock(&api_file_mutex); rc = (*(bridge_api.get_partition_info))(pid, partition); slurm_mutex_unlock(&api_file_mutex); return rc; diff --git a/src/plugins/select/bluegene/plugin/bg_block_info.c b/src/plugins/select/bluegene/plugin/bg_block_info.c index cec58fa4d..0d9c33c45 100644 --- a/src/plugins/select/bluegene/plugin/bg_block_info.c +++ b/src/plugins/select/bluegene/plugin/bg_block_info.c @@ -1,7 +1,7 @@ /*****************************************************************************\ * bg_block_info.c - bluegene block information from the db2 database. * - * $Id: bg_block_info.c 18147 2009-07-15 16:25:53Z da $ + * $Id: bg_block_info.c 18904 2009-10-15 15:52:20Z da $ ***************************************************************************** * Copyright (C) 2004-2006 The Regents of the University of California. * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). @@ -278,6 +278,16 @@ extern int update_block_list() break; } } + + /* If the call was busy, just skip this + iteration. It usually means something like + rm_get_BG was called which can be a very + long call */ + if(rc == EBUSY) { + debug5("lock was busy, aborting"); + break; + } + error("bridge_get_block_info(%s): %s", name, bg_err_str(rc)); @@ -357,6 +367,7 @@ extern int update_block_list() //plugin set error && bg_record->state != state) { int skipped_dealloc = 0; + debug("state of Block %s was %d and now is %d", bg_record->bg_block_id, bg_record->state, @@ -382,8 +393,18 @@ extern int update_block_list() xfree(bg_record->target_name); bg_record->target_name = xstrdup(bg_record->user_name); - } - + } else if((bg_record->state + == RM_PARTITION_DEALLOCATING) + && (state == RM_PARTITION_CONFIGURING)) + /* This is a funky state IBM says + isn't a bug, but all their + documentation says this doesn't + happen, but IBM says oh yeah, you + weren't really suppose to notice + that. So we will just skip this + state and act like this didn't happen. */ + goto nochange_state; + bg_record->state = state; if(bg_record->state == RM_PARTITION_DEALLOCATING @@ -402,7 +423,7 @@ extern int update_block_list() xstrdup(bg_record->user_name); } #endif - else if(bg_record->state == RM_PARTITION_CONFIGURING) + else if(bg_record->state == RM_PARTITION_CONFIGURING) bg_record->boot_state = 1; else if(bg_record->state == RM_PARTITION_FREE) { if(remove_from_bg_list(bg_lists->job_running, @@ -425,8 +446,8 @@ extern int update_block_list() trigger_block_error(); } updated = 1; - } + nochange_state: /* check the boot state */ debug3("boot state for block %s is %d", @@ -600,6 +621,15 @@ extern int update_freeing_block_list() break; } } + /* If the call was busy, just skip this + iteration. It usually means something like + rm_get_BG was called which can be a very + long call */ + if(rc == EBUSY) { + debug5("lock was busy, aborting"); + break; + } + error("bridge_get_block_info(%s): %s", name, bg_err_str(rc)); diff --git a/src/plugins/select/bluegene/plugin/bluegene.c b/src/plugins/select/bluegene/plugin/bluegene.c index 867e2099d..024098f54 100644 --- a/src/plugins/select/bluegene/plugin/bluegene.c +++ b/src/plugins/select/bluegene/plugin/bluegene.c @@ -1,7 +1,7 @@ /*****************************************************************************\ * bluegene.c - blue gene node configuration processing module. * - * $Id: bluegene.c 17982 2009-06-26 16:25:33Z da $ + * $Id: bluegene.c 18897 2009-10-14 19:09:10Z da $ ***************************************************************************** * Copyright (C) 2004 The Regents of the University of California. * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). @@ -41,9 +41,10 @@ #include "defined_block.h" #include <stdio.h> -#define MMCS_POLL_TIME 30 /* poll MMCS for down switches and nodes - * every 120 secs */ -#define BG_POLL_TIME 0 /* poll bg blocks every 3 secs */ +#define MMCS_POLL_TIME 30 /* seconds between poll of MMCS for + * down switches and nodes */ +#define BG_POLL_TIME 1 /* seconds between poll of state + * change in bg blocks */ #define _DEBUG 0 @@ -359,7 +360,6 @@ extern void *block_agent(void *args) last_bg_test = now - BG_POLL_TIME; while (!agent_fini) { - if (difftime(now, last_bg_test) >= BG_POLL_TIME) { if (agent_fini) /* don't bother */ break; /* quit now */ @@ -378,10 +378,10 @@ extern void *block_agent(void *args) "update_block_list 2"); } } - now = time(NULL); } sleep(1); + now = time(NULL); } return NULL; } @@ -402,9 +402,12 @@ extern void *state_agent(void *args) if (agent_fini) /* don't bother */ break; /* quit now */ if(blocks_are_created) { - last_mmcs_test = now; - /* can run for a while */ + /* can run for a while so set the + * time after the call so there is + * always MMCS_POLL_TIME between + * calls */ test_mmcs_failures(); + last_mmcs_test = time(NULL); } } diff --git a/src/plugins/select/bluegene/plugin/sfree.c b/src/plugins/select/bluegene/plugin/sfree.c index c8460347d..84919d1d8 100644 --- a/src/plugins/select/bluegene/plugin/sfree.c +++ b/src/plugins/select/bluegene/plugin/sfree.c @@ -1,6 +1,6 @@ /*****************************************************************************\ * sfree.c - free specified block or all blocks. - * $Id: sfree.c 18185 2009-07-17 19:02:22Z da $ + * $Id: sfree.c 18904 2009-10-15 15:52:20Z da $ ***************************************************************************** * Copyright (C) 2004 The Regents of the University of California. * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). @@ -364,6 +364,15 @@ static int _update_bg_record_state() continue; } + /* If the call was busy, just skip this + iteration. It usually means something like + rm_get_BG was called which can be a very + long call */ + if(rc == EBUSY) { + debug5("lock was busy, aborting"); + break; + } + error("bridge_get_block_info(%s): %s", name, _bg_err_str(rc)); diff --git a/src/plugins/select/bluegene/plugin/state_test.c b/src/plugins/select/bluegene/plugin/state_test.c index 2c636d91f..2b2042107 100644 --- a/src/plugins/select/bluegene/plugin/state_test.c +++ b/src/plugins/select/bluegene/plugin/state_test.c @@ -2,7 +2,7 @@ * state_test.c - Test state of Bluegene base partitions and switches. * DRAIN nodes in SLURM that are not usable. * - * $Id: state_test.c 17317 2009-04-21 21:39:50Z da $ + * $Id: state_test.c 18875 2009-10-12 20:34:17Z da $ ***************************************************************************** * Copyright (C) 2004-2006 The Regents of the University of California. * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). @@ -351,6 +351,8 @@ static int _test_down_nodecards(rm_BP_t *bp_ptr) /* } */ clean_up: + if(ncard_list) + bridge_free_nodecard_list(ncard_list); xfree(node_name); /* if(ionode_bitmap) */ /* FREE_NULL_BITMAP(ionode_bitmap); */ diff --git a/src/plugins/select/cons_res/job_test.c b/src/plugins/select/cons_res/job_test.c index b219e2266..b090dde51 100644 --- a/src/plugins/select/cons_res/job_test.c +++ b/src/plugins/select/cons_res/job_test.c @@ -1201,7 +1201,7 @@ static int _eval_nodes_topo(struct job_record *job_ptr, bitstr_t *bitmap, bitstr_t *avail_nodes_bitmap = NULL; /* nodes on any switch */ bitstr_t *req_nodes_bitmap = NULL; int rem_cpus, rem_nodes; /* remaining resources desired */ - int avail_cpus, alloc_cpus = 0; + int avail_cpus; int i, j, rc = SLURM_SUCCESS; int best_fit_inx, first, last; int best_fit_nodes, best_fit_cpus; @@ -1289,7 +1289,6 @@ static int _eval_nodes_topo(struct job_record *job_ptr, bitstr_t *bitmap, avail_cpus = _get_cpu_cnt(job_ptr, i, cpu_cnt, freq, size); rem_cpus -= avail_cpus; - alloc_cpus += avail_cpus; for (j=0; j<switch_record_cnt; j++) { if (!bit_test(switches_bitmap[j], i)) continue; @@ -1327,7 +1326,6 @@ static int _eval_nodes_topo(struct job_record *job_ptr, bitstr_t *bitmap, avail_cpus = _get_cpu_cnt(job_ptr, i, cpu_cnt, freq, size); rem_cpus -= avail_cpus; - alloc_cpus += avail_cpus; } } if ((rem_nodes <= 0) && (rem_cpus <= 0)) @@ -1456,7 +1454,6 @@ static int _eval_nodes_topo(struct job_record *job_ptr, bitstr_t *bitmap, rem_nodes--; max_nodes--; rem_cpus -= avail_cpus; - alloc_cpus += avail_cpus; if ((max_nodes <= 0) || ((rem_nodes <= 0) && (rem_cpus <= 0))) break; @@ -1469,11 +1466,7 @@ static int _eval_nodes_topo(struct job_record *job_ptr, bitstr_t *bitmap, } else rc = SLURM_ERROR; - fini: if (rc == SLURM_SUCCESS) { - /* Job's total_procs is needed for SELECT_MODE_WILL_RUN */ - job_ptr->total_procs = alloc_cpus; - } - FREE_NULL_BITMAP(avail_nodes_bitmap); + fini: FREE_NULL_BITMAP(avail_nodes_bitmap); FREE_NULL_BITMAP(req_nodes_bitmap); for (i=0; i<switch_record_cnt; i++) bit_free(switches_bitmap[i]); @@ -1753,8 +1746,7 @@ extern int cr_job_test(struct job_record *job_ptr, bitstr_t *bitmap, "insufficient resources"); return SLURM_ERROR; } else if (test_only) { - /* FIXME: does "test_only" expect struct_job_res - * to be filled out? For now we assume NO */ + /* Note: "test_only" does not need struct_job_res */ FREE_NULL_BITMAP(orig_map); FREE_NULL_BITMAP(free_cores); FREE_NULL_BITMAP(avail_cores); @@ -1776,7 +1768,10 @@ extern int cr_job_test(struct job_record *job_ptr, bitstr_t *bitmap, * of resources for this job. Here is the procedure: * * Step 1: Seek idle nodes across all partitions. If successful then - * place job and exit. If not successful, then continue: + * place job and exit. If not successful, then continue. Two + * related items to note: + * 1. Jobs that don't share CPUs finish with step 1. + * 2. The remaining steps assume sharing or preemption. * * Step 2: Remove resources that are in use by higher-pri partitions, * and test that job can still succeed. If not then exit. @@ -1829,6 +1824,16 @@ extern int cr_job_test(struct job_record *job_ptr, bitstr_t *bitmap, debug3("cons_res: cr_job_test: test 1 fail - " "not enough idle resources"); + /* If no sched/gang, then check for Shared=NO (NODE_CR_ONE_ROW). Note + * that Shared=EXCLUSIVE was already addressed in _verify_node_state(). + */ + if (!cr_priority_selection_enabled() && + job_node_req == NODE_CR_ONE_ROW) { + /* this job CANNOT share CPUs regardless of priority, + * so we fail here */ + goto alloc_job; + } + /*** Step 2 ***/ bit_copybits(bitmap, orig_map); bit_copybits(free_cores, avail_cores); @@ -2007,6 +2012,12 @@ alloc_job: if ((mode != SELECT_MODE_WILL_RUN) && (job_ptr->part_ptr == NULL)) error_code = EINVAL; + if ((error_code == SLURM_SUCCESS) && (mode == SELECT_MODE_WILL_RUN)) { + /* Set a reasonable value for the number of allocated CPUs. + * Without computing task distribution this is only a guess */ + job_ptr->total_procs = MAX(job_ptr->num_procs, + job_ptr->details->min_nodes); + } if ((error_code != SLURM_SUCCESS) || (mode != SELECT_MODE_RUN_NOW)) { FREE_NULL_BITMAP(free_cores); xfree(cpu_count); diff --git a/src/scontrol/info_job.c b/src/scontrol/info_job.c index 415535934..291f699a8 100644 --- a/src/scontrol/info_job.c +++ b/src/scontrol/info_job.c @@ -650,7 +650,7 @@ extern int scontrol_encode_hostlist(char *hostlist) { char *io_buf = NULL, *tmp_list, *ranged_string; - int buf_size = 0; + int buf_size = 1024 * 1024; hostlist_t hl; if (!hostlist) { @@ -665,7 +665,6 @@ scontrol_encode_hostlist(char *hostlist) fprintf(stderr, "Can not open %s\n", hostlist); return SLURM_ERROR; } - buf_size = 1024 * 1024; io_buf = xmalloc(buf_size); buf_read = read(fd, io_buf, buf_size); close(fd); @@ -680,9 +679,12 @@ scontrol_encode_hostlist(char *hostlist) } else tmp_list = hostlist; - buf_size = strlen(tmp_list) + 1; - ranged_string = xmalloc(buf_size); hl = hostlist_create(tmp_list); + if (hl == NULL) { + fprintf(stderr, "Invalid hostlist: %s\n", tmp_list); + return SLURM_ERROR; + } + ranged_string = xmalloc(buf_size); hostlist_ranged_string(hl, buf_size, ranged_string); printf("%s\n", ranged_string); hostlist_destroy(hl); diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c index 34bc923ad..367287468 100644 --- a/src/slurmctld/job_mgr.c +++ b/src/slurmctld/job_mgr.c @@ -1770,7 +1770,7 @@ extern int job_allocate(job_desc_msg_t * job_specs, int immediate, return error_code; } xassert(job_ptr); - independent = job_independent(job_ptr); + independent = job_independent(job_ptr, will_run); /* priority needs to be calculated after this since we set a begin time in job_independent and that lets us know if the job is eligible. @@ -4473,7 +4473,7 @@ static bool _top_priority(struct job_record *job_ptr) continue; if (job_ptr2->job_state != JOB_PENDING) continue; - if (!job_independent(job_ptr2)) + if (!job_independent(job_ptr2, 0)) continue; if ((job_ptr2->resv_name && (!job_ptr->resv_name)) || ((!job_ptr2->resv_name) && job_ptr->resv_name)) @@ -5956,7 +5956,7 @@ extern void job_completion_logger(struct job_record *job_ptr) * IN job_ptr - pointer to job being tested * RET - true if job no longer must be defered for another job */ -extern bool job_independent(struct job_record *job_ptr) +extern bool job_independent(struct job_record *job_ptr, int will_run) { struct job_details *detail_ptr = job_ptr->details; time_t now = time(NULL); @@ -5989,7 +5989,7 @@ extern bool job_independent(struct job_record *job_ptr) xfree(job_ptr->state_desc); send_acct_rec = true; } - if (send_acct_rec) { + if (send_acct_rec && !will_run) { /* We want to record when a job becomes eligible in * order to calculate reserved time (a measure of * system over-subscription), job really is not diff --git a/src/slurmctld/job_scheduler.c b/src/slurmctld/job_scheduler.c index 3bd46a2b2..29d87ff64 100644 --- a/src/slurmctld/job_scheduler.c +++ b/src/slurmctld/job_scheduler.c @@ -155,7 +155,7 @@ extern int build_job_queue(struct job_queue **job_queue) (job_ptr->job_state & JOB_COMPLETING) || (job_ptr->priority == 0)) /* held */ continue; - if (!job_independent(job_ptr)) /* can not run now */ + if (!job_independent(job_ptr, 0)) /* can not run now */ continue; if (job_buffer_size <= job_queue_size) { job_buffer_size += 200; @@ -237,7 +237,7 @@ extern void set_job_elig_time(void) (job_ptr->details->min_nodes > part_ptr->max_nodes))) continue; /* Job's eligible time is set in job_independent() */ - if (!job_independent(job_ptr)) + if (!job_independent(job_ptr, 0)) continue; } list_iterator_destroy(job_iterator); diff --git a/src/slurmctld/node_mgr.c b/src/slurmctld/node_mgr.c index f6a8f949a..ee553d578 100644 --- a/src/slurmctld/node_mgr.c +++ b/src/slurmctld/node_mgr.c @@ -583,20 +583,10 @@ extern int load_all_node_state ( bool state_only ) node_ptr->last_idle = now; } xfree (node_name); - if(node_ptr) { - /* If the state is UNKNOWN we will assume IDLE - until the nodes check in. This is needed - for bluegene to set up drained nodes - correctly. */ - if((node_ptr->node_state & NODE_STATE_BASE) - == NODE_STATE_UNKNOWN) - node_ptr->node_state |= NODE_STATE_IDLE; - + if(node_ptr) select_g_update_node_state( (node_ptr - node_record_table_ptr), node_ptr->node_state); - } - } fini: info("Recovered state of %d nodes", node_cnt); diff --git a/src/slurmctld/proc_req.c b/src/slurmctld/proc_req.c index 670856164..8fa9c1eae 100644 --- a/src/slurmctld/proc_req.c +++ b/src/slurmctld/proc_req.c @@ -2642,11 +2642,16 @@ static void _slurm_rpc_job_ready(slurm_msg_t * msg) int error_code, result; job_id_msg_t *id_msg = (job_id_msg_t *) msg->data; DEF_TIMERS; + /* Locks: read job */ + slurmctld_lock_t job_read_lock = { + NO_LOCK, READ_LOCK, NO_LOCK, NO_LOCK }; slurm_msg_t response_msg; return_code_msg_t rc_msg; START_TIMER; + lock_slurmctld(job_read_lock); error_code = job_node_ready(id_msg->job_id, &result); + unlock_slurmctld(job_read_lock); END_TIMER2("_slurm_rpc_job_ready"); if (error_code) { diff --git a/src/slurmctld/slurmctld.h b/src/slurmctld/slurmctld.h index 2cadba0b3..59d7b6446 100644 --- a/src/slurmctld/slurmctld.h +++ b/src/slurmctld/slurmctld.h @@ -1069,9 +1069,10 @@ extern int job_complete (uint32_t job_id, uid_t uid, bool requeue, * job_independent - determine if this job has a depenentent job pending * or if the job's scheduled begin time is in the future * IN job_ptr - pointer to job being tested + * IN will_run - is this a test for will_run or not * RET - true if job no longer must be defered for another job */ -extern bool job_independent(struct job_record *job_ptr); +extern bool job_independent(struct job_record *job_ptr, int will_run); /* * job_req_node_filter - job reqeust node filter. diff --git a/src/smap/configure_functions.c b/src/smap/configure_functions.c index 35bd8dfc5..5495e671a 100644 --- a/src/smap/configure_functions.c +++ b/src/smap/configure_functions.c @@ -797,7 +797,7 @@ static int _remove_allocation(char *com, List allocated_blocks) { ListIterator results_i; allocated_block_t *allocated_block = NULL; - int i=6, found=0; + int i=1, found=0; int len = strlen(com); char letter; @@ -890,17 +890,15 @@ static int _copy_allocation(char *com, List allocated_blocks) allocated_block_t *temp_block = NULL; ba_request_t *request = NULL; - int i=0; + int i=1; int len = strlen(com); char letter = '\0'; int count = 1; int *geo = NULL, *geo_ptr = NULL; - while(i<=len) { - if((i>0) && (com[i-1] != ' ')) - break; + /* look for the space after copy */ + while(com[i-1]!=' ' && i<len) i++; - } if(i<=len) { /* Here we are looking for a real number for the count diff --git a/src/smap/opts.c b/src/smap/opts.c index 6c7b39571..10827917e 100644 --- a/src/smap/opts.c +++ b/src/smap/opts.c @@ -95,7 +95,7 @@ extern void parse_command_line(int argc, char *argv[]) case (int) 'i': params.iterate = atoi(optarg); if (params.iterate <= 0) { - error("Error: --iterate=%s"); + error("Error: --iterate=%s", optarg); exit(1); } break; diff --git a/src/srun/srun.c b/src/srun/srun.c index 9698b78dd..6f2b0eaaa 100644 --- a/src/srun/srun.c +++ b/src/srun/srun.c @@ -1091,20 +1091,26 @@ _is_openmpi_port_error(int errcode) } static void -_handle_openmpi_port_error(const char *tasks, const char *hosts) +_handle_openmpi_port_error(const char *tasks, const char *hosts, + slurm_step_ctx_t *step_ctx) { + uint32_t job_id, step_id; char *msg = "retrying"; if (!retry_step_begin) { retry_step_begin = true; retry_step_cnt++; } - if (retry_step_cnt >= MAX_STEP_RETRIES) { + + if (retry_step_cnt >= MAX_STEP_RETRIES) msg = "aborting"; - opt.kill_bad_exit = true; - } error("%s: tasks %s unable to claim reserved port, %s.", hosts, tasks, msg); + + slurm_step_ctx_get(step_ctx, SLURM_STEP_CTX_JOBID, &job_id); + slurm_step_ctx_get(step_ctx, SLURM_STEP_CTX_STEPID, &step_id); + info("Terminating job step %u.%u", job_id, step_id); + slurm_kill_job_step(job_id, step_id, SIGKILL); } static void @@ -1128,11 +1134,13 @@ _task_finish(task_exit_msg_t *msg) verbose("%s: %s %s: Completed", hosts, task_str, tasks); normal_exit = 1; } - else if (_is_openmpi_port_error(rc)) - _handle_openmpi_port_error(tasks, hosts); - else + else if (_is_openmpi_port_error(rc)) { + _handle_openmpi_port_error(tasks, hosts, + job->step_ctx); + } else { error("%s: %s %s: Exited with exit code %d", hosts, task_str, tasks, rc); + } if (!WIFEXITED(global_rc) || (rc > WEXITSTATUS(global_rc))) global_rc = msg->return_code; } diff --git a/src/sview/block_info.c b/src/sview/block_info.c index 412b95efe..1e1fcdbc1 100644 --- a/src/sview/block_info.c +++ b/src/sview/block_info.c @@ -136,7 +136,7 @@ static display_data_t options_data_block[] = { {G_TYPE_STRING, JOB_PAGE, "Jobs", TRUE, BLOCK_PAGE}, {G_TYPE_STRING, PART_PAGE, "Partition", TRUE, BLOCK_PAGE}, {G_TYPE_STRING, NODE_PAGE, "Base Partitions", TRUE, BLOCK_PAGE}, - {G_TYPE_STRING, SUBMIT_PAGE, "Job Submit", FALSE, BLOCK_PAGE}, + //{G_TYPE_STRING, SUBMIT_PAGE, "Job Submit", FALSE, BLOCK_PAGE}, {G_TYPE_STRING, RESV_PAGE, "Reservation", TRUE, BLOCK_PAGE}, {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} }; diff --git a/src/sview/job_info.c b/src/sview/job_info.c index f2c1188d0..c76e6a05f 100644 --- a/src/sview/job_info.c +++ b/src/sview/job_info.c @@ -3111,14 +3111,6 @@ extern void popup_all_job(GtkTreeModel *model, GtkTreeIter *iter, int id) snprintf(title, 100, "Block with job %d.%d", jobid, stepid); break; - case SUBMIT_PAGE: - if(stepid == NO_VAL) - snprintf(title, 100, "Submit job on job %d", jobid); - else - snprintf(title, 100, "Submit job on job %d.%d", - jobid, stepid); - - break; case INFO_PAGE: if(stepid == NO_VAL) snprintf(title, 100, "Full info for job %d", jobid); diff --git a/src/sview/node_info.c b/src/sview/node_info.c index 1942dd6bb..e682f2e5a 100644 --- a/src/sview/node_info.c +++ b/src/sview/node_info.c @@ -108,7 +108,7 @@ static display_data_t options_data_node[] = { #endif {G_TYPE_STRING, PART_PAGE, "Partition", TRUE, NODE_PAGE}, {G_TYPE_STRING, RESV_PAGE, "Reservation", TRUE, NODE_PAGE}, - {G_TYPE_STRING, SUBMIT_PAGE, "Job Submit", FALSE, NODE_PAGE}, + //{G_TYPE_STRING, SUBMIT_PAGE, "Job Submit", FALSE, NODE_PAGE}, {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} }; diff --git a/src/sview/part_info.c b/src/sview/part_info.c index e442b4580..cef05a735 100644 --- a/src/sview/part_info.c +++ b/src/sview/part_info.c @@ -193,7 +193,7 @@ static display_data_t options_data_part[] = { #else {G_TYPE_STRING, NODE_PAGE, "Nodes", TRUE, PART_PAGE}, #endif - {G_TYPE_STRING, SUBMIT_PAGE, "Job Submit", FALSE, PART_PAGE}, + //{G_TYPE_STRING, SUBMIT_PAGE, "Job Submit", FALSE, PART_PAGE}, {G_TYPE_STRING, RESV_PAGE, "Reservations", TRUE, PART_PAGE}, {G_TYPE_NONE, -1, NULL, FALSE, EDIT_NONE} }; diff --git a/testsuite/expect/test1.59 b/testsuite/expect/test1.59 index c6ee7cd31..6ad5da113 100755 --- a/testsuite/expect/test1.59 +++ b/testsuite/expect/test1.59 @@ -117,7 +117,7 @@ for {set i 0} {$i<4} {incr i} { previous srun\n" exit 1 } - send "export SLURM_HOSTFILE=$hostfile\n" + send "export SLURM_HOSTFILE=$hostfile\r" expect { -re $prompt { #send_user "srun completed\n" @@ -175,7 +175,7 @@ for {set i 0} {$i<4} {incr i} { # # execute srun with a specific node count # - send "$srun -l $extra -O $bin_printenv SLURMD_NODENAME\n" + send "$srun -l $extra -O $bin_printenv SLURMD_NODENAME\r" expect { -re "($number): ($alpha_numeric_under)" { set task_id $expect_out(1,string) @@ -256,7 +256,7 @@ for {set i 0} {$i<4} {incr i} { } } } -send "unset SLURM_HOSTFILE\n" +send "unset SLURM_HOSTFILE\r" expect { -re $prompt { #send_user "srun completed\n" @@ -327,7 +327,7 @@ for {set i 0} {$i<5} {incr i} { # execute srun with a specific node count # - send "$srun -l $extra -O $bin_printenv SLURMD_NODENAME\n" + send "$srun -l $extra -O $bin_printenv SLURMD_NODENAME\r" expect { -re "($number): ($alpha_numeric_under)" { @@ -406,7 +406,7 @@ for {set i 0} {$i<5} {incr i} { } } -send "exit\n" +send "exit\r" expect { -re "error.*Exit 1" { send_user "This error is expected, no worries\n" diff --git a/testsuite/expect/test7.3.prog.c b/testsuite/expect/test7.3.prog.c index bab653f8f..6b597b8c2 100644 --- a/testsuite/expect/test7.3.prog.c +++ b/testsuite/expect/test7.3.prog.c @@ -69,10 +69,11 @@ int main (int argc, char *argv[]) /* Create a job allocation */ slurm_init_job_desc_msg( &job_req ); - job_req.min_nodes = min_nodes; - job_req.max_nodes = max_nodes; - job_req.user_id = getuid(); - job_req.group_id = getgid(); + job_req.min_nodes = min_nodes; + job_req.max_nodes = max_nodes; + job_req.user_id = getuid(); + job_req.group_id = getgid(); + job_req.time_limit = 1; if (slurm_allocate_resources(&job_req, &job_resp)) { slurm_perror ("slurm_allocate_resources"); exit(0); -- GitLab