From 19df4fab0715a7f4c7495d3f3a73d575c1083d16 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Fri, 17 Jan 2025 13:02:50 -0700 Subject: [PATCH 01/16] Add --allow-baseline-skip option to create_test. --- CIME/Tools/component_generate_baseline | 14 +++++++++++--- CIME/hist_utils.py | 18 ++++++++++-------- CIME/scripts/create_test.py | 24 ++++++++++++++++++++++++ CIME/test_scheduler.py | 6 ++++-- CIME/utils.py | 1 + 5 files changed, 50 insertions(+), 13 deletions(-) diff --git a/CIME/Tools/component_generate_baseline b/CIME/Tools/component_generate_baseline index ff8f39170f0..f353407f70f 100755 --- a/CIME/Tools/component_generate_baseline +++ b/CIME/Tools/component_generate_baseline @@ -44,20 +44,28 @@ OR "existing baseline directories to be silently overwritten.", ) + parser.add_argument( + "--allow-baseline-skip", + action="store_true", + help="By default an attempt to overwrite an existing baseline directory " + "will raise an error. Specifying this option allows tests with " + "existing baseline directories to be silently skipped.", + ) + args = CIME.utils.parse_args_and_handle_standard_logging_options(args, parser) - return args.caseroot, args.baseline_dir, args.allow_baseline_overwrite + return args.caseroot, args.baseline_dir, args.allow_baseline_overwrite, args.allow_baseline_skip ############################################################################### def _main_func(description): ############################################################################### - caseroot, baseline_dir, allow_baseline_overwrite = parse_command_line( + caseroot, baseline_dir, allow_baseline_overwrite, allow_baseline_skip = parse_command_line( sys.argv, description ) with Case(caseroot) as case: success, comments = generate_baseline( - case, baseline_dir, allow_baseline_overwrite + case, baseline_dir, allow_baseline_overwrite, allow_baseline_skip ) print(comments) diff --git a/CIME/hist_utils.py b/CIME/hist_utils.py index 18bb4827ee0..3252f31a108 100644 --- a/CIME/hist_utils.py +++ b/CIME/hist_utils.py @@ -609,13 +609,14 @@ def generate_teststatus(testdir, baseline_dir): ) -def _generate_baseline_impl(case, baseline_dir=None, allow_baseline_overwrite=False): +def _generate_baseline_impl(case, baseline_dir=None, allow_baseline_overwrite=False, allow_baseline_skip=False): """ copy the current test output to baseline result case - The case containing the hist files to be copied into baselines baseline_dir - Optionally, specify a specific baseline dir, otherwise it will be computed from case config - allow_baseline_overwrite must be true to generate baselines to an existing directory. + allow_baseline_overwrite must be true to generate baselines to an existing directory. allow_baseline_skip + will result in tests with existing baselines being skipped returns (SUCCESS, comments) """ @@ -632,11 +633,11 @@ def _generate_baseline_impl(case, baseline_dir=None, allow_baseline_overwrite=Fa if not os.path.isdir(basegen_dir): os.makedirs(basegen_dir) - if ( - os.path.isdir(os.path.join(basegen_dir, testcase)) - and not allow_baseline_overwrite - ): - expect(False, " Cowardly refusing to overwrite existing baseline directory") + if os.path.isdir(os.path.join(basegen_dir, testcase)): + if allow_baseline_skip: + return False, " Skipping" + if not allow_baseline_overwrite: + expect(False, " Cowardly refusing to overwrite existing baseline directory") comments = "Generating baselines into '{}'\n".format(basegen_dir) num_gen = 0 @@ -710,12 +711,13 @@ def _generate_baseline_impl(case, baseline_dir=None, allow_baseline_overwrite=Fa return True, comments -def generate_baseline(case, baseline_dir=None, allow_baseline_overwrite=False): +def generate_baseline(case, baseline_dir=None, allow_baseline_overwrite=False, allow_baseline_skip=False): with SharedArea(): return _generate_baseline_impl( case, baseline_dir=baseline_dir, allow_baseline_overwrite=allow_baseline_overwrite, + allow_baseline_skip=allow_baseline_skip, ) diff --git a/CIME/scripts/create_test.py b/CIME/scripts/create_test.py index 74dd60e8c19..93191fc17ae 100755 --- a/CIME/scripts/create_test.py +++ b/CIME/scripts/create_test.py @@ -351,6 +351,10 @@ def parse_command_line(args, description): config, "ALLOW_BASELINE_OVERWRITE", False, check_main=False ) + default = get_default_setting( + config, "ALLOW_BASELINE_SKIP", False, check_main=False + ) + parser.add_argument( "-o", "--allow-baseline-overwrite", @@ -361,6 +365,15 @@ def parse_command_line(args, description): "\noption will allow existing baseline directories to be silently overwritten.", ) + parser.add_argument( + "--allow-baseline-skip", + action="store_true", + default=default, + help="If the --generate option is given, then an attempt to overwrite " + "\nan existing baseline directory will raise an error. WARNING: Specifying this " + "\noption will allow tests with existing baseline directories to be silently skipped.", + ) + default = get_default_setting(config, "WAIT", False, check_main=False) parser.add_argument( @@ -503,6 +516,12 @@ def parse_command_line(args, description): "Cannot force a rebuild without 'use-existing' and 'test-id'", ) + # baseline overwrite and skip can't be simultaneously specified + expect( + not (args.allow_baseline_overwrite and args.allow_baseline_skip), + "Cannot skip and overwrite baselines at the same time", + ) + # generate and compare flags may not point to the same directory if model_config.create_test_flag_mode == "cesm": if args.generate is not None: @@ -759,6 +778,7 @@ def parse_command_line(args, description): args.save_timing, args.queue, args.allow_baseline_overwrite, + args.allow_baseline_skip, args.output_root, args.wait, args.force_procs, @@ -921,6 +941,7 @@ def create_test( save_timing, queue, allow_baseline_overwrite, + allow_baseline_skip, output_root, wait, force_procs, @@ -969,6 +990,7 @@ def create_test( save_timing=save_timing, queue=queue, allow_baseline_overwrite=allow_baseline_overwrite, + allow_baseline_skip=allow_baseline_skip, output_root=output_root, force_procs=force_procs, force_threads=force_threads, @@ -1068,6 +1090,7 @@ def _main_func(description=None): save_timing, queue, allow_baseline_overwrite, + allow_baseline_skip, output_root, wait, force_procs, @@ -1122,6 +1145,7 @@ def _main_func(description=None): save_timing, queue, allow_baseline_overwrite, + allow_baseline_skip, output_root, wait, force_procs, diff --git a/CIME/test_scheduler.py b/CIME/test_scheduler.py index 8e3b77603cb..de8f0e02e13 100644 --- a/CIME/test_scheduler.py +++ b/CIME/test_scheduler.py @@ -196,6 +196,7 @@ def __init__( save_timing=False, queue=None, allow_baseline_overwrite=False, + allow_baseline_skip=False, output_root=None, force_procs=None, force_threads=None, @@ -227,6 +228,7 @@ def __init__( self._input_dir = input_dir self._pesfile = pesfile self._allow_baseline_overwrite = allow_baseline_overwrite + self._allow_baseline_skip = allow_baseline_skip self._single_exe = single_exe if self._single_exe: self._allow_pnl = True @@ -358,9 +360,9 @@ def __init__( else: clear_folder(test_baseline) expect( - allow_baseline_overwrite or len(existing_baselines) == 0, + allow_baseline_overwrite or len(existing_baselines) == 0 or allow_baseline_skip, "Baseline directories already exists {}\n" - "Use -o to avoid this error".format(existing_baselines), + "Use -o or --allow-baseline-skip to avoid this error".format(existing_baselines), ) if self._config.sort_tests: diff --git a/CIME/utils.py b/CIME/utils.py index dbd05217d92..51f725a973c 100644 --- a/CIME/utils.py +++ b/CIME/utils.py @@ -260,6 +260,7 @@ def _read_cime_config_file(): "walltime", "job_queue", "allow_baseline_overwrite", + "allow_baseline_skip", "wait", "force_procs", "force_threads", From 7fe8120953c5ff412443caf5c70a5b65cffd58e2 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Fri, 17 Jan 2025 13:02:50 -0700 Subject: [PATCH 02/16] Add --allow-baseline-skip option to create_test. --- CIME/hist_utils.py | 2 +- CIME/test_scheduler.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CIME/hist_utils.py b/CIME/hist_utils.py index 3252f31a108..e0e91ae9a01 100644 --- a/CIME/hist_utils.py +++ b/CIME/hist_utils.py @@ -635,7 +635,7 @@ def _generate_baseline_impl(case, baseline_dir=None, allow_baseline_overwrite=Fa if os.path.isdir(os.path.join(basegen_dir, testcase)): if allow_baseline_skip: - return False, " Skipping" + return True, " Skipping" if not allow_baseline_overwrite: expect(False, " Cowardly refusing to overwrite existing baseline directory") diff --git a/CIME/test_scheduler.py b/CIME/test_scheduler.py index de8f0e02e13..a6df782af7e 100644 --- a/CIME/test_scheduler.py +++ b/CIME/test_scheduler.py @@ -359,6 +359,9 @@ def __init__( clear_folder(os.path.join(test_baseline, "CaseDocs")) else: clear_folder(test_baseline) + print(f"allow_baseline_overwrite: {allow_baseline_overwrite}") + print(f"len(existing_baselines): {len(existing_baselines)}") + print(f"allow_baseline_skip: {allow_baseline_skip}") expect( allow_baseline_overwrite or len(existing_baselines) == 0 or allow_baseline_skip, "Baseline directories already exists {}\n" From eda49a9ac3b1311fcc9fbd445e9590e6697fb016 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Fri, 17 Jan 2025 13:30:27 -0700 Subject: [PATCH 03/16] Try return False --- CIME/hist_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CIME/hist_utils.py b/CIME/hist_utils.py index e0e91ae9a01..3252f31a108 100644 --- a/CIME/hist_utils.py +++ b/CIME/hist_utils.py @@ -635,7 +635,7 @@ def _generate_baseline_impl(case, baseline_dir=None, allow_baseline_overwrite=Fa if os.path.isdir(os.path.join(basegen_dir, testcase)): if allow_baseline_skip: - return True, " Skipping" + return False, " Skipping" if not allow_baseline_overwrite: expect(False, " Cowardly refusing to overwrite existing baseline directory") From cdd90d17f1c5314ed7caae548dc5b2cee9e97489 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Sat, 18 Jan 2025 13:53:50 -0700 Subject: [PATCH 04/16] Remove diagnostic printout. --- CIME/test_scheduler.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/CIME/test_scheduler.py b/CIME/test_scheduler.py index a6df782af7e..de8f0e02e13 100644 --- a/CIME/test_scheduler.py +++ b/CIME/test_scheduler.py @@ -359,9 +359,6 @@ def __init__( clear_folder(os.path.join(test_baseline, "CaseDocs")) else: clear_folder(test_baseline) - print(f"allow_baseline_overwrite: {allow_baseline_overwrite}") - print(f"len(existing_baselines): {len(existing_baselines)}") - print(f"allow_baseline_skip: {allow_baseline_skip}") expect( allow_baseline_overwrite or len(existing_baselines) == 0 or allow_baseline_skip, "Baseline directories already exists {}\n" From 31b46b05dd9b608e7157e4dd718fbef3e289ba88 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Sat, 18 Jan 2025 14:08:28 -0700 Subject: [PATCH 05/16] ACTUALLY skip tests with baselines already. --- CIME/test_scheduler.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CIME/test_scheduler.py b/CIME/test_scheduler.py index de8f0e02e13..f147f404966 100644 --- a/CIME/test_scheduler.py +++ b/CIME/test_scheduler.py @@ -350,6 +350,8 @@ def __init__( self._baseline_root, self._baseline_gen_name ) existing_baselines = [] + if allow_baseline_skip: + tests_to_skip = [] for test_name in test_names: test_baseline = os.path.join(full_baseline_dir, test_name) if os.path.isdir(test_baseline): @@ -359,11 +361,15 @@ def __init__( clear_folder(os.path.join(test_baseline, "CaseDocs")) else: clear_folder(test_baseline) + elif allow_baseline_skip: + tests_to_skip.append(test_name) expect( allow_baseline_overwrite or len(existing_baselines) == 0 or allow_baseline_skip, "Baseline directories already exists {}\n" "Use -o or --allow-baseline-skip to avoid this error".format(existing_baselines), ) + if allow_baseline_skip: + test_names = [test for test in test_names if test not in tests_to_skip] if self._config.sort_tests: _order_tests_by_runtime(test_names, self._baseline_root) From 6e372ce6d206538ace17e2b66d368e3f36ff29a3 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Sat, 18 Jan 2025 14:09:51 -0700 Subject: [PATCH 06/16] Remove now-unneeded allow_baseline_skip stuff from generate_baseline(). --- CIME/Tools/component_generate_baseline | 14 +++----------- CIME/hist_utils.py | 10 +++------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/CIME/Tools/component_generate_baseline b/CIME/Tools/component_generate_baseline index f353407f70f..ff8f39170f0 100755 --- a/CIME/Tools/component_generate_baseline +++ b/CIME/Tools/component_generate_baseline @@ -44,28 +44,20 @@ OR "existing baseline directories to be silently overwritten.", ) - parser.add_argument( - "--allow-baseline-skip", - action="store_true", - help="By default an attempt to overwrite an existing baseline directory " - "will raise an error. Specifying this option allows tests with " - "existing baseline directories to be silently skipped.", - ) - args = CIME.utils.parse_args_and_handle_standard_logging_options(args, parser) - return args.caseroot, args.baseline_dir, args.allow_baseline_overwrite, args.allow_baseline_skip + return args.caseroot, args.baseline_dir, args.allow_baseline_overwrite ############################################################################### def _main_func(description): ############################################################################### - caseroot, baseline_dir, allow_baseline_overwrite, allow_baseline_skip = parse_command_line( + caseroot, baseline_dir, allow_baseline_overwrite = parse_command_line( sys.argv, description ) with Case(caseroot) as case: success, comments = generate_baseline( - case, baseline_dir, allow_baseline_overwrite, allow_baseline_skip + case, baseline_dir, allow_baseline_overwrite ) print(comments) diff --git a/CIME/hist_utils.py b/CIME/hist_utils.py index 3252f31a108..8e96dbdb551 100644 --- a/CIME/hist_utils.py +++ b/CIME/hist_utils.py @@ -609,14 +609,13 @@ def generate_teststatus(testdir, baseline_dir): ) -def _generate_baseline_impl(case, baseline_dir=None, allow_baseline_overwrite=False, allow_baseline_skip=False): +def _generate_baseline_impl(case, baseline_dir=None, allow_baseline_overwrite=False): """ copy the current test output to baseline result case - The case containing the hist files to be copied into baselines baseline_dir - Optionally, specify a specific baseline dir, otherwise it will be computed from case config - allow_baseline_overwrite must be true to generate baselines to an existing directory. allow_baseline_skip - will result in tests with existing baselines being skipped + allow_baseline_overwrite must be true to generate baselines to an existing directory. returns (SUCCESS, comments) """ @@ -634,8 +633,6 @@ def _generate_baseline_impl(case, baseline_dir=None, allow_baseline_overwrite=Fa os.makedirs(basegen_dir) if os.path.isdir(os.path.join(basegen_dir, testcase)): - if allow_baseline_skip: - return False, " Skipping" if not allow_baseline_overwrite: expect(False, " Cowardly refusing to overwrite existing baseline directory") @@ -711,13 +708,12 @@ def _generate_baseline_impl(case, baseline_dir=None, allow_baseline_overwrite=Fa return True, comments -def generate_baseline(case, baseline_dir=None, allow_baseline_overwrite=False, allow_baseline_skip=False): +def generate_baseline(case, baseline_dir=None, allow_baseline_overwrite=False): with SharedArea(): return _generate_baseline_impl( case, baseline_dir=baseline_dir, allow_baseline_overwrite=allow_baseline_overwrite, - allow_baseline_skip=allow_baseline_skip, ) From 9c8c2b31d434bd443df4f74c154e4f53f6f04429 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Sat, 18 Jan 2025 14:20:04 -0700 Subject: [PATCH 07/16] Note incompatibility of --allow-baseline-overwrite and -skip. --- CIME/scripts/create_test.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CIME/scripts/create_test.py b/CIME/scripts/create_test.py index 93191fc17ae..94ee40f3418 100755 --- a/CIME/scripts/create_test.py +++ b/CIME/scripts/create_test.py @@ -362,7 +362,8 @@ def parse_command_line(args, description): default=default, help="If the --generate option is given, then an attempt to overwrite " "\nan existing baseline directory will raise an error. WARNING: Specifying this " - "\noption will allow existing baseline directories to be silently overwritten.", + "\noption will allow existing baseline directories to be silently overwritten. " + "\nIncompatible with --allow-baseline-skip.", ) parser.add_argument( @@ -371,7 +372,8 @@ def parse_command_line(args, description): default=default, help="If the --generate option is given, then an attempt to overwrite " "\nan existing baseline directory will raise an error. WARNING: Specifying this " - "\noption will allow tests with existing baseline directories to be silently skipped.", + "\noption will allow tests with existing baseline directories to be silently skipped. " + "\nIncompatible with -o/--allow-baseline-overwrite.", ) default = get_default_setting(config, "WAIT", False, check_main=False) From f48d5cf0f65190a841b37de8772b186efa52c6cc Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Sat, 18 Jan 2025 14:23:10 -0700 Subject: [PATCH 08/16] Revert remaining changes to hist_utils.py. --- CIME/hist_utils.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CIME/hist_utils.py b/CIME/hist_utils.py index 8e96dbdb551..18bb4827ee0 100644 --- a/CIME/hist_utils.py +++ b/CIME/hist_utils.py @@ -632,9 +632,11 @@ def _generate_baseline_impl(case, baseline_dir=None, allow_baseline_overwrite=Fa if not os.path.isdir(basegen_dir): os.makedirs(basegen_dir) - if os.path.isdir(os.path.join(basegen_dir, testcase)): - if not allow_baseline_overwrite: - expect(False, " Cowardly refusing to overwrite existing baseline directory") + if ( + os.path.isdir(os.path.join(basegen_dir, testcase)) + and not allow_baseline_overwrite + ): + expect(False, " Cowardly refusing to overwrite existing baseline directory") comments = "Generating baselines into '{}'\n".format(basegen_dir) num_gen = 0 From 0aa6f546829447890d4a728a9bbe5711d969cd09 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Sun, 19 Jan 2025 13:53:48 -0700 Subject: [PATCH 09/16] Use mutually exclusive parsing group for existing baseline options. --- CIME/scripts/create_test.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/CIME/scripts/create_test.py b/CIME/scripts/create_test.py index 94ee40f3418..021de5e558a 100755 --- a/CIME/scripts/create_test.py +++ b/CIME/scripts/create_test.py @@ -355,7 +355,10 @@ def parse_command_line(args, description): config, "ALLOW_BASELINE_SKIP", False, check_main=False ) - parser.add_argument( + # Don't allow -o/--allow-baseline-overwrite AND --allow-baseline-skip + existing_baseline_group = parser.add_mutually_exclusive_group() + + existing_baseline_group.add_argument( "-o", "--allow-baseline-overwrite", action="store_true", @@ -366,7 +369,7 @@ def parse_command_line(args, description): "\nIncompatible with --allow-baseline-skip.", ) - parser.add_argument( + existing_baseline_group.add_argument( "--allow-baseline-skip", action="store_true", default=default, @@ -518,12 +521,6 @@ def parse_command_line(args, description): "Cannot force a rebuild without 'use-existing' and 'test-id'", ) - # baseline overwrite and skip can't be simultaneously specified - expect( - not (args.allow_baseline_overwrite and args.allow_baseline_skip), - "Cannot skip and overwrite baselines at the same time", - ) - # generate and compare flags may not point to the same directory if model_config.create_test_flag_mode == "cesm": if args.generate is not None: From 3f28e481fd5a71abf43fe593e3c3acf88b336d95 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Sun, 19 Jan 2025 13:57:51 -0700 Subject: [PATCH 10/16] Rename --allow-baseline-skip to --skip-tests-with-existing-baselines. --- CIME/scripts/create_test.py | 18 +++++++++--------- CIME/test_scheduler.py | 14 +++++++------- CIME/utils.py | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/CIME/scripts/create_test.py b/CIME/scripts/create_test.py index 021de5e558a..cb71b8ed5f5 100755 --- a/CIME/scripts/create_test.py +++ b/CIME/scripts/create_test.py @@ -352,10 +352,10 @@ def parse_command_line(args, description): ) default = get_default_setting( - config, "ALLOW_BASELINE_SKIP", False, check_main=False + config, "SKIP_TESTS_WITH_EXISTING_BASELINES", False, check_main=False ) - # Don't allow -o/--allow-baseline-overwrite AND --allow-baseline-skip + # Don't allow -o/--allow-baseline-overwrite AND --skip-tests-with-existing-baselines existing_baseline_group = parser.add_mutually_exclusive_group() existing_baseline_group.add_argument( @@ -366,11 +366,11 @@ def parse_command_line(args, description): help="If the --generate option is given, then an attempt to overwrite " "\nan existing baseline directory will raise an error. WARNING: Specifying this " "\noption will allow existing baseline directories to be silently overwritten. " - "\nIncompatible with --allow-baseline-skip.", + "\nIncompatible with --skip-tests-with-existing-baselines.", ) existing_baseline_group.add_argument( - "--allow-baseline-skip", + "--skip-tests-with-existing-baselines", action="store_true", default=default, help="If the --generate option is given, then an attempt to overwrite " @@ -777,7 +777,7 @@ def parse_command_line(args, description): args.save_timing, args.queue, args.allow_baseline_overwrite, - args.allow_baseline_skip, + args.skip_tests_with_existing_baselines, args.output_root, args.wait, args.force_procs, @@ -940,7 +940,7 @@ def create_test( save_timing, queue, allow_baseline_overwrite, - allow_baseline_skip, + skip_tests_with_existing_baselines, output_root, wait, force_procs, @@ -989,7 +989,7 @@ def create_test( save_timing=save_timing, queue=queue, allow_baseline_overwrite=allow_baseline_overwrite, - allow_baseline_skip=allow_baseline_skip, + skip_tests_with_existing_baselines=skip_tests_with_existing_baselines, output_root=output_root, force_procs=force_procs, force_threads=force_threads, @@ -1089,7 +1089,7 @@ def _main_func(description=None): save_timing, queue, allow_baseline_overwrite, - allow_baseline_skip, + skip_tests_with_existing_baselines, output_root, wait, force_procs, @@ -1144,7 +1144,7 @@ def _main_func(description=None): save_timing, queue, allow_baseline_overwrite, - allow_baseline_skip, + skip_tests_with_existing_baselines, output_root, wait, force_procs, diff --git a/CIME/test_scheduler.py b/CIME/test_scheduler.py index f147f404966..99ed08f614c 100644 --- a/CIME/test_scheduler.py +++ b/CIME/test_scheduler.py @@ -196,7 +196,7 @@ def __init__( save_timing=False, queue=None, allow_baseline_overwrite=False, - allow_baseline_skip=False, + skip_tests_with_existing_baselines=False, output_root=None, force_procs=None, force_threads=None, @@ -228,7 +228,7 @@ def __init__( self._input_dir = input_dir self._pesfile = pesfile self._allow_baseline_overwrite = allow_baseline_overwrite - self._allow_baseline_skip = allow_baseline_skip + self._skip_tests_with_existing_baselines = skip_tests_with_existing_baselines self._single_exe = single_exe if self._single_exe: self._allow_pnl = True @@ -350,7 +350,7 @@ def __init__( self._baseline_root, self._baseline_gen_name ) existing_baselines = [] - if allow_baseline_skip: + if skip_tests_with_existing_baselines: tests_to_skip = [] for test_name in test_names: test_baseline = os.path.join(full_baseline_dir, test_name) @@ -361,14 +361,14 @@ def __init__( clear_folder(os.path.join(test_baseline, "CaseDocs")) else: clear_folder(test_baseline) - elif allow_baseline_skip: + elif skip_tests_with_existing_baselines: tests_to_skip.append(test_name) expect( - allow_baseline_overwrite or len(existing_baselines) == 0 or allow_baseline_skip, + allow_baseline_overwrite or len(existing_baselines) == 0 or skip_tests_with_existing_baselines, "Baseline directories already exists {}\n" - "Use -o or --allow-baseline-skip to avoid this error".format(existing_baselines), + "Use -o or --skip-tests-with-existing-baselines to avoid this error".format(existing_baselines), ) - if allow_baseline_skip: + if skip_tests_with_existing_baselines: test_names = [test for test in test_names if test not in tests_to_skip] if self._config.sort_tests: diff --git a/CIME/utils.py b/CIME/utils.py index 51f725a973c..d7c7856656e 100644 --- a/CIME/utils.py +++ b/CIME/utils.py @@ -260,7 +260,7 @@ def _read_cime_config_file(): "walltime", "job_queue", "allow_baseline_overwrite", - "allow_baseline_skip", + "skip_tests_with_existing_baselines", "wait", "force_procs", "force_threads", From ff177e8bfc2670021013770dbbeacd667f5efc1e Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Wed, 22 Jan 2025 11:18:30 -0700 Subject: [PATCH 11/16] Add test_skip_run_with_existing_baseline. --- CIME/tests/base.py | 6 +++++- CIME/tests/test_sys_cime_case.py | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/CIME/tests/base.py b/CIME/tests/base.py index 44846919178..bd2c713b1bd 100644 --- a/CIME/tests/base.py +++ b/CIME/tests/base.py @@ -203,6 +203,7 @@ def _create_test( run_errors=False, env_changes="", default_baseline_area=False, + expect_cases_made=True, ): """ Convenience wrapper around create_test. Returns list of full paths to created cases. If multiple cases, @@ -260,7 +261,10 @@ def _create_test( ) cases.append(casedir) - self.assertTrue(len(cases) > 0, "create_test made no cases") + if expect_cases_made: + self.assertTrue(len(cases) > 0, "create_test made no cases") + else: + self.assertTrue(len(cases) == 0, "create_test unexpectedly made {} case(s)".format(len(cases))) return cases[0] if len(cases) == 1 else cases diff --git a/CIME/tests/test_sys_cime_case.py b/CIME/tests/test_sys_cime_case.py index d07456eb570..eb2ca4c6773 100644 --- a/CIME/tests/test_sys_cime_case.py +++ b/CIME/tests/test_sys_cime_case.py @@ -748,3 +748,22 @@ def test_case_clean(self): self.run_cmd_assert_result("./case.setup --clean", from_dir=casedir) self.run_cmd_assert_result("./case.setup --clean", from_dir=casedir) self.run_cmd_assert_result("./case.setup", from_dir=casedir) + + def test_skip_run_with_existing_baseline(self): + test_name = "TESTRUNPASS_P1.f19_g16_rx1.A" + create_test_extra_args = ["--generate", "baseline", "--no-build", test_name] + + orig_testroot = self._testroot + self._testroot = os.path.join(orig_testroot, "case0") + casedir_0 = self._create_test( + ["--output-root", "case0"] + create_test_extra_args, + test_id=self._baseline_name, + expect_cases_made=True, + ) + self._testroot = os.path.join(orig_testroot, "case1") + casedir_1 = self._create_test( + ["--output-root", "case1", "--skip-tests-with-existing-baselines"] + create_test_extra_args, + test_id=self._baseline_name, + expect_cases_made=False, + ) + self._testroot = orig_testroot From 6751504adf095d5d034e6406fbb0e914924aecff Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Wed, 22 Jan 2025 12:04:13 -0700 Subject: [PATCH 12/16] Reformat CIME/ with black. --- CIME/test_scheduler.py | 12 +++++++++--- CIME/tests/base.py | 5 ++++- CIME/tests/test_sys_cime_case.py | 3 ++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CIME/test_scheduler.py b/CIME/test_scheduler.py index 99ed08f614c..6b62e2eec9d 100644 --- a/CIME/test_scheduler.py +++ b/CIME/test_scheduler.py @@ -364,12 +364,18 @@ def __init__( elif skip_tests_with_existing_baselines: tests_to_skip.append(test_name) expect( - allow_baseline_overwrite or len(existing_baselines) == 0 or skip_tests_with_existing_baselines, + allow_baseline_overwrite + or len(existing_baselines) == 0 + or skip_tests_with_existing_baselines, "Baseline directories already exists {}\n" - "Use -o or --skip-tests-with-existing-baselines to avoid this error".format(existing_baselines), + "Use -o or --skip-tests-with-existing-baselines to avoid this error".format( + existing_baselines + ), ) if skip_tests_with_existing_baselines: - test_names = [test for test in test_names if test not in tests_to_skip] + test_names = [ + test for test in test_names if test not in tests_to_skip + ] if self._config.sort_tests: _order_tests_by_runtime(test_names, self._baseline_root) diff --git a/CIME/tests/base.py b/CIME/tests/base.py index bd2c713b1bd..cf7cf993caf 100644 --- a/CIME/tests/base.py +++ b/CIME/tests/base.py @@ -264,7 +264,10 @@ def _create_test( if expect_cases_made: self.assertTrue(len(cases) > 0, "create_test made no cases") else: - self.assertTrue(len(cases) == 0, "create_test unexpectedly made {} case(s)".format(len(cases))) + self.assertTrue( + len(cases) == 0, + "create_test unexpectedly made {} case(s)".format(len(cases)), + ) return cases[0] if len(cases) == 1 else cases diff --git a/CIME/tests/test_sys_cime_case.py b/CIME/tests/test_sys_cime_case.py index eb2ca4c6773..27cec9a36c5 100644 --- a/CIME/tests/test_sys_cime_case.py +++ b/CIME/tests/test_sys_cime_case.py @@ -762,7 +762,8 @@ def test_skip_run_with_existing_baseline(self): ) self._testroot = os.path.join(orig_testroot, "case1") casedir_1 = self._create_test( - ["--output-root", "case1", "--skip-tests-with-existing-baselines"] + create_test_extra_args, + ["--output-root", "case1", "--skip-tests-with-existing-baselines"] + + create_test_extra_args, test_id=self._baseline_name, expect_cases_made=False, ) From 1e9bf30660f33d170d21d2d1bd2dff2aa736f642 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Wed, 22 Jan 2025 12:04:46 -0700 Subject: [PATCH 13/16] Add previous commit to .git-blame-ignore-revs. --- .git-blame-ignore-revs | 1 + 1 file changed, 1 insertion(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index b6bc14420c7..413095f3551 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,3 +1,4 @@ # Migrated code style to Black eabf877cbb86b281fdd37a3fa3cc0edf9b8eb874 321463922724b225988e517da54a18bad90bc316 +6751504adf095d5d034e6406fbb0e914924aecff From 0e4bbb97f471329e8014cebba0422d7514287954 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Wed, 22 Jan 2025 12:41:14 -0700 Subject: [PATCH 14/16] Remove unused args from create_test call in test_skip_run_with_existing_baseline. --- CIME/tests/test_sys_cime_case.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CIME/tests/test_sys_cime_case.py b/CIME/tests/test_sys_cime_case.py index 27cec9a36c5..d8dcbca1859 100644 --- a/CIME/tests/test_sys_cime_case.py +++ b/CIME/tests/test_sys_cime_case.py @@ -756,14 +756,13 @@ def test_skip_run_with_existing_baseline(self): orig_testroot = self._testroot self._testroot = os.path.join(orig_testroot, "case0") casedir_0 = self._create_test( - ["--output-root", "case0"] + create_test_extra_args, + create_test_extra_args, test_id=self._baseline_name, expect_cases_made=True, ) self._testroot = os.path.join(orig_testroot, "case1") casedir_1 = self._create_test( - ["--output-root", "case1", "--skip-tests-with-existing-baselines"] - + create_test_extra_args, + ["--skip-tests-with-existing-baselines"] + create_test_extra_args, test_id=self._baseline_name, expect_cases_made=False, ) From 4147a4636d653bafc7a3edad9e5182a559c476aa Mon Sep 17 00:00:00 2001 From: Jim Edwards Date: Thu, 23 Jan 2025 07:14:30 -0700 Subject: [PATCH 15/16] allow for different args in e3sm testing --- CIME/tests/test_sys_cime_case.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CIME/tests/test_sys_cime_case.py b/CIME/tests/test_sys_cime_case.py index d8dcbca1859..30d58c32ddf 100644 --- a/CIME/tests/test_sys_cime_case.py +++ b/CIME/tests/test_sys_cime_case.py @@ -751,7 +751,11 @@ def test_case_clean(self): def test_skip_run_with_existing_baseline(self): test_name = "TESTRUNPASS_P1.f19_g16_rx1.A" - create_test_extra_args = ["--generate", "baseline", "--no-build", test_name] + + if self._config.test_mode == "cesm": + create_test_extra_args = ["--generate", "baseline", "--no-build", test_name] + else: + create_test_extra_args = ["-g", "--no-build", test_name] orig_testroot = self._testroot self._testroot = os.path.join(orig_testroot, "case0") From 664c7a26f276c08add56298e8b46df6af4725cad Mon Sep 17 00:00:00 2001 From: Jim Edwards Date: Thu, 23 Jan 2025 07:39:48 -0700 Subject: [PATCH 16/16] reverse -o and --allow-baseline-overwrite so that help message is more readable --- CIME/scripts/create_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CIME/scripts/create_test.py b/CIME/scripts/create_test.py index cb71b8ed5f5..051c7430592 100755 --- a/CIME/scripts/create_test.py +++ b/CIME/scripts/create_test.py @@ -359,8 +359,8 @@ def parse_command_line(args, description): existing_baseline_group = parser.add_mutually_exclusive_group() existing_baseline_group.add_argument( - "-o", "--allow-baseline-overwrite", + "-o", action="store_true", default=default, help="If the --generate option is given, then an attempt to overwrite "