lsst-ctrl-bps-htcondor 29.2025.3600__tar.gz → 29.2025.3800__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 (33) hide show
  1. {lsst_ctrl_bps_htcondor-29.2025.3600/python/lsst_ctrl_bps_htcondor.egg-info → lsst_ctrl_bps_htcondor-29.2025.3800}/PKG-INFO +1 -1
  2. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst/ctrl/bps/htcondor/htcondor_service.py +4 -4
  3. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst/ctrl/bps/htcondor/lssthtc.py +1 -1
  4. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst/ctrl/bps/htcondor/provisioner.py +3 -2
  5. lsst_ctrl_bps_htcondor-29.2025.3800/python/lsst/ctrl/bps/htcondor/version.py +2 -0
  6. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800/python/lsst_ctrl_bps_htcondor.egg-info}/PKG-INFO +1 -1
  7. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/tests/test_htcondor_service.py +4 -0
  8. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/tests/test_lssthtc.py +18 -1
  9. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/tests/test_provisioner.py +8 -8
  10. lsst_ctrl_bps_htcondor-29.2025.3600/python/lsst/ctrl/bps/htcondor/version.py +0 -2
  11. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/COPYRIGHT +0 -0
  12. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/LICENSE +0 -0
  13. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/MANIFEST.in +0 -0
  14. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/README.rst +0 -0
  15. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/bsd_license.txt +0 -0
  16. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/doc/lsst.ctrl.bps.htcondor/CHANGES.rst +0 -0
  17. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/doc/lsst.ctrl.bps.htcondor/index.rst +0 -0
  18. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/doc/lsst.ctrl.bps.htcondor/userguide.rst +0 -0
  19. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/gpl-v3.0.txt +0 -0
  20. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/pyproject.toml +0 -0
  21. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst/ctrl/bps/htcondor/__init__.py +0 -0
  22. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst/ctrl/bps/htcondor/etc/__init__.py +0 -0
  23. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst/ctrl/bps/htcondor/etc/htcondor_defaults.yaml +0 -0
  24. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst/ctrl/bps/htcondor/final_post.sh +0 -0
  25. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst/ctrl/bps/htcondor/handlers.py +0 -0
  26. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst/ctrl/bps/htcondor/htcondor_config.py +0 -0
  27. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst_ctrl_bps_htcondor.egg-info/SOURCES.txt +0 -0
  28. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst_ctrl_bps_htcondor.egg-info/dependency_links.txt +0 -0
  29. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst_ctrl_bps_htcondor.egg-info/requires.txt +0 -0
  30. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst_ctrl_bps_htcondor.egg-info/top_level.txt +0 -0
  31. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/python/lsst_ctrl_bps_htcondor.egg-info/zip-safe +0 -0
  32. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/setup.cfg +0 -0
  33. {lsst_ctrl_bps_htcondor-29.2025.3600 → lsst_ctrl_bps_htcondor-29.2025.3800}/tests/test_handlers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-ctrl-bps-htcondor
3
- Version: 29.2025.3600
3
+ Version: 29.2025.3800
4
4
  Summary: HTCondor plugin for lsst-ctrl-bps.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -705,16 +705,16 @@ def _create_job(subdir_template, cached_values, generic_workflow, gwjob, out_pre
705
705
 
706
706
  htc_job_cmds.update(_translate_job_cmds(cached_values, generic_workflow, gwjob))
707
707
 
708
- # job stdout, stderr, htcondor user log.
708
+ # Combine stdout and stderr to reduce the number of files.
709
709
  for key in ("output", "error"):
710
710
  if cached_values["overwriteJobFiles"]:
711
- htc_job_cmds[key] = f"{gwjob.name}.$(Cluster).{key[:3]}"
711
+ htc_job_cmds[key] = f"{gwjob.name}.$(Cluster).out"
712
712
  else:
713
- htc_job_cmds[key] = f"{gwjob.name}.$(Cluster).$$([NumJobStarts ?: 0]).{key[:3]}"
713
+ htc_job_cmds[key] = f"{gwjob.name}.$(Cluster).$$([NumJobStarts ?: 0]).out"
714
714
  _LOG.debug("HTCondor %s = %s", key, htc_job_cmds[key])
715
715
 
716
716
  key = "log"
717
- htc_job_cmds[key] = f"{gwjob.name}.$(Cluster).{key[:3]}"
717
+ htc_job_cmds[key] = f"{gwjob.name}.$(Cluster).{key}"
718
718
  _LOG.debug("HTCondor %s = %s", key, htc_job_cmds[key])
719
719
 
720
720
  htc_job_cmds.update(
@@ -530,7 +530,7 @@ def htc_write_condor_file(
530
530
  print(f"{key}={value}", file=fh)
531
531
  for key in ["output", "error", "log"]:
532
532
  if key not in job:
533
- filename = f"{job_name}.$(Cluster).${key[:3]}"
533
+ filename = f"{job_name}.$(Cluster).{'out' if key != 'log' else key}"
534
534
  print(f"{key}={filename}", file=fh)
535
535
 
536
536
  if job_attrs is not None:
@@ -194,8 +194,9 @@ class Provisioner:
194
194
  "getenv": "True",
195
195
  }
196
196
  cmds |= {
197
- stream: str(job.subfile.with_suffix(f".$(Cluster).{stream[:3]}"))
198
- for stream in ("output", "error", "log")
197
+ "output": str(job.subfile.with_suffix(".$(Cluster).out")),
198
+ "error": str(job.subfile.with_suffix(".$(Cluster).out")),
199
+ "log": str(job.subfile.with_suffix(".$(Cluster).log")),
199
200
  }
200
201
  job.add_job_cmds(cmds)
201
202
 
@@ -0,0 +1,2 @@
1
+ __all__ = ["__version__"]
2
+ __version__ = "29.2025.3800"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-ctrl-bps-htcondor
3
- Version: 29.2025.3600
3
+ Version: 29.2025.3800
4
4
  Summary: HTCondor plugin for lsst-ctrl-bps.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -1577,6 +1577,10 @@ class CreateJobTestCase(unittest.TestCase):
1577
1577
  self.assertEqual(htc_job.label, gwjob.label)
1578
1578
  self.assertIn("NumJobStarts", htc_job.cmds["output"])
1579
1579
  self.assertIn("NumJobStarts", htc_job.cmds["error"])
1580
+ self.assertNotIn("NumJobStarts", htc_job.cmds["log"])
1581
+ self.assertTrue(htc_job.cmds["error"].endswith(".out"))
1582
+ self.assertTrue(htc_job.cmds["output"].endswith(".out"))
1583
+ self.assertTrue(htc_job.cmds["log"].endswith(".log"))
1580
1584
 
1581
1585
 
1582
1586
  if __name__ == "__main__":
@@ -1128,13 +1128,30 @@ class HtcWriteCondorFileTestCase(unittest.TestCase):
1128
1128
  "environment": "one=1 two=\"2\" three='spacey 'quoted' value'",
1129
1129
  "log": f"{job_name}.log",
1130
1130
  }
1131
-
1132
1131
  job_attrs = {
1133
1132
  "bps_job_name": job_name,
1134
1133
  "bps_job_label": "label1",
1135
1134
  "bps_job_quanta": "task1:8;task2:8",
1136
1135
  }
1136
+ expected = [
1137
+ "executable=$(CTRL_MPEXEC_DIR)/bin/pipetask\n",
1138
+ "arguments=-a -b 2 -c\n",
1139
+ "request_memory=2000\n",
1140
+ "environment=\"one=1 two=\"2\" three='spacey 'quoted' value'\"\n",
1141
+ f"output={job_name}.$(Cluster).out\n",
1142
+ f"error={job_name}.$(Cluster).out\n",
1143
+ f"log={job_name}.log\n",
1144
+ f'+bps_job_name = "{job_name}"\n',
1145
+ '+bps_job_label = "label1"\n',
1146
+ '+bps_job_quanta = "task1:8;task2:8"\n',
1147
+ "queue\n",
1148
+ ]
1149
+
1137
1150
  lssthtc.htc_write_condor_file(filename, job_name, job, job_attrs)
1151
+ with open(filename, encoding="utf-8") as f:
1152
+ actual = f.readlines()
1153
+
1154
+ self.assertEqual(set(actual), set(expected))
1138
1155
  self.assertTrue(filename.exists())
1139
1156
  # Try to make Submit object from file to find any syntax issues
1140
1157
  _ = lssthtc.htc_create_submit_from_file(filename)
@@ -49,7 +49,7 @@ class ProvisionerTestCase(unittest.TestCase):
49
49
  pass
50
50
 
51
51
  def testConfigureWithoutExistingConfig(self):
52
- """Test if configuration file is created if necessary."""
52
+ """Test if the configuration file is created if necessary."""
53
53
  with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpdir:
54
54
  filename = f"{tmpdir}/condor-info.py"
55
55
  self.config[".provisioning.provisioningScriptConfig"] = "foo"
@@ -66,7 +66,7 @@ class ProvisionerTestCase(unittest.TestCase):
66
66
  self.assertTrue(provisioner.is_configured)
67
67
 
68
68
  def testConfigureWithExistingConfig(self):
69
- """Test if existing configuration file is left unchanged."""
69
+ """Test if the existing configuration file is left unchanged."""
70
70
  with tempfile.NamedTemporaryFile(mode="w+", encoding="utf-8") as tmpfile:
71
71
  self.config[".provisioning.provisioningScriptConfig"] = "bar"
72
72
  self.config[".provisioning.provisioningScriptConfigPath"] = tmpfile.name
@@ -97,7 +97,7 @@ class ProvisionerTestCase(unittest.TestCase):
97
97
  self.assertTrue(provisioner.is_configured)
98
98
 
99
99
  def testConfigureOsError(self):
100
- """Test if method raises when the configuration can't be created."""
100
+ """Test if the method raises when it can't create the configuration."""
101
101
  with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpdir:
102
102
  filename = f"{tmpdir}/subdir/condor-info.py"
103
103
  self.config[".provisioning.provisioningScriptConfigPath"] = filename
@@ -112,7 +112,7 @@ class ProvisionerTestCase(unittest.TestCase):
112
112
  os.chmod(tmpdir, 0o700)
113
113
 
114
114
  def testPrepare(self):
115
- """Test if provisioning script is created."""
115
+ """Test if the provisioning script is created."""
116
116
  with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpdir:
117
117
  prov_config = Path(f"{tmpdir}/condor-info.py")
118
118
  self.config[".provisioning.provisioningScriptConfigPath"] = str(prov_config)
@@ -133,13 +133,13 @@ class ProvisionerTestCase(unittest.TestCase):
133
133
  self.assertEqual(prov_script.read_text(), "bar")
134
134
 
135
135
  def testPrepareIfNotConfigured(self):
136
- """Test if method raises when the configuration step was skipped."""
136
+ """Test if the method raises when the configuration step is skipped."""
137
137
  provisioner = Provisioner(self.config)
138
138
  with self.assertRaises(RuntimeError):
139
139
  provisioner.prepare("provisioning_job.sh", prefix="")
140
140
 
141
141
  def testProvision(self):
142
- """Test if provisioning job is added to the DAG."""
142
+ """Test if the provisioning job is added to the DAG."""
143
143
  script = Path("provisioningJob.sh")
144
144
  cmds = {
145
145
  "universe": "local",
@@ -147,7 +147,7 @@ class ProvisionerTestCase(unittest.TestCase):
147
147
  "should_transfer_files": "NO",
148
148
  "getenv": "True",
149
149
  "output": f"jobs/{script.stem}/{script.stem}.$(Cluster).out",
150
- "error": f"jobs/{script.stem}/{script.stem}.$(Cluster).err",
150
+ "error": f"jobs/{script.stem}/{script.stem}.$(Cluster).out",
151
151
  "log": f"jobs/{script.stem}/{script.stem}.$(Cluster).log",
152
152
  }
153
153
  dag = HTCDag(name="default")
@@ -168,7 +168,7 @@ class ProvisionerTestCase(unittest.TestCase):
168
168
  self.assertIn("bps_provisioning_job", dag.graph["attr"])
169
169
 
170
170
  def testProvisionError(self):
171
- """Test if method raises when the prepare step was skipped."""
171
+ """Test if the method raises when the prepare step was skipped."""
172
172
  dag = HTCDag(name="test")
173
173
  provisioner = Provisioner(self.config)
174
174
  with self.assertRaises(RuntimeError):
@@ -1,2 +0,0 @@
1
- __all__ = ["__version__"]
2
- __version__ = "29.2025.3600"