Coverage for python / lsst / ctrl / bps / htcondor / htcondor_workflow.py: 52%
21 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-18 08:49 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-18 08:49 +0000
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)
40from .prepare_utils import _generic_workflow_to_htcondor_dag
42_LOG = logging.getLogger(__name__)
45class HTCondorWorkflow(BaseWmsWorkflow):
46 """Single HTCondor workflow.
48 Parameters
49 ----------
50 name : `str`
51 Unique name for Workflow used when naming files.
52 config : `lsst.ctrl.bps.BpsConfig`
53 BPS configuration that includes necessary submit/runtime information.
54 """
56 def __init__(self, name, config=None):
57 super().__init__(name, config)
58 self.dag = None
60 @classmethod
61 def from_generic_workflow(cls, config, generic_workflow, out_prefix, service_class):
62 # Docstring inherited
63 htc_workflow = cls(generic_workflow.name, config)
64 htc_workflow.dag = _generic_workflow_to_htcondor_dag(config, generic_workflow, out_prefix)
66 _LOG.debug("htcondor dag attribs %s", generic_workflow.run_attrs)
67 # Add extra attributes to top most DAG.
68 htc_workflow.dag.add_attribs(
69 {
70 "bps_wms_service": service_class,
71 "bps_wms_workflow": f"{cls.__module__}.{cls.__name__}",
72 }
73 )
75 return htc_workflow
77 def write(self, out_prefix):
78 """Output HTCondor DAGMan files needed for workflow submission.
80 Parameters
81 ----------
82 out_prefix : `str`
83 Directory prefix for HTCondor files.
84 """
85 self.submit_path = out_prefix
86 os.makedirs(out_prefix, exist_ok=True)
88 # Write down the workflow in HTCondor format.
89 self.dag.write(out_prefix, job_subdir="jobs/{self.label}")