Source code for CIME.XML.workflow

"""
Interface to the config_workflow.xml file.  This class inherits from GenericXML.py
"""

from CIME.XML.standard_module_setup import *
from CIME.XML.generic_xml import GenericXML
from CIME.XML.files import Files
from CIME.utils import expect

logger = logging.getLogger(__name__)


[docs] class Workflow(GenericXML): def __init__(self, infile=None, files=None): """ initialize an object """ if files is None: files = Files() if infile is None: infile = files.get_value("WORKFLOW_SPEC_FILE") expect(infile, "No workflow file defined in {}".format(files.filename)) schema = files.get_schema("WORKFLOW_SPEC_FILE") GenericXML.__init__(self, infile, schema=schema) # Append the contents of $HOME/.cime/config_workflow.xml if it exists # This could cause problems if node matchs are repeated when only one is expected infile = os.path.join(os.environ.get("HOME"), ".cime", "config_workflow.xml") if os.path.exists(infile): GenericXML.read(self, infile)
[docs] def get_workflow_jobs(self, machine, workflowid="default"): """ Return a list of jobs with the first element the name of the script and the second a dict of qualifiers for the job """ jobs = [] bnodes = [] findmore = True prepend = False while findmore: bnode = self.get_optional_child( "workflow_jobs", attributes={"id": workflowid} ) expect( bnode, "No workflow {} found in file {}".format(workflowid, self.filename), ) if prepend: bnodes = [bnode] + bnodes else: bnodes.append(bnode) prepend = False workflow_attribs = self.attrib(bnode) if "prepend" in workflow_attribs: workflowid = workflow_attribs["prepend"] prepend = True elif "append" in workflow_attribs: workflowid = workflow_attribs["append"] else: findmore = False for bnode in bnodes: for jnode in self.get_children(root=bnode): if self.name(jnode) == "job": name = self.get(jnode, "name") jdict = {} for child in self.get_children(root=jnode): if self.name(child) == "runtime_parameters": attrib = self.attrib(child) if attrib and attrib == {"MACH": machine}: for rtchild in self.get_children(root=child): jdict[self.name(rtchild)] = self.text(rtchild) elif not attrib: for rtchild in self.get_children(root=child): if self.name(rtchild) not in jdict: jdict[self.name(rtchild)] = self.text(rtchild) else: jdict[self.name(child)] = self.text(child) jobs.append((name, jdict)) return jobs