def update_acme_tests(xml_file, categories, platform=None): ############################################################################### # Retrieve all supported ACME platforms, killing the third entry (MPI lib) # for the moment. supported_platforms = [p[:2] for p in find_all_supported_platforms()] # Fish all of the existing machine/compiler combos out of the XML file. if (platform is not None): platforms = [tuple(platform.split(","))] else: platforms = find_all_platforms(xml_file) # Prune the non-supported platforms from our list. for p in platforms: if p not in supported_platforms: acme_util.verbose_print("pruning unsupported platform %s"%repr(p)) platforms = [p for p in platforms if p in supported_platforms] manage_xml_entries = os.path.join(acme_util.get_cime_root(), "scripts", "manage_testlists") expect(os.path.isfile(manage_xml_entries), "Couldn't find manage_testlists, expected it to be here: '%s'" % manage_xml_entries) for category in categories: # Remove any existing acme test category from the file. if (platform is None): acme_util.run_cmd("%s -component allactive -removetests -category %s" % (manage_xml_entries, category)) else: acme_util.run_cmd("%s -component allactive -removetests -category %s -machine %s -compiler %s" % (manage_xml_entries, category, platforms[0][0], platforms[0][1])) # Generate a list of test entries corresponding to our suite at the top # of the file. new_test_file = generate_acme_test_entries(category, platforms) acme_util.run_cmd("%s -component allactive -addlist -file %s -category %s" % (manage_xml_entries, new_test_file, category)) os.unlink(new_test_file) print "SUCCESS"
def create_cdash_test_xml(results, cdash_build_name, cdash_build_group, utc_time, start_time, hostname): ############################################################################### git_commit = acme_util.get_current_commit(repo=acme_util.get_cime_root()) data_rel_path = os.path.join("Testing", utc_time) site_elem = xmlet.Element("Site") site_elem.attrib["BuildName"] = cdash_build_name site_elem.attrib["BuildStamp"] = "%s-%s" % (utc_time, cdash_build_group) site_elem.attrib["Name"] = hostname site_elem.attrib["OSName"] = "Linux" site_elem.attrib["Hostname"] = hostname site_elem.attrib["OSVersion"] = "Commit: %s, Total testing time: %d seconds" % (git_commit, time.time() - start_time) testing_elem = xmlet.SubElement(site_elem, "Testing") start_date_time_elem = xmlet.SubElement(testing_elem, "StartDateTime") start_date_time_elem.text = time.ctime(start_time) start_test_time_elem = xmlet.SubElement(testing_elem, "StartTestTime") start_test_time_elem.text = str(int(start_time)) test_list_elem = xmlet.SubElement(testing_elem, "TestList") for test_name in sorted(results): test_elem = xmlet.SubElement(test_list_elem, "Test") test_elem.text = test_name for test_name in sorted(results): test_path, test_status = results[test_name] test_passed = test_status == TEST_PASS_STATUS test_norm_path = test_path if os.path.isdir(test_path) else os.path.dirname(test_path) full_test_elem = xmlet.SubElement(testing_elem, "Test") if (test_passed): full_test_elem.attrib["Status"] = "passed" elif (test_status == NAMELIST_FAIL_STATUS): full_test_elem.attrib["Status"] = "notrun" else: full_test_elem.attrib["Status"] = "failed" name_elem = xmlet.SubElement(full_test_elem, "Name") name_elem.text = test_name path_elem = xmlet.SubElement(full_test_elem, "Path") path_elem.text = test_norm_path full_name_elem = xmlet.SubElement(full_test_elem, "FullName") full_name_elem.text = test_name full_command_line_elem = xmlet.SubElement(full_test_elem, "FullCommandLine") # text ? results_elem = xmlet.SubElement(full_test_elem, "Results") named_measurements = ( ("text/string", "Exit Code", test_status), ("text/string", "Exit Value", "0" if test_passed else "1"), ("numeric_double", "Execution Time", str(get_test_time(test_norm_path))), ("text/string", "Completion Status", "Not Completed" if test_status == TEST_PENDING_STATUS else "Completed"), ("text/string", "Command line", "create_test") ) for type_attr, name_attr, value in named_measurements: named_measurement_elem = xmlet.SubElement(results_elem, "NamedMeasurement") named_measurement_elem.attrib["type"] = type_attr named_measurement_elem.attrib["name"] = name_attr value_elem = xmlet.SubElement(named_measurement_elem, "Value") value_elem.text = value measurement_elem = xmlet.SubElement(results_elem, "Measurement") value_elem = xmlet.SubElement(measurement_elem, "Value") value_elem.text = get_test_output(test_norm_path) elapsed_time_elem = xmlet.SubElement(testing_elem, "ElapsedMinutes") elapsed_time_elem.text = "0" # Skip for now etree = xmlet.ElementTree(site_elem) etree.write(os.path.join(data_rel_path, "Test.xml"))
def create_cdash_test_xml(results, cdash_build_name, cdash_build_group, utc_time, start_time, hostname): ############################################################################### git_commit = acme_util.get_current_commit(repo=acme_util.get_cime_root()) data_rel_path = os.path.join("Testing", utc_time) site_elem = xmlet.Element("Site") site_elem.attrib["BuildName"] = cdash_build_name site_elem.attrib["BuildStamp"] = "%s-%s" % (utc_time, cdash_build_group) site_elem.attrib["Name"] = hostname site_elem.attrib["OSName"] = "Linux" site_elem.attrib["Hostname"] = hostname site_elem.attrib[ "OSVersion"] = "Commit: %s, Total testing time: %d seconds" % ( git_commit, time.time() - start_time) testing_elem = xmlet.SubElement(site_elem, "Testing") start_date_time_elem = xmlet.SubElement(testing_elem, "StartDateTime") start_date_time_elem.text = time.ctime(start_time) start_test_time_elem = xmlet.SubElement(testing_elem, "StartTestTime") start_test_time_elem.text = str(int(start_time)) test_list_elem = xmlet.SubElement(testing_elem, "TestList") for test_name in sorted(results): test_elem = xmlet.SubElement(test_list_elem, "Test") test_elem.text = test_name for test_name in sorted(results): test_path, test_status = results[test_name] test_passed = test_status == TEST_PASS_STATUS test_norm_path = test_path if os.path.isdir( test_path) else os.path.dirname(test_path) full_test_elem = xmlet.SubElement(testing_elem, "Test") if (test_passed): full_test_elem.attrib["Status"] = "passed" elif (test_status == NAMELIST_FAIL_STATUS): full_test_elem.attrib["Status"] = "notrun" else: full_test_elem.attrib["Status"] = "failed" name_elem = xmlet.SubElement(full_test_elem, "Name") name_elem.text = test_name path_elem = xmlet.SubElement(full_test_elem, "Path") path_elem.text = test_norm_path full_name_elem = xmlet.SubElement(full_test_elem, "FullName") full_name_elem.text = test_name full_command_line_elem = xmlet.SubElement(full_test_elem, "FullCommandLine") # text ? results_elem = xmlet.SubElement(full_test_elem, "Results") named_measurements = (("text/string", "Exit Code", test_status), ("text/string", "Exit Value", "0" if test_passed else "1"), ("numeric_double", "Execution Time", str(get_test_time(test_norm_path))), ("text/string", "Completion Status", "Not Completed" if test_status == TEST_PENDING_STATUS else "Completed"), ("text/string", "Command line", "create_test")) for type_attr, name_attr, value in named_measurements: named_measurement_elem = xmlet.SubElement(results_elem, "NamedMeasurement") named_measurement_elem.attrib["type"] = type_attr named_measurement_elem.attrib["name"] = name_attr value_elem = xmlet.SubElement(named_measurement_elem, "Value") value_elem.text = value measurement_elem = xmlet.SubElement(results_elem, "Measurement") value_elem = xmlet.SubElement(measurement_elem, "Value") value_elem.text = get_test_output(test_norm_path) elapsed_time_elem = xmlet.SubElement(testing_elem, "ElapsedMinutes") elapsed_time_elem.text = "0" # Skip for now etree = xmlet.ElementTree(site_elem) etree.write(os.path.join(data_rel_path, "Test.xml"))
def __init__(self, test_names, no_run=False, no_build=False, no_batch=None, test_root=None, test_id=None, compiler=None, baseline_root=None, baseline_name=None, clean=False, compare=False, generate=False, namelists_only=False, project=None, parallel_jobs=None): ########################################################################### self._cime_root = acme_util.get_cime_root() self._test_names = test_names self._no_build = no_build if not namelists_only else True self._no_run = no_run if not self._no_build else True self._no_batch = no_batch if no_batch is not None else not acme_util.does_machine_have_batch() self._test_root = test_root if test_root is not None else acme_util.get_machine_info("CESMSCRATCHROOT") self._test_id = test_id if test_id is not None else acme_util.get_utc_timestamp() self._project = project if project is not None else acme_util.get_machine_project() self._baseline_root = baseline_root if baseline_root is not None else acme_util.get_machine_info("CCSM_BASELINE", project=self._project) self._baseline_name = None self._compiler = compiler if compiler is not None else acme_util.get_machine_info("COMPILERS")[0] self._clean = clean self._compare = compare self._generate = generate self._namelists_only = namelists_only self._parallel_jobs = parallel_jobs if parallel_jobs is not None else min(len(self._test_names), int(acme_util.get_machine_info("MAX_TASKS_PER_NODE"))) # Oversubscribe by 1/4 pes = int(acme_util.get_machine_info("MAX_TASKS_PER_NODE")) # This is the only data that multiple threads will simultaneously access # Each test has it's own index and setting/retrieving items from a list # is atomic, so this should be fine to use without mutex self._test_states = [ (INITIAL_PHASE, TEST_PASS_STATUS) ] * len(test_names) self._proc_pool = int(pes * 1.25) # Since the name-list phase can fail without aborting later phases, we # need some extra state to remember tests that had namelist problems self._tests_with_nl_problems = [None] * len(test_names) # Setup phases self._phases = list(PHASES) if (no_build): self._phases.remove(BUILD_PHASE) if (no_run): self._phases.remove(RUN_PHASE) if (not self._compare and not self._generate): self._phases.remove(NAMELIST_PHASE) else: if (baseline_name is None): branch_name = acme_util.get_current_branch(repo=self._cime_root) expect(branch_name is not None, "Could not determine baseline name from branch, please use -b option") self._baseline_name = os.path.join(self._compiler, branch_name) else: self._baseline_name = baseline_name if (not self._baseline_name.startswith("%s/" % self._compiler)): self._baseline_name = os.path.join(self._compiler, self._baseline_name) # Validate any assumptions that were not caught by the arg parser # None of the test directories should already exist. for test in self._test_names: expect(not os.path.exists(self._get_test_dir(test)), "Cannot create new case in directory '%s', it already exists. Pick a different test-id" % self._get_test_dir(test))
def __init__(self, test_names, no_run=False, no_build=False, no_batch=None, test_root=None, test_id=None, compiler=None, baseline_root=None, baseline_name=None, clean=False, compare=False, generate=False, namelists_only=False, project=None, parallel_jobs=None): ########################################################################### self._cime_root = acme_util.get_cime_root() self._test_names = test_names self._no_build = no_build if not namelists_only else True self._no_run = no_run if not self._no_build else True self._no_batch = no_batch if no_batch is not None else not acme_util.does_machine_have_batch( ) self._test_root = test_root if test_root is not None else acme_util.get_machine_info( "CESMSCRATCHROOT") self._test_id = test_id if test_id is not None else acme_util.get_utc_timestamp( ) self._project = project if project is not None else acme_util.get_machine_project( ) self._baseline_root = baseline_root if baseline_root is not None else acme_util.get_machine_info( "CCSM_BASELINE", project=self._project) self._baseline_name = None self._compiler = compiler if compiler is not None else acme_util.get_machine_info( "COMPILERS")[0] self._clean = clean self._compare = compare self._generate = generate self._namelists_only = namelists_only self._parallel_jobs = parallel_jobs if parallel_jobs is not None else min( len(self._test_names), int(acme_util.get_machine_info("MAX_TASKS_PER_NODE"))) # Oversubscribe by 1/4 pes = int(acme_util.get_machine_info("MAX_TASKS_PER_NODE")) # This is the only data that multiple threads will simultaneously access # Each test has it's own index and setting/retrieving items from a list # is atomic, so this should be fine to use without mutex self._test_states = [(INITIAL_PHASE, TEST_PASS_STATUS) ] * len(test_names) self._proc_pool = int(pes * 1.25) # Since the name-list phase can fail without aborting later phases, we # need some extra state to remember tests that had namelist problems self._tests_with_nl_problems = [None] * len(test_names) # Setup phases self._phases = list(PHASES) if (no_build): self._phases.remove(BUILD_PHASE) if (no_run): self._phases.remove(RUN_PHASE) if (not self._compare and not self._generate): self._phases.remove(NAMELIST_PHASE) else: if (baseline_name is None): branch_name = acme_util.get_current_branch( repo=self._cime_root) expect( branch_name is not None, "Could not determine baseline name from branch, please use -b option" ) self._baseline_name = os.path.join(self._compiler, branch_name) else: self._baseline_name = baseline_name if (not self._baseline_name.startswith( "%s/" % self._compiler)): self._baseline_name = os.path.join(self._compiler, self._baseline_name) # Validate any assumptions that were not caught by the arg parser # None of the test directories should already exist. for test in self._test_names: expect( not os.path.exists(self._get_test_dir(test)), "Cannot create new case in directory '%s', it already exists. Pick a different test-id" % self._get_test_dir(test))