Source code for CIME.XML.testlist

"""
Interface to the config_files.xml file.  This class inherits from generic_xml.py
It supports version 2.0 of the testlist.xml file

In version 2 of the file options can be specified to further refine a test or
set of tests. They can be specified either at the top level, in which case they
apply to all machines/compilers for this test:

<test ...>
  <options>
    <option name="wallclock">00:20</option>
  </options>
  ...
</test>

or at the level of a particular machine/compiler:

<test ...>
  <machines>
    <machine ...>
      <options>
        <option name="wallclock">00:20</option>
      </options>
    </machine>
  </machines>
</test>

Currently supported options are:

- walltime: sets the wallclock limit in the queuing system

- memleak_tolerance: specifies the relative memory growth expected for this test

- comment: has no effect, but is written out when printing the test list

- workflow: adds a workflow to the test
"""
from CIME.XML.standard_module_setup import *

from CIME.XML.generic_xml import GenericXML
from CIME.XML.files import Files

logger = logging.getLogger(__name__)


[docs] class Testlist(GenericXML): def __init__(self, infile, files=None): """ initialize an object """ schema = None if files is None: files = Files() schema = files.get_schema("TESTS_SPEC_FILE") GenericXML.__init__(self, infile, schema=schema) expect( self.get_version() >= 2.0, "{} is an unsupported version of the testfile format and will be ignored".format( infile ), )
[docs] def get_tests( self, machine=None, category=None, compiler=None, compset=None, grid=None, supported_only=False, ): tests = [] attributes = {} if compset is not None: attributes["compset"] = compset if grid is not None: attributes["grid"] = grid testnodes = self.get_children("test", attributes=attributes) machatts = {} if machine is not None: machatts["name"] = machine if category is not None: machatts["category"] = category if compiler is not None: machatts["compiler"] = compiler for tnode in testnodes: if ( supported_only and self.has(tnode, "supported") and self.get(tnode, "supported") == "false" ): continue machnode = self.get_optional_child("machines", root=tnode) machnodes = ( None if machnode is None else self.get_children("machine", machatts, root=machnode) ) if machnodes: this_test_node = {} for key, value in self.attrib(tnode).items(): if key == "name": this_test_node["testname"] = value else: this_test_node[key] = value # Get options that apply to all machines/compilers for this test options = self.get_children("options", root=tnode) if len(options) > 0: optionnodes = self.get_children("option", root=options[0]) else: optionnodes = [] for mach in machnodes: # this_test_node can include multiple tests this_test = dict(this_test_node) for key, value in self.attrib(mach).items(): if key == "name": this_test["machine"] = value else: this_test[key] = value this_test["options"] = {} for onode in optionnodes: this_test["options"][self.get(onode, "name")] = self.text(onode) # Now get options specific to this machine/compiler options = self.get_optional_child("options", root=mach) optionnodes = ( [] if options is None else self.get_children("option", root=options) ) for onode in optionnodes: this_test["options"][self.get(onode, "name")] = self.text(onode) tests.append(this_test) return tests