lsst-ctrl-execute 29.2025.1000__tar.gz → 29.2025.2100__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/PKG-INFO +1 -1
  2. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/allocator.py +8 -7
  3. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/allocatorParser.py +18 -0
  4. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/slurmPlugin.py +14 -0
  5. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/test_allocatorParser.py +6 -0
  6. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/test_slurmPlugin.py +20 -0
  7. lsst_ctrl_execute-29.2025.2100/tests/testfiles/config_execconfig.py +6 -0
  8. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/.github/workflows/build.yaml +0 -0
  9. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/.github/workflows/formatting.yaml +0 -0
  10. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/.github/workflows/rebase_checker.yaml +0 -0
  11. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/.gitignore +0 -0
  12. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/.pre-commit-config.yaml +0 -0
  13. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/SConstruct +0 -0
  14. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/etc/configs/gordon_config.py +0 -0
  15. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/etc/configs/lsst_config.py +0 -0
  16. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/etc/scripts/generateDag.py +0 -0
  17. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/pyproject.toml +0 -0
  18. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/__init__.py +0 -0
  19. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/__init__.py +0 -0
  20. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/__init__.py +0 -0
  21. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/allocationConfig.py +0 -0
  22. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/condorConfig.py +0 -0
  23. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/condorInfoConfig.py +0 -0
  24. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/envString.py +0 -0
  25. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/findPackageFile.py +0 -0
  26. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/libexec/allocateNodes.py +0 -0
  27. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/libexec/dagIdInfo.py +0 -0
  28. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/libexec/qdelete.py +0 -0
  29. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/libexec/qstatus.py +0 -0
  30. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/namedClassFactory.py +0 -0
  31. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/pbsPlugin.py +0 -0
  32. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/qCommand.py +0 -0
  33. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/seqFile.py +0 -0
  34. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/python/lsst/ctrl/execute/templateWriter.py +0 -0
  35. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/setup.cfg +0 -0
  36. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/README +0 -0
  37. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/SConscript +0 -0
  38. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/test_allocationConfig.py +0 -0
  39. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/test_condorConfig.py +0 -0
  40. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/test_condorInfoConfig.py +0 -0
  41. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/test_dagIdInfo.py +0 -0
  42. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/test_findPackageFile.py +0 -0
  43. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/test_seqFile.py +0 -0
  44. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/test_templateWriter.py +0 -0
  45. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/allocator-info1.py +0 -0
  46. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/config_allocation.py +0 -0
  47. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/config_allocation_slurm.py +0 -0
  48. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/config_asserts.py +0 -0
  49. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/config_condor.py +0 -0
  50. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/config_condorInfo.py +0 -0
  51. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/config_condor_getenv.py +0 -0
  52. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/config_condor_setups.py +0 -0
  53. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/config_condor_slurm.py +0 -0
  54. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/config_pegasus.py +0 -0
  55. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/generic.pbs.template +0 -0
  56. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/generic.pbs.txt +0 -0
  57. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/generic.slurm.template +0 -0
  58. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/generic.slurm.txt +0 -0
  59. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/glidein_condor_config.template +0 -0
  60. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/glidein_condor_config.txt +0 -0
  61. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/templateWriter.template +0 -0
  62. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/templateWriter.txt +0 -0
  63. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/tests/testfiles/test.diamond.dag +0 -0
  64. {lsst_ctrl_execute-29.2025.1000 → lsst_ctrl_execute-29.2025.2100}/ups/ctrl_execute.table +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-ctrl-execute
3
- Version: 29.2025.1000
3
+ Version: 29.2025.2100
4
4
  Summary: Utilities for executing and managing workloads.
5
5
  Project-URL: Homepage, https://github.com/lsst/ctrl_execute
6
6
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
@@ -30,9 +30,7 @@ from datetime import datetime
30
30
  from string import Template
31
31
 
32
32
  from lsst.ctrl.execute.allocationConfig import AllocationConfig
33
- from lsst.ctrl.execute.condorConfig import CondorConfig
34
33
  from lsst.ctrl.execute.condorInfoConfig import CondorInfoConfig
35
- from lsst.ctrl.execute.findPackageFile import find_package_file
36
34
  from lsst.ctrl.execute.templateWriter import TemplateWriter
37
35
  from lsst.resources import ResourcePath, ResourcePathExpression
38
36
 
@@ -79,10 +77,6 @@ class Allocator:
79
77
 
80
78
  self.platform = platform
81
79
 
82
- execConfigName = find_package_file("execConfig.py", platform=platform)
83
- execConfig = CondorConfig()
84
- execConfig.loadFromStream(execConfigName.read())
85
-
86
80
  # Look up the user's name and home and scratch directory in the
87
81
  # $HOME/.lsst/condor-info.py file
88
82
  user_name = None
@@ -115,7 +109,7 @@ class Allocator:
115
109
  self.commandLineDefaults["COLLECTOR"] = self.opts.collector
116
110
  self.commandLineDefaults["CPORT"] = self.opts.collectorport
117
111
  if self.opts.exclusive:
118
- self.commandLineDefaults["CPUS"] = execConfig.platform.peakcpus
112
+ self.commandLineDefaults["CPUS"] = self.configuration.platform.peakcpus
119
113
  else:
120
114
  self.commandLineDefaults["CPUS"] = self.opts.cpus
121
115
  self.commandLineDefaults["WALL_CLOCK"] = self.opts.maximumWallClock
@@ -123,6 +117,7 @@ class Allocator:
123
117
  self.commandLineDefaults["MEMPERCORE"] = 4096
124
118
  self.commandLineDefaults["ALLOWEDAUTO"] = 500
125
119
  self.commandLineDefaults["AUTOCPUS"] = 16
120
+ self.commandLineDefaults["MINAUTOCPUS"] = 15
126
121
  self.commandLineDefaults["QUEUE"] = self.opts.queue
127
122
  self.load()
128
123
 
@@ -361,6 +356,12 @@ class Allocator:
361
356
  else:
362
357
  return self.getParameter("AUTOCPUS")
363
358
 
359
+ def getMinAutoCPUs(self):
360
+ """Minimum Size of standard glideins for allocateNodes auto
361
+ @return the value of minAutoCPUs
362
+ """
363
+ return self.getParameter("MINAUTOCPUS")
364
+
364
365
  def getWallClock(self):
365
366
  """Accessor for WALL_CLOCK
366
367
  @return the value of WALL_CLOCK
@@ -178,6 +178,24 @@ class AllocatorParser:
178
178
  dest="packnodes",
179
179
  help="encourage nodes to pack jobs rather than spread",
180
180
  )
181
+ parser.add_argument(
182
+ "--exclude",
183
+ action="store",
184
+ default=None,
185
+ dest="exclude",
186
+ help="machine name(s) to exclude Slurm jobs from",
187
+ type=str,
188
+ required=False,
189
+ )
190
+ parser.add_argument(
191
+ "--nodelist",
192
+ action="store",
193
+ default=None,
194
+ dest="nodelist",
195
+ help="machine name(s) to target Slurm jobs toward",
196
+ type=str,
197
+ required=False,
198
+ )
181
199
  parser.add_argument(
182
200
  "--exclusive",
183
201
  action="store_true",
@@ -214,6 +214,16 @@ class SlurmPlugin(Allocator):
214
214
  else:
215
215
  self.defaults["RESERVATION"] = ""
216
216
 
217
+ if self.opts.exclude is not None:
218
+ self.defaults["EXCLUDE"] = f"#SBATCH --exclude {self.opts.exclude}"
219
+ else:
220
+ self.defaults["EXCLUDE"] = ""
221
+
222
+ if self.opts.nodelist is not None:
223
+ self.defaults["NODELIST"] = f"#SBATCH --nodelist {self.opts.nodelist}"
224
+ else:
225
+ self.defaults["NODELIST"] = ""
226
+
217
227
  if self.opts.exclusive is not None:
218
228
  self.defaults["EXCLUSIVE"] = "#SBATCH --exclusive"
219
229
  else:
@@ -291,7 +301,11 @@ class SlurmPlugin(Allocator):
291
301
  """Determine and submit the glideins needed from job pressure."""
292
302
 
293
303
  verbose = self.isVerbose()
304
+ cpus = self.getCPUs()
294
305
  autoCPUs = self.getAutoCPUs()
306
+ minAutoCPUs = self.getMinAutoCPUs()
307
+ if cpus >= minAutoCPUs:
308
+ autoCPUs = cpus
295
309
  memoryPerCore = self.getMemoryPerCore()
296
310
  memoryLimit = autoCPUs * memoryPerCore
297
311
  auser = self.getUserName()
@@ -42,6 +42,10 @@ class TestAllocatorParser(lsst.utils.tests.TestCase):
42
42
  "12",
43
43
  "-m",
44
44
  "00:30:00",
45
+ "--exclude",
46
+ "sdfmilan003",
47
+ "--nodelist",
48
+ "sdfmilan004",
45
49
  "-q",
46
50
  "normal",
47
51
  "-O",
@@ -57,6 +61,8 @@ class TestAllocatorParser(lsst.utils.tests.TestCase):
57
61
  self.assertEqual(args.nodeCount, 64)
58
62
  self.assertEqual(args.cpus, 12)
59
63
  self.assertEqual(args.maximumWallClock, "00:30:00")
64
+ self.assertEqual(args.exclude, "sdfmilan003")
65
+ self.assertEqual(args.nodelist, "sdfmilan004")
60
66
  self.assertEqual(args.queue, "normal")
61
67
  self.assertEqual(args.outputLog, "outlog")
62
68
  self.assertEqual(args.errorLog, "errlog")
@@ -26,6 +26,7 @@ import sys
26
26
  import unittest
27
27
 
28
28
  import lsst.utils.tests
29
+ from lsst.ctrl.execute.allocator import Allocator
29
30
  from lsst.ctrl.execute.allocatorParser import AllocatorParser
30
31
  from lsst.ctrl.execute.condorConfig import CondorConfig
31
32
  from lsst.ctrl.execute.namedClassFactory import NamedClassFactory
@@ -77,6 +78,25 @@ class SlurmPluginTest(lsst.utils.tests.TestCase):
77
78
  self.assertTrue(self.config)
78
79
  self.assertTrue(condor_info_file)
79
80
 
81
+ platform = "test1"
82
+ configuration = CondorConfig()
83
+ p1 = os.path.join("tests/testfiles", "config_execconfig.py")
84
+ execConfigName = p1
85
+ configuration.load(execConfigName)
86
+ scheduler: Allocator = schedulerClass(platform, args, configuration, condor_info_file)
87
+ self.assertTrue(scheduler)
88
+
89
+ autocpus = scheduler.getAutoCPUs()
90
+ minautocpus = scheduler.getMinAutoCPUs()
91
+ cpus = scheduler.getCPUs()
92
+ nodes = scheduler.getNodes()
93
+ wallclock = scheduler.getWallClock()
94
+ self.assertEqual(autocpus, 16)
95
+ self.assertEqual(minautocpus, 15)
96
+ self.assertEqual(cpus, 12)
97
+ self.assertEqual(nodes, 64)
98
+ self.assertEqual(wallclock, "00:30:00")
99
+
80
100
 
81
101
  if __name__ == "__main__":
82
102
  lsst.utils.tests.init()
@@ -0,0 +1,6 @@
1
+ # flake8: noqa
2
+ config.platform.nodeSetRequired = False
3
+ config.platform.localScratch = "/condor_scratch"
4
+ config.platform.fileSystemDomain = "slac.stanford.edu"
5
+ config.platform.scheduler = "slurm"
6
+ config.platform.peakcpus = 120