Coverage for python/lsst/ctrl/bps/htcondor/htcondor_workflow.py: 87%
23 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-29 02:24 -0700
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-29 02:24 -0700
1# This file is part of ctrl_bps_htcondor.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (https://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This software is dual licensed under the GNU General Public License and also
10# under a 3-clause BSD license. Recipients may choose which of these licenses
11# to use; please see the files gpl-3.0.txt and/or bsd_license.txt,
12# respectively. If you choose the GPL option then the following text applies
13# (but note that there is still no warranty even if you opt for BSD instead):
14#
15# This program is free software: you can redistribute it and/or modify
16# it under the terms of the GNU General Public License as published by
17# the Free Software Foundation, either version 3 of the License, or
18# (at your option) any later version.
19#
20# This program is distributed in the hope that it will be useful,
21# but WITHOUT ANY WARRANTY; without even the implied warranty of
22# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23# GNU General Public License for more details.
24#
25# You should have received a copy of the GNU General Public License
26# along with this program. If not, see <https://www.gnu.org/licenses/>.
28"""Class and utility functions at the workflow level."""
30__all__ = ["HTCondorWorkflow"]
33import logging
34import os
36from lsst.ctrl.bps import (
37 BaseWmsWorkflow,
38 BpsConfig,
39)
41from .prepare_utils import _generic_workflow_to_htcondor_dag, _update_job_summary
43_LOG = logging.getLogger(__name__)
46class HTCondorWorkflow(BaseWmsWorkflow):
47 """Single HTCondor workflow.
49 Parameters
50 ----------
51 name : `str`
52 Unique name for Workflow used when naming files.
53 config : `lsst.ctrl.bps.BpsConfig`
54 BPS configuration that includes necessary submit/runtime information.
55 """
57 def __init__(self, name, config=None):
58 super().__init__(name, config)
59 self.dag = None
61 @classmethod
62 def from_generic_workflow(cls, config, generic_workflow, out_prefix, service_class):
63 # Docstring inherited
64 htc_workflow = cls(generic_workflow.name, config)
65 htc_workflow.dag = _generic_workflow_to_htcondor_dag(config, generic_workflow, out_prefix)
67 _LOG.debug("htcondor dag attribs %s", generic_workflow.run_attrs)
68 # Add extra attributes to top most DAG.
69 htc_workflow.dag.add_attribs(
70 {
71 "bps_wms_service": service_class,
72 "bps_wms_workflow": f"{cls.__module__}.{cls.__name__}",
73 }
74 )
76 return htc_workflow
78 def write(self, out_prefix):
79 """Output HTCondor DAGMan files needed for workflow submission.
81 Parameters
82 ----------
83 out_prefix : `str`
84 Directory prefix for HTCondor files.
85 """
86 self.submit_path = out_prefix
87 os.makedirs(out_prefix, exist_ok=True)
89 # Write down the workflow in HTCondor format.
90 self.dag.write(out_prefix, job_subdir="jobs/{self.label}")
92 def add_to_parent_workflow(self, config: BpsConfig) -> None:
93 """Add self to parent workflow.
95 Parameters
96 ----------
97 config : `lsst.ctrl.bps.BpsConfig`
98 Configuration.
99 """
100 _update_job_summary(
101 self.name,
102 self.dag.graph["attr"]["bps_job_summary"],
103 config[".bps_defined.submitPath"],
104 )