From ff3448b75a5f416cb1f3a59f5ab642c8524169c5 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Mon, 18 Nov 2024 09:07:01 -0700 Subject: [PATCH 01/16] run_neon: Print case path. --- python/ctsm/site_and_regional/tower_site.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/ctsm/site_and_regional/tower_site.py b/python/ctsm/site_and_regional/tower_site.py index 31c959cac7..137c932197 100644 --- a/python/ctsm/site_and_regional/tower_site.py +++ b/python/ctsm/site_and_regional/tower_site.py @@ -95,6 +95,7 @@ def build_base_case( if not output_root: output_root = os.getcwd() case_path = os.path.join(output_root, self.name) + print(case_path) logger.info("base_case_name : %s", self.name) logger.info("user_mods_dir : %s", user_mods_dirs[0]) From 535bec106272486d3a02a6b96cde2e19c6fd95ad Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Mon, 18 Nov 2024 09:08:11 -0700 Subject: [PATCH 02/16] run_neon: Fix bug where --overwrite is ignored. Resolves ESCOMP/CTSM#2884. --- python/ctsm/site_and_regional/neon_site.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/ctsm/site_and_regional/neon_site.py b/python/ctsm/site_and_regional/neon_site.py index 70414d9e5c..ced4c4c64b 100755 --- a/python/ctsm/site_and_regional/neon_site.py +++ b/python/ctsm/site_and_regional/neon_site.py @@ -47,7 +47,8 @@ def build_base_case( user_mods_dirs = [ os.path.join(self.cesmroot, "cime_config", "usermods_dirs", "NEON", self.name) ] - case_path = super().build_base_case(cesmroot, output_root, res, compset, user_mods_dirs) + case_path = super().build_base_case(cesmroot, output_root, res, compset, user_mods_dirs, + overwrite=overwrite) return case_path From e74a63e3736678efc2aba4d47f6db36e1f2540c1 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Mon, 18 Nov 2024 09:11:11 -0700 Subject: [PATCH 03/16] run_neon: Improve help text for --base-case. --- python/ctsm/site_and_regional/neon_arg_parse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ctsm/site_and_regional/neon_arg_parse.py b/python/ctsm/site_and_regional/neon_arg_parse.py index 99f184dd62..db4a90c9e0 100644 --- a/python/ctsm/site_and_regional/neon_arg_parse.py +++ b/python/ctsm/site_and_regional/neon_arg_parse.py @@ -45,7 +45,7 @@ def get_parser(args, description, valid_neon_sites): "--base-case", help=""" Root Directory of base case build - [default: %(default)s] + [default: CESMROOT/NEONSITE] """, action="store", dest="base_case_root", From 49f44350b338790a255d605cfc511e7076729a4d Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Mon, 18 Nov 2024 09:29:41 -0700 Subject: [PATCH 04/16] run_neon: Fix issue where --setup-only was ignored. Resolves ESCOMP/CTSM#2885. --- python/ctsm/site_and_regional/neon_site.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ctsm/site_and_regional/neon_site.py b/python/ctsm/site_and_regional/neon_site.py index ced4c4c64b..073e0f75aa 100755 --- a/python/ctsm/site_and_regional/neon_site.py +++ b/python/ctsm/site_and_regional/neon_site.py @@ -48,7 +48,7 @@ def build_base_case( os.path.join(self.cesmroot, "cime_config", "usermods_dirs", "NEON", self.name) ] case_path = super().build_base_case(cesmroot, output_root, res, compset, user_mods_dirs, - overwrite=overwrite) + overwrite=overwrite, setup_only=setup_only) return case_path From 1caa2c955683ca202eb8c30b210f4b1222d7eaa9 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Mon, 18 Nov 2024 10:06:58 -0700 Subject: [PATCH 05/16] run_neon: Add --no-input-data-check option. --- python/ctsm/site_and_regional/neon_arg_parse.py | 17 +++++++++++++++++ python/ctsm/site_and_regional/neon_site.py | 4 ++++ python/ctsm/site_and_regional/run_neon.py | 2 ++ python/ctsm/site_and_regional/tower_site.py | 5 ++++- 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/python/ctsm/site_and_regional/neon_arg_parse.py b/python/ctsm/site_and_regional/neon_arg_parse.py index db4a90c9e0..3aa619aad3 100644 --- a/python/ctsm/site_and_regional/neon_arg_parse.py +++ b/python/ctsm/site_and_regional/neon_arg_parse.py @@ -91,6 +91,18 @@ def get_parser(args, description, valid_neon_sites): default=False, ) + parser.add_argument( + "--no-input-data-check", "--no-check-input-data", + help=""" + Don't check for input data. Implies --setup-only. + [default: %(default)s] + """, + action="store_true", + dest="no_input_data_check", + required=False, + default=False, + ) + parser.add_argument( "--rerun", help=""" @@ -223,6 +235,10 @@ def get_parser(args, description, valid_neon_sites): root_logger = logging.getLogger() root_logger.setLevel(logging.WARN) + # --no-input-data-check implies --setup-only + if args.no_input_data_check and not args.setup_only: + args.setup_only = True + return ( neon_sites, args.output_root, @@ -236,5 +252,6 @@ def get_parser(args, description, valid_neon_sites): args.setup_only, args.no_batch, args.rerun, + args.no_input_data_check, args.user_version, ) diff --git a/python/ctsm/site_and_regional/neon_site.py b/python/ctsm/site_and_regional/neon_site.py index 073e0f75aa..7978eac2ed 100755 --- a/python/ctsm/site_and_regional/neon_site.py +++ b/python/ctsm/site_and_regional/neon_site.py @@ -67,6 +67,7 @@ def run_case( no_batch=False, rerun=False, experiment=False, + no_input_data_check=False, ): """ Run case. @@ -93,6 +94,8 @@ def run_case( default False experiment: str, opt name of experiment, default False + no_input_data_check: bool, opt + default False """ user_mods_dirs = [ os.path.join(self.cesmroot, "cime_config", "usermods_dirs", "NEON", self.name) @@ -112,6 +115,7 @@ def run_case( no_batch, rerun, experiment, + no_input_data_check, ) def modify_user_nl(self, case_root, run_type, rundir, site_lines=None): diff --git a/python/ctsm/site_and_regional/run_neon.py b/python/ctsm/site_and_regional/run_neon.py index 3acbf435b1..d4ded645b7 100755 --- a/python/ctsm/site_and_regional/run_neon.py +++ b/python/ctsm/site_and_regional/run_neon.py @@ -194,6 +194,7 @@ def main(description): setup_only, no_batch, rerun, + no_input_data_check, user_version, ) = get_parser(sys.argv, description, valid_neon_sites) @@ -240,4 +241,5 @@ def main(description): no_batch=no_batch, rerun=rerun, experiment=experiment, + no_input_data_check=no_input_data_check, ) diff --git a/python/ctsm/site_and_regional/tower_site.py b/python/ctsm/site_and_regional/tower_site.py index 137c932197..7f83b29663 100644 --- a/python/ctsm/site_and_regional/tower_site.py +++ b/python/ctsm/site_and_regional/tower_site.py @@ -263,6 +263,7 @@ def run_case( no_batch, rerun, experiment, + no_input_data_check, ): """ Run case. @@ -413,8 +414,10 @@ def run_case( self.modify_user_nl(case_root, run_type, rundir) case.create_namelists() + # explicitly run check_input_data - case.check_all_input_data() + if not no_input_data_check: + case.check_all_input_data() if not setup_only: case.submit(no_batch=no_batch) print("-----------------------------------") From 3e63547b8b01db3f0ef41585f9af9f74ea23ee46 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Mon, 18 Nov 2024 10:25:19 -0700 Subject: [PATCH 06/16] run_neon: Add --xmlchange option. --- python/ctsm/site_and_regional/neon_arg_parse.py | 12 ++++++++++++ python/ctsm/site_and_regional/neon_site.py | 2 ++ python/ctsm/site_and_regional/run_neon.py | 2 ++ python/ctsm/site_and_regional/tower_site.py | 7 +++++++ 4 files changed, 23 insertions(+) diff --git a/python/ctsm/site_and_regional/neon_arg_parse.py b/python/ctsm/site_and_regional/neon_arg_parse.py index 3aa619aad3..7317c947fb 100644 --- a/python/ctsm/site_and_regional/neon_arg_parse.py +++ b/python/ctsm/site_and_regional/neon_arg_parse.py @@ -195,6 +195,17 @@ def get_parser(args, description, valid_neon_sites): choices=["v1", "v2", "v3"], ) + parser.add_argument( + "--xmlchange", + help=""" + Any xmlchanges (e.g., CLM_CO2_TYPE=constant,CCSM_CO2_PPMV=500) + [default: %(default)s] + """, + required=False, + type=str, + default=None, + ) + args = parse_args_and_handle_standard_logging_options(args, parser) if "all" in args.neon_sites: @@ -254,4 +265,5 @@ def get_parser(args, description, valid_neon_sites): args.rerun, args.no_input_data_check, args.user_version, + args.xmlchange, ) diff --git a/python/ctsm/site_and_regional/neon_site.py b/python/ctsm/site_and_regional/neon_site.py index 7978eac2ed..82ef7adf05 100755 --- a/python/ctsm/site_and_regional/neon_site.py +++ b/python/ctsm/site_and_regional/neon_site.py @@ -68,6 +68,7 @@ def run_case( rerun=False, experiment=False, no_input_data_check=False, + xmlchange=None, ): """ Run case. @@ -116,6 +117,7 @@ def run_case( rerun, experiment, no_input_data_check, + xmlchange, ) def modify_user_nl(self, case_root, run_type, rundir, site_lines=None): diff --git a/python/ctsm/site_and_regional/run_neon.py b/python/ctsm/site_and_regional/run_neon.py index d4ded645b7..2d9346d49e 100755 --- a/python/ctsm/site_and_regional/run_neon.py +++ b/python/ctsm/site_and_regional/run_neon.py @@ -196,6 +196,7 @@ def main(description): rerun, no_input_data_check, user_version, + xmlchange, ) = get_parser(sys.argv, description, valid_neon_sites) if output_root: @@ -242,4 +243,5 @@ def main(description): rerun=rerun, experiment=experiment, no_input_data_check=no_input_data_check, + xmlchange=xmlchange, ) diff --git a/python/ctsm/site_and_regional/tower_site.py b/python/ctsm/site_and_regional/tower_site.py index 7f83b29663..33b36b7613 100644 --- a/python/ctsm/site_and_regional/tower_site.py +++ b/python/ctsm/site_and_regional/tower_site.py @@ -264,6 +264,7 @@ def run_case( rerun, experiment, no_input_data_check, + xmlchange, ): """ Run case. @@ -411,6 +412,12 @@ def run_case( if not rundir: rundir = case.get_value("RUNDIR") + if xmlchange: + xmlchange_list = xmlchange.split(",") + for setting in xmlchange_list: + setting_split = setting.split("=") + case.set_value(*setting_split) + self.modify_user_nl(case_root, run_type, rundir) case.create_namelists() From e386a21965f753b0b65c230ff111d440420384c5 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Thu, 13 Feb 2025 13:46:25 -0700 Subject: [PATCH 07/16] Use no_input_data_check and xmlchange in Plumber2Site. --- python/ctsm/site_and_regional/plumber_site.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/python/ctsm/site_and_regional/plumber_site.py b/python/ctsm/site_and_regional/plumber_site.py index 3f06f2949b..7d03af8a40 100755 --- a/python/ctsm/site_and_regional/plumber_site.py +++ b/python/ctsm/site_and_regional/plumber_site.py @@ -49,7 +49,8 @@ def build_base_case( self.cesmroot, "cime_config", "usermods_dirs", "clm", "PLUMBER2", self.name ) ] - case_path = super().build_base_case(cesmroot, output_root, res, compset, user_mods_dirs) + case_path = super().build_base_case(cesmroot, output_root, res, compset, user_mods_dirs, + overwrite=overwrite, setup_only=setup_only) return case_path @@ -67,6 +68,8 @@ def run_case( no_batch=False, rerun=False, experiment=False, + no_input_data_check=False, + xmlchange=None, ): """ Run case. @@ -113,6 +116,8 @@ def run_case( no_batch, rerun, experiment, + no_input_data_check, + xmlchange, ) def set_ref_case(self, case): From e8fc526e0d7818d45f171488c78392c4ff63902a Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Thu, 13 Feb 2025 13:58:06 -0700 Subject: [PATCH 08/16] Reformat with black. --- python/ctsm/site_and_regional/neon_site.py | 11 +++++++++-- python/ctsm/site_and_regional/plumber_site.py | 11 +++++++++-- python/ctsm/site_and_regional/tower_arg_parse.py | 3 ++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/python/ctsm/site_and_regional/neon_site.py b/python/ctsm/site_and_regional/neon_site.py index e6f905ce82..3da43ac27a 100755 --- a/python/ctsm/site_and_regional/neon_site.py +++ b/python/ctsm/site_and_regional/neon_site.py @@ -50,8 +50,15 @@ def build_base_case( self.cesmroot, "cime_config", "usermods_dirs", "clm", "NEON", self.name ) ] - case_path = super().build_base_case(cesmroot, output_root, res, compset, user_mods_dirs, - overwrite=overwrite, setup_only=setup_only) + case_path = super().build_base_case( + cesmroot, + output_root, + res, + compset, + user_mods_dirs, + overwrite=overwrite, + setup_only=setup_only, + ) return case_path diff --git a/python/ctsm/site_and_regional/plumber_site.py b/python/ctsm/site_and_regional/plumber_site.py index 7d03af8a40..4048312627 100755 --- a/python/ctsm/site_and_regional/plumber_site.py +++ b/python/ctsm/site_and_regional/plumber_site.py @@ -49,8 +49,15 @@ def build_base_case( self.cesmroot, "cime_config", "usermods_dirs", "clm", "PLUMBER2", self.name ) ] - case_path = super().build_base_case(cesmroot, output_root, res, compset, user_mods_dirs, - overwrite=overwrite, setup_only=setup_only) + case_path = super().build_base_case( + cesmroot, + output_root, + res, + compset, + user_mods_dirs, + overwrite=overwrite, + setup_only=setup_only, + ) return case_path diff --git a/python/ctsm/site_and_regional/tower_arg_parse.py b/python/ctsm/site_and_regional/tower_arg_parse.py index 21dfef7836..29d04b710a 100644 --- a/python/ctsm/site_and_regional/tower_arg_parse.py +++ b/python/ctsm/site_and_regional/tower_arg_parse.py @@ -105,7 +105,8 @@ def get_parser(args, description, valid_neon_sites, valid_plumber_sites): ) parser.add_argument( - "--no-input-data-check", "--no-check-input-data", + "--no-input-data-check", + "--no-check-input-data", help=""" Don't check for input data. Implies --setup-only. [default: %(default)s] From 7cecdf3ad112e6d059a7554a0c765854bc986c19 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Thu, 13 Feb 2025 13:58:47 -0700 Subject: [PATCH 09/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 8960800172..1e73e65b4f 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -58,3 +58,4 @@ bd535c710db78420b8e8b9d71d88d8339e899c59 4b20bbd7003e6f77dab4e3268cc4a43f9b5a3b5d cf433215b58ba8776ec5edfb0b0d80c0836ed3a0 16d57ff37859b34dab005693e3085d64e2bcd95a +e8fc526e0d7818d45f171488c78392c4ff63902a From f0d56c4630b617501178848db5f71cdf4579289f Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Thu, 13 Feb 2025 14:00:43 -0700 Subject: [PATCH 10/16] Use --no-input-data-check in run_tower testing. --- python/ctsm/test/test_sys_run_tower.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/ctsm/test/test_sys_run_tower.py b/python/ctsm/test/test_sys_run_tower.py index b1eef6c3a9..6141e562b9 100755 --- a/python/ctsm/test/test_sys_run_tower.py +++ b/python/ctsm/test/test_sys_run_tower.py @@ -58,7 +58,7 @@ def test_one_site(self): os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), "--neon-sites", "BART", - "--setup-only", + "--no-input-data-check", "--experiment", "TEST", "--output-root", @@ -82,7 +82,7 @@ def test_ad_site(self): os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), "--neon-sites", "ABBY", - "--setup-only", + "--no-input-data-check", "--run-type", "ad", "--output-root", @@ -104,7 +104,7 @@ def test_plumber_site(self): os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), "--plumber-sites", "AR-SLu", - "--setup-only", + "--no-input-data-check", "--experiment", "TEST", "--output-root", From d7c058bbd1c5c4e4496ced80eb9ab0d5c970dd5b Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Thu, 13 Feb 2025 14:48:28 -0700 Subject: [PATCH 11/16] Add run_tower system tests of --xmlchange. --- python/ctsm/test/test_sys_run_tower.py | 65 ++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/python/ctsm/test/test_sys_run_tower.py b/python/ctsm/test/test_sys_run_tower.py index 6141e562b9..3520adabe5 100755 --- a/python/ctsm/test/test_sys_run_tower.py +++ b/python/ctsm/test/test_sys_run_tower.py @@ -15,6 +15,8 @@ from ctsm.site_and_regional.run_tower import main from ctsm.path_utils import path_to_ctsm_root +from CIME.case import Case + # Allow test names that pylint doesn't like; otherwise hard to make them # readable # pylint: disable=invalid-name @@ -115,6 +117,69 @@ def test_plumber_site(self): # assert that AR-SLu directories were created during setup self.assertTrue("AR-SLu" in glob.glob(self._tempdir + "/AR-SLu*")[0]) + def test_xmlchange_neon(self): + """ + This test checks that the --xmlchange argument is obeyed for a NEON site. + """ + + # run the run_tower tool + sys.argv = [ + os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), + "--neon-sites", + "BART", + "--no-input-data-check", + "--experiment", + "TEST", + "--xmlchange", + "CLM_CO2_TYPE=constant,CCSM_CO2_PPMV=1987", + "--output-root", + self._tempdir, + ] + print(sys.argv) + main("") + + # Check that the --xmlchange argument is obeyed + case_dir = os.path.join(self._tempdir, "BART.TEST.transient") + self.assertTrue(os.path.exists(case_dir)) + with Case(case_dir, read_only=True) as case: + value = case.get_value("CLM_CO2_TYPE") + print(f"CLM_CO2_TYPE = {value}") + self.assertTrue(value == "constant") + value = int(case.get_value("CCSM_CO2_PPMV")) + print(f"CCSM_CO2_PPMV = {value}") + self.assertTrue(int(value) == 1987) + + def test_xmlchange_plumber(self): + """ + This test checks that the --xmlchange argument is obeyed for a PLUMBER site. + """ + + # run the run_tower tool for plumber site + sys.argv = [ + os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), + "--plumber-sites", + "AR-SLu", + "--no-input-data-check", + "--experiment", + "TEST", + "--xmlchange", + "CLM_CO2_TYPE=constant,CCSM_CO2_PPMV=1987", + "--output-root", + self._tempdir, + ] + main("") + + # Check that the --xmlchange argument is obeyed + case_dir = os.path.join(self._tempdir, "AR-SLu.TEST.ad") + self.assertTrue(os.path.exists(case_dir)) + with Case(case_dir, read_only=True) as case: + value = case.get_value("CLM_CO2_TYPE") + print(f"CLM_CO2_TYPE = {value}") + self.assertTrue(value == "constant") + value = int(case.get_value("CCSM_CO2_PPMV")) + print(f"CCSM_CO2_PPMV = {value}") + self.assertTrue(int(value) == 1987) + if __name__ == "__main__": unit_testing.setup_for_tests() From 1a9535102eb9e057d33865255defebc1d2090113 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Thu, 13 Feb 2025 21:09:40 -0700 Subject: [PATCH 12/16] Add run_tower system tests of --setup-only. --- python/ctsm/test/test_sys_run_tower.py | 51 ++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/python/ctsm/test/test_sys_run_tower.py b/python/ctsm/test/test_sys_run_tower.py index 3520adabe5..b6e414319d 100755 --- a/python/ctsm/test/test_sys_run_tower.py +++ b/python/ctsm/test/test_sys_run_tower.py @@ -180,6 +180,57 @@ def test_xmlchange_plumber(self): print(f"CCSM_CO2_PPMV = {value}") self.assertTrue(int(value) == 1987) + def test_setup_only_neon(self): + """ + This test checks that the --setup-only argument is obeyed for NEON sites + """ + + # run the run_tower tool + site_name = "BART" + sys.argv = [ + os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), + "--neon-sites", + site_name, + "--setup-only", + "--experiment", + "TEST", + "--output-root", + self._tempdir, + ] + print(sys.argv) + main("") + + # make sure that build didn't happen: this dir should be empty + case_dir = os.path.join(self._tempdir, site_name) + build_dir_to_check = os.path.join(case_dir, "bld", "cpl", "obj") + self.assertTrue(os.path.exists(build_dir_to_check)) + self.assertTrue(len(os.listdir(build_dir_to_check)) == 0) + + def test_setup_only_plumber(self): + """ + This test checks that the --setup-only argument is obeyed for PLUMBER sites + """ + + # run the run_tower tool for plumber site + site_name = "AR-SLu" + sys.argv = [ + os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), + "--plumber-sites", + site_name, + "--setup-only", + "--experiment", + "TEST", + "--output-root", + self._tempdir, + ] + main("") + + # make sure that build didn't happen: this dir should be empty + case_dir = os.path.join(self._tempdir, site_name) + build_dir_to_check = os.path.join(case_dir, "bld", "cpl", "obj") + self.assertTrue(os.path.exists(build_dir_to_check)) + self.assertTrue(len(os.listdir(build_dir_to_check)) == 0) + if __name__ == "__main__": unit_testing.setup_for_tests() From 6fd238f19be95f702ac47a229ca04c897a245360 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Thu, 13 Feb 2025 21:46:21 -0700 Subject: [PATCH 13/16] Add run_tower system tests of --overwrite. --- python/ctsm/test/test_sys_run_tower.py | 68 ++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/python/ctsm/test/test_sys_run_tower.py b/python/ctsm/test/test_sys_run_tower.py index b6e414319d..0639563229 100755 --- a/python/ctsm/test/test_sys_run_tower.py +++ b/python/ctsm/test/test_sys_run_tower.py @@ -10,6 +10,7 @@ import tempfile import shutil import sys +import pathlib from ctsm import unit_testing from ctsm.site_and_regional.run_tower import main @@ -231,6 +232,73 @@ def test_setup_only_plumber(self): self.assertTrue(os.path.exists(build_dir_to_check)) self.assertTrue(len(os.listdir(build_dir_to_check)) == 0) + def test_overwrite_neon(self): + """ + This test checks that the --overwrite argument is obeyed for NEON sites + """ + + # run the run_tower tool once + site_name = "BART" + sys.argv = [ + os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), + "--neon-sites", + site_name, + "--no-input-data-check", + "--experiment", + "TEST", + "--output-root", + self._tempdir, + ] + print(sys.argv) + main("") + + # create a file that should be erased during the upcoming overwrite + case_dir = os.path.join(self._tempdir, site_name) + test_file = os.path.join(case_dir, "test_file") + pathlib.Path(test_file).touch() + self.assertTrue(os.path.exists(test_file)) + + # run the tool again, overwriting existing + sys.argv += ["--overwrite"] + print(sys.argv) + main("") + + # ensure that file we created is gone + self.assertFalse(os.path.exists(test_file)) + + def test_overwrite_plumber(self): + """ + This test checks that the --overwrite argument is obeyed for PLUMBER sites + """ + + # run the run_tower tool once + site_name = "AR-SLu" + sys.argv = [ + os.path.join(path_to_ctsm_root(), "tools", "site_and_regional", "run_tower"), + "--plumber-sites", + site_name, + "--no-input-data-check", + "--experiment", + "TEST", + "--output-root", + self._tempdir, + ] + main("") + + # create a file that should be erased during the upcoming overwrite + case_dir = os.path.join(self._tempdir, site_name) + test_file = os.path.join(case_dir, "test_file") + pathlib.Path(test_file).touch() + self.assertTrue(os.path.exists(test_file)) + + # run the tool again, overwriting existing + sys.argv += ["--overwrite"] + print(sys.argv) + main("") + + # ensure that file we created is gone + self.assertFalse(os.path.exists(test_file)) + if __name__ == "__main__": unit_testing.setup_for_tests() From bf4e6cf828759bb51a072dcee86fdc5b431632b9 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Fri, 14 Feb 2025 09:14:23 -0700 Subject: [PATCH 14/16] Satisfy pylint. --- python/ctsm/test/test_sys_run_tower.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/ctsm/test/test_sys_run_tower.py b/python/ctsm/test/test_sys_run_tower.py index 0639563229..19c3d5701a 100755 --- a/python/ctsm/test/test_sys_run_tower.py +++ b/python/ctsm/test/test_sys_run_tower.py @@ -16,6 +16,8 @@ from ctsm.site_and_regional.run_tower import main from ctsm.path_utils import path_to_ctsm_root +# pylint: disable=import-error +# pylint: disable=wrong-import-order from CIME.case import Case # Allow test names that pylint doesn't like; otherwise hard to make them From 4051ee0183cbcfcc77051cbb20c4f40960d20fd2 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Sat, 15 Feb 2025 12:20:24 -0700 Subject: [PATCH 15/16] Undo a change to a help message. --- python/ctsm/site_and_regional/tower_arg_parse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ctsm/site_and_regional/tower_arg_parse.py b/python/ctsm/site_and_regional/tower_arg_parse.py index 29d04b710a..33b3db2afa 100644 --- a/python/ctsm/site_and_regional/tower_arg_parse.py +++ b/python/ctsm/site_and_regional/tower_arg_parse.py @@ -58,7 +58,7 @@ def get_parser(args, description, valid_neon_sites, valid_plumber_sites): "--base-case", help=""" Root Directory of base case build - [default: CESMROOT/NEONSITE] + [default: %(default)s] """, action="store", dest="base_case_root", From 491507a22eb152f37179b3985a1f568b6ab059e8 Mon Sep 17 00:00:00 2001 From: Sam Rabin Date: Tue, 18 Feb 2025 15:37:17 -0700 Subject: [PATCH 16/16] Remove some unneeded print statements. --- python/ctsm/site_and_regional/tower_site.py | 1 - python/ctsm/test/test_sys_run_tower.py | 6 ------ 2 files changed, 7 deletions(-) diff --git a/python/ctsm/site_and_regional/tower_site.py b/python/ctsm/site_and_regional/tower_site.py index f03e56d819..aad6e0203c 100644 --- a/python/ctsm/site_and_regional/tower_site.py +++ b/python/ctsm/site_and_regional/tower_site.py @@ -128,7 +128,6 @@ def build_base_case( abort("Input output_root directory does NOT exist: " + str(output_root)) case_path = os.path.join(output_root, self.name) - print(case_path) logger.info("base_case_name : %s", self.name) logger.info("user_mods_dir : %s", user_mods_dirs[0]) diff --git a/python/ctsm/test/test_sys_run_tower.py b/python/ctsm/test/test_sys_run_tower.py index 19c3d5701a..04a318b46a 100755 --- a/python/ctsm/test/test_sys_run_tower.py +++ b/python/ctsm/test/test_sys_run_tower.py @@ -69,7 +69,6 @@ def test_one_site(self): "--output-root", self._tempdir, ] - print(sys.argv) main("") # assert that BART directories were created during setup @@ -138,7 +137,6 @@ def test_xmlchange_neon(self): "--output-root", self._tempdir, ] - print(sys.argv) main("") # Check that the --xmlchange argument is obeyed @@ -200,7 +198,6 @@ def test_setup_only_neon(self): "--output-root", self._tempdir, ] - print(sys.argv) main("") # make sure that build didn't happen: this dir should be empty @@ -251,7 +248,6 @@ def test_overwrite_neon(self): "--output-root", self._tempdir, ] - print(sys.argv) main("") # create a file that should be erased during the upcoming overwrite @@ -262,7 +258,6 @@ def test_overwrite_neon(self): # run the tool again, overwriting existing sys.argv += ["--overwrite"] - print(sys.argv) main("") # ensure that file we created is gone @@ -295,7 +290,6 @@ def test_overwrite_plumber(self): # run the tool again, overwriting existing sys.argv += ["--overwrite"] - print(sys.argv) main("") # ensure that file we created is gone