From 987ae5bbeba38416e64ab4e99c37db336b04a864 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Fri, 6 Dec 2024 10:55:54 -0500 Subject: [PATCH 001/144] added ctest dir with cmake to create an experment --- ci/scripts/ctests/CMakeLists.txt | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 ci/scripts/ctests/CMakeLists.txt diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt new file mode 100644 index 0000000000..9a09b5e275 --- /dev/null +++ b/ci/scripts/ctests/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.10) + +project(FunctionalTests) + +enable_testing() + +# Add a custom build step to run a script +add_custom_target(BuildScript + COMMAND bash ${CMAKE_SOURCE_DIR}/sorc/build_all.sh + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Running custom build script" +) + +# Add a CTest to run the generate_workflows.sh script with additional arguments +set(YAMLS "C48_ATM.yaml" CACHE STRING "YAML files separated by spaces") +set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS" ) + +# Get the Git hash +execute_process( + COMMAND git rev-parse --short HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +add_test(NAME CreateExperiment + COMMAND bash ${CMAKE_SOURCE_DIR}/workflow/generate_workflows.sh -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS}) From 61fcf83520a3ef1ccc86bb1d60cc9dff0004359f Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 6 Dec 2024 11:07:35 -0600 Subject: [PATCH 002/144] added CMakeLists for creating initial case EXPDIR usint ctest --- ci/scripts/ctests/CMakeLists.txt | 10 ++-------- workflow/generate_workflows.sh | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index 9a09b5e275..f1c0872681 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -4,16 +4,10 @@ project(FunctionalTests) enable_testing() -# Add a custom build step to run a script -add_custom_target(BuildScript - COMMAND bash ${CMAKE_SOURCE_DIR}/sorc/build_all.sh - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Running custom build script" -) - # Add a CTest to run the generate_workflows.sh script with additional arguments set(YAMLS "C48_ATM.yaml" CACHE STRING "YAML files separated by spaces") set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS" ) +set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../../..) # Get the Git hash execute_process( @@ -24,4 +18,4 @@ execute_process( ) add_test(NAME CreateExperiment - COMMAND bash ${CMAKE_SOURCE_DIR}/workflow/generate_workflows.sh -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS}) + COMMAND bash ${HOMEgfs}/workflow/generate_workflows.sh -H ${HOMEgfs} -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS}) diff --git a/workflow/generate_workflows.sh b/workflow/generate_workflows.sh index 6a4cb9910a..10334dce2d 100755 --- a/workflow/generate_workflows.sh +++ b/workflow/generate_workflows.sh @@ -462,7 +462,7 @@ echo "Running create_experiment.py for ${#_yaml_list[@]} cases" for _case in "${_yaml_list[@]}"; do [[ "${_verbose}" == false ]] && echo "${_case}" _pslot="${_case}${_tag}" - _create_exp_cmd="./create_experiment.py -y ../ci/cases/pr/${_case}.yaml --overwrite" + _create_exp_cmd="${HOMEgfs}/workflow/create_experiment.py -y ${HOMEgfs}/ci/cases/pr/${_case}.yaml --overwrite" if [[ "${_verbose}" == true ]]; then pslot=${_pslot} RUNTESTS=${_runtests} ${_create_exp_cmd} else From f5f65959c210e766367a8fcc3a53c756c885ee27 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Fri, 6 Dec 2024 13:34:33 -0500 Subject: [PATCH 003/144] ready to test getting the job names --- ci/scripts/ctests/CMakeLists.txt | 18 +++++++++ ci/scripts/utils/get_job_names.py | 63 +++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100755 ci/scripts/utils/get_job_names.py diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index f1c0872681..9974918004 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -19,3 +19,21 @@ execute_process( add_test(NAME CreateExperiment COMMAND bash ${HOMEgfs}/workflow/generate_workflows.sh -H ${HOMEgfs} -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS}) + + +execute_process( + COMMAND ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.py get_pslot_list ${RUNTESTS} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE PSLOT_LIST + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +execute_process( + COMMAND ${HOMEgfs}/ci/scripts/utils/git_job_names.py -xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE JOB_NAMES + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# Output the job names +message(STATUS "Job names: ${JOB_NAMES}") \ No newline at end of file diff --git a/ci/scripts/utils/get_job_names.py b/ci/scripts/utils/get_job_names.py new file mode 100755 index 0000000000..6995464681 --- /dev/null +++ b/ci/scripts/utils/get_job_names.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +import os +from lxml import etree +from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter + +def valid_file_path(path): + """ + Check if the provided path is a valid file. + + Args: + path (str): The file path. + + Returns: + str: The absolute path if valid. + + Raises: + argparse.ArgumentTypeError: If the path is not a valid file. + """ + if os.path.isfile(path): + return os.path.abspath(path) + else: + raise argparse.ArgumentTypeError(f"Invalid file path: {path}") + +def input_args(): + + description = "Extracts the string between tags within tags." + parser = ArgumentParser(description=description, + formatter_class=ArgumentDefaultsHelpFormatter) + + parser.add_argument('--xmlfile', type=valid_file_path, help='The path to the XML file.') + return parser.parse_args() + +def get_cyclestr_from_jobname(xml_file): + """ + Extracts the string between tags within tags. + + Args: + xml_file (str): The path to the XML file. + + Returns: + list: A list of strings found between tags within tags. + """ + tree = etree.parse(xml_file) + root = tree.getroot() + cyclestr_list = [] + + for jobname in root.findall('.//jobname'): + cyclestr = jobname.find('cyclestr') + if cyclestr is not None: + cyclestr_list.append(cyclestr.text) + + return cyclestr_list + +# Example usage +if __name__ == "__main__": + args = input_args() + xml_file = args.xmlfile + job_names = get_cyclestr_from_jobname(xml_file) + for job_name in job_names: + if "#" not in job_name: + if job_name.endswith("_@H"): + job_name = job_name[:-3] + print(job_name) From cbe3baba8b57775c64e7c23d6d5d5d41181ecc1f Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Fri, 6 Dec 2024 14:26:02 -0500 Subject: [PATCH 004/144] move all operations of creating EXPDIR cases into configure phase --- ci/scripts/ctests/CMakeLists.txt | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index 9974918004..c88ee54670 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -17,22 +17,23 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -add_test(NAME CreateExperiment - COMMAND bash ${HOMEgfs}/workflow/generate_workflows.sh -H ${HOMEgfs} -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS}) - +execute_process(NAME CreateExperiment + COMMAND bash ${HOMEgfs}/workflow/generate_workflows.sh -H ${HOMEgfs} -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} +) -execute_process( - COMMAND ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.py get_pslot_list ${RUNTESTS} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +execute_process(NAME GetPslotList + COMMAND ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.py get_pslot_list ${RUNTESTS} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE PSLOT_LIST OUTPUT_STRIP_TRAILING_WHITESPACE ) -execute_process( - COMMAND ${HOMEgfs}/ci/scripts/utils/git_job_names.py -xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +execute_process(NAME GetJobNames + OUTPUT ${CMAKE_BINARY_DIR}/job_names.txt + COMMAND ${HOMEgfs}/ci/scripts/utils/git_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml OUTPUT_VARIABLE JOB_NAMES - OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) # Output the job names From 6a50e14abd797d993fe241735de9d735f3e57241 Mon Sep 17 00:00:00 2001 From: "Terry.McGuinness" Date: Fri, 6 Dec 2024 22:32:03 +0000 Subject: [PATCH 005/144] got cmake configure to work for EXPDIR --- ci/scripts/ctests/CMakeLists.txt | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index c88ee54670..dae7575e35 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -7,7 +7,7 @@ enable_testing() # Add a CTest to run the generate_workflows.sh script with additional arguments set(YAMLS "C48_ATM.yaml" CACHE STRING "YAML files separated by spaces") set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS" ) -set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../../..) +set(HOMEGFS ${CMAKE_CURRENT_SOURCE_DIR}/../../..) # Get the Git hash execute_process( @@ -17,24 +17,29 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -execute_process(NAME CreateExperiment - COMMAND bash ${HOMEgfs}/workflow/generate_workflows.sh -H ${HOMEgfs} -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS} +execute_process( + COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -u -H ${HOMEGFS} -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) -execute_process(NAME GetPslotList - COMMAND ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.py get_pslot_list ${RUNTESTS} +execute_process( + COMMAND ${HOMEGFS}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE PSLOT_LIST OUTPUT_STRIP_TRAILING_WHITESPACE ) -execute_process(NAME GetJobNames - OUTPUT ${CMAKE_BINARY_DIR}/job_names.txt - COMMAND ${HOMEgfs}/ci/scripts/utils/git_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml - OUTPUT_VARIABLE JOB_NAMES +message(STATUS "pslots: ${PSLOT_LIST}") +message(STATUS "xmlfile: ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") + +execute_process( + COMMAND ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml + COMMAND_ECHO STDOUT WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ENCODING UTF-8 + OUTPUT_VARIABLE JOB_NAMES + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_FILE job_names.txt ) -# Output the job names -message(STATUS "Job names: ${JOB_NAMES}") \ No newline at end of file +message(STATUS "Job Names: \"${JOB_NAMES}\"") From bcebecadbd43c7fb4deb12b54bab9cdfcf3a318f Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Fri, 6 Dec 2024 17:38:27 -0500 Subject: [PATCH 006/144] can not do both file and variable save for execute_process --- ci/scripts/ctests/CMakeLists.txt | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index dae7575e35..763f8678fa 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -7,7 +7,7 @@ enable_testing() # Add a CTest to run the generate_workflows.sh script with additional arguments set(YAMLS "C48_ATM.yaml" CACHE STRING "YAML files separated by spaces") set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS" ) -set(HOMEGFS ${CMAKE_CURRENT_SOURCE_DIR}/../../..) +set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../../..) # Get the Git hash execute_process( @@ -17,29 +17,23 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -execute_process( - COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -u -H ${HOMEGFS} -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS} +execute_process(NAME CreateExperiment + COMMAND bash ${HOMEgfs}/workflow/generate_workflows.sh -H ${HOMEgfs} -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) -execute_process( - COMMAND ${HOMEGFS}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS} +execute_process(NAME GetPslotList + COMMAND ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.py get_pslot_list ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE PSLOT_LIST OUTPUT_STRIP_TRAILING_WHITESPACE ) -message(STATUS "pslots: ${PSLOT_LIST}") -message(STATUS "xmlfile: ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") - execute_process( - COMMAND ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml - COMMAND_ECHO STDOUT + COMMAND ${HOMEgfs}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ENCODING UTF-8 - OUTPUT_VARIABLE JOB_NAMES - OUTPUT_STRIP_TRAILING_WHITESPACE - OUTPUT_FILE job_names.txt + OUTPUT_FILE ${CMAKE_BINARY_DIR}/job_names.txt ) -message(STATUS "Job Names: \"${JOB_NAMES}\"") +file(READ ${CMAKE_BINARY_DIR}/job_names.txt JOB_NAMES) +message(STATUS "Job names: ${JOB_NAMES}") \ No newline at end of file From be7a8905abc9d9c57fd4c0364ac90f2fa423de76 Mon Sep 17 00:00:00 2001 From: "Terry.McGuinness" Date: Fri, 6 Dec 2024 22:52:53 +0000 Subject: [PATCH 007/144] working cmake config up to output of job names --- ci/scripts/ctests/CMakeLists.txt | 14 +++++++------- ci/scripts/utils/get_job_names.py | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index 763f8678fa..a6913a7132 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -7,7 +7,7 @@ enable_testing() # Add a CTest to run the generate_workflows.sh script with additional arguments set(YAMLS "C48_ATM.yaml" CACHE STRING "YAML files separated by spaces") set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS" ) -set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../../..) +set(HOMEGFS ${CMAKE_CURRENT_SOURCE_DIR}/../../..) # Get the Git hash execute_process( @@ -17,23 +17,23 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -execute_process(NAME CreateExperiment - COMMAND bash ${HOMEgfs}/workflow/generate_workflows.sh -H ${HOMEgfs} -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS} +execute_process( + COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -H ${HOMEGFS} -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) -execute_process(NAME GetPslotList - COMMAND ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.py get_pslot_list ${RUNTESTS} +execute_process( + COMMAND ${HOMEGFS}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE PSLOT_LIST OUTPUT_STRIP_TRAILING_WHITESPACE ) execute_process( - COMMAND ${HOMEgfs}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml + COMMAND ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_FILE ${CMAKE_BINARY_DIR}/job_names.txt ) file(READ ${CMAKE_BINARY_DIR}/job_names.txt JOB_NAMES) -message(STATUS "Job names: ${JOB_NAMES}") \ No newline at end of file +message(STATUS "Job names: ${JOB_NAMES}") diff --git a/ci/scripts/utils/get_job_names.py b/ci/scripts/utils/get_job_names.py index 6995464681..286324135d 100755 --- a/ci/scripts/utils/get_job_names.py +++ b/ci/scripts/utils/get_job_names.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import os from lxml import etree -from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter +from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, ArgumentTypeError def valid_file_path(path): """ @@ -19,7 +19,7 @@ def valid_file_path(path): if os.path.isfile(path): return os.path.abspath(path) else: - raise argparse.ArgumentTypeError(f"Invalid file path: {path}") + raise ArgumentTypeError(f"Invalid file path: {path}") def input_args(): From 70a8183f96513f3dec187888295e503436e594c6 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 9 Dec 2024 11:42:57 -0600 Subject: [PATCH 008/144] loop over jobnames and create an experment for each --- ci/scripts/ctests/CMakeLists.txt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index a6913a7132..3cebbba05f 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -4,12 +4,14 @@ project(FunctionalTests) enable_testing() + + # Add a CTest to run the generate_workflows.sh script with additional arguments -set(YAMLS "C48_ATM.yaml" CACHE STRING "YAML files separated by spaces") +set(CASE "C48_ATM") set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS" ) set(HOMEGFS ${CMAKE_CURRENT_SOURCE_DIR}/../../..) -# Get the Git hash + execute_process( COMMAND git rev-parse --short HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} @@ -18,7 +20,7 @@ execute_process( ) execute_process( - COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -H ${HOMEGFS} -y ${YAMLS} -t ${GIT_HASH} ${RUNTESTS} + COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${GIT_HASH} ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) @@ -36,4 +38,13 @@ execute_process( ) file(READ ${CMAKE_BINARY_DIR}/job_names.txt JOB_NAMES) -message(STATUS "Job names: ${JOB_NAMES}") +message(STATUS "Job names:\n${JOB_NAMES}") + +foreach(JOB IN LISTS JOB_NAMES) +execute_process( + COMMAND bash -c "JOB="${JOB#"CASE"}"" + COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB} ${RUNTESTS} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} +) +endforeach() + From 72e5a9ccc61d9cc14636670476b4223f1fa134c2 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Mon, 9 Dec 2024 12:50:11 -0500 Subject: [PATCH 009/144] update JOB name update in loop --- ci/scripts/ctests/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index 3cebbba05f..39e5085f25 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -41,10 +41,10 @@ file(READ ${CMAKE_BINARY_DIR}/job_names.txt JOB_NAMES) message(STATUS "Job names:\n${JOB_NAMES}") foreach(JOB IN LISTS JOB_NAMES) -execute_process( - COMMAND bash -c "JOB="${JOB#"CASE"}"" - COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB} ${RUNTESTS} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} -) + string(REGEX REPLACE "^CASE" "" JOB_MODIFIED ${JOB}) + execute_process( + COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED} ${RUNTESTS} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) endforeach() From 1f1fcd6549817a437a54a2d7ffa3ece49e2ddf28 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Mon, 9 Dec 2024 13:12:10 -0500 Subject: [PATCH 010/144] addded debug outputs --- ci/scripts/ctests/CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index 39e5085f25..0a8a7b3448 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -4,14 +4,14 @@ project(FunctionalTests) enable_testing() - +set(CMAKE_VERBOSE_MAKEFILE ON) # Add a CTest to run the generate_workflows.sh script with additional arguments set(CASE "C48_ATM") set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS" ) set(HOMEGFS ${CMAKE_CURRENT_SOURCE_DIR}/../../..) - +message(STATUS "Executing: git rev-parse --short HEAD") execute_process( COMMAND git rev-parse --short HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} @@ -19,11 +19,13 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) +message(STATUS "Executing: bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${GIT_HASH} ${RUNTESTS}") execute_process( COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${GIT_HASH} ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) +message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS}") execute_process( COMMAND ${HOMEGFS}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} @@ -31,6 +33,7 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) +message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") execute_process( COMMAND ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml WORKING_DIRECTORY ${CMAKE_BINARY_DIR} @@ -42,6 +45,7 @@ message(STATUS "Job names:\n${JOB_NAMES}") foreach(JOB IN LISTS JOB_NAMES) string(REGEX REPLACE "^CASE" "" JOB_MODIFIED ${JOB}) + message(STATUS "Executing: bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED} ${RUNTESTS}") execute_process( COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED} ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} From ee27b024bfbd9e5dd8082942dac0c5331d75de23 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 9 Dec 2024 13:45:36 -0600 Subject: [PATCH 011/144] modifying plslot list to be only on a per case --- ci/scripts/ctests/CMakeLists.txt | 65 +++++++++++++++++++------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index 0a8a7b3448..83a4584a77 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -6,10 +6,10 @@ enable_testing() set(CMAKE_VERBOSE_MAKEFILE ON) -# Add a CTest to run the generate_workflows.sh script with additional arguments -set(CASE "C48_ATM") +set(CASE_LIST "C48_ATM" "C48_S2SW" "C96_S2SWA_gefs_replay_ics") set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS" ) set(HOMEGFS ${CMAKE_CURRENT_SOURCE_DIR}/../../..) +file(REMOVE_RECURSE ${RUNTESTS}) message(STATUS "Executing: git rev-parse --short HEAD") execute_process( @@ -19,36 +19,47 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -message(STATUS "Executing: bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${GIT_HASH} ${RUNTESTS}") -execute_process( - COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${GIT_HASH} ${RUNTESTS} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} -) - -message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS}") -execute_process( - COMMAND ${HOMEGFS}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - OUTPUT_VARIABLE PSLOT_LIST - OUTPUT_STRIP_TRAILING_WHITESPACE -) -message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") -execute_process( - COMMAND ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - OUTPUT_FILE ${CMAKE_BINARY_DIR}/job_names.txt -) +function(GenerateJobWorkflows CASE) -file(READ ${CMAKE_BINARY_DIR}/job_names.txt JOB_NAMES) -message(STATUS "Job names:\n${JOB_NAMES}") + message(STATUS "Executing: bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${GIT_HASH} ${RUNTESTS}") + execute_process( + COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${GIT_HASH} ${RUNTESTS} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + + message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS}") + execute_process( + COMMAND ${HOMEGFS}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + OUTPUT_VARIABLE PSLOT_LIST + OUTPUT_STRIP_TRAILING_WHITESPACE + ) -foreach(JOB IN LISTS JOB_NAMES) - string(REGEX REPLACE "^CASE" "" JOB_MODIFIED ${JOB}) - message(STATUS "Executing: bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED} ${RUNTESTS}") + message(STATUS "PSLOT list: ${PSLOT_LIST}\n\n") + + message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") execute_process( - COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED} ${RUNTESTS} + COMMAND ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + OUTPUT_FILE ${CMAKE_BINARY_DIR}/${CASE}_jobs.txt ) + + file(STRINGS ${CMAKE_BINARY_DIR}/${CASE}_jobs.txt JOB_NAMES) + message(STATUS "Job names:\n${JOB_NAMES}") + + foreach(JOB IN LISTS JOB_NAMES) + string(REGEX REPLACE "^${CASE}_" "" JOB_MODIFIED ${JOB}) + message(STATUS "Executing: bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED} ${RUNTESTS}") + execute_process( + COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED} ${RUNTESTS} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + endforeach() + +endfunction() + +foreach(CASE IN LISTS CASE_LIST) + GenerateJobWorkflows(${CASE}) endforeach() From bc76ddfc1a9278d44c16d24b6508aa58b3a23331 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Mon, 9 Dec 2024 14:50:38 -0500 Subject: [PATCH 012/144] filter pslot list for only relevent cases --- ci/scripts/ctests/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index 83a4584a77..1fb8b85b90 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -36,7 +36,8 @@ function(GenerateJobWorkflows CASE) OUTPUT_STRIP_TRAILING_WHITESPACE ) - message(STATUS "PSLOT list: ${PSLOT_LIST}\n\n") + string(REGEX MATCHALL "${CASE}_[^;]+" PSLOT_LIST "${PSLOT_LIST}") + message(STATUS "Filtered PSLOT list: ${PSLOT_LIST}\n\n") message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") execute_process( From 38838a67407acde3f8e9d4589868432bea5e9ebe Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Mon, 9 Dec 2024 15:13:09 -0500 Subject: [PATCH 013/144] refining get_job_names --- ci/scripts/utils/get_job_names.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/ci/scripts/utils/get_job_names.py b/ci/scripts/utils/get_job_names.py index 286324135d..eb1c7a7fee 100755 --- a/ci/scripts/utils/get_job_names.py +++ b/ci/scripts/utils/get_job_names.py @@ -22,40 +22,39 @@ def valid_file_path(path): raise ArgumentTypeError(f"Invalid file path: {path}") def input_args(): - - description = "Extracts the string between tags within tags." + description = "Extracts the string between and tags." parser = ArgumentParser(description=description, formatter_class=ArgumentDefaultsHelpFormatter) parser.add_argument('--xmlfile', type=valid_file_path, help='The path to the XML file.') return parser.parse_args() -def get_cyclestr_from_jobname(xml_file): +def get_names_from_tags(xml_file): """ - Extracts the string between tags within tags. + Extracts the string between and tags. Args: xml_file (str): The path to the XML file. Returns: - list: A list of strings found between tags within tags. + list: A list of strings found between and tags. """ tree = etree.parse(xml_file) root = tree.getroot() - cyclestr_list = [] + name_list = [] - for jobname in root.findall('.//jobname'): - cyclestr = jobname.find('cyclestr') - if cyclestr is not None: - cyclestr_list.append(cyclestr.text) + for tag in ['task name', 'metatask name']: + for element in root.findall(f'.//{tag.replace(" ", "")}'): + if element is not None: + name_list.append(element.text) - return cyclestr_list + return name_list # Example usage if __name__ == "__main__": args = input_args() xml_file = args.xmlfile - job_names = get_cyclestr_from_jobname(xml_file) + job_names = get_names_from_tags(xml_file) for job_name in job_names: if "#" not in job_name: if job_name.endswith("_@H"): From d18ad01a9d9b1d1f83ac60115c65fb46ed8dbb50 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Mon, 9 Dec 2024 15:28:57 -0500 Subject: [PATCH 014/144] modigied get_jobs_names to task and metatask names --- ci/scripts/utils/get_job_names.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ci/scripts/utils/get_job_names.py b/ci/scripts/utils/get_job_names.py index eb1c7a7fee..cb2f2c18ad 100755 --- a/ci/scripts/utils/get_job_names.py +++ b/ci/scripts/utils/get_job_names.py @@ -22,31 +22,32 @@ def valid_file_path(path): raise ArgumentTypeError(f"Invalid file path: {path}") def input_args(): - description = "Extracts the string between and tags." + description = "Extracts the values of and tags." parser = ArgumentParser(description=description, formatter_class=ArgumentDefaultsHelpFormatter) - parser.add_argument('--xmlfile', type=valid_file_path, help='The path to the XML file.') + parser.add_argument('--xml', type=valid_file_path, help='The path to the XML file.') return parser.parse_args() def get_names_from_tags(xml_file): """ - Extracts the string between and tags. + Extracts the values of and tags. Args: xml_file (str): The path to the XML file. Returns: - list: A list of strings found between and tags. + list: A list of values found in and tags. """ tree = etree.parse(xml_file) root = tree.getroot() name_list = [] - for tag in ['task name', 'metatask name']: - for element in root.findall(f'.//{tag.replace(" ", "")}'): - if element is not None: - name_list.append(element.text) + for tag in ['task', 'metatask']: + for element in root.findall(f'.//{tag}'): + name = element.get('name') + if name is not None: + name_list.append(name) return name_list From ef0e0667794d4d81a1ca306ea8721f599fd79810 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 9 Dec 2024 15:04:47 -0600 Subject: [PATCH 015/144] got better jobname parcer working --- ci/scripts/ctests/CMakeLists.txt | 8 ++++---- ci/scripts/utils/get_job_names.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index 1fb8b85b90..aa7abe45b1 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -39,9 +39,9 @@ function(GenerateJobWorkflows CASE) string(REGEX MATCHALL "${CASE}_[^;]+" PSLOT_LIST "${PSLOT_LIST}") message(STATUS "Filtered PSLOT list: ${PSLOT_LIST}\n\n") - message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") + message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") execute_process( - COMMAND ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xmlfile ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml + COMMAND ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_FILE ${CMAKE_BINARY_DIR}/${CASE}_jobs.txt ) @@ -51,9 +51,9 @@ function(GenerateJobWorkflows CASE) foreach(JOB IN LISTS JOB_NAMES) string(REGEX REPLACE "^${CASE}_" "" JOB_MODIFIED ${JOB}) - message(STATUS "Executing: bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED} ${RUNTESTS}") + message(STATUS "Executing: bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED} ${RUNTESTS}") execute_process( - COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED} ${RUNTESTS} + COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED}_${GIT_HASH} ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) endforeach() diff --git a/ci/scripts/utils/get_job_names.py b/ci/scripts/utils/get_job_names.py index cb2f2c18ad..eb7ca53207 100755 --- a/ci/scripts/utils/get_job_names.py +++ b/ci/scripts/utils/get_job_names.py @@ -54,7 +54,7 @@ def get_names_from_tags(xml_file): # Example usage if __name__ == "__main__": args = input_args() - xml_file = args.xmlfile + xml_file = args.xml job_names = get_names_from_tags(xml_file) for job_name in job_names: if "#" not in job_name: From f813a1b5e78acaf996eeeb79c8ff21457d8349d7 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Tue, 10 Dec 2024 16:01:42 -0500 Subject: [PATCH 016/144] replaced generate_workflows with create_experment --- ci/scripts/ctests/CMakeLists.txt | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index aa7abe45b1..64cdae616d 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -6,11 +6,14 @@ enable_testing() set(CMAKE_VERBOSE_MAKEFILE ON) -set(CASE_LIST "C48_ATM" "C48_S2SW" "C96_S2SWA_gefs_replay_ics") +set(CASE_LIST "C48_ATM" "C48_S2SW") set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS" ) -set(HOMEGFS ${CMAKE_CURRENT_SOURCE_DIR}/../../..) +set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../../..) +set(CASE_PATH ${HOMEgfs}/ci/cases/pr) file(REMOVE_RECURSE ${RUNTESTS}) +set(CREATE_EXPERIMENT_CMD "${HOMEgfs}/workflow/create_experiment.py") + message(STATUS "Executing: git rev-parse --short HEAD") execute_process( COMMAND git rev-parse --short HEAD @@ -19,12 +22,11 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) +function(GenerateExperiments CASE) -function(GenerateJobWorkflows CASE) - - message(STATUS "Executing: bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${GIT_HASH} ${RUNTESTS}") execute_process( - COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${GIT_HASH} ${RUNTESTS} + COMMAND ${CREATE_EXPERIMENT_CMD} -yaml ${CASE_PATH}/${CASE}.yaml + ENVIRONMENT "pslot=${CASE}_${GIT_HASH}" "RUNTESTS=${RUNTESTS}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) @@ -41,7 +43,7 @@ function(GenerateJobWorkflows CASE) message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") execute_process( - COMMAND ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml + COMMAND ${HOMEgfs}/ci/scripts/utils/get_job_names.py --xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_FILE ${CMAKE_BINARY_DIR}/${CASE}_jobs.txt ) @@ -51,9 +53,10 @@ function(GenerateJobWorkflows CASE) foreach(JOB IN LISTS JOB_NAMES) string(REGEX REPLACE "^${CASE}_" "" JOB_MODIFIED ${JOB}) - message(STATUS "Executing: bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED} ${RUNTESTS}") + message(STATUS "Executing: ${CREATE_EXPERIMENT_CMD} -yaml ${CASE_PATH}/${CASE}.yaml") execute_process( - COMMAND bash ${HOMEGFS}/workflow/generate_workflows.sh -V -H ${HOMEGFS} -y ${CASE}.yaml -t ${JOB_MODIFIED}_${GIT_HASH} ${RUNTESTS} + COMMAND ${CREATE_EXPERIMENT_CMD} -yaml ${CASE_PATH}/${CASE}.yaml + ENVIRONMENT "pslot=${CASE}_${JOB_MODIFIED}_${GIT_HASH}" "RUNTESTS=${RUNTESTS}" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) endforeach() @@ -61,6 +64,5 @@ function(GenerateJobWorkflows CASE) endfunction() foreach(CASE IN LISTS CASE_LIST) - GenerateJobWorkflows(${CASE}) + GenerateExperiments(${CASE}) endforeach() - From 8238228ef4c4e338c2d75a18e2454c827ca82451 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Tue, 10 Dec 2024 16:24:04 -0500 Subject: [PATCH 017/144] removed non-existing ENVIRONMENT setting to consolated COMMAND line --- ci/scripts/ctests/CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index 64cdae616d..b1289accbf 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -25,8 +25,7 @@ execute_process( function(GenerateExperiments CASE) execute_process( - COMMAND ${CREATE_EXPERIMENT_CMD} -yaml ${CASE_PATH}/${CASE}.yaml - ENVIRONMENT "pslot=${CASE}_${GIT_HASH}" "RUNTESTS=${RUNTESTS}" + COMMAND bash -c "pslot=${CASE}_${GIT_HASH}; RUNTESTS=${RUNTESTS}; ${CREATE_EXPERIMENT_CMD} -yaml ${CASE_PATH}/${CASE}.yaml" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) @@ -55,8 +54,7 @@ function(GenerateExperiments CASE) string(REGEX REPLACE "^${CASE}_" "" JOB_MODIFIED ${JOB}) message(STATUS "Executing: ${CREATE_EXPERIMENT_CMD} -yaml ${CASE_PATH}/${CASE}.yaml") execute_process( - COMMAND ${CREATE_EXPERIMENT_CMD} -yaml ${CASE_PATH}/${CASE}.yaml - ENVIRONMENT "pslot=${CASE}_${JOB_MODIFIED}_${GIT_HASH}" "RUNTESTS=${RUNTESTS}" + COMMAND bash -c "pslot=${CASE}_${JOB_MODIFIED}_${GIT_HASH}; RUNTESTS=${RUNTESTS}; ${CREATE_EXPERIMENT_CMD} -yaml ${CASE_PATH}/${CASE}.yaml" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) endforeach() From bf579eea95f64c0e2a3062cd57059b95ef8bfb84 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 10 Dec 2024 15:39:30 -0600 Subject: [PATCH 018/144] got cmake script to use creat_experiment --- ci/scripts/ctests/CMakeLists.txt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index b1289accbf..4e308d203b 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -7,7 +7,8 @@ enable_testing() set(CMAKE_VERBOSE_MAKEFILE ON) set(CASE_LIST "C48_ATM" "C48_S2SW") -set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS" ) +set(ENV{RUNTESTS} "${CMAKE_BINARY_DIR}/RUNTESTS") +set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS") set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../../..) set(CASE_PATH ${HOMEgfs}/ci/cases/pr) file(REMOVE_RECURSE ${RUNTESTS}) @@ -25,13 +26,13 @@ execute_process( function(GenerateExperiments CASE) execute_process( - COMMAND bash -c "pslot=${CASE}_${GIT_HASH}; RUNTESTS=${RUNTESTS}; ${CREATE_EXPERIMENT_CMD} -yaml ${CASE_PATH}/${CASE}.yaml" + COMMAND bash -c "export pslot=${CASE}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) - message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS}") + message(STATUS "Executing: ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS}") execute_process( - COMMAND ${HOMEGFS}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS} + COMMAND ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE PSLOT_LIST OUTPUT_STRIP_TRAILING_WHITESPACE @@ -40,7 +41,7 @@ function(GenerateExperiments CASE) string(REGEX MATCHALL "${CASE}_[^;]+" PSLOT_LIST "${PSLOT_LIST}") message(STATUS "Filtered PSLOT list: ${PSLOT_LIST}\n\n") - message(STATUS "Executing: ${HOMEGFS}/ci/scripts/utils/get_job_names.py --xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") + message(STATUS "Executing: ${HOMEgfs}/ci/scripts/utils/get_job_names.py --xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") execute_process( COMMAND ${HOMEgfs}/ci/scripts/utils/get_job_names.py --xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml WORKING_DIRECTORY ${CMAKE_BINARY_DIR} @@ -52,9 +53,9 @@ function(GenerateExperiments CASE) foreach(JOB IN LISTS JOB_NAMES) string(REGEX REPLACE "^${CASE}_" "" JOB_MODIFIED ${JOB}) - message(STATUS "Executing: ${CREATE_EXPERIMENT_CMD} -yaml ${CASE_PATH}/${CASE}.yaml") + message(STATUS "Executing: ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") execute_process( - COMMAND bash -c "pslot=${CASE}_${JOB_MODIFIED}_${GIT_HASH}; RUNTESTS=${RUNTESTS}; ${CREATE_EXPERIMENT_CMD} -yaml ${CASE_PATH}/${CASE}.yaml" + COMMAND bash -c "export pslot=${CASE}_${JOB_MODIFIED}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml" WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) endforeach() From 374927f56a6fb9f3065a16caa4d8f2a2afc188e6 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Thu, 12 Dec 2024 14:28:09 -0500 Subject: [PATCH 019/144] just getting started with addeding a ctest --- ci/scripts/ctests/CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index 4e308d203b..ce9dd4d69e 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -62,6 +62,13 @@ function(GenerateExperiments CASE) endfunction() +function(AddRocotoBootTest CASE_NAME JOB_NAME) + add_test(NAME jjob_test_${CASE_NAME}_${JOB_NAME} + COMMAND bash -c "rocotoboot -w ${RUNTESTS}/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d ${RUNTESTS}/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -c ${JOB_NAME}") +endfunction() + foreach(CASE IN LISTS CASE_LIST) GenerateExperiments(${CASE}) + # Example usage of AddRocotoBootTest function + # AddRocotoBootTest(${CASE} "example_job_name") endforeach() From 8b4fc4f764130bc58a30ba1e8675c007fb01c99e Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Thu, 12 Dec 2024 14:43:22 -0500 Subject: [PATCH 020/144] add in test for configured project --- ci/scripts/ctests/CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index ce9dd4d69e..26515b4cfd 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -6,7 +6,8 @@ enable_testing() set(CMAKE_VERBOSE_MAKEFILE ON) -set(CASE_LIST "C48_ATM" "C48_S2SW") +#set(CASE_LIST "C48_ATM" "C48_S2SW") +set(CASE_LIST "C48_ATM") set(ENV{RUNTESTS} "${CMAKE_BINARY_DIR}/RUNTESTS") set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS") set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../../..) @@ -67,8 +68,8 @@ function(AddRocotoBootTest CASE_NAME JOB_NAME) COMMAND bash -c "rocotoboot -w ${RUNTESTS}/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d ${RUNTESTS}/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -c ${JOB_NAME}") endfunction() + foreach(CASE IN LISTS CASE_LIST) - GenerateExperiments(${CASE}) - # Example usage of AddRocotoBootTest function - # AddRocotoBootTest(${CASE} "example_job_name") + #GenerateExperiments(${CASE}) + AddRocotoBootTest(${CASE} "gfs_fcst" ) endforeach() From ce37d86edc1a0bb70efa3d92f487b24592719917 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Thu, 12 Dec 2024 14:53:35 -0600 Subject: [PATCH 021/144] added ctest and testing --- ci/scripts/ctests/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/scripts/ctests/CMakeLists.txt index 26515b4cfd..89ccc93e44 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/scripts/ctests/CMakeLists.txt @@ -12,7 +12,7 @@ set(ENV{RUNTESTS} "${CMAKE_BINARY_DIR}/RUNTESTS") set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS") set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../../..) set(CASE_PATH ${HOMEgfs}/ci/cases/pr) -file(REMOVE_RECURSE ${RUNTESTS}) +#file(REMOVE_RECURSE ${RUNTESTS}) set(CREATE_EXPERIMENT_CMD "${HOMEgfs}/workflow/create_experiment.py") @@ -65,7 +65,7 @@ endfunction() function(AddRocotoBootTest CASE_NAME JOB_NAME) add_test(NAME jjob_test_${CASE_NAME}_${JOB_NAME} - COMMAND bash -c "rocotoboot -w ${RUNTESTS}/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d ${RUNTESTS}/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -c ${JOB_NAME}") + COMMAND bash -c "rocotoboot -w ${RUNTESTS}/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d ${RUNTESTS}/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") endfunction() From bb12cda8165177efda34116ca9bd309c6ffc8c61 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Fri, 13 Dec 2024 16:53:18 -0500 Subject: [PATCH 022/144] moved ctests dir to top HOMEgfs/ci/ctests with its own scripts dir --- ci/{scripts => }/ctests/CMakeLists.txt | 23 ++++++++----------- .../utils => ctests/scripts}/get_job_names.py | 0 2 files changed, 9 insertions(+), 14 deletions(-) rename ci/{scripts => }/ctests/CMakeLists.txt (67%) rename ci/{scripts/utils => ctests/scripts}/get_job_names.py (100%) diff --git a/ci/scripts/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt similarity index 67% rename from ci/scripts/ctests/CMakeLists.txt rename to ci/ctests/CMakeLists.txt index 89ccc93e44..41484222be 100644 --- a/ci/scripts/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -9,10 +9,9 @@ set(CMAKE_VERBOSE_MAKEFILE ON) #set(CASE_LIST "C48_ATM" "C48_S2SW") set(CASE_LIST "C48_ATM") set(ENV{RUNTESTS} "${CMAKE_BINARY_DIR}/RUNTESTS") -set(RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS") -set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../../..) +set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../..) set(CASE_PATH ${HOMEgfs}/ci/cases/pr) -#file(REMOVE_RECURSE ${RUNTESTS}) +file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/RUNTESTS) set(CREATE_EXPERIMENT_CMD "${HOMEgfs}/workflow/create_experiment.py") @@ -27,14 +26,12 @@ execute_process( function(GenerateExperiments CASE) execute_process( - COMMAND bash -c "export pslot=${CASE}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMAND bash -c "export pslot=${CASE}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --overwrite --yaml ${CASE_PATH}/${CASE}.yaml" ) - message(STATUS "Executing: ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS}") + message(STATUS "Executing: ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list RUNTESTS") execute_process( - COMMAND ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list ${RUNTESTS} - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMAND ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list RUNTESTS OUTPUT_VARIABLE PSLOT_LIST OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -42,10 +39,9 @@ function(GenerateExperiments CASE) string(REGEX MATCHALL "${CASE}_[^;]+" PSLOT_LIST "${PSLOT_LIST}") message(STATUS "Filtered PSLOT list: ${PSLOT_LIST}\n\n") - message(STATUS "Executing: ${HOMEgfs}/ci/scripts/utils/get_job_names.py --xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") + message(STATUS "Executing: ${HOMEgfs}/ci/ctests/scripts/get_job_names.py --xml RUNTESTS/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") execute_process( - COMMAND ${HOMEgfs}/ci/scripts/utils/get_job_names.py --xml ${RUNTESTS}/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMAND ${HOMEgfs}/ci/ctests/scripts/get_job_names.py --xml RUNTESTS/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml OUTPUT_FILE ${CMAKE_BINARY_DIR}/${CASE}_jobs.txt ) @@ -57,7 +53,6 @@ function(GenerateExperiments CASE) message(STATUS "Executing: ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") execute_process( COMMAND bash -c "export pslot=${CASE}_${JOB_MODIFIED}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) endforeach() @@ -65,11 +60,11 @@ endfunction() function(AddRocotoBootTest CASE_NAME JOB_NAME) add_test(NAME jjob_test_${CASE_NAME}_${JOB_NAME} - COMMAND bash -c "rocotoboot -w ${RUNTESTS}/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d ${RUNTESTS}/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") + COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") endfunction() foreach(CASE IN LISTS CASE_LIST) - #GenerateExperiments(${CASE}) + GenerateExperiments(${CASE}) AddRocotoBootTest(${CASE} "gfs_fcst" ) endforeach() diff --git a/ci/scripts/utils/get_job_names.py b/ci/ctests/scripts/get_job_names.py similarity index 100% rename from ci/scripts/utils/get_job_names.py rename to ci/ctests/scripts/get_job_names.py From f78181c49bb7439b19d4ed78f239ab598e73379f Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Fri, 13 Dec 2024 18:38:11 -0500 Subject: [PATCH 023/144] added all jobs for tests for each case --- ci/ctests/CMakeLists.txt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 41484222be..7ef9e2ce82 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -6,8 +6,7 @@ enable_testing() set(CMAKE_VERBOSE_MAKEFILE ON) -#set(CASE_LIST "C48_ATM" "C48_S2SW") -set(CASE_LIST "C48_ATM") +set(CASE_LIST "C48_ATM" "C48_S2SW") set(ENV{RUNTESTS} "${CMAKE_BINARY_DIR}/RUNTESTS") set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../..) set(CASE_PATH ${HOMEgfs}/ci/cases/pr) @@ -23,6 +22,10 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) +execute_process( + COMMAND ln -s ${HOMEgfs} global-workflow +) + function(GenerateExperiments CASE) execute_process( @@ -63,8 +66,14 @@ function(AddRocotoBootTest CASE_NAME JOB_NAME) COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") endfunction() +add_test( NAME BuildAll + COMMAND bash -c "cd ${HOMEgfs}/sorc; ./build_all.sh" +) foreach(CASE IN LISTS CASE_LIST) GenerateExperiments(${CASE}) - AddRocotoBootTest(${CASE} "gfs_fcst" ) + file(STRINGS ${CMAKE_BINARY_DIR}/${CASE}_jobs.txt JOB_NAMES) + foreach(JOB IN LISTS JOB_NAMES) + AddRocotoBootTest(${CASE} ${JOB}) + endforeach() endforeach() From 46cddb7973abec6331ccea6d16de76ef2a612038 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Fri, 13 Dec 2024 19:04:33 -0500 Subject: [PATCH 024/144] added data stagging dependances and started it as a stub script --- ci/ctests/CMakeLists.txt | 3 +++ ci/ctests/scripts/starge_data.sh | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 ci/ctests/scripts/starge_data.sh diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 7ef9e2ce82..6887599172 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -62,8 +62,11 @@ function(GenerateExperiments CASE) endfunction() function(AddRocotoBootTest CASE_NAME JOB_NAME) + add_test(NAME jjob_test_${CASE_NAME}_${JOB_NAME}_StageData + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") add_test(NAME jjob_test_${CASE_NAME}_${JOB_NAME} COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") + set_tests_properties(jjob_test_${CASE_NAME}_${JOB_NAME} PROPERTIES DEPENDS jjob_test_${CASE_NAME}_${JOB_NAME}_StageData) endfunction() add_test( NAME BuildAll diff --git a/ci/ctests/scripts/starge_data.sh b/ci/ctests/scripts/starge_data.sh new file mode 100644 index 0000000000..4e943793d1 --- /dev/null +++ b/ci/ctests/scripts/starge_data.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -eux +######################################################################## +# This script is used to stage data for the tests. For now it is a stub. +######################################################################## + +exit 0 \ No newline at end of file From 434f869b830b30e4692a8e49ffb089219fdc3d14 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Wed, 18 Dec 2024 00:22:40 -0500 Subject: [PATCH 025/144] added driver for creating ctests from yaml files --- ci/ctests/C48_ATM.yaml | 9 +++++ ci/ctests/create_functional_ctests.py | 52 +++++++++++++++++++++++++++ ci/platforms/config.hera | 2 ++ ci/platforms/config.orion | 1 + 4 files changed, 64 insertions(+) create mode 100644 ci/ctests/C48_ATM.yaml create mode 100755 ci/ctests/create_functional_ctests.py diff --git a/ci/ctests/C48_ATM.yaml b/ci/ctests/C48_ATM.yaml new file mode 100644 index 0000000000..4c3122a1f7 --- /dev/null +++ b/ci/ctests/C48_ATM.yaml @@ -0,0 +1,9 @@ +fcst_gfs: + staged_datapath: {{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ testcase }}/fcst_gfs + input_files: use_jinja_template_fcst + output_files: use_jinja_template_fcst + +gfs_atmos_pro: + staged_datapath: {{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ testcase }}/gfs_atmos_prod + input_files: use_jinja_template_gfs_atmos_pro + output_files: use_jinja_template_gfs_atmos_pro diff --git a/ci/ctests/create_functional_ctests.py b/ci/ctests/create_functional_ctests.py new file mode 100755 index 0000000000..d42d963143 --- /dev/null +++ b/ci/ctests/create_functional_ctests.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 + +import os, sys +_here = os.path.dirname(__file__) +_top = os.path.abspath(os.path.join(os.path.abspath(_here), '../..')) +sys.path.insert(0, _top) + +from argparse import ArgumentParser +from pathlib import Path +from wxflow import Configuration, AttrDict, parse_j2yaml, Logger, logit +from workflow.hosts import Host + +def parse_args(): + """ + Parse command line arguments. + + Returns + ------- + argparse.Namespace + The parsed command line arguments. + """ + + description = """Arguments for creating and updating error log files + """ + parser = ArgumentParser(description=description) + + parser.add_argument('--yaml', help='path to file for creating functional tests per case', required=True, type=Path) + return parser.parse_args() + +if __name__ == '__main__': + + # Put HOMEgfs into the test configuration + args = parse_args() + data = AttrDict(HOMEgfs=_top) + data.update(os.environ) + + # Used for getting platform specific information + host = Host() + cfg = Configuration(f'{data.HOMEgfs}/ci/platforms') + platform_config = cfg.parse_config(f'config.{host.machine.lower()}') + + # Get the case name from the yaml file basename + # and get the configuration for the case + case_name = os.path.basename(args.yaml).split('.')[0] + platform_config['testcase'] = case_name + data.update(platform_config) + case_cfg = parse_j2yaml(path=args.yaml, data=data) + case_cfg.update(platform_config) + + print(f'\nCase name: {case_cfg.testcase}\n') + print(f"Input Data Path: {case_cfg.fcst_gfs.staged_datapath}") + print(f"Input Data Path: {case_cfg.gfs_atmos_pro.staged_datapath}") \ No newline at end of file diff --git a/ci/platforms/config.hera b/ci/platforms/config.hera index 6d3e43c820..fa908f8eb1 100644 --- a/ci/platforms/config.hera +++ b/ci/platforms/config.hera @@ -2,6 +2,8 @@ export GFS_CI_ROOT=/scratch1/NCEPDEV/global/Terry.McGuinness/GFS_CI_ROOT export ICSDIR_ROOT=/scratch1/NCEPDEV/global/glopara/data/ICSDIR + +export STAGED_FUNCTIONAL_TEST_DIR=${GFS_CI_ROOT}/STAGED_FUNCTIONAL_TEST_DIR export HPC_ACCOUNT=nems export max_concurrent_cases=5 export max_concurrent_pr=4 diff --git a/ci/platforms/config.orion b/ci/platforms/config.orion index 5171373127..6b4810419d 100644 --- a/ci/platforms/config.orion +++ b/ci/platforms/config.orion @@ -3,6 +3,7 @@ export GFS_CI_ROOT=/work2/noaa/stmp/GFS_CI_ROOT/ORION export ICSDIR_ROOT=/work/noaa/global/glopara/data/ICSDIR export HPC_ACCOUNT=nems +export STAGED_FUNCTIONAL_TEST_DIR=/work/noaa/stmp/GFS_CI_ROOT/ORION/STAGED_FUNCTIONAL_TEST_DIR export max_concurrent_cases=5 export max_concurrent_pr=4 From 99df88d38ac6bdb50efb72052708bf8b9918f8d0 Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Wed, 18 Dec 2024 02:47:41 -0500 Subject: [PATCH 026/144] added a driver to create ctests from defintions in yaml files --- ci/ctests/CMakeLists.txt | 56 ++++++++---------------- ci/ctests/create_functional_ctests.py | 27 ++++++++++-- ci/ctests/scripts/get_job_names.py | 63 --------------------------- ci/ctests/scripts/starge_data.sh | 7 --- 4 files changed, 41 insertions(+), 112 deletions(-) delete mode 100755 ci/ctests/scripts/get_job_names.py delete mode 100644 ci/ctests/scripts/starge_data.sh diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 6887599172..e61056f4d6 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -6,13 +6,12 @@ enable_testing() set(CMAKE_VERBOSE_MAKEFILE ON) -set(CASE_LIST "C48_ATM" "C48_S2SW") set(ENV{RUNTESTS} "${CMAKE_BINARY_DIR}/RUNTESTS") -set(HOMEgfs ${CMAKE_CURRENT_SOURCE_DIR}/../..) +get_filename_component(HOMEgfs ${CMAKE_SOURCE_DIR}/../.. ABSOLUTE) set(CASE_PATH ${HOMEgfs}/ci/cases/pr) file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/RUNTESTS) -set(CREATE_EXPERIMENT_CMD "${HOMEgfs}/workflow/create_experiment.py") +set(CREATE_EXPERIMENT_CMD "${HOMEgfs}/workflow/create_experiment.py --overwrite") message(STATUS "Executing: git rev-parse --short HEAD") execute_process( @@ -22,43 +21,24 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -execute_process( - COMMAND ln -s ${HOMEgfs} global-workflow -) - function(GenerateExperiments CASE) - - execute_process( - COMMAND bash -c "export pslot=${CASE}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --overwrite --yaml ${CASE_PATH}/${CASE}.yaml" - ) - - message(STATUS "Executing: ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list RUNTESTS") - execute_process( - COMMAND ${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh get_pslot_list RUNTESTS - OUTPUT_VARIABLE PSLOT_LIST - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - - string(REGEX MATCHALL "${CASE}_[^;]+" PSLOT_LIST "${PSLOT_LIST}") - message(STATUS "Filtered PSLOT list: ${PSLOT_LIST}\n\n") + # Read the job list file for this case + set(JOB_LIST_FILE "${CMAKE_BINARY_DIR}/${CASE}_jobs.txt") - message(STATUS "Executing: ${HOMEgfs}/ci/ctests/scripts/get_job_names.py --xml RUNTESTS/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml") - execute_process( - COMMAND ${HOMEgfs}/ci/ctests/scripts/get_job_names.py --xml RUNTESTS/EXPDIR/${PSLOT_LIST}/${PSLOT_LIST}.xml - OUTPUT_FILE ${CMAKE_BINARY_DIR}/${CASE}_jobs.txt - ) - - file(STRINGS ${CMAKE_BINARY_DIR}/${CASE}_jobs.txt JOB_NAMES) - message(STATUS "Job names:\n${JOB_NAMES}") - - foreach(JOB IN LISTS JOB_NAMES) - string(REGEX REPLACE "^${CASE}_" "" JOB_MODIFIED ${JOB}) - message(STATUS "Executing: ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") - execute_process( - COMMAND bash -c "export pslot=${CASE}_${JOB_MODIFIED}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml" - ) - endforeach() - + if(EXISTS ${JOB_LIST_FILE}) + file(STRINGS ${JOB_LIST_FILE} JOB_NAMES) + message(STATUS "Processing jobs from ${JOB_LIST_FILE}:\n${JOB_NAMES}") + + foreach(JOB IN LISTS JOB_NAMES) + string(REGEX REPLACE "^${CASE}_" "" JOB_MODIFIED ${JOB}) + message(STATUS "Executing: ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") + execute_process( + COMMAND bash -c "export pslot=${CASE}_${JOB_MODIFIED}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml" + ) + endforeach() + else() + message(WARNING "Job list file ${JOB_LIST_FILE} does not exist.") + endif() endfunction() function(AddRocotoBootTest CASE_NAME JOB_NAME) diff --git a/ci/ctests/create_functional_ctests.py b/ci/ctests/create_functional_ctests.py index d42d963143..b1898f3bfe 100755 --- a/ci/ctests/create_functional_ctests.py +++ b/ci/ctests/create_functional_ctests.py @@ -1,14 +1,18 @@ #!/usr/bin/env python3 import os, sys +import shutil _here = os.path.dirname(__file__) _top = os.path.abspath(os.path.join(os.path.abspath(_here), '../..')) sys.path.insert(0, _top) from argparse import ArgumentParser from pathlib import Path -from wxflow import Configuration, AttrDict, parse_j2yaml, Logger, logit +from wxflow import Configuration, AttrDict, parse_j2yaml, Logger, logit, which, CommandNotFoundError, ProcessError from workflow.hosts import Host +from wxflow.fsutils import mkdir_p, chdir, cp + +logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) def parse_args(): """ @@ -29,6 +33,12 @@ def parse_args(): if __name__ == '__main__': + try: + cmake = which("cmake") + except CommandNotFoundError: + logger.exception("cmake not found in PATH") + raise CommandNotFoundError("cmake not found in PATH") + # Put HOMEgfs into the test configuration args = parse_args() data = AttrDict(HOMEgfs=_top) @@ -47,6 +57,15 @@ def parse_args(): case_cfg = parse_j2yaml(path=args.yaml, data=data) case_cfg.update(platform_config) - print(f'\nCase name: {case_cfg.testcase}\n') - print(f"Input Data Path: {case_cfg.fcst_gfs.staged_datapath}") - print(f"Input Data Path: {case_cfg.gfs_atmos_pro.staged_datapath}") \ No newline at end of file + # Get top-level entries and create a job list file for the case + top_level_entries = [key for key in case_cfg.keys() if isinstance(case_cfg[key], dict)] + + # Create cmake directory and move job list file + test_dir = os.path.join(_here, 'TESTS') + job_list_file = f"TESTS/{case_name}_jobs.txt" + with open(job_list_file, 'w') as f: + for entry in top_level_entries: + f.write(f"{case_name}_{entry}\n") + + cmake.add_default_arg([f'-S {_here}', f'-B {test_dir}', f'-DCASE_LIST={case_name}']) + cmake() diff --git a/ci/ctests/scripts/get_job_names.py b/ci/ctests/scripts/get_job_names.py deleted file mode 100755 index eb7ca53207..0000000000 --- a/ci/ctests/scripts/get_job_names.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python3 -import os -from lxml import etree -from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, ArgumentTypeError - -def valid_file_path(path): - """ - Check if the provided path is a valid file. - - Args: - path (str): The file path. - - Returns: - str: The absolute path if valid. - - Raises: - argparse.ArgumentTypeError: If the path is not a valid file. - """ - if os.path.isfile(path): - return os.path.abspath(path) - else: - raise ArgumentTypeError(f"Invalid file path: {path}") - -def input_args(): - description = "Extracts the values of and tags." - parser = ArgumentParser(description=description, - formatter_class=ArgumentDefaultsHelpFormatter) - - parser.add_argument('--xml', type=valid_file_path, help='The path to the XML file.') - return parser.parse_args() - -def get_names_from_tags(xml_file): - """ - Extracts the values of and tags. - - Args: - xml_file (str): The path to the XML file. - - Returns: - list: A list of values found in and tags. - """ - tree = etree.parse(xml_file) - root = tree.getroot() - name_list = [] - - for tag in ['task', 'metatask']: - for element in root.findall(f'.//{tag}'): - name = element.get('name') - if name is not None: - name_list.append(name) - - return name_list - -# Example usage -if __name__ == "__main__": - args = input_args() - xml_file = args.xml - job_names = get_names_from_tags(xml_file) - for job_name in job_names: - if "#" not in job_name: - if job_name.endswith("_@H"): - job_name = job_name[:-3] - print(job_name) diff --git a/ci/ctests/scripts/starge_data.sh b/ci/ctests/scripts/starge_data.sh deleted file mode 100644 index 4e943793d1..0000000000 --- a/ci/ctests/scripts/starge_data.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -set -eux -######################################################################## -# This script is used to stage data for the tests. For now it is a stub. -######################################################################## - -exit 0 \ No newline at end of file From e18617338721f2c5a181b0b431c898245831aedd Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Wed, 18 Dec 2024 04:11:06 -0500 Subject: [PATCH 027/144] added final step to loop over yaml files for creating functiona ctests from configs --- ci/ctests/CMakeLists.txt | 6 +++- ci/ctests/create_functional_ctests.py | 46 ++++++++++++++++----------- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index e61056f4d6..05864c39c0 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -53,7 +53,11 @@ add_test( NAME BuildAll COMMAND bash -c "cd ${HOMEgfs}/sorc; ./build_all.sh" ) -foreach(CASE IN LISTS CASE_LIST) +# Split CASE_LIST into individual cases +string(REPLACE " " ";" CASE_LIST_SPLIT ${CASE_LIST}) + +# Loop over each case in CASE_LIST_SPLIT +foreach(CASE IN LISTS CASE_LIST_SPLIT) GenerateExperiments(${CASE}) file(STRINGS ${CMAKE_BINARY_DIR}/${CASE}_jobs.txt JOB_NAMES) foreach(JOB IN LISTS JOB_NAMES) diff --git a/ci/ctests/create_functional_ctests.py b/ci/ctests/create_functional_ctests.py index b1898f3bfe..5123972cfd 100755 --- a/ci/ctests/create_functional_ctests.py +++ b/ci/ctests/create_functional_ctests.py @@ -28,7 +28,7 @@ def parse_args(): """ parser = ArgumentParser(description=description) - parser.add_argument('--yaml', help='path to file for creating functional tests per case', required=True, type=Path) + parser.add_argument('--yaml', help='paths to YAML files for creating functional tests per case', required=True, type=Path, nargs='+') return parser.parse_args() if __name__ == '__main__': @@ -47,25 +47,35 @@ def parse_args(): # Used for getting platform specific information host = Host() cfg = Configuration(f'{data.HOMEgfs}/ci/platforms') - platform_config = cfg.parse_config(f'config.{host.machine.lower()}') - # Get the case name from the yaml file basename - # and get the configuration for the case - case_name = os.path.basename(args.yaml).split('.')[0] - platform_config['testcase'] = case_name - data.update(platform_config) - case_cfg = parse_j2yaml(path=args.yaml, data=data) - case_cfg.update(platform_config) - - # Get top-level entries and create a job list file for the case - top_level_entries = [key for key in case_cfg.keys() if isinstance(case_cfg[key], dict)] - # Create cmake directory and move job list file test_dir = os.path.join(_here, 'TESTS') - job_list_file = f"TESTS/{case_name}_jobs.txt" - with open(job_list_file, 'w') as f: - for entry in top_level_entries: - f.write(f"{case_name}_{entry}\n") + mkdir_p(test_dir) + + # Get the case name from the yaml file basename + # and get the configuration for the case + case_names = "" + for yaml in args.yaml: + platform_config = cfg.parse_config(f'config.{host.machine.lower()}') + case_name = os.path.basename(yaml).split('.')[0] + platform_config['testcase'] = case_name + data.update(platform_config) + case_cfg = parse_j2yaml(path=yaml, data=data) + case_cfg.update(platform_config) + + # Get top-level entries and create a job list file for the case + top_level_entries = [key for key in case_cfg.keys() if isinstance(case_cfg[key], dict)] + job_list_file = f"TESTS/{case_name}_jobs.txt" + with open(job_list_file, 'w') as f: + for entry in top_level_entries: + f.write(f"{case_name}_{entry}\n") + + case_names += f"{case_name} " + + platform_config.clear() + data.clear() + case_cfg.clear() - cmake.add_default_arg([f'-S {_here}', f'-B {test_dir}', f'-DCASE_LIST={case_name}']) + # Run cmake to create the functional tests + cmake.add_default_arg([f"-S {_here}", f"-B {test_dir}", f"-DCASE_LIST='{case_names[:-1]}'"]) cmake() From 0183667afafe9aac799bf1b2303bb57293b0329a Mon Sep 17 00:00:00 2001 From: Terry McGUinness Date: Thu, 19 Dec 2024 09:45:06 -0500 Subject: [PATCH 028/144] added second yaml case file for testing python driver --- ci/ctests/C48_S2SW.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 ci/ctests/C48_S2SW.yaml diff --git a/ci/ctests/C48_S2SW.yaml b/ci/ctests/C48_S2SW.yaml new file mode 100644 index 0000000000..4c3122a1f7 --- /dev/null +++ b/ci/ctests/C48_S2SW.yaml @@ -0,0 +1,9 @@ +fcst_gfs: + staged_datapath: {{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ testcase }}/fcst_gfs + input_files: use_jinja_template_fcst + output_files: use_jinja_template_fcst + +gfs_atmos_pro: + staged_datapath: {{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ testcase }}/gfs_atmos_prod + input_files: use_jinja_template_gfs_atmos_pro + output_files: use_jinja_template_gfs_atmos_pro From 3088bffcb925c2e204af864ee14b0ef03ed03854 Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Thu, 19 Dec 2024 10:40:01 -0500 Subject: [PATCH 029/144] added a few comments for each section --- ci/ctests/CMakeLists.txt | 5 +++++ ci/ctests/create_functional_ctests.py | 14 ++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 05864c39c0..5e29a76dc9 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -6,6 +6,7 @@ enable_testing() set(CMAKE_VERBOSE_MAKEFILE ON) +# Set environment variables and paths set(ENV{RUNTESTS} "${CMAKE_BINARY_DIR}/RUNTESTS") get_filename_component(HOMEgfs ${CMAKE_SOURCE_DIR}/../.. ABSOLUTE) set(CASE_PATH ${HOMEgfs}/ci/cases/pr) @@ -13,6 +14,7 @@ file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/RUNTESTS) set(CREATE_EXPERIMENT_CMD "${HOMEgfs}/workflow/create_experiment.py --overwrite") +# Get the current git commit hash message(STATUS "Executing: git rev-parse --short HEAD") execute_process( COMMAND git rev-parse --short HEAD @@ -21,6 +23,7 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) +# Function to generate experiments for a given case function(GenerateExperiments CASE) # Read the job list file for this case set(JOB_LIST_FILE "${CMAKE_BINARY_DIR}/${CASE}_jobs.txt") @@ -41,6 +44,7 @@ function(GenerateExperiments CASE) endif() endfunction() +# Function to add Rocoto boot test for a given case and job function(AddRocotoBootTest CASE_NAME JOB_NAME) add_test(NAME jjob_test_${CASE_NAME}_${JOB_NAME}_StageData COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") @@ -49,6 +53,7 @@ function(AddRocotoBootTest CASE_NAME JOB_NAME) set_tests_properties(jjob_test_${CASE_NAME}_${JOB_NAME} PROPERTIES DEPENDS jjob_test_${CASE_NAME}_${JOB_NAME}_StageData) endfunction() +# Add a test to build all components add_test( NAME BuildAll COMMAND bash -c "cd ${HOMEgfs}/sorc; ./build_all.sh" ) diff --git a/ci/ctests/create_functional_ctests.py b/ci/ctests/create_functional_ctests.py index 5123972cfd..cc7036aa3c 100755 --- a/ci/ctests/create_functional_ctests.py +++ b/ci/ctests/create_functional_ctests.py @@ -23,7 +23,6 @@ def parse_args(): argparse.Namespace The parsed command line arguments. """ - description = """Arguments for creating and updating error log files """ parser = ArgumentParser(description=description) @@ -32,28 +31,27 @@ def parse_args(): return parser.parse_args() if __name__ == '__main__': - + # Locate cmake executable try: cmake = which("cmake") except CommandNotFoundError: logger.exception("cmake not found in PATH") raise CommandNotFoundError("cmake not found in PATH") - # Put HOMEgfs into the test configuration + # Parse command line arguments args = parse_args() data = AttrDict(HOMEgfs=_top) data.update(os.environ) - # Used for getting platform specific information + # Initialize host and configuration host = Host() cfg = Configuration(f'{data.HOMEgfs}/ci/platforms') - # Create cmake directory and move job list file + # Create directory for tests test_dir = os.path.join(_here, 'TESTS') mkdir_p(test_dir) - # Get the case name from the yaml file basename - # and get the configuration for the case + # Process each YAML file case_names = "" for yaml in args.yaml: platform_config = cfg.parse_config(f'config.{host.machine.lower()}') @@ -63,7 +61,7 @@ def parse_args(): case_cfg = parse_j2yaml(path=yaml, data=data) case_cfg.update(platform_config) - # Get top-level entries and create a job list file for the case + # Create job list file for the case top_level_entries = [key for key in case_cfg.keys() if isinstance(case_cfg[key], dict)] job_list_file = f"TESTS/{case_name}_jobs.txt" with open(job_list_file, 'w') as f: From 674f8d6ea058a99707c6f35855ed7b7ce341d4b7 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 20 Dec 2024 09:54:12 -0600 Subject: [PATCH 030/144] made CMakeList.txt independent of python script --- ci/ctests/CMakeLists.txt | 54 +++++++++++++++------------ ci/ctests/create_functional_ctests.py | 36 ++++++++++++------ 2 files changed, 55 insertions(+), 35 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 5e29a76dc9..f9f9c954e4 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -25,46 +25,52 @@ execute_process( # Function to generate experiments for a given case function(GenerateExperiments CASE) - # Read the job list file for this case - set(JOB_LIST_FILE "${CMAKE_BINARY_DIR}/${CASE}_jobs.txt") - - if(EXISTS ${JOB_LIST_FILE}) - file(STRINGS ${JOB_LIST_FILE} JOB_NAMES) - message(STATUS "Processing jobs from ${JOB_LIST_FILE}:\n${JOB_NAMES}") - - foreach(JOB IN LISTS JOB_NAMES) - string(REGEX REPLACE "^${CASE}_" "" JOB_MODIFIED ${JOB}) - message(STATUS "Executing: ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") - execute_process( - COMMAND bash -c "export pslot=${CASE}_${JOB_MODIFIED}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml" - ) - endforeach() + # Get JOB_NAMES for this CASE from input variable + string(TOUPPER ${CASE} CASE_UPPER) + set(JOB_NAMES_VAR "JOB_NAMES_${CASE_UPPER}") + if(DEFINED ${JOB_NAMES_VAR}) + string(REPLACE " " ";" JOB_NAMES ${${JOB_NAMES_VAR}}) else() - message(WARNING "Job list file ${JOB_LIST_FILE} does not exist.") + message(WARNING "No JOB_NAMES provided for ${CASE}") + return() endif() + message(STATUS "Processing jobs for ${CASE}: ${JOB_NAMES}") + foreach(JOB IN LISTS JOB_NAMES) + string(REGEX REPLACE "^${CASE}_" "" JOB_MODIFIED ${JOB}) + message(STATUS "Executing: ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") + execute_process( + COMMAND bash -c "export pslot=${CASE}_${JOB_MODIFIED}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml" + ) + endforeach() endfunction() # Function to add Rocoto boot test for a given case and job function(AddRocotoBootTest CASE_NAME JOB_NAME) - add_test(NAME jjob_test_${CASE_NAME}_${JOB_NAME}_StageData + add_test(NAME stage_${CASE_NAME}_${JOB_NAME} COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") - add_test(NAME jjob_test_${CASE_NAME}_${JOB_NAME} + add_test(NAME run_${CASE_NAME}_${JOB_NAME} COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") - set_tests_properties(jjob_test_${CASE_NAME}_${JOB_NAME} PROPERTIES DEPENDS jjob_test_${CASE_NAME}_${JOB_NAME}_StageData) + add_test(NAME validate_${CASE_NAME}_${JOB_NAME} + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") + set_tests_properties(run_${CASE_NAME}_${JOB_NAME} PROPERTIES DEPENDS stage_${CASE_NAME}_${JOB_NAME}) + set_tests_properties(stage_${CASE_NAME}_${JOB_NAME} PROPERTIES DEPENDS validate_${CASE_NAME}_${JOB_NAME}) endfunction() -# Add a test to build all components -add_test( NAME BuildAll - COMMAND bash -c "cd ${HOMEgfs}/sorc; ./build_all.sh" -) - # Split CASE_LIST into individual cases string(REPLACE " " ";" CASE_LIST_SPLIT ${CASE_LIST}) # Loop over each case in CASE_LIST_SPLIT foreach(CASE IN LISTS CASE_LIST_SPLIT) GenerateExperiments(${CASE}) - file(STRINGS ${CMAKE_BINARY_DIR}/${CASE}_jobs.txt JOB_NAMES) + # Get JOB_NAMES for this CASE from input variable + string(TOUPPER ${CASE} CASE_UPPER) + set(JOB_NAMES_VAR "JOB_NAMES_${CASE_UPPER}") + if(DEFINED ${JOB_NAMES_VAR}) + string(REPLACE " " ";" JOB_NAMES ${${JOB_NAMES_VAR}}) + else() + message(WARNING "No JOB_NAMES provided for ${CASE}") + continue() + endif() foreach(JOB IN LISTS JOB_NAMES) AddRocotoBootTest(${CASE} ${JOB}) endforeach() diff --git a/ci/ctests/create_functional_ctests.py b/ci/ctests/create_functional_ctests.py index cc7036aa3c..c805a9f027 100755 --- a/ci/ctests/create_functional_ctests.py +++ b/ci/ctests/create_functional_ctests.py @@ -51,8 +51,10 @@ def parse_args(): test_dir = os.path.join(_here, 'TESTS') mkdir_p(test_dir) - # Process each YAML file - case_names = "" + # Initialize dictionaries to hold case names and their job names + case_names = [] + case_jobs = {} + for yaml in args.yaml: platform_config = cfg.parse_config(f'config.{host.machine.lower()}') case_name = os.path.basename(yaml).split('.')[0] @@ -61,19 +63,31 @@ def parse_args(): case_cfg = parse_j2yaml(path=yaml, data=data) case_cfg.update(platform_config) - # Create job list file for the case + # Collect job names from the YAML file top_level_entries = [key for key in case_cfg.keys() if isinstance(case_cfg[key], dict)] - job_list_file = f"TESTS/{case_name}_jobs.txt" - with open(job_list_file, 'w') as f: - for entry in top_level_entries: - f.write(f"{case_name}_{entry}\n") + job_names = [f"{case_name}_{entry}" for entry in top_level_entries] + case_jobs[case_name.upper()] = ' '.join(job_names) + case_names.append(case_name) - case_names += f"{case_name} " + # Create job list file for the case + job_list_file = f"{test_dir}/{case_name}_jobs.txt" + with open(job_list_file, 'w') as f: + for job in job_names: + f.write(f"{job}\n") platform_config.clear() data.clear() case_cfg.clear() - # Run cmake to create the functional tests - cmake.add_default_arg([f"-S {_here}", f"-B {test_dir}", f"-DCASE_LIST='{case_names[:-1]}'"]) - cmake() + # Prepare cmake command-line arguments + cmake_args = [ + f"-DCASE_LIST='{ ' '.join(case_names) }'" + ] + for case_upper, jobs in case_jobs.items(): + cmake_args.append(f"-DJOB_NAMES_{case_upper}='{jobs}'") + + for each_arg in cmake_args: + print(each_arg, end=' ') + print() + #cmake.add_default_arg(cmake_args) + #cmake() \ No newline at end of file From 68ca6eebe042dd6ddb556c59cae0329861c5f9ce Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 20 Dec 2024 11:53:18 -0500 Subject: [PATCH 031/144] simplified CMakeList to be compatible with manin build, consolated create exp into main test along with stage,run, and validate. --- ci/ctests/CMakeLists.txt | 52 +++++++++++----------------------------- 1 file changed, 14 insertions(+), 38 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index f9f9c954e4..cd19d00162 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -1,17 +1,12 @@ cmake_minimum_required(VERSION 3.10) project(FunctionalTests) - enable_testing() - set(CMAKE_VERBOSE_MAKEFILE ON) # Set environment variables and paths -set(ENV{RUNTESTS} "${CMAKE_BINARY_DIR}/RUNTESTS") get_filename_component(HOMEgfs ${CMAKE_SOURCE_DIR}/../.. ABSOLUTE) set(CASE_PATH ${HOMEgfs}/ci/cases/pr) -file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/RUNTESTS) - set(CREATE_EXPERIMENT_CMD "${HOMEgfs}/workflow/create_experiment.py --overwrite") # Get the current git commit hash @@ -23,37 +18,19 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE ) -# Function to generate experiments for a given case -function(GenerateExperiments CASE) - # Get JOB_NAMES for this CASE from input variable - string(TOUPPER ${CASE} CASE_UPPER) - set(JOB_NAMES_VAR "JOB_NAMES_${CASE_UPPER}") - if(DEFINED ${JOB_NAMES_VAR}) - string(REPLACE " " ";" JOB_NAMES ${${JOB_NAMES_VAR}}) - else() - message(WARNING "No JOB_NAMES provided for ${CASE}") - return() - endif() - message(STATUS "Processing jobs for ${CASE}: ${JOB_NAMES}") - foreach(JOB IN LISTS JOB_NAMES) - string(REGEX REPLACE "^${CASE}_" "" JOB_MODIFIED ${JOB}) - message(STATUS "Executing: ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") - execute_process( - COMMAND bash -c "export pslot=${CASE}_${JOB_MODIFIED}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml" - ) - endforeach() -endfunction() - # Function to add Rocoto boot test for a given case and job -function(AddRocotoBootTest CASE_NAME JOB_NAME) - add_test(NAME stage_${CASE_NAME}_${JOB_NAME} - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") - add_test(NAME run_${CASE_NAME}_${JOB_NAME} - COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") - add_test(NAME validate_${CASE_NAME}_${JOB_NAME} - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") - set_tests_properties(run_${CASE_NAME}_${JOB_NAME} PROPERTIES DEPENDS stage_${CASE_NAME}_${JOB_NAME}) - set_tests_properties(stage_${CASE_NAME}_${JOB_NAME} PROPERTIES DEPENDS validate_${CASE_NAME}_${JOB_NAME}) +function(AddFunctionalTest JOB) + add_test(NAME test_${JOB} + COMMAND bash -c "export RUNTESTS=${CMAKE_BINARY_DIR}/RUNTESTS; export pslot=${CASE}_${JOB}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") + add_test(NAME stage_${JOB} + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") + add_test(NAME run_${JOB} + COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") + add_test(NAME validate_${JOB} + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") + set_tests_properties(stage_${JOB} PROPERTIES DEPENDS test_${JOB}) + set_tests_properties(run_${JOB} PROPERTIES DEPENDS stage_${JOB}) + set_tests_properties(validate_${JOB} PROPERTIES DEPENDS run_${JOB}) endfunction() # Split CASE_LIST into individual cases @@ -61,7 +38,6 @@ string(REPLACE " " ";" CASE_LIST_SPLIT ${CASE_LIST}) # Loop over each case in CASE_LIST_SPLIT foreach(CASE IN LISTS CASE_LIST_SPLIT) - GenerateExperiments(${CASE}) # Get JOB_NAMES for this CASE from input variable string(TOUPPER ${CASE} CASE_UPPER) set(JOB_NAMES_VAR "JOB_NAMES_${CASE_UPPER}") @@ -72,6 +48,6 @@ foreach(CASE IN LISTS CASE_LIST_SPLIT) continue() endif() foreach(JOB IN LISTS JOB_NAMES) - AddRocotoBootTest(${CASE} ${JOB}) + AddFunctionalTest(${JOB}) endforeach() -endforeach() +endforeach() \ No newline at end of file From f7bbd401418269d4fb025ce1a7b4adad7d2b8e39 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 20 Dec 2024 11:58:55 -0500 Subject: [PATCH 032/144] repurposed python script for generating args to man CMakeLists.txt --- ci/ctests/{create_functional_ctests.py => generate_ctest_args.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ci/ctests/{create_functional_ctests.py => generate_ctest_args.py} (100%) diff --git a/ci/ctests/create_functional_ctests.py b/ci/ctests/generate_ctest_args.py similarity index 100% rename from ci/ctests/create_functional_ctests.py rename to ci/ctests/generate_ctest_args.py From 36d497ee5e247ea5628d4041f4bbe7eb5c47afab Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 20 Dec 2024 11:39:25 -0600 Subject: [PATCH 033/144] added lables to run tests in groups and added stubbed scripts --- ci/ctests/CMakeLists.txt | 14 +++++++---- .../{ => scripts}/generate_ctest_args.py | 24 +------------------ ci/ctests/scripts/stage_data.sh | 0 ci/ctests/scripts/validate.sh | 0 4 files changed, 10 insertions(+), 28 deletions(-) rename ci/ctests/{ => scripts}/generate_ctest_args.py (77%) create mode 100644 ci/ctests/scripts/stage_data.sh create mode 100644 ci/ctests/scripts/validate.sh diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index cd19d00162..9af5c7e946 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -19,18 +19,22 @@ execute_process( ) # Function to add Rocoto boot test for a given case and job -function(AddFunctionalTest JOB) +function(AddFunctionalTest CASE JOB) add_test(NAME test_${JOB} COMMAND bash -c "export RUNTESTS=${CMAKE_BINARY_DIR}/RUNTESTS; export pslot=${CASE}_${JOB}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") + set_tests_properties(test_${JOB} PROPERTIES LABELS ${CASE}) + add_test(NAME stage_${JOB} COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") + set_tests_properties(stage_${JOB} PROPERTIES DEPENDS test_${JOB} LABELS ${CASE}) + add_test(NAME run_${JOB} COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") + set_tests_properties(run_${JOB} PROPERTIES DEPENDS stage_${JOB} LABELS ${CASE}) + add_test(NAME validate_${JOB} COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") - set_tests_properties(stage_${JOB} PROPERTIES DEPENDS test_${JOB}) - set_tests_properties(run_${JOB} PROPERTIES DEPENDS stage_${JOB}) - set_tests_properties(validate_${JOB} PROPERTIES DEPENDS run_${JOB}) + set_tests_properties(validate_${JOB} PROPERTIES DEPENDS run_${JOB} LABELS ${CASE}) endfunction() # Split CASE_LIST into individual cases @@ -48,6 +52,6 @@ foreach(CASE IN LISTS CASE_LIST_SPLIT) continue() endif() foreach(JOB IN LISTS JOB_NAMES) - AddFunctionalTest(${JOB}) + AddFunctionalTest(${CASE} ${JOB}) endforeach() endforeach() \ No newline at end of file diff --git a/ci/ctests/generate_ctest_args.py b/ci/ctests/scripts/generate_ctest_args.py similarity index 77% rename from ci/ctests/generate_ctest_args.py rename to ci/ctests/scripts/generate_ctest_args.py index c805a9f027..72754cebc2 100755 --- a/ci/ctests/generate_ctest_args.py +++ b/ci/ctests/scripts/generate_ctest_args.py @@ -31,12 +31,6 @@ def parse_args(): return parser.parse_args() if __name__ == '__main__': - # Locate cmake executable - try: - cmake = which("cmake") - except CommandNotFoundError: - logger.exception("cmake not found in PATH") - raise CommandNotFoundError("cmake not found in PATH") # Parse command line arguments args = parse_args() @@ -47,10 +41,6 @@ def parse_args(): host = Host() cfg = Configuration(f'{data.HOMEgfs}/ci/platforms') - # Create directory for tests - test_dir = os.path.join(_here, 'TESTS') - mkdir_p(test_dir) - # Initialize dictionaries to hold case names and their job names case_names = [] case_jobs = {} @@ -69,16 +59,6 @@ def parse_args(): case_jobs[case_name.upper()] = ' '.join(job_names) case_names.append(case_name) - # Create job list file for the case - job_list_file = f"{test_dir}/{case_name}_jobs.txt" - with open(job_list_file, 'w') as f: - for job in job_names: - f.write(f"{job}\n") - - platform_config.clear() - data.clear() - case_cfg.clear() - # Prepare cmake command-line arguments cmake_args = [ f"-DCASE_LIST='{ ' '.join(case_names) }'" @@ -88,6 +68,4 @@ def parse_args(): for each_arg in cmake_args: print(each_arg, end=' ') - print() - #cmake.add_default_arg(cmake_args) - #cmake() \ No newline at end of file + print() \ No newline at end of file diff --git a/ci/ctests/scripts/stage_data.sh b/ci/ctests/scripts/stage_data.sh new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ci/ctests/scripts/validate.sh b/ci/ctests/scripts/validate.sh new file mode 100644 index 0000000000..e69de29bb2 From 808a4cfe02ac2eb45a5d453399a777210d6c5f90 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 20 Dec 2024 12:10:08 -0600 Subject: [PATCH 034/144] created script and cases dir to isolate CMakeLists.txt --- ci/ctests/CMakeLists.txt | 11 ++++++----- ci/ctests/{ => cases}/C48_ATM.yaml | 0 ci/ctests/{ => cases}/C48_S2SW.yaml | 0 ci/ctests/scripts/generate_ctest_args.py | 3 +-- ci/ctests/scripts/stage_data.sh | 0 ci/ctests/scripts/validate.sh | 0 ci/ctests/scripts/wxflow | 1 + 7 files changed, 8 insertions(+), 7 deletions(-) rename ci/ctests/{ => cases}/C48_ATM.yaml (100%) rename ci/ctests/{ => cases}/C48_S2SW.yaml (100%) mode change 100644 => 100755 ci/ctests/scripts/stage_data.sh mode change 100644 => 100755 ci/ctests/scripts/validate.sh create mode 120000 ci/ctests/scripts/wxflow diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 9af5c7e946..9ea2753f8a 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -22,19 +22,20 @@ execute_process( function(AddFunctionalTest CASE JOB) add_test(NAME test_${JOB} COMMAND bash -c "export RUNTESTS=${CMAKE_BINARY_DIR}/RUNTESTS; export pslot=${CASE}_${JOB}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") - set_tests_properties(test_${JOB} PROPERTIES LABELS ${CASE}) + set_tests_properties(test_${JOB} PROPERTIES LABELS "${CASE};${JOB}") add_test(NAME stage_${JOB} COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") - set_tests_properties(stage_${JOB} PROPERTIES DEPENDS test_${JOB} LABELS ${CASE}) + set_tests_properties(stage_${JOB} PROPERTIES DEPENDS test_${JOB} LABELS "${CASE};${JOB}") add_test(NAME run_${JOB} - COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") - set_tests_properties(run_${JOB} PROPERTIES DEPENDS stage_${JOB} LABELS ${CASE}) + #COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") + COMMAND bash -c "echo 'submitting running of job ${JOB_NAME}'") + set_tests_properties(run_${JOB} PROPERTIES DEPENDS stage_${JOB} LABELS "${CASE};${JOB}") add_test(NAME validate_${JOB} COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") - set_tests_properties(validate_${JOB} PROPERTIES DEPENDS run_${JOB} LABELS ${CASE}) + set_tests_properties(validate_${JOB} PROPERTIES DEPENDS run_${JOB} LABELS "${CASE};${JOB}") endfunction() # Split CASE_LIST into individual cases diff --git a/ci/ctests/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml similarity index 100% rename from ci/ctests/C48_ATM.yaml rename to ci/ctests/cases/C48_ATM.yaml diff --git a/ci/ctests/C48_S2SW.yaml b/ci/ctests/cases/C48_S2SW.yaml similarity index 100% rename from ci/ctests/C48_S2SW.yaml rename to ci/ctests/cases/C48_S2SW.yaml diff --git a/ci/ctests/scripts/generate_ctest_args.py b/ci/ctests/scripts/generate_ctest_args.py index 72754cebc2..6b81b8aa93 100755 --- a/ci/ctests/scripts/generate_ctest_args.py +++ b/ci/ctests/scripts/generate_ctest_args.py @@ -3,14 +3,13 @@ import os, sys import shutil _here = os.path.dirname(__file__) -_top = os.path.abspath(os.path.join(os.path.abspath(_here), '../..')) +_top = os.path.abspath(os.path.join(os.path.abspath(_here), '../../..')) sys.path.insert(0, _top) from argparse import ArgumentParser from pathlib import Path from wxflow import Configuration, AttrDict, parse_j2yaml, Logger, logit, which, CommandNotFoundError, ProcessError from workflow.hosts import Host -from wxflow.fsutils import mkdir_p, chdir, cp logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) diff --git a/ci/ctests/scripts/stage_data.sh b/ci/ctests/scripts/stage_data.sh old mode 100644 new mode 100755 diff --git a/ci/ctests/scripts/validate.sh b/ci/ctests/scripts/validate.sh old mode 100644 new mode 100755 diff --git a/ci/ctests/scripts/wxflow b/ci/ctests/scripts/wxflow new file mode 120000 index 0000000000..54d0558aba --- /dev/null +++ b/ci/ctests/scripts/wxflow @@ -0,0 +1 @@ +../../../sorc/wxflow/src/wxflow \ No newline at end of file From 81e640fb5a3a84ceb2ed32e556ba4a752b499075 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 20 Dec 2024 13:06:18 -0600 Subject: [PATCH 035/144] renamed test to create_experiment --- ci/ctests/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 9ea2753f8a..2e413380d9 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -22,11 +22,11 @@ execute_process( function(AddFunctionalTest CASE JOB) add_test(NAME test_${JOB} COMMAND bash -c "export RUNTESTS=${CMAKE_BINARY_DIR}/RUNTESTS; export pslot=${CASE}_${JOB}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") - set_tests_properties(test_${JOB} PROPERTIES LABELS "${CASE};${JOB}") + set_tests_properties(create_experiment_${JOB} PROPERTIES LABELS "${CASE};${JOB}") add_test(NAME stage_${JOB} COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") - set_tests_properties(stage_${JOB} PROPERTIES DEPENDS test_${JOB} LABELS "${CASE};${JOB}") + set_tests_properties(stage_${JOB} PROPERTIES DEPENDS create_experiment_${JOB} LABELS "${CASE};${JOB}") add_test(NAME run_${JOB} #COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") From a1d0f20eeab11ea36fca04c902fd0e54af1012d5 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 20 Dec 2024 14:29:11 -0600 Subject: [PATCH 036/144] missed update to name of test from test_ to create_experiment_ --- ci/ctests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 2e413380d9..b6b624a3f0 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -20,7 +20,7 @@ execute_process( # Function to add Rocoto boot test for a given case and job function(AddFunctionalTest CASE JOB) - add_test(NAME test_${JOB} + add_test(NAME create_expirment_${JOB} COMMAND bash -c "export RUNTESTS=${CMAKE_BINARY_DIR}/RUNTESTS; export pslot=${CASE}_${JOB}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") set_tests_properties(create_experiment_${JOB} PROPERTIES LABELS "${CASE};${JOB}") From 2cbf4eec2743a73d44ba26c5fe42584d84812865 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 20 Dec 2024 14:31:52 -0600 Subject: [PATCH 037/144] forgot to save contents of the stubbed scripts --- ci/ctests/scripts/stage_data.sh | 2 ++ ci/ctests/scripts/validate.sh | 2 ++ 2 files changed, 4 insertions(+) diff --git a/ci/ctests/scripts/stage_data.sh b/ci/ctests/scripts/stage_data.sh index e69de29bb2..8e5e43fa35 100755 --- a/ci/ctests/scripts/stage_data.sh +++ b/ci/ctests/scripts/stage_data.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +echo "This is a stub for the stage_data script." diff --git a/ci/ctests/scripts/validate.sh b/ci/ctests/scripts/validate.sh index e69de29bb2..ea1d3c41d9 100755 --- a/ci/ctests/scripts/validate.sh +++ b/ci/ctests/scripts/validate.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +echo "This is a stub for the validate script." From 687217f848ff3086a349815b41d94f093d3f935c Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 20 Dec 2024 14:37:38 -0600 Subject: [PATCH 038/144] spelling error on create_experiment --- ci/ctests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index b6b624a3f0..8af648eea2 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -20,7 +20,7 @@ execute_process( # Function to add Rocoto boot test for a given case and job function(AddFunctionalTest CASE JOB) - add_test(NAME create_expirment_${JOB} + add_test(NAME create_experiment_${JOB} COMMAND bash -c "export RUNTESTS=${CMAKE_BINARY_DIR}/RUNTESTS; export pslot=${CASE}_${JOB}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") set_tests_properties(create_experiment_${JOB} PROPERTIES LABELS "${CASE};${JOB}") From 55766bd63117fdb746d124685ec2a60e0cfedce0 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 20 Dec 2024 15:57:11 -0600 Subject: [PATCH 039/144] got a few hints on using File Utils directly in case Yaml file --- ci/ctests/cases/C48_ATM.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ci/ctests/cases/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml index 4c3122a1f7..309366dcaa 100644 --- a/ci/ctests/cases/C48_ATM.yaml +++ b/ci/ctests/cases/C48_ATM.yaml @@ -3,6 +3,13 @@ fcst_gfs: input_files: use_jinja_template_fcst output_files: use_jinja_template_fcst +gfs_fcst: + input_files: + copy: + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/INPUT/gfs_ctrl.nc, + {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/INPUT/gfs_ctrl.nc] + output_files: use_jinja_template_fcst + gfs_atmos_pro: staged_datapath: {{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ testcase }}/gfs_atmos_prod input_files: use_jinja_template_gfs_atmos_pro From f69fb6834f8cdb6a65c0983dc905dc3713accf2f Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 23 Dec 2024 14:55:11 -0600 Subject: [PATCH 040/144] updated adding functional test as line enteries in CMakeLists.txt directly that creats the three steps as tests --- ci/ctests/CMakeLists.txt | 58 +++++++++--------------- ci/ctests/cases/C48_ATM.yaml | 5 -- ci/ctests/scripts/loop_cases_jjobs.cmake | 19 ++++++++ 3 files changed, 41 insertions(+), 41 deletions(-) create mode 100644 ci/ctests/scripts/loop_cases_jjobs.cmake diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 8af648eea2..f444d9e8e3 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -10,49 +10,35 @@ set(CASE_PATH ${HOMEgfs}/ci/cases/pr) set(CREATE_EXPERIMENT_CMD "${HOMEgfs}/workflow/create_experiment.py --overwrite") # Get the current git commit hash -message(STATUS "Executing: git rev-parse --short HEAD") -execute_process( - COMMAND git rev-parse --short HEAD - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_HASH - OUTPUT_STRIP_TRAILING_WHITESPACE -) +#message(STATUS "Executing: git rev-parse --short HEAD") +#execute_process( +# COMMAND git rev-parse --short HEAD +# WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +# OUTPUT_VARIABLE GIT_HASH +# OUTPUT_STRIP_TRAILING_WHITESPACE +#) # Function to add Rocoto boot test for a given case and job function(AddFunctionalTest CASE JOB) - add_test(NAME create_experiment_${JOB} - COMMAND bash -c "export RUNTESTS=${CMAKE_BINARY_DIR}/RUNTESTS; export pslot=${CASE}_${JOB}_${GIT_HASH}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") - set_tests_properties(create_experiment_${JOB} PROPERTIES LABELS "${CASE};${JOB}") + set(TEST_NAME ${CASE}_${JOB}) + add_test(NAME create_experiment_${TEST_NAME} + COMMAND bash -c "export RUNTESTS=${CMAKE_BINARY_DIR}/RUNTESTS; export pslot=${TEST_NAME}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") + set_tests_properties(create_experiment_${TEST_NAME} PROPERTIES LABELS "${CASE};${JOB}") - add_test(NAME stage_${JOB} - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") - set_tests_properties(stage_${JOB} PROPERTIES DEPENDS create_experiment_${JOB} LABELS "${CASE};${JOB}") + add_test(NAME stage_${TEST_NAME} + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE} $${JOB}") + set_tests_properties(stage_${TEST_NAME} PROPERTIES DEPENDS create_experiment_${TEST_NAME} LABELS "${CASE};${JOB}") - add_test(NAME run_${JOB} + add_test(NAME run_${TEST_NAME} #COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") COMMAND bash -c "echo 'submitting running of job ${JOB_NAME}'") - set_tests_properties(run_${JOB} PROPERTIES DEPENDS stage_${JOB} LABELS "${CASE};${JOB}") + set_tests_properties(run_${TEST_NAME} PROPERTIES DEPENDS stage_${TEST_NAME} LABELS "${CASE};${JOB}") - add_test(NAME validate_${JOB} - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh ${CASE_NAME} ${JOB_NAME} ${GIT_HASH}") - set_tests_properties(validate_${JOB} PROPERTIES DEPENDS run_${JOB} LABELS "${CASE};${JOB}") + add_test(NAME validate_${TEST_NAME} + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh ${CASE} ${JOB}") + set_tests_properties(validate_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME} LABELS "${CASE};${JOB}") endfunction() -# Split CASE_LIST into individual cases -string(REPLACE " " ";" CASE_LIST_SPLIT ${CASE_LIST}) - -# Loop over each case in CASE_LIST_SPLIT -foreach(CASE IN LISTS CASE_LIST_SPLIT) - # Get JOB_NAMES for this CASE from input variable - string(TOUPPER ${CASE} CASE_UPPER) - set(JOB_NAMES_VAR "JOB_NAMES_${CASE_UPPER}") - if(DEFINED ${JOB_NAMES_VAR}) - string(REPLACE " " ";" JOB_NAMES ${${JOB_NAMES_VAR}}) - else() - message(WARNING "No JOB_NAMES provided for ${CASE}") - continue() - endif() - foreach(JOB IN LISTS JOB_NAMES) - AddFunctionalTest(${CASE} ${JOB}) - endforeach() -endforeach() \ No newline at end of file +AddFunctionalTest("C48_ATM" "gfs_fcst_000") +AddFunctionalTest("C48_ATM" "gfs_atmos_pro") +AddFunctionalTest("C48_S2SW" "gfs_fcst_000") diff --git a/ci/ctests/cases/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml index 309366dcaa..3bd555425b 100644 --- a/ci/ctests/cases/C48_ATM.yaml +++ b/ci/ctests/cases/C48_ATM.yaml @@ -1,8 +1,3 @@ -fcst_gfs: - staged_datapath: {{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ testcase }}/fcst_gfs - input_files: use_jinja_template_fcst - output_files: use_jinja_template_fcst - gfs_fcst: input_files: copy: diff --git a/ci/ctests/scripts/loop_cases_jjobs.cmake b/ci/ctests/scripts/loop_cases_jjobs.cmake new file mode 100644 index 0000000000..e94b8dc630 --- /dev/null +++ b/ci/ctests/scripts/loop_cases_jjobs.cmake @@ -0,0 +1,19 @@ + +# Split CASE_LIST into individual cases +string(REPLACE " " ";" CASE_LIST_SPLIT ${CASE_LIST}) + +# Loop over each case in CASE_LIST_SPLIT +foreach(CASE IN LISTS CASE_LIST_SPLIT) + # Get JOB_NAMES for this CASE from input variable + string(TOUPPER ${CASE} CASE_UPPER) + set(JOB_NAMES_VAR "JOB_NAMES_${CASE_UPPER}") + if(DEFINED ${JOB_NAMES_VAR}) + string(REPLACE " " ";" JOB_NAMES ${${JOB_NAMES_VAR}}) + else() + message(WARNING "No JOB_NAMES provided for ${CASE}") + continue() + endif() + foreach(JOB IN LISTS JOB_NAMES) + AddFunctionalTest(${CASE} ${JOB}) + endforeach() +endforeach() \ No newline at end of file From 3cc83c6a5ae40fa251690c06e7ca3e95eef957cc Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 23 Dec 2024 15:45:04 -0600 Subject: [PATCH 041/144] Cleaned up names to have Case and job name first --- ci/ctests/CMakeLists.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index f444d9e8e3..7bde309ab1 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -21,22 +21,22 @@ set(CREATE_EXPERIMENT_CMD "${HOMEgfs}/workflow/create_experiment.py --overwrite" # Function to add Rocoto boot test for a given case and job function(AddFunctionalTest CASE JOB) set(TEST_NAME ${CASE}_${JOB}) - add_test(NAME create_experiment_${TEST_NAME} + add_test(NAME ${TEST_NAME}_create_experiment COMMAND bash -c "export RUNTESTS=${CMAKE_BINARY_DIR}/RUNTESTS; export pslot=${TEST_NAME}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") - set_tests_properties(create_experiment_${TEST_NAME} PROPERTIES LABELS "${CASE};${JOB}") + set_tests_properties(${TEST_NAME}_create_experiment PROPERTIES LABELS "${CASE};${JOB}") - add_test(NAME stage_${TEST_NAME} + add_test(NAME ${TEST_NAME}_stage COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE} $${JOB}") - set_tests_properties(stage_${TEST_NAME} PROPERTIES DEPENDS create_experiment_${TEST_NAME} LABELS "${CASE};${JOB}") + set_tests_properties(${TEST_NAME}_stage PROPERTIES DEPENDS ${TEST_NAME}_create_experiment LABELS "${CASE};${JOB}") - add_test(NAME run_${TEST_NAME} + add_test(NAME ${TEST_NAME}_execute #COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") COMMAND bash -c "echo 'submitting running of job ${JOB_NAME}'") - set_tests_properties(run_${TEST_NAME} PROPERTIES DEPENDS stage_${TEST_NAME} LABELS "${CASE};${JOB}") + set_tests_properties(${TEST_NAME}_execute PROPERTIES DEPENDS ${TEST_NAME}_stage LABELS "${CASE};${JOB}") - add_test(NAME validate_${TEST_NAME} + add_test(NAME ${TEST_NAME}_validate COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh ${CASE} ${JOB}") - set_tests_properties(validate_${TEST_NAME} PROPERTIES DEPENDS run_${TEST_NAME} LABELS "${CASE};${JOB}") + set_tests_properties(${TEST_NAME}_validate PROPERTIES DEPENDS ${TEST_NAME}_execute LABELS "${CASE};${JOB}") endfunction() AddFunctionalTest("C48_ATM" "gfs_fcst_000") From e1e185890f69f70f8c6ff5f55df3b9870917d3a0 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 23 Dec 2024 16:25:55 -0600 Subject: [PATCH 042/144] added file utils copy commands in gfs_fcst for C48_ATM --- ci/ctests/cases/C48_ATM.yaml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/ci/ctests/cases/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml index 3bd555425b..c54261aeda 100644 --- a/ci/ctests/cases/C48_ATM.yaml +++ b/ci/ctests/cases/C48_ATM.yaml @@ -1,8 +1,21 @@ gfs_fcst: input_files: copy: - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/INPUT/gfs_ctrl.nc, - {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/INPUT/gfs_ctrl.nc] + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_ctrl.nc, + {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_ctrl.nc] + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile1.nc + {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile1.nc] + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile2.nc + {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile2.nc] + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile3.nc + {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile3.nc] + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile4.nc + {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile4.nc] + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile5.nc + {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile5.nc] + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile6.nc + {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile6.nc] + output_files: use_jinja_template_fcst gfs_atmos_pro: From 5ce988f0d7b81a0ebe15e378ba77031a941ee5d5 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 23 Dec 2024 18:11:43 -0600 Subject: [PATCH 043/144] started on stage data python script --- ci/ctests/scripts/stage_data.py | 58 +++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100755 ci/ctests/scripts/stage_data.py diff --git a/ci/ctests/scripts/stage_data.py b/ci/ctests/scripts/stage_data.py new file mode 100755 index 0000000000..55330b9ee6 --- /dev/null +++ b/ci/ctests/scripts/stage_data.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +import os, sys +import shutil +_here = os.path.dirname(__file__) +_top = os.path.abspath(os.path.join(os.path.abspath(_here), '../../..')) +sys.path.insert(0, _top) + +from argparse import ArgumentParser +from pathlib import Path +from wxflow import Configuration, AttrDict, parse_j2yaml, Logger, logit, which, CommandNotFoundError, ProcessError +from workflow.hosts import Host + +logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) + +def parse_args(): + """ + Parse command line arguments. + + Returns + ------- + argparse.Namespace + The parsed command line arguments. + """ + description = """Arguments for creating and updating error log files + """ + parser = ArgumentParser(description=description) + + parser.add_argument('--case', help='Case name', required=True, type=str) + parser.add_argument('--job', help='Job name', required=True, type=str) + parser.add_argument('--build_dir', help='CMake build directory', required=False, type=Path, default=None) + return parser.parse_args() + +if __name__ == '__main__': + + # Parse command line arguments + args = parse_args() + data = AttrDict(HOMEgfs=_top) + data.update(os.environ) + + case_yaml_path = Path(f'{data.HOMEgfs}/ci/ctests/cases/{args.case}.yaml') + + # Initialize host and platform configuration + host = Host() + cfg = Configuration(f'{data.HOMEgfs}/ci/platforms') + platform_config = cfg.parse_config(f'config.{host.machine.lower()}') + data.update(platform_config) + + print(f'{args.build_dir}/RUNTESTS/EXPDIR/{args.case}_{args.job}') + cfg = Configuration(f'{args.build_dir}/RUNTESTS/EXPDIR/{args.case}_{args.job}') + base_cfg = cfg.parse_config('config.base') + + print (base_cfg['PDY']) + + base_cfg.update(data) + + case_cfg = parse_j2yaml(path=case_yaml_path, data=data) + print (case_cfg) From cefaccd964372b281a7a21fd78cc31665860aad6 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 23 Dec 2024 18:13:53 -0600 Subject: [PATCH 044/144] added exec line for python staging script --- ci/ctests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 7bde309ab1..d0ca0605c0 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -26,7 +26,7 @@ function(AddFunctionalTest CASE JOB) set_tests_properties(${TEST_NAME}_create_experiment PROPERTIES LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_stage - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.sh ${CASE} $${JOB}") + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.py --build_dir ${CMAKE_BINARY_DIR} --case ${CASE} --job $${JOB}") set_tests_properties(${TEST_NAME}_stage PROPERTIES DEPENDS ${TEST_NAME}_create_experiment LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_execute From bec03d9abf23226d2e955c1ecfefd721273a54fb Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 23 Dec 2024 18:15:21 -0600 Subject: [PATCH 045/144] deleted space in yaml file for copy commands --- ci/ctests/cases/C48_ATM.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ctests/cases/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml index c54261aeda..31ec1c43f1 100644 --- a/ci/ctests/cases/C48_ATM.yaml +++ b/ci/ctests/cases/C48_ATM.yaml @@ -1,7 +1,7 @@ gfs_fcst: input_files: copy: - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_ctrl.nc, + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_ctrl.nc, {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_ctrl.nc] - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile1.nc {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile1.nc] From 74fbf45ad85a9b8f94f746be27b0c0d5f3fb8cb8 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Thu, 2 Jan 2025 10:43:39 -0600 Subject: [PATCH 046/144] removed extra $ on JOB var --- ci/ctests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index d0ca0605c0..f839faba1d 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -26,7 +26,7 @@ function(AddFunctionalTest CASE JOB) set_tests_properties(${TEST_NAME}_create_experiment PROPERTIES LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_stage - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.py --build_dir ${CMAKE_BINARY_DIR} --case ${CASE} --job $${JOB}") + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.py --build_dir ${CMAKE_BINARY_DIR} --case ${CASE} --job ${JOB}") set_tests_properties(${TEST_NAME}_stage PROPERTIES DEPENDS ${TEST_NAME}_create_experiment LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_execute From 19600f10cb99c5bf4be4d36c62ee5c4890d3659d Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Thu, 2 Jan 2025 11:31:24 -0600 Subject: [PATCH 047/144] idate needed for PDY --- ci/ctests/scripts/stage_data.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ci/ctests/scripts/stage_data.py b/ci/ctests/scripts/stage_data.py index 55330b9ee6..0f3c9e6dae 100755 --- a/ci/ctests/scripts/stage_data.py +++ b/ci/ctests/scripts/stage_data.py @@ -39,6 +39,7 @@ def parse_args(): data.update(os.environ) case_yaml_path = Path(f'{data.HOMEgfs}/ci/ctests/cases/{args.case}.yaml') + pr_case_yaml_path = Path(f'{data.HOMEgfs}/ci/cases/pr/{args.case}.yaml') # Initialize host and platform configuration host = Host() @@ -50,6 +51,9 @@ def parse_args(): cfg = Configuration(f'{args.build_dir}/RUNTESTS/EXPDIR/{args.case}_{args.job}') base_cfg = cfg.parse_config('config.base') + pr_case_cfg = parse_j2yaml(path=pr_case_yaml_path, data=data) + print (f'idate: {pr_case_cfg.idate}') + print (base_cfg['PDY']) base_cfg.update(data) From 2caa229ae3ff286debd9fa5d531a23ccc4881a4d Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Thu, 2 Jan 2025 12:50:11 -0600 Subject: [PATCH 048/144] updated stage data with idate for PDY and HH and made sure paths where correct --- ci/ctests/cases/C48_ATM.yaml | 39 +++++++++++++++++---------------- ci/ctests/scripts/stage_data.py | 12 +++++----- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/ci/ctests/cases/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml index 31ec1c43f1..7a57ed071b 100644 --- a/ci/ctests/cases/C48_ATM.yaml +++ b/ci/ctests/cases/C48_ATM.yaml @@ -1,24 +1,25 @@ gfs_fcst: input_files: copy: - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_ctrl.nc, - {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_ctrl.nc] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile1.nc - {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile1.nc] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile2.nc - {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile2.nc] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile3.nc - {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile3.nc] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile4.nc - {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile4.nc] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile5.nc - {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile5.nc] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/gdas.{{ PDY }}/{{ HH }}/atmos/input/gfs_data.tile6.nc - {{RUNTESTS}}/{{test_name}}//gdas.{{PDY}}/{{HH}}/atmos/input/gfs_data.tile6.nc] + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_ctrl.nc, + {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_ctrl.nc] - output_files: use_jinja_template_fcst + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile1.nc + {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile1.nc] + + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile2.nc + {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile2.nc] + + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile3.nc + {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile3.nc] + + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile4.nc + {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile4.nc] -gfs_atmos_pro: - staged_datapath: {{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ testcase }}/gfs_atmos_prod - input_files: use_jinja_template_gfs_atmos_pro - output_files: use_jinja_template_gfs_atmos_pro + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile5.nc + {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}///gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile5.nc] + + - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc + {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc] + + output_files: use_jinja_template_fcst diff --git a/ci/ctests/scripts/stage_data.py b/ci/ctests/scripts/stage_data.py index 0f3c9e6dae..20dd3384d6 100755 --- a/ci/ctests/scripts/stage_data.py +++ b/ci/ctests/scripts/stage_data.py @@ -52,11 +52,11 @@ def parse_args(): base_cfg = cfg.parse_config('config.base') pr_case_cfg = parse_j2yaml(path=pr_case_yaml_path, data=data) - print (f'idate: {pr_case_cfg.idate}') - - print (base_cfg['PDY']) - + data["PDY"]=str(pr_case_cfg.arguments.idate)[0:8] + data["HH"]=str(pr_case_cfg.arguments.idate)[8:10] + data["case"]=args.case + data["RUNTESTS"]=Path.joinpath(args.build_dir,"RUNTESTS") + data["JOB"]=args.job base_cfg.update(data) - case_cfg = parse_j2yaml(path=case_yaml_path, data=data) - print (case_cfg) + print (case_cfg.gfs_fcst.input_files.copy) From 749e54faa4276d201f1469714533b54547e2676b Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Thu, 2 Jan 2025 13:15:34 -0600 Subject: [PATCH 049/144] added copy using FIleHandler --- ci/ctests/scripts/stage_data.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ci/ctests/scripts/stage_data.py b/ci/ctests/scripts/stage_data.py index 20dd3384d6..ea355d252d 100755 --- a/ci/ctests/scripts/stage_data.py +++ b/ci/ctests/scripts/stage_data.py @@ -47,16 +47,13 @@ def parse_args(): platform_config = cfg.parse_config(f'config.{host.machine.lower()}') data.update(platform_config) - print(f'{args.build_dir}/RUNTESTS/EXPDIR/{args.case}_{args.job}') - cfg = Configuration(f'{args.build_dir}/RUNTESTS/EXPDIR/{args.case}_{args.job}') - base_cfg = cfg.parse_config('config.base') - pr_case_cfg = parse_j2yaml(path=pr_case_yaml_path, data=data) data["PDY"]=str(pr_case_cfg.arguments.idate)[0:8] data["HH"]=str(pr_case_cfg.arguments.idate)[8:10] data["case"]=args.case data["RUNTESTS"]=Path.joinpath(args.build_dir,"RUNTESTS") data["JOB"]=args.job - base_cfg.update(data) case_cfg = parse_j2yaml(path=case_yaml_path, data=data) - print (case_cfg.gfs_fcst.input_files.copy) + + for file in case_cfg['copy']: + file.sync() From 75450e166d49fceff33b6e327c67f323ccaaa230 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Thu, 2 Jan 2025 13:45:20 -0600 Subject: [PATCH 050/144] copy command needs quotes --- ci/ctests/cases/C48_ATM.yaml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ci/ctests/cases/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml index 7a57ed071b..785e17b63a 100644 --- a/ci/ctests/cases/C48_ATM.yaml +++ b/ci/ctests/cases/C48_ATM.yaml @@ -1,25 +1,25 @@ gfs_fcst: input_files: copy: - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_ctrl.nc, - {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_ctrl.nc] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_ctrl.nc", + "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_ctrl.nc"] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile1.nc - {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile1.nc] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile1.nc", + "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile1.nc"] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile2.nc - {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile2.nc] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile2.nc", + "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile2.nc"] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile3.nc - {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile3.nc] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile3.nc", + "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile3.nc"] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile4.nc - {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile4.nc] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile4.nc", + "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile4.nc"] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile5.nc - {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}///gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile5.nc] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile5.nc", + "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}///gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile5.nc"] - - [{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc - {{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc", + "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc"] output_files: use_jinja_template_fcst From 0fc5d76d4909cfa4cfb9bd0cfca485a82e1c1130 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Thu, 2 Jan 2025 13:48:32 -0600 Subject: [PATCH 051/144] added sync() on file handler --- ci/ctests/scripts/stage_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/ctests/scripts/stage_data.py b/ci/ctests/scripts/stage_data.py index ea355d252d..914ab8226d 100755 --- a/ci/ctests/scripts/stage_data.py +++ b/ci/ctests/scripts/stage_data.py @@ -9,7 +9,7 @@ from argparse import ArgumentParser from pathlib import Path from wxflow import Configuration, AttrDict, parse_j2yaml, Logger, logit, which, CommandNotFoundError, ProcessError -from workflow.hosts import Host +from workflow.hosts import Host, FileHandler logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) @@ -56,4 +56,4 @@ def parse_args(): case_cfg = parse_j2yaml(path=case_yaml_path, data=data) for file in case_cfg['copy']: - file.sync() + FileHandler(file).sync() From ea017378cc75808c3216fbeee2b07a35a2064eb5 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Thu, 2 Jan 2025 14:27:46 -0600 Subject: [PATCH 052/144] got FileUtil to work in stage data --- ci/ctests/cases/C48_ATM.yaml | 37 +++++++++++---------------------- ci/ctests/scripts/stage_data.py | 8 +++---- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/ci/ctests/cases/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml index 785e17b63a..3cc5422f24 100644 --- a/ci/ctests/cases/C48_ATM.yaml +++ b/ci/ctests/cases/C48_ATM.yaml @@ -1,25 +1,12 @@ -gfs_fcst: - input_files: - copy: - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_ctrl.nc", - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_ctrl.nc"] - - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile1.nc", - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile1.nc"] - - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile2.nc", - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile2.nc"] - - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile3.nc", - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile3.nc"] - - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile4.nc", - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile4.nc"] - - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile5.nc", - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}///gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile5.nc"] - - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc", - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc"] - - output_files: use_jinja_template_fcst +gfs_fcst_000: + input_files: + mkdir: + - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input" + copy: + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_ctrl.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_ctrl.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile1.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile2.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile3.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile4.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}///gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile5.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc"] diff --git a/ci/ctests/scripts/stage_data.py b/ci/ctests/scripts/stage_data.py index 914ab8226d..8ccd41b6f9 100755 --- a/ci/ctests/scripts/stage_data.py +++ b/ci/ctests/scripts/stage_data.py @@ -8,8 +8,8 @@ from argparse import ArgumentParser from pathlib import Path -from wxflow import Configuration, AttrDict, parse_j2yaml, Logger, logit, which, CommandNotFoundError, ProcessError -from workflow.hosts import Host, FileHandler +from wxflow import Configuration, AttrDict, parse_j2yaml, Logger, logit, which, CommandNotFoundError, ProcessError, FileHandler +from workflow.hosts import Host logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) @@ -54,6 +54,4 @@ def parse_args(): data["RUNTESTS"]=Path.joinpath(args.build_dir,"RUNTESTS") data["JOB"]=args.job case_cfg = parse_j2yaml(path=case_yaml_path, data=data) - - for file in case_cfg['copy']: - FileHandler(file).sync() + FileHandler(case_cfg[args.job]['input_files']).sync() From e9c46f14f37325d524bea30f2e6f99de7b09f1c7 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Thu, 2 Jan 2025 15:22:25 -0600 Subject: [PATCH 053/144] got started on execute --- ci/ctests/CMakeLists.txt | 5 ++--- ci/ctests/cases/C48_ATM.yaml | 2 +- ci/ctests/scripts/execute.sh | 7 +++++++ 3 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 ci/ctests/scripts/execute.sh diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index f839faba1d..7f4671443d 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -39,6 +39,5 @@ function(AddFunctionalTest CASE JOB) set_tests_properties(${TEST_NAME}_validate PROPERTIES DEPENDS ${TEST_NAME}_execute LABELS "${CASE};${JOB}") endfunction() -AddFunctionalTest("C48_ATM" "gfs_fcst_000") -AddFunctionalTest("C48_ATM" "gfs_atmos_pro") -AddFunctionalTest("C48_S2SW" "gfs_fcst_000") +AddFunctionalTest("C48_ATM" "gfs_fcst_seg0") +#AddFunctionalTest("C48_S2SW" "gfs_fcst_000") diff --git a/ci/ctests/cases/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml index 3cc5422f24..d799bdd3b3 100644 --- a/ci/ctests/cases/C48_ATM.yaml +++ b/ci/ctests/cases/C48_ATM.yaml @@ -1,4 +1,4 @@ -gfs_fcst_000: +gfs_fcst_seg0: input_files: mkdir: - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input" diff --git a/ci/ctests/scripts/execute.sh b/ci/ctests/scripts/execute.sh new file mode 100644 index 0000000000..9ff23203cd --- /dev/null +++ b/ci/ctests/scripts/execute.sh @@ -0,0 +1,7 @@ +#/usr/bin/env bash + +CASE=$1 +JOB=$1 + +rocotoboot_dryrun=/work2/noaa/global/mterry/rocoto_dryrun/bin/rocotoboot +job_card=$(${rocotoboot_dryrun} -d ${CASE}_${JOB}.db -w ${CASE}/${JOB}.xml -v 10 -c ${idate}00 -t ${JOB}) From 2602166a72777a5bb6739606ce0aa0c679f6a592 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Thu, 2 Jan 2025 15:25:10 -0600 Subject: [PATCH 054/144] execute needed shabang and exit 0 --- ci/ctests/scripts/execute.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ci/ctests/scripts/execute.sh b/ci/ctests/scripts/execute.sh index 9ff23203cd..5fdb911e30 100644 --- a/ci/ctests/scripts/execute.sh +++ b/ci/ctests/scripts/execute.sh @@ -1,7 +1,10 @@ -#/usr/bin/env bash +#!/usr/bin/env bash CASE=$1 JOB=$1 rocotoboot_dryrun=/work2/noaa/global/mterry/rocoto_dryrun/bin/rocotoboot job_card=$(${rocotoboot_dryrun} -d ${CASE}_${JOB}.db -w ${CASE}/${JOB}.xml -v 10 -c ${idate}00 -t ${JOB}) + +echo -e "scheduler job-card:\n${job_card}" +exit 0 From 1950af4233b355019e6ca080605d0c3f7ad94ae8 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Thu, 2 Jan 2025 15:42:57 -0600 Subject: [PATCH 055/144] almost ready to launch execute.sh --- ci/ctests/CMakeLists.txt | 5 +++-- ci/ctests/scripts/execute.sh | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 7f4671443d..6867406779 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -30,8 +30,9 @@ function(AddFunctionalTest CASE JOB) set_tests_properties(${TEST_NAME}_stage PROPERTIES DEPENDS ${TEST_NAME}_create_experiment LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_execute - #COMMAND bash -c "rocotoboot -w RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.xml -d RUNTESTS/EXPDIR/${CASE_NAME}_${GIT_HASH}/workflow.db -t ${JOB_NAME}") - COMMAND bash -c "echo 'submitting running of job ${JOB_NAME}'") + #TODO Need to get the idate for rocotoboot get the right cycle for the test + #TODO Need to add a loop to check for when job has been completed + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/execute.sh ${CASE} ${JOB}") set_tests_properties(${TEST_NAME}_execute PROPERTIES DEPENDS ${TEST_NAME}_stage LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_validate diff --git a/ci/ctests/scripts/execute.sh b/ci/ctests/scripts/execute.sh index 5fdb911e30..21f55e14d5 100644 --- a/ci/ctests/scripts/execute.sh +++ b/ci/ctests/scripts/execute.sh @@ -1,7 +1,8 @@ #!/usr/bin/env bash CASE=$1 -JOB=$1 +JOB=$2 +idate=$3 rocotoboot_dryrun=/work2/noaa/global/mterry/rocoto_dryrun/bin/rocotoboot job_card=$(${rocotoboot_dryrun} -d ${CASE}_${JOB}.db -w ${CASE}/${JOB}.xml -v 10 -c ${idate}00 -t ${JOB}) From 276a9bd7cca8e428b7951c1e36999e0e714a6026 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 3 Jan 2025 12:05:04 -0600 Subject: [PATCH 056/144] added working skeleton bash script for execute using rocotoboot with dryrun --- ci/ctests/CMakeLists.txt | 4 ++-- ci/ctests/cases/C48_ATM.yaml | 2 ++ ci/ctests/scripts/execute.sh | 15 ++++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) mode change 100644 => 100755 ci/ctests/scripts/execute.sh diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 6867406779..8dba8e26b5 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -30,9 +30,9 @@ function(AddFunctionalTest CASE JOB) set_tests_properties(${TEST_NAME}_stage PROPERTIES DEPENDS ${TEST_NAME}_create_experiment LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_execute - #TODO Need to get the idate for rocotoboot get the right cycle for the test + #TODO Need to get the idate for rocotoboot get the right cycle for the test (hard coded for now) #TODO Need to add a loop to check for when job has been completed - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/execute.sh ${CASE} ${JOB}") + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/execute.sh ${CASE} ${JOB} 2021032312") set_tests_properties(${TEST_NAME}_execute PROPERTIES DEPENDS ${TEST_NAME}_stage LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_validate diff --git a/ci/ctests/cases/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml index d799bdd3b3..a4460511f4 100644 --- a/ci/ctests/cases/C48_ATM.yaml +++ b/ci/ctests/cases/C48_ATM.yaml @@ -10,3 +10,5 @@ gfs_fcst_seg0: - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile4.nc"] - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}///gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile5.nc"] - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile1.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile2.nc"] diff --git a/ci/ctests/scripts/execute.sh b/ci/ctests/scripts/execute.sh old mode 100644 new mode 100755 index 21f55e14d5..680c6d89c4 --- a/ci/ctests/scripts/execute.sh +++ b/ci/ctests/scripts/execute.sh @@ -1,11 +1,20 @@ #!/usr/bin/env bash +set -xe + CASE=$1 JOB=$2 idate=$3 rocotoboot_dryrun=/work2/noaa/global/mterry/rocoto_dryrun/bin/rocotoboot -job_card=$(${rocotoboot_dryrun} -d ${CASE}_${JOB}.db -w ${CASE}/${JOB}.xml -v 10 -c ${idate}00 -t ${JOB}) +CASEDIR="RUNTESTS/EXPDIR/${CASE}_${JOB}" +cd "${CASEDIR}" +rm -f *.db +rm -f jobcard + +job_card=$(yes | ${rocotoboot_dryrun} -d ${CASE}_${JOB}.db -w ${CASE}_${JOB}.xml -v 10 -c ${idate}00 -t ${JOB} 2> jobcard) +cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${CASE}_${JOB}.sub" + +#TODO Generalize for batch system (hard coded to slurm) -echo -e "scheduler job-card:\n${job_card}" -exit 0 +sbatch < "${CASE}_${JOB}.sub" From 283000eff37ccc02aea0549a99d5789df84251c3 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 3 Jan 2025 12:17:24 -0600 Subject: [PATCH 057/144] added a few ICs that where missed --- ci/ctests/cases/C48_ATM.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ci/ctests/cases/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml index a4460511f4..38972826c3 100644 --- a/ci/ctests/cases/C48_ATM.yaml +++ b/ci/ctests/cases/C48_ATM.yaml @@ -12,3 +12,7 @@ gfs_fcst_seg0: - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc"] - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile1.nc"] - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile2.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile3.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile4.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile5.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile6.nc"] From b2a6fec9d6fe05469cedf130137e9d148a230153 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 3 Jan 2025 12:47:58 -0600 Subject: [PATCH 058/144] removed extra scripts no longer used --- ci/ctests/scripts/loop_cases_jjobs.cmake | 19 ------------------- ci/ctests/scripts/stage_data.sh | 2 -- 2 files changed, 21 deletions(-) delete mode 100644 ci/ctests/scripts/loop_cases_jjobs.cmake delete mode 100755 ci/ctests/scripts/stage_data.sh diff --git a/ci/ctests/scripts/loop_cases_jjobs.cmake b/ci/ctests/scripts/loop_cases_jjobs.cmake deleted file mode 100644 index e94b8dc630..0000000000 --- a/ci/ctests/scripts/loop_cases_jjobs.cmake +++ /dev/null @@ -1,19 +0,0 @@ - -# Split CASE_LIST into individual cases -string(REPLACE " " ";" CASE_LIST_SPLIT ${CASE_LIST}) - -# Loop over each case in CASE_LIST_SPLIT -foreach(CASE IN LISTS CASE_LIST_SPLIT) - # Get JOB_NAMES for this CASE from input variable - string(TOUPPER ${CASE} CASE_UPPER) - set(JOB_NAMES_VAR "JOB_NAMES_${CASE_UPPER}") - if(DEFINED ${JOB_NAMES_VAR}) - string(REPLACE " " ";" JOB_NAMES ${${JOB_NAMES_VAR}}) - else() - message(WARNING "No JOB_NAMES provided for ${CASE}") - continue() - endif() - foreach(JOB IN LISTS JOB_NAMES) - AddFunctionalTest(${CASE} ${JOB}) - endforeach() -endforeach() \ No newline at end of file diff --git a/ci/ctests/scripts/stage_data.sh b/ci/ctests/scripts/stage_data.sh deleted file mode 100755 index 8e5e43fa35..0000000000 --- a/ci/ctests/scripts/stage_data.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -echo "This is a stub for the stage_data script." From 9525c7422aff0ee07d0680f421811edc16fc4f4f Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 3 Jan 2025 16:21:41 -0600 Subject: [PATCH 059/144] added defulted values and over rides from command line --- ci/ctests/CMakeLists.txt | 75 ++++++++++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 8dba8e26b5..360e3b19b3 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -4,39 +4,86 @@ project(FunctionalTests) enable_testing() set(CMAKE_VERBOSE_MAKEFILE ON) + +if (DEFINED ENV{GW_BASELINE_DIR} AND NOT DEFINED GW_BASELINE_DIR) + set(GW_BASELINE_DIR $ENV{GW_BASELINE_DIR} CACHE FILEPATH "Path to global-workflow baselines") +else() + get_filename_component(GW_BASELINE_DIR ${CMAKE_SOURCE_DIR}/../.. ABSOLUTE) +endif() + +# If GW_BASELINE_DIR is not defined, tests will not be run, return +if(NOT DEFINED GW_BASELINE_DIR) + message(WARNING "gw: GW_BASELINE_DIR is not defined. Tests will not be run.") + return() +endif() + +if (DEFINED ENV{MACHINE_ID} AND NOT DEFINED MACHINE_ID) + set(MACHINE_ID $ENV{MACHINE_ID} CACHE STRING "Machine ID") +elseif(NOT DEFINED MACHINE_ID) + execute_process( + COMMAND bash -c "source ${GW_BASELINE_DIR}/ush/detect_machine.sh && echo \$MACHINE_ID" + OUTPUT_VARIABLE MACHINE_ID + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +endif() + +if (DEFINED ENV{RUNTESTS} AND NOT DEFINED RUNTESTS) + set(RUNTESTS $ENV{RUNTESTS} CACHE FILEPATH "Path to run global-workflow tests") +elseif( NOT DEFINED RUNTESTS) + set(RUNTESTS ${CMAKE_BINARY_DIR}/RUNTESTS CACHE FILEPATH "Path to run global-workflow tests") +endif() + +if (DEFINED ENV{HPC_ACCOUNT} AND NOT DEFINED HPC_ACCOUNT) + set(HPC_ACCOUNT $ENV{HPC_ACCOUNT} CACHE STRING "Allocation to use for running global-workflow tests") +elseif(NOT DEFINED HPC_ACCOUNT) + execute_process( + COMMAND bash -c "source ${GW_BASELINE_DIR}/ci/platforms/config.${MACHINE_ID} && echo \$HPC_ACCOUNT" + OUTPUT_VARIABLE HPC_ACCOUNT + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +endif() + +if (DEFINED ENV{ICSDIR_ROOT} AND NOT DEFINED ICSDIR_ROOT) + set(ICSDIR_ROOT $ENV{ICSDIR_ROOT} CACHE FILEPATH "Path to ICS directory") +elseif(NOT DEFINED ICSDIR_ROOT) + execute_process( + COMMAND bash -c "source ${CMAKE_SOURCE_DIR}/../platforms/config.${MACHINE_ID} && echo \$ICSDIR_ROOT" + OUTPUT_VARIABLE ICSDIR_ROOT + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + set(ICSDIR_ROOT ${ICSDIR_ROOT} CACHE FILEPATH "Path to ICS directory") +endif() + # Set environment variables and paths -get_filename_component(HOMEgfs ${CMAKE_SOURCE_DIR}/../.. ABSOLUTE) set(CASE_PATH ${HOMEgfs}/ci/cases/pr) set(CREATE_EXPERIMENT_CMD "${HOMEgfs}/workflow/create_experiment.py --overwrite") -# Get the current git commit hash -#message(STATUS "Executing: git rev-parse --short HEAD") -#execute_process( -# COMMAND git rev-parse --short HEAD -# WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} -# OUTPUT_VARIABLE GIT_HASH -# OUTPUT_STRIP_TRAILING_WHITESPACE -#) +message(STATUS "MACHINE_ID: '${MACHINE_ID}'") +message(STATUS "gw: global-workflow baselines will be used from: '${GW_BASELINE_DIR}'") +message(STATUS "gw: global-workflow tests will be run at: '${RUNTESTS}'") +message(STATUS "gw: global-workflow tests will use the allocation: '${HPC_ACCOUNT}'") +message(STATUS "gw: global-workflow tests will use ICSDIR_ROOT: '${ICSDIR_ROOT}'") + +return() -# Function to add Rocoto boot test for a given case and job function(AddFunctionalTest CASE JOB) set(TEST_NAME ${CASE}_${JOB}) add_test(NAME ${TEST_NAME}_create_experiment - COMMAND bash -c "export RUNTESTS=${CMAKE_BINARY_DIR}/RUNTESTS; export pslot=${TEST_NAME}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") + COMMAND bash -c "export pslot=${TEST_NAME}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") set_tests_properties(${TEST_NAME}_create_experiment PROPERTIES LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_stage - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/stage_data.py --build_dir ${CMAKE_BINARY_DIR} --case ${CASE} --job ${JOB}") + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/stage_data.py --build_dir ${CMAKE_BINARY_DIR} --case ${CASE} --job ${JOB}") set_tests_properties(${TEST_NAME}_stage PROPERTIES DEPENDS ${TEST_NAME}_create_experiment LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_execute #TODO Need to get the idate for rocotoboot get the right cycle for the test (hard coded for now) #TODO Need to add a loop to check for when job has been completed - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/execute.sh ${CASE} ${JOB} 2021032312") + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${CASE} ${JOB} 2021032312") set_tests_properties(${TEST_NAME}_execute PROPERTIES DEPENDS ${TEST_NAME}_stage LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_validate - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh ${CASE} ${JOB}") + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${CASE} ${JOB}") set_tests_properties(${TEST_NAME}_validate PROPERTIES DEPENDS ${TEST_NAME}_execute LABELS "${CASE};${JOB}") endfunction() From 74f7268f207d4a9fe999152c3fa6d1cce159c5aa Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 3 Jan 2025 16:28:03 -0600 Subject: [PATCH 060/144] removed HOMEgfs for path to create expermient --- ci/ctests/CMakeLists.txt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 360e3b19b3..91806b7eb1 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -54,17 +54,14 @@ elseif(NOT DEFINED ICSDIR_ROOT) set(ICSDIR_ROOT ${ICSDIR_ROOT} CACHE FILEPATH "Path to ICS directory") endif() -# Set environment variables and paths -set(CASE_PATH ${HOMEgfs}/ci/cases/pr) -set(CREATE_EXPERIMENT_CMD "${HOMEgfs}/workflow/create_experiment.py --overwrite") - message(STATUS "MACHINE_ID: '${MACHINE_ID}'") message(STATUS "gw: global-workflow baselines will be used from: '${GW_BASELINE_DIR}'") message(STATUS "gw: global-workflow tests will be run at: '${RUNTESTS}'") message(STATUS "gw: global-workflow tests will use the allocation: '${HPC_ACCOUNT}'") message(STATUS "gw: global-workflow tests will use ICSDIR_ROOT: '${ICSDIR_ROOT}'") -return() +set(CASE_PATH ${HOMEgfs}/ci/cases/pr) +set(CREATE_EXPERIMENT_CMD "${GW_BASELINE_DIR}/workflow/create_experiment.py --overwrite") function(AddFunctionalTest CASE JOB) set(TEST_NAME ${CASE}_${JOB}) From 5cd1c5ff72a49c35a032d379a831492135f2ac37 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 3 Jan 2025 12:58:12 -0600 Subject: [PATCH 061/144] removed another unused script --- ci/ctests/scripts/generate_ctest_args.py | 70 ------------------------ 1 file changed, 70 deletions(-) delete mode 100755 ci/ctests/scripts/generate_ctest_args.py diff --git a/ci/ctests/scripts/generate_ctest_args.py b/ci/ctests/scripts/generate_ctest_args.py deleted file mode 100755 index 6b81b8aa93..0000000000 --- a/ci/ctests/scripts/generate_ctest_args.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 - -import os, sys -import shutil -_here = os.path.dirname(__file__) -_top = os.path.abspath(os.path.join(os.path.abspath(_here), '../../..')) -sys.path.insert(0, _top) - -from argparse import ArgumentParser -from pathlib import Path -from wxflow import Configuration, AttrDict, parse_j2yaml, Logger, logit, which, CommandNotFoundError, ProcessError -from workflow.hosts import Host - -logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) - -def parse_args(): - """ - Parse command line arguments. - - Returns - ------- - argparse.Namespace - The parsed command line arguments. - """ - description = """Arguments for creating and updating error log files - """ - parser = ArgumentParser(description=description) - - parser.add_argument('--yaml', help='paths to YAML files for creating functional tests per case', required=True, type=Path, nargs='+') - return parser.parse_args() - -if __name__ == '__main__': - - # Parse command line arguments - args = parse_args() - data = AttrDict(HOMEgfs=_top) - data.update(os.environ) - - # Initialize host and configuration - host = Host() - cfg = Configuration(f'{data.HOMEgfs}/ci/platforms') - - # Initialize dictionaries to hold case names and their job names - case_names = [] - case_jobs = {} - - for yaml in args.yaml: - platform_config = cfg.parse_config(f'config.{host.machine.lower()}') - case_name = os.path.basename(yaml).split('.')[0] - platform_config['testcase'] = case_name - data.update(platform_config) - case_cfg = parse_j2yaml(path=yaml, data=data) - case_cfg.update(platform_config) - - # Collect job names from the YAML file - top_level_entries = [key for key in case_cfg.keys() if isinstance(case_cfg[key], dict)] - job_names = [f"{case_name}_{entry}" for entry in top_level_entries] - case_jobs[case_name.upper()] = ' '.join(job_names) - case_names.append(case_name) - - # Prepare cmake command-line arguments - cmake_args = [ - f"-DCASE_LIST='{ ' '.join(case_names) }'" - ] - for case_upper, jobs in case_jobs.items(): - cmake_args.append(f"-DJOB_NAMES_{case_upper}='{jobs}'") - - for each_arg in cmake_args: - print(each_arg, end=' ') - print() \ No newline at end of file From c132786bc4ed66ccf7a0addc09941f0ee02c7453 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 3 Jan 2025 16:39:02 -0600 Subject: [PATCH 062/144] fixed a few path errors with HOMEgfs still hanging around --- ci/ctests/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 91806b7eb1..a9536db974 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -60,13 +60,13 @@ message(STATUS "gw: global-workflow tests will be run at: '${RUNTESTS}'") message(STATUS "gw: global-workflow tests will use the allocation: '${HPC_ACCOUNT}'") message(STATUS "gw: global-workflow tests will use ICSDIR_ROOT: '${ICSDIR_ROOT}'") -set(CASE_PATH ${HOMEgfs}/ci/cases/pr) +set(CASE_PATH ${GW_BASELINE_DIR}/ci/cases/pr) set(CREATE_EXPERIMENT_CMD "${GW_BASELINE_DIR}/workflow/create_experiment.py --overwrite") function(AddFunctionalTest CASE JOB) set(TEST_NAME ${CASE}_${JOB}) add_test(NAME ${TEST_NAME}_create_experiment - COMMAND bash -c "export pslot=${TEST_NAME}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") + COMMAND bash -c "export RUNTESTS=${RUNTESTS}; export pslot=${TEST_NAME}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") set_tests_properties(${TEST_NAME}_create_experiment PROPERTIES LABELS "${CASE};${JOB}") add_test(NAME ${TEST_NAME}_stage From e873722f96a1e243f7eadb0d9884d2f2aa8e07e3 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 6 Jan 2025 16:33:40 -0600 Subject: [PATCH 063/144] added cmake_parse_arguments with extras and used inline template for setup.sh --- ci/ctests/CMakeLists.txt | 62 ++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 22 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index a9536db974..91af853edb 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -47,7 +47,7 @@ if (DEFINED ENV{ICSDIR_ROOT} AND NOT DEFINED ICSDIR_ROOT) set(ICSDIR_ROOT $ENV{ICSDIR_ROOT} CACHE FILEPATH "Path to ICS directory") elseif(NOT DEFINED ICSDIR_ROOT) execute_process( - COMMAND bash -c "source ${CMAKE_SOURCE_DIR}/../platforms/config.${MACHINE_ID} && echo \$ICSDIR_ROOT" + COMMAND bash -c "source ${GW_BASELINE_DIR}/ci/platforms/config.${MACHINE_ID} && echo \$ICSDIR_ROOT" OUTPUT_VARIABLE ICSDIR_ROOT OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -60,29 +60,47 @@ message(STATUS "gw: global-workflow tests will be run at: '${RUNTESTS}'") message(STATUS "gw: global-workflow tests will use the allocation: '${HPC_ACCOUNT}'") message(STATUS "gw: global-workflow tests will use ICSDIR_ROOT: '${ICSDIR_ROOT}'") -set(CASE_PATH ${GW_BASELINE_DIR}/ci/cases/pr) -set(CREATE_EXPERIMENT_CMD "${GW_BASELINE_DIR}/workflow/create_experiment.py --overwrite") +# Prepare test scripts +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/setup.sh.in + ${CMAKE_CURRENT_BINARY_DIR}/scripts/setup.sh @ONLY) -function(AddFunctionalTest CASE JOB) - set(TEST_NAME ${CASE}_${JOB}) - add_test(NAME ${TEST_NAME}_create_experiment - COMMAND bash -c "export RUNTESTS=${RUNTESTS}; export pslot=${TEST_NAME}; ${CREATE_EXPERIMENT_CMD} --yaml ${CASE_PATH}/${CASE}.yaml") - set_tests_properties(${TEST_NAME}_create_experiment PROPERTIES LABELS "${CASE};${JOB}") - - add_test(NAME ${TEST_NAME}_stage - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/stage_data.py --build_dir ${CMAKE_BINARY_DIR} --case ${CASE} --job ${JOB}") - set_tests_properties(${TEST_NAME}_stage PROPERTIES DEPENDS ${TEST_NAME}_create_experiment LABELS "${CASE};${JOB}") - - add_test(NAME ${TEST_NAME}_execute - #TODO Need to get the idate for rocotoboot get the right cycle for the test (hard coded for now) - #TODO Need to add a loop to check for when job has been completed - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${CASE} ${JOB} 2021032312") - set_tests_properties(${TEST_NAME}_execute PROPERTIES DEPENDS ${TEST_NAME}_stage LABELS "${CASE};${JOB}") +function(AddFunctionalTest) + + set(prefix ARG) + set(novals NOTRAPFPE NOVALGRIND) + set(singlevals CASE JOB) + set(multivals TEST_DEPENDS) + + cmake_parse_arguments(${prefix} + "${novals}" "${singlevals}" "${multivals}" + ${ARGN}) + + set(TEST_NAME test_${ARG_CASE}_${ARG_JOB}) + set(CASE_PATH ${GW_BASELINE_DIR}/ci/cases/pr) + set(CASE_YAML ${CASE_PATH}/${ARG_CASE}.yaml) + + add_test(NAME ${TEST_NAME}_setup + COMMAND ./setup.sh ${TEST_NAME} ${CASE_YAML} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) + set_tests_properties(${TEST_NAME}_setup PROPERTIES LABELS "${CASE};${JOB}") - add_test(NAME ${TEST_NAME}_validate - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${CASE} ${JOB}") - set_tests_properties(${TEST_NAME}_validate PROPERTIES DEPENDS ${TEST_NAME}_execute LABELS "${CASE};${JOB}") + add_test(NAME ${TEST_NAME}_stage + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/stage_data.py --build_dir ${CMAKE_BINARY_DIR} --case ${ARG_CASE} --job ${ARG_JOB}") + set_tests_properties(${TEST_NAME}_stage PROPERTIES DEPENDS ${TEST_NAME}_setup LABELS "${ARG_CASE};${ARG_JOB}") + + add_test(NAME ${TEST_NAME}_execute + #TODO Need to get the idate for rocotoboot get the right cycle for the test (hard coded for now) + #TODO Need to add a loop to check for when job has been completed + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${CASE_ARG} ${JOB_ARG} 2021032312") + set_tests_properties(${TEST_NAME}_execute PROPERTIES DEPENDS ${TEST_NAME}_stage LABELS "${CASE_ARG};${JOB_ARG}") + + add_test(NAME ${TEST_NAME}_validate + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${CASE_ARG} ${JOB}") + set_tests_properties(${TEST_NAME}_validate PROPERTIES DEPENDS ${TEST_NAME}_execute LABELS "${CASE_ARG};${JOB}") endfunction() -AddFunctionalTest("C48_ATM" "gfs_fcst_seg0") +AddFunctionalTest( + CASE "C48_ATM" + JOB "gfs_fcst_seg0" +) #AddFunctionalTest("C48_S2SW" "gfs_fcst_000") From 32c5f87f74a31455ee8f860e1f61d520f7ed4b19 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 6 Jan 2025 16:38:26 -0600 Subject: [PATCH 064/144] added template for cmake tests setup.sh --- ci/ctests/scripts/setup.sh.in | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 ci/ctests/scripts/setup.sh.in diff --git a/ci/ctests/scripts/setup.sh.in b/ci/ctests/scripts/setup.sh.in new file mode 100755 index 0000000000..3bbf6d4c77 --- /dev/null +++ b/ci/ctests/scripts/setup.sh.in @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -ux + +TEST_NAME=${1:?"Name of the test is required"} +YAML_FILE=${2:?"Name of the CI yaml file for the test"} + +# CMake to fill these variables +HOMEgfs="@GW_BASELINE_DIR@" +RUNTESTS="@RUNTESTS@" +ICSDIR_ROOT="@ICSDIR_ROOT@" +HPC_ACCOUNT="@HPC_ACCOUNT@" + +set +x +source "${HOMEgfs}/workflow/gw_setup.sh" +set -x + +pslot="${TEST_NAME}" \ +RUNTESTS="${RUNTESTS}" \ +ICSDIR_ROOT="${ICSDIR_ROOT}" \ +HPC_ACCOUNT="${HPC_ACCOUNT}" \ +"${HOMEgfs}/workflow/create_experiment.py" --yaml "${YAML_FILE}" +rc=$? +if [[ "${rc}" -ne 0 ]]; then + set +x + echo "Failed to create test experiment for '${TEST_NAME}' with yaml file '${YAML_FILE}'" + set -x + exit "${rc}" +fi + +exit 0 From 128d0e6638df4c33e4c0865d931e15e56088668e Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 6 Jan 2025 16:43:38 -0600 Subject: [PATCH 065/144] had to add ARG_ header to labels names for depenancies for setup worked --- ci/ctests/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 91af853edb..04d2361e7e 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -82,7 +82,7 @@ function(AddFunctionalTest) add_test(NAME ${TEST_NAME}_setup COMMAND ./setup.sh ${TEST_NAME} ${CASE_YAML} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) - set_tests_properties(${TEST_NAME}_setup PROPERTIES LABELS "${CASE};${JOB}") + set_tests_properties(${TEST_NAME}_setup PROPERTIES LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME ${TEST_NAME}_stage COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/stage_data.py --build_dir ${CMAKE_BINARY_DIR} --case ${ARG_CASE} --job ${ARG_JOB}") @@ -101,6 +101,6 @@ endfunction() AddFunctionalTest( CASE "C48_ATM" - JOB "gfs_fcst_seg0" + JOB "gfs_fcst_seg0" ) #AddFunctionalTest("C48_S2SW" "gfs_fcst_000") From abb295257cc7fd93c18daf0bd4011a7a6b75df62 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 6 Jan 2025 17:00:20 -0600 Subject: [PATCH 066/144] added bash wrapper to stage_data.py and made single job per yaml configuation --- ci/ctests/cases/C48_ATM.yaml | 18 ------------------ ci/ctests/scripts/stage.sh.in | 30 ++++++++++++++++++++++++++++++ ci/ctests/scripts/stage_data.py | 4 ++-- 3 files changed, 32 insertions(+), 20 deletions(-) delete mode 100644 ci/ctests/cases/C48_ATM.yaml create mode 100755 ci/ctests/scripts/stage.sh.in diff --git a/ci/ctests/cases/C48_ATM.yaml b/ci/ctests/cases/C48_ATM.yaml deleted file mode 100644 index 38972826c3..0000000000 --- a/ci/ctests/cases/C48_ATM.yaml +++ /dev/null @@ -1,18 +0,0 @@ -gfs_fcst_seg0: - input_files: - mkdir: - - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input" - copy: - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_ctrl.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_ctrl.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile1.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile2.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile3.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile4.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}///gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile5.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile1.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile2.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile3.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile4.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile5.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile6.nc"] diff --git a/ci/ctests/scripts/stage.sh.in b/ci/ctests/scripts/stage.sh.in new file mode 100755 index 0000000000..d7a1da35d0 --- /dev/null +++ b/ci/ctests/scripts/stage.sh.in @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +set -ux + +TEST_NAME=${1:?"Name of the test is required"} + +# CMake to fill these variables +HOMEgfs="@GW_BASELINE_DIR@" + +# Load the runtime environment for this script (needs wxflow and its dependencies) +set +x +source "${HOMEgfs}/workflow/gw_setup.sh" +rc=$? +[[ "${rc}" -ne 0 ]] && exit "${status}" +set -x +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${HOMEgfs}/sorc/wxflow/src/wxflow" +export PYTHONPATH + +INPUTS_YAML="${HOMEgfs}/tests/inputs/${TEST_NAME}.yaml" + +"${HOMEgfs}/tests/scripts/stage.py" "${INPUTS_YAML}" +rc=$? +if [[ "${rc}" -ne 0 ]]; then + set +x + echo "Failed to stage inputs for '${TEST_NAME}' with '${INPUTS_YAML}'" + set -x + exit "${rc}" +fi + +exit 0 diff --git a/ci/ctests/scripts/stage_data.py b/ci/ctests/scripts/stage_data.py index 8ccd41b6f9..331bdf5527 100755 --- a/ci/ctests/scripts/stage_data.py +++ b/ci/ctests/scripts/stage_data.py @@ -38,7 +38,7 @@ def parse_args(): data = AttrDict(HOMEgfs=_top) data.update(os.environ) - case_yaml_path = Path(f'{data.HOMEgfs}/ci/ctests/cases/{args.case}.yaml') + case_yaml_path = Path(f'{data.HOMEgfs}/ci/ctests/cases/{args.case}_{args.job}.yaml') pr_case_yaml_path = Path(f'{data.HOMEgfs}/ci/cases/pr/{args.case}.yaml') # Initialize host and platform configuration @@ -54,4 +54,4 @@ def parse_args(): data["RUNTESTS"]=Path.joinpath(args.build_dir,"RUNTESTS") data["JOB"]=args.job case_cfg = parse_j2yaml(path=case_yaml_path, data=data) - FileHandler(case_cfg[args.job]['input_files']).sync() + FileHandler(case_cfg.input_files.sync()) From 1d54caf5a0f4f83c04fac8e937cec7d0575f7485 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 6 Jan 2025 17:04:07 -0600 Subject: [PATCH 067/144] added the part to drop in templated inline script for stage.sh --- ci/ctests/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 04d2361e7e..1f066c4bf8 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -63,6 +63,8 @@ message(STATUS "gw: global-workflow tests will use ICSDIR_ROOT: '${ICSDIR_ROOT}' # Prepare test scripts configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/setup.sh.in ${CMAKE_CURRENT_BINARY_DIR}/scripts/setup.sh @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/stage.sh.in + ${CMAKE_CURRENT_BINARY_DIR}/scripts/stage.sh @ONLY) function(AddFunctionalTest) From 253257611d77c06203bf337fb998d7ed518e0ff0 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 6 Jan 2025 17:18:33 -0600 Subject: [PATCH 068/144] getting stage.sh.in args to work for now --- ci/ctests/CMakeLists.txt | 3 ++- ci/ctests/scripts/stage.sh.in | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 1f066c4bf8..043d56c8f1 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -87,7 +87,8 @@ function(AddFunctionalTest) set_tests_properties(${TEST_NAME}_setup PROPERTIES LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME ${TEST_NAME}_stage - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/stage_data.py --build_dir ${CMAKE_BINARY_DIR} --case ${ARG_CASE} --job ${ARG_JOB}") + COMMAND ./stage.sh ${TEST_NAME} ${ARG_CASE} ${ARG_JOB} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts set_tests_properties(${TEST_NAME}_stage PROPERTIES DEPENDS ${TEST_NAME}_setup LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME ${TEST_NAME}_execute diff --git a/ci/ctests/scripts/stage.sh.in b/ci/ctests/scripts/stage.sh.in index d7a1da35d0..69056f1b84 100755 --- a/ci/ctests/scripts/stage.sh.in +++ b/ci/ctests/scripts/stage.sh.in @@ -16,9 +16,10 @@ set -x PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${HOMEgfs}/sorc/wxflow/src/wxflow" export PYTHONPATH +#TODO - need to use this instead of CACE_JOB by updating the python script INPUTS_YAML="${HOMEgfs}/tests/inputs/${TEST_NAME}.yaml" -"${HOMEgfs}/tests/scripts/stage.py" "${INPUTS_YAML}" +"${HOMEgfs}/tests/scripts/stage.py" --build_dir "${MAKE_CURRENT_BINARY_DIR}" --case "${ARG_CASE}" --job "${ARG_JOB}" rc=$? if [[ "${rc}" -ne 0 ]]; then set +x From 0967f1072cf470423e9d7d903f5bc150dbdfa8bf Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 6 Jan 2025 17:27:55 -0600 Subject: [PATCH 069/144] still getting args straintened out with staging --- ci/ctests/CMakeLists.txt | 2 +- ci/ctests/scripts/{stage_data.py => stage.py} | 0 ci/ctests/scripts/stage.sh.in | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename ci/ctests/scripts/{stage_data.py => stage.py} (100%) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 043d56c8f1..8d9d9bf702 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -88,7 +88,7 @@ function(AddFunctionalTest) add_test(NAME ${TEST_NAME}_stage COMMAND ./stage.sh ${TEST_NAME} ${ARG_CASE} ${ARG_JOB} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) set_tests_properties(${TEST_NAME}_stage PROPERTIES DEPENDS ${TEST_NAME}_setup LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME ${TEST_NAME}_execute diff --git a/ci/ctests/scripts/stage_data.py b/ci/ctests/scripts/stage.py similarity index 100% rename from ci/ctests/scripts/stage_data.py rename to ci/ctests/scripts/stage.py diff --git a/ci/ctests/scripts/stage.sh.in b/ci/ctests/scripts/stage.sh.in index 69056f1b84..2272401ab8 100755 --- a/ci/ctests/scripts/stage.sh.in +++ b/ci/ctests/scripts/stage.sh.in @@ -19,7 +19,7 @@ export PYTHONPATH #TODO - need to use this instead of CACE_JOB by updating the python script INPUTS_YAML="${HOMEgfs}/tests/inputs/${TEST_NAME}.yaml" -"${HOMEgfs}/tests/scripts/stage.py" --build_dir "${MAKE_CURRENT_BINARY_DIR}" --case "${ARG_CASE}" --job "${ARG_JOB}" +"${HOMEgfs}/ci/ctests/scripts/stage.py" --build_dir "${MAKE_CURRENT_BINARY_DIR}" --case "${ARG_CASE}" --job "${ARG_JOB}" rc=$? if [[ "${rc}" -ne 0 ]]; then set +x From 8231519adfe5fd9ec92bb7c02f614e87f32f9df1 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 12:08:14 -0600 Subject: [PATCH 070/144] added args in bash wrapper to stage.py to pick up ARG_CASE and ARG_JOB --- ci/ctests/scripts/stage.sh.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ci/ctests/scripts/stage.sh.in b/ci/ctests/scripts/stage.sh.in index 2272401ab8..6777961882 100755 --- a/ci/ctests/scripts/stage.sh.in +++ b/ci/ctests/scripts/stage.sh.in @@ -3,6 +3,8 @@ set -ux TEST_NAME=${1:?"Name of the test is required"} +CASE=${2:?"Case name for JJOB test"} +JOB=${3:?"Job name for JJOB test"} # CMake to fill these variables HOMEgfs="@GW_BASELINE_DIR@" From 30466b95faae08fc36b52c09786540e58f0df543 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 12:30:54 -0600 Subject: [PATCH 071/144] updated args to stage.py to simply take yaml input --- ci/ctests/CMakeLists.txt | 20 ++++++++++---------- ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml | 17 +++++++++++++++++ ci/ctests/scripts/stage.sh.in | 6 ++---- 3 files changed, 29 insertions(+), 14 deletions(-) create mode 100644 ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 8d9d9bf702..b4867a0f39 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -77,29 +77,29 @@ function(AddFunctionalTest) "${novals}" "${singlevals}" "${multivals}" ${ARGN}) - set(TEST_NAME test_${ARG_CASE}_${ARG_JOB}) + set(TEST_NAME ${ARG_CASE}_${ARG_JOB}) set(CASE_PATH ${GW_BASELINE_DIR}/ci/cases/pr) set(CASE_YAML ${CASE_PATH}/${ARG_CASE}.yaml) - add_test(NAME ${TEST_NAME}_setup + add_test(NAME test_${TEST_NAME}_setup COMMAND ./setup.sh ${TEST_NAME} ${CASE_YAML} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) - set_tests_properties(${TEST_NAME}_setup PROPERTIES LABELS "${ARG_CASE};${ARG_JOB}") + set_tests_properties(test_${TEST_NAME}_setup PROPERTIES LABELS "${ARG_CASE};${ARG_JOB}") - add_test(NAME ${TEST_NAME}_stage - COMMAND ./stage.sh ${TEST_NAME} ${ARG_CASE} ${ARG_JOB} + add_test(NAME test_${TEST_NAME}_stage + COMMAND ./stage.sh ${TEST_NAME}) WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) - set_tests_properties(${TEST_NAME}_stage PROPERTIES DEPENDS ${TEST_NAME}_setup LABELS "${ARG_CASE};${ARG_JOB}") + set_tests_properties(test_${TEST_NAME}_stage PROPERTIES DEPENDS test_${TEST_NAME}_setup LABELS "${ARG_CASE};${ARG_JOB}") - add_test(NAME ${TEST_NAME}_execute + add_test(NAME test_${TEST_NAME}_execute #TODO Need to get the idate for rocotoboot get the right cycle for the test (hard coded for now) #TODO Need to add a loop to check for when job has been completed COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${CASE_ARG} ${JOB_ARG} 2021032312") - set_tests_properties(${TEST_NAME}_execute PROPERTIES DEPENDS ${TEST_NAME}_stage LABELS "${CASE_ARG};${JOB_ARG}") + set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${CASE_ARG};${JOB_ARG}") - add_test(NAME ${TEST_NAME}_validate + add_test(NAME test_${TEST_NAME}_validate COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${CASE_ARG} ${JOB}") - set_tests_properties(${TEST_NAME}_validate PROPERTIES DEPENDS ${TEST_NAME}_execute LABELS "${CASE_ARG};${JOB}") + set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${CASE_ARG};${JOB}") endfunction() AddFunctionalTest( diff --git a/ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml b/ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml new file mode 100644 index 0000000000..b8a7e1cce9 --- /dev/null +++ b/ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml @@ -0,0 +1,17 @@ +input_files: + mkdir: + - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input" + copy: + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_ctrl.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_ctrl.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile1.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile2.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile3.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile4.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}///gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile5.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile1.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile2.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile3.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile4.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile5.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile6.nc"] diff --git a/ci/ctests/scripts/stage.sh.in b/ci/ctests/scripts/stage.sh.in index 6777961882..0a1547c58e 100755 --- a/ci/ctests/scripts/stage.sh.in +++ b/ci/ctests/scripts/stage.sh.in @@ -3,8 +3,6 @@ set -ux TEST_NAME=${1:?"Name of the test is required"} -CASE=${2:?"Case name for JJOB test"} -JOB=${3:?"Job name for JJOB test"} # CMake to fill these variables HOMEgfs="@GW_BASELINE_DIR@" @@ -19,9 +17,9 @@ PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${HOMEgfs}/sorc/wxflow/src/wxflow" export PYTHONPATH #TODO - need to use this instead of CACE_JOB by updating the python script -INPUTS_YAML="${HOMEgfs}/tests/inputs/${TEST_NAME}.yaml" +INPUTS_YAML="${HOMEgfs}/ci/ctest/cases/${TEST_NAME}.yaml" -"${HOMEgfs}/ci/ctests/scripts/stage.py" --build_dir "${MAKE_CURRENT_BINARY_DIR}" --case "${ARG_CASE}" --job "${ARG_JOB}" +"${HOMEgfs}/ci/ctests/scripts/stage.py" --build_dir "${MAKE_CURRENT_BINARY_DIR}" --yaml "${INPUTS_YAML}" rc=$? if [[ "${rc}" -ne 0 ]]; then set +x From 3deeb41bc3750e0f693dd5a4bd9fd66eb49b0f5a Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 12:32:28 -0600 Subject: [PATCH 072/144] had extra ) for updated add_test --- ci/ctests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index b4867a0f39..a73efe42df 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -87,7 +87,7 @@ function(AddFunctionalTest) set_tests_properties(test_${TEST_NAME}_setup PROPERTIES LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME test_${TEST_NAME}_stage - COMMAND ./stage.sh ${TEST_NAME}) + COMMAND ./stage.sh ${TEST_NAME} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) set_tests_properties(test_${TEST_NAME}_stage PROPERTIES DEPENDS test_${TEST_NAME}_setup LABELS "${ARG_CASE};${ARG_JOB}") From 099a2cb60ed3a57c4c4cfa188a557fc8971a0303 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 12:43:12 -0600 Subject: [PATCH 073/144] removed reading of pr case file for getting idate --- ci/ctests/scripts/stage.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/ci/ctests/scripts/stage.py b/ci/ctests/scripts/stage.py index 331bdf5527..4d89b1a7ac 100755 --- a/ci/ctests/scripts/stage.py +++ b/ci/ctests/scripts/stage.py @@ -26,20 +26,22 @@ def parse_args(): """ parser = ArgumentParser(description=description) - parser.add_argument('--case', help='Case name', required=True, type=str) - parser.add_argument('--job', help='Job name', required=True, type=str) parser.add_argument('--build_dir', help='CMake build directory', required=False, type=Path, default=None) + parser.add_argument('-y', '--yaml', help='full path to yaml file describing the job test configuration', type=Path, required=True) return parser.parse_args() if __name__ == '__main__': + # TODO get idate + idate = "2021032312" + # Parse command line arguments args = parse_args() data = AttrDict(HOMEgfs=_top) data.update(os.environ) - case_yaml_path = Path(f'{data.HOMEgfs}/ci/ctests/cases/{args.case}_{args.job}.yaml') - pr_case_yaml_path = Path(f'{data.HOMEgfs}/ci/cases/pr/{args.case}.yaml') + case_yaml_path = Path(f'{data.HOMEgfs}/ci/ctests/cases/{args.yaml}') + #pr_case_yaml_path = Path(f'{data.HOMEgfs}/ci/cases/pr/{args.case}.yaml') # Initialize host and platform configuration host = Host() @@ -47,11 +49,11 @@ def parse_args(): platform_config = cfg.parse_config(f'config.{host.machine.lower()}') data.update(platform_config) - pr_case_cfg = parse_j2yaml(path=pr_case_yaml_path, data=data) - data["PDY"]=str(pr_case_cfg.arguments.idate)[0:8] - data["HH"]=str(pr_case_cfg.arguments.idate)[8:10] - data["case"]=args.case + #pr_case_cfg = parse_j2yaml(path=pr_case_yaml_path, data=data) + #data["PDY"]=str(pr_case_cfg.arguments.idate)[0:8] + #data["HH"]=str(pr_case_cfg.arguments.idate)[8:10] + data["PDY"]=str(idate)[0:8] + data["HH"]=str(idate)[8:10] data["RUNTESTS"]=Path.joinpath(args.build_dir,"RUNTESTS") - data["JOB"]=args.job case_cfg = parse_j2yaml(path=case_yaml_path, data=data) FileHandler(case_cfg.input_files.sync()) From 94dd64e1ab03fae6bbcb3fc0b5fd21260b9d59c4 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 12:47:21 -0600 Subject: [PATCH 074/144] replaced JOB_CASE in path for inputs to TEST_NAME --- ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml b/ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml index b8a7e1cce9..ec76ed794e 100644 --- a/ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml +++ b/ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml @@ -1,17 +1,17 @@ input_files: mkdir: - - "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input" + - "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{PDY}}/{{HH}}/model/atmos/input" copy: - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_ctrl.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_ctrl.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile1.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile2.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile3.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile4.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}///gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile5.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile1.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile2.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile3.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile4.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile5.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{case}}/{{JOB}}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{case}}_{{JOB}}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile6.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_ctrl.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_ctrl.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile1.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile2.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile3.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile4.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}///gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile5.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile1.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile2.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile3.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile4.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile5.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile6.nc"] From a98d55d6c02065d5f4c7171d567994b8a747d863 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 12:57:09 -0600 Subject: [PATCH 075/144] updated path to yaml input to stage --- ci/ctests/scripts/stage.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ci/ctests/scripts/stage.py b/ci/ctests/scripts/stage.py index 4d89b1a7ac..945e7ae952 100755 --- a/ci/ctests/scripts/stage.py +++ b/ci/ctests/scripts/stage.py @@ -40,7 +40,6 @@ def parse_args(): data = AttrDict(HOMEgfs=_top) data.update(os.environ) - case_yaml_path = Path(f'{data.HOMEgfs}/ci/ctests/cases/{args.yaml}') #pr_case_yaml_path = Path(f'{data.HOMEgfs}/ci/cases/pr/{args.case}.yaml') # Initialize host and platform configuration @@ -55,5 +54,5 @@ def parse_args(): data["PDY"]=str(idate)[0:8] data["HH"]=str(idate)[8:10] data["RUNTESTS"]=Path.joinpath(args.build_dir,"RUNTESTS") - case_cfg = parse_j2yaml(path=case_yaml_path, data=data) + case_cfg = parse_j2yaml(path=args.yaml, data=data) FileHandler(case_cfg.input_files.sync()) From 29517e3346d7512bfb7f0a37f98ecb36a9c33383 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 13:00:18 -0600 Subject: [PATCH 076/144] ctest dir is ctests in path to YAML file for stage.py --- ci/ctests/scripts/stage.sh.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ci/ctests/scripts/stage.sh.in b/ci/ctests/scripts/stage.sh.in index 0a1547c58e..ab73d1fbd1 100755 --- a/ci/ctests/scripts/stage.sh.in +++ b/ci/ctests/scripts/stage.sh.in @@ -16,8 +16,7 @@ set -x PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${HOMEgfs}/sorc/wxflow/src/wxflow" export PYTHONPATH -#TODO - need to use this instead of CACE_JOB by updating the python script -INPUTS_YAML="${HOMEgfs}/ci/ctest/cases/${TEST_NAME}.yaml" +INPUTS_YAML="${HOMEgfs}/ci/ctests/cases/${TEST_NAME}.yaml" "${HOMEgfs}/ci/ctests/scripts/stage.py" --build_dir "${MAKE_CURRENT_BINARY_DIR}" --yaml "${INPUTS_YAML}" rc=$? From 60a61363df9aa354fe3da583ee64b5ea7265229f Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 13:34:39 -0600 Subject: [PATCH 077/144] finilized inputs to make stage.py to work without using CASE+JOB --- ci/ctests/scripts/setup.sh.in | 2 +- ci/ctests/scripts/stage.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ci/ctests/scripts/setup.sh.in b/ci/ctests/scripts/setup.sh.in index 3bbf6d4c77..93d85b9354 100755 --- a/ci/ctests/scripts/setup.sh.in +++ b/ci/ctests/scripts/setup.sh.in @@ -19,7 +19,7 @@ pslot="${TEST_NAME}" \ RUNTESTS="${RUNTESTS}" \ ICSDIR_ROOT="${ICSDIR_ROOT}" \ HPC_ACCOUNT="${HPC_ACCOUNT}" \ -"${HOMEgfs}/workflow/create_experiment.py" --yaml "${YAML_FILE}" +"${HOMEgfs}/workflow/create_experiment.py" --yaml "${YAML_FILE}" --overwrite rc=$? if [[ "${rc}" -ne 0 ]]; then set +x diff --git a/ci/ctests/scripts/stage.py b/ci/ctests/scripts/stage.py index 945e7ae952..c10045ecd1 100755 --- a/ci/ctests/scripts/stage.py +++ b/ci/ctests/scripts/stage.py @@ -32,17 +32,12 @@ def parse_args(): if __name__ == '__main__': - # TODO get idate - idate = "2021032312" - # Parse command line arguments args = parse_args() data = AttrDict(HOMEgfs=_top) data.update(os.environ) - #pr_case_yaml_path = Path(f'{data.HOMEgfs}/ci/cases/pr/{args.case}.yaml') - - # Initialize host and platform configuration + # Initialize host and platform configuration for getting PATH to staged data per machine host = Host() cfg = Configuration(f'{data.HOMEgfs}/ci/platforms') platform_config = cfg.parse_config(f'config.{host.machine.lower()}') @@ -51,8 +46,13 @@ def parse_args(): #pr_case_cfg = parse_j2yaml(path=pr_case_yaml_path, data=data) #data["PDY"]=str(pr_case_cfg.arguments.idate)[0:8] #data["HH"]=str(pr_case_cfg.arguments.idate)[8:10] + + # TODO get idate in lue of above + idate = "2021032312" + data["PDY"]=str(idate)[0:8] data["HH"]=str(idate)[8:10] data["RUNTESTS"]=Path.joinpath(args.build_dir,"RUNTESTS") + data["TEST_NAME"]=args.yaml.stem case_cfg = parse_j2yaml(path=args.yaml, data=data) - FileHandler(case_cfg.input_files.sync()) + FileHandler(case_cfg.input_files).sync() From b977e52c8fad07cdebf80cccce3d4dfb65c14e47 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 14:12:19 -0600 Subject: [PATCH 078/144] mnissed a couple or ARGS_ again this time in execute --- ci/ctests/CMakeLists.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index a73efe42df..06d86e938e 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -98,12 +98,11 @@ function(AddFunctionalTest) set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${CASE_ARG};${JOB_ARG}") add_test(NAME test_${TEST_NAME}_validate - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${CASE_ARG} ${JOB}") - set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${CASE_ARG};${JOB}") + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${CASE_ARG} ${JOB_ARG}") + set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${CASE_ARG};${JOB_ARG}") endfunction() AddFunctionalTest( CASE "C48_ATM" - JOB "gfs_fcst_seg0" + JOB "gfs_fcst_seg0" ) -#AddFunctionalTest("C48_S2SW" "gfs_fcst_000") From 95be9f2df8a431076cdd72353d0e712d0833733d Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 14:22:34 -0600 Subject: [PATCH 079/144] ARG are prefixes in execute add test --- ci/ctests/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 06d86e938e..637ca35b43 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -95,11 +95,11 @@ function(AddFunctionalTest) #TODO Need to get the idate for rocotoboot get the right cycle for the test (hard coded for now) #TODO Need to add a loop to check for when job has been completed COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${CASE_ARG} ${JOB_ARG} 2021032312") - set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${CASE_ARG};${JOB_ARG}") + set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME test_${TEST_NAME}_validate COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${CASE_ARG} ${JOB_ARG}") - set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${CASE_ARG};${JOB_ARG}") + set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") endfunction() AddFunctionalTest( From e9b0b6ac142f05d436e86e5e319140666acc8b18 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 14:25:38 -0600 Subject: [PATCH 080/144] ARG are prefixes in execute add test 2 --- ci/ctests/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 637ca35b43..b48852a689 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -94,11 +94,11 @@ function(AddFunctionalTest) add_test(NAME test_${TEST_NAME}_execute #TODO Need to get the idate for rocotoboot get the right cycle for the test (hard coded for now) #TODO Need to add a loop to check for when job has been completed - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${CASE_ARG} ${JOB_ARG} 2021032312") + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${ARG_CASE} ${ARG_JOG} 2021032312") set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME test_${TEST_NAME}_validate - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${CASE_ARG} ${JOB_ARG}") + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${ARG_CASE} ${ARG_JOB}") set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") endfunction() From a72827c2e2e32b15fcf3ed5339956acf4cf08002 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 14:28:13 -0600 Subject: [PATCH 081/144] ARG are prefixes in execute add test 3 --- ci/ctests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index b48852a689..197b0f0968 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -94,7 +94,7 @@ function(AddFunctionalTest) add_test(NAME test_${TEST_NAME}_execute #TODO Need to get the idate for rocotoboot get the right cycle for the test (hard coded for now) #TODO Need to add a loop to check for when job has been completed - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${ARG_CASE} ${ARG_JOG} 2021032312") + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${ARG_CASE} ${ARG_JOB} 2021032312") set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME test_${TEST_NAME}_validate From 4f010a46dbacf38d1886dca0cc76805ef9bfc715 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 14:57:02 -0600 Subject: [PATCH 082/144] added MAKE_CURRENT_BINARY_DIR as templated VAR in stage --- ci/ctests/scripts/stage.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ctests/scripts/stage.sh.in b/ci/ctests/scripts/stage.sh.in index ab73d1fbd1..61f78287b9 100755 --- a/ci/ctests/scripts/stage.sh.in +++ b/ci/ctests/scripts/stage.sh.in @@ -18,7 +18,7 @@ export PYTHONPATH INPUTS_YAML="${HOMEgfs}/ci/ctests/cases/${TEST_NAME}.yaml" -"${HOMEgfs}/ci/ctests/scripts/stage.py" --build_dir "${MAKE_CURRENT_BINARY_DIR}" --yaml "${INPUTS_YAML}" +"${HOMEgfs}/ci/ctests/scripts/stage.py" --build_dir "@CMAKE_CURRENT_BINARY_DIR@" --yaml "${INPUTS_YAML}" rc=$? if [[ "${rc}" -ne 0 ]]; then set +x From b79d4452f57612cb82ddda8312e40b9aa1f5c5a8 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 15:22:20 -0600 Subject: [PATCH 083/144] made execute bash sript a template too --- ci/ctests/CMakeLists.txt | 4 +++- ci/ctests/scripts/execute.sh | 20 -------------------- ci/ctests/scripts/execute.sh.in | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+), 21 deletions(-) delete mode 100755 ci/ctests/scripts/execute.sh create mode 100755 ci/ctests/scripts/execute.sh.in diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 197b0f0968..7c4b4a6061 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -65,6 +65,8 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/setup.sh.in ${CMAKE_CURRENT_BINARY_DIR}/scripts/setup.sh @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/stage.sh.in ${CMAKE_CURRENT_BINARY_DIR}/scripts/stage.sh @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/execute.sh.in + ${CMAKE_CURRENT_BINARY_DIR}/scripts/execute.sh @ONLY) function(AddFunctionalTest) @@ -94,7 +96,7 @@ function(AddFunctionalTest) add_test(NAME test_${TEST_NAME}_execute #TODO Need to get the idate for rocotoboot get the right cycle for the test (hard coded for now) #TODO Need to add a loop to check for when job has been completed - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${ARG_CASE} ${ARG_JOB} 2021032312") + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${TEST_NAME} ${ARG_JOB} 2021032312") set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME test_${TEST_NAME}_validate diff --git a/ci/ctests/scripts/execute.sh b/ci/ctests/scripts/execute.sh deleted file mode 100755 index 680c6d89c4..0000000000 --- a/ci/ctests/scripts/execute.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -set -xe - -CASE=$1 -JOB=$2 -idate=$3 - -rocotoboot_dryrun=/work2/noaa/global/mterry/rocoto_dryrun/bin/rocotoboot -CASEDIR="RUNTESTS/EXPDIR/${CASE}_${JOB}" -cd "${CASEDIR}" -rm -f *.db -rm -f jobcard - -job_card=$(yes | ${rocotoboot_dryrun} -d ${CASE}_${JOB}.db -w ${CASE}_${JOB}.xml -v 10 -c ${idate}00 -t ${JOB} 2> jobcard) -cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${CASE}_${JOB}.sub" - -#TODO Generalize for batch system (hard coded to slurm) - -sbatch < "${CASE}_${JOB}.sub" diff --git a/ci/ctests/scripts/execute.sh.in b/ci/ctests/scripts/execute.sh.in new file mode 100755 index 0000000000..6ea4c80c86 --- /dev/null +++ b/ci/ctests/scripts/execute.sh.in @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +set -xe + +TEST_NAME=${1:?"Name of the test is required"} +JOB=${2:?"Job name is required"} +# TODO - adding idate by hand for now, need to get this from the test somehow +idate=$3 + +#TODO - add rocotoboot_dryrun to repo some how +rocotoboot_dryrun=/work2/noaa/global/mterry/rocoto_dryrun/bin/rocotoboot +CASEDIR="@CMAKE_CURRENT_BINARY_DIR@/RUNTESTS/EXPDIR/${TEST_NAME}" +cd "${CASEDIR}" +rm -f *.db +rm -f jobcard + +job_card=$(yes | ${rocotoboot_dryrun} -d ${TEST_NAME}.db -w ${TEST_NAME}.xml -v 10 -c ${idate}00 -t ${JOB} 2> jobcard) +cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${TEST_NAME}.sub" + +#TODO Generalize for batch system (hard coded to slurm) +sbatch < "${CASE}_${JOB}.sub" From 16cd19f48e04252e385dde728aa0d814cd55a865 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 15:29:11 -0600 Subject: [PATCH 084/144] forgot to save CMakeLists now has updated call to excute from script dir in build --- ci/ctests/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 7c4b4a6061..38623b09c3 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -96,11 +96,12 @@ function(AddFunctionalTest) add_test(NAME test_${TEST_NAME}_execute #TODO Need to get the idate for rocotoboot get the right cycle for the test (hard coded for now) #TODO Need to add a loop to check for when job has been completed - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/execute.sh ${TEST_NAME} ${ARG_JOB} 2021032312") + COMMAND ./execute.sh ${TEST_NAME} ${ARG_JOB} 2021032312 + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME test_${TEST_NAME}_validate - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${ARG_CASE} ${ARG_JOB}") + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${TEST_NAME}") set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") endfunction() From fffb13dd6331852369d4077593767653f11404fc Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 15:33:27 -0600 Subject: [PATCH 085/144] last bug for working execute phase --- ci/ctests/scripts/execute.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ctests/scripts/execute.sh.in b/ci/ctests/scripts/execute.sh.in index 6ea4c80c86..cd59173632 100755 --- a/ci/ctests/scripts/execute.sh.in +++ b/ci/ctests/scripts/execute.sh.in @@ -18,4 +18,4 @@ job_card=$(yes | ${rocotoboot_dryrun} -d ${TEST_NAME}.db -w ${TEST_NAME}.xml -v cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${TEST_NAME}.sub" #TODO Generalize for batch system (hard coded to slurm) -sbatch < "${CASE}_${JOB}.sub" +sbatch < "${TEST_NAME}.sub" From 5c5ac0fe6f2b79bd2d9260113a8ed78389c2d3ad Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 15:43:48 -0600 Subject: [PATCH 086/144] ready to test x coders add for waiting for slurm job to complete --- ci/ctests/scripts/execute.sh.in | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/ci/ctests/scripts/execute.sh.in b/ci/ctests/scripts/execute.sh.in index cd59173632..621ea0f428 100755 --- a/ci/ctests/scripts/execute.sh.in +++ b/ci/ctests/scripts/execute.sh.in @@ -17,5 +17,23 @@ rm -f jobcard job_card=$(yes | ${rocotoboot_dryrun} -d ${TEST_NAME}.db -w ${TEST_NAME}.xml -v 10 -c ${idate}00 -t ${JOB} 2> jobcard) cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${TEST_NAME}.sub" -#TODO Generalize for batch system (hard coded to slurm) -sbatch < "${TEST_NAME}.sub" +#TODO - Generalize for batch system (hard coded to slurm) + +output=$(sbatch "${TEST_NAME}.sub") +job_id=$(echo $output | awk '{print $4}') +echo "Job ${job_id} submitted for test ${TEST_NAME} with job name ${JOB}" + +# Check the status of the Slurm job +while true; do + job_status=$(squeue --job $job_id --noheader --format "%T") + if [[ "$job_status" == "COMPLETED" ]]; then + echo "Job ${job_id} completed successfully." + exit 0 + elif [[ "$job_status" == "FAILED" || "$job_status" == "CANCELLED" || "$job_status" == "TIMEOUT" ]]; then + echo "Job ${job_id} failed with status: $job_status." + exit -1 + else + echo "Job ${job_id} is still running with status: $job_status." + sleep 60 # Check every 60 seconds + fi +done \ No newline at end of file From 06c8e8f18250cd0a5049443a88737a3042ae8011 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 7 Jan 2025 15:50:25 -0600 Subject: [PATCH 087/144] do not need link to wxflow anymore, added it to PYTHONPATH in bash wrappers --- ci/ctests/scripts/wxflow | 1 - 1 file changed, 1 deletion(-) delete mode 120000 ci/ctests/scripts/wxflow diff --git a/ci/ctests/scripts/wxflow b/ci/ctests/scripts/wxflow deleted file mode 120000 index 54d0558aba..0000000000 --- a/ci/ctests/scripts/wxflow +++ /dev/null @@ -1 +0,0 @@ -../../../sorc/wxflow/src/wxflow \ No newline at end of file From d68b02ee628a26eb1ef784e7681e0348ab0b1e47 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 8 Jan 2025 10:07:14 -0600 Subject: [PATCH 088/144] path to wxflow in PYTHONPATH was wrong in stage template --- ci/ctests/scripts/stage.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ctests/scripts/stage.sh.in b/ci/ctests/scripts/stage.sh.in index 61f78287b9..6f84a37a29 100755 --- a/ci/ctests/scripts/stage.sh.in +++ b/ci/ctests/scripts/stage.sh.in @@ -13,7 +13,7 @@ source "${HOMEgfs}/workflow/gw_setup.sh" rc=$? [[ "${rc}" -ne 0 ]] && exit "${status}" set -x -PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${HOMEgfs}/sorc/wxflow/src/wxflow" +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${HOMEgfs}/sorc/wxflow/src" export PYTHONPATH INPUTS_YAML="${HOMEgfs}/ci/ctests/cases/${TEST_NAME}.yaml" From b0602bc15ba74de130d6fcd11cf14130b3ea0329 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 8 Jan 2025 11:17:39 -0600 Subject: [PATCH 089/144] generlized ARG over-ride and added check for exectution success from log file output for when slurm job id is no longer available after job completes --- ci/ctests/CMakeLists.txt | 32 ++++++++++++++++---------------- ci/ctests/scripts/execute.sh.in | 28 +++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt index 38623b09c3..6c97fb30a9 100644 --- a/ci/ctests/CMakeLists.txt +++ b/ci/ctests/CMakeLists.txt @@ -4,11 +4,18 @@ project(FunctionalTests) enable_testing() set(CMAKE_VERBOSE_MAKEFILE ON) +function(set_from_env_or_default VAR_NAME ENV_VAR DEFAULT_VALUE) + if (DEFINED ENV{${ENV_VAR}} AND NOT DEFINED ${VAR_NAME}) + set(${VAR_NAME} $ENV{${ENV_VAR}} CACHE STRING "Set from environment variable ${ENV_VAR}") + elseif(NOT DEFINED ${VAR_NAME}) + set(${VAR_NAME} ${DEFAULT_VALUE} CACHE STRING "Default value for ${VAR_NAME}") + endif() +endfunction() if (DEFINED ENV{GW_BASELINE_DIR} AND NOT DEFINED GW_BASELINE_DIR) set(GW_BASELINE_DIR $ENV{GW_BASELINE_DIR} CACHE FILEPATH "Path to global-workflow baselines") else() - get_filename_component(GW_BASELINE_DIR ${CMAKE_SOURCE_DIR}/../.. ABSOLUTE) + get_filename_component(GW_BASELINE_DIR ${CMAKE_SOURCE_DIR}/../.. ABSOLUTE) endif() # If GW_BASELINE_DIR is not defined, tests will not be run, return @@ -17,9 +24,10 @@ if(NOT DEFINED GW_BASELINE_DIR) return() endif() -if (DEFINED ENV{MACHINE_ID} AND NOT DEFINED MACHINE_ID) - set(MACHINE_ID $ENV{MACHINE_ID} CACHE STRING "Machine ID") -elseif(NOT DEFINED MACHINE_ID) +set_from_env_or_default(RUNTESTS RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS") + +set_from_env_or_default(MACHINE_ID MACHINE_ID "NOT_DEFINED") +if(${MACHINE_ID} STREQUAL "NOT_DEFINED") execute_process( COMMAND bash -c "source ${GW_BASELINE_DIR}/ush/detect_machine.sh && echo \$MACHINE_ID" OUTPUT_VARIABLE MACHINE_ID @@ -27,15 +35,8 @@ elseif(NOT DEFINED MACHINE_ID) ) endif() -if (DEFINED ENV{RUNTESTS} AND NOT DEFINED RUNTESTS) - set(RUNTESTS $ENV{RUNTESTS} CACHE FILEPATH "Path to run global-workflow tests") -elseif( NOT DEFINED RUNTESTS) - set(RUNTESTS ${CMAKE_BINARY_DIR}/RUNTESTS CACHE FILEPATH "Path to run global-workflow tests") -endif() - -if (DEFINED ENV{HPC_ACCOUNT} AND NOT DEFINED HPC_ACCOUNT) - set(HPC_ACCOUNT $ENV{HPC_ACCOUNT} CACHE STRING "Allocation to use for running global-workflow tests") -elseif(NOT DEFINED HPC_ACCOUNT) +set_from_env_or_default(HPC_ACCOUNT HPC_ACCOUNT "NOT_DEFINED") +if(${HPC_ACCOUNT} STREQUAL "NOT_DEFINED") execute_process( COMMAND bash -c "source ${GW_BASELINE_DIR}/ci/platforms/config.${MACHINE_ID} && echo \$HPC_ACCOUNT" OUTPUT_VARIABLE HPC_ACCOUNT @@ -43,9 +44,8 @@ elseif(NOT DEFINED HPC_ACCOUNT) ) endif() -if (DEFINED ENV{ICSDIR_ROOT} AND NOT DEFINED ICSDIR_ROOT) - set(ICSDIR_ROOT $ENV{ICSDIR_ROOT} CACHE FILEPATH "Path to ICS directory") -elseif(NOT DEFINED ICSDIR_ROOT) +set_from_env_or_default(ICSDIR_ROOT ICSDIR_ROOT "NOT_DEFINED") +if(${ICSDIR_ROOT} STREQUAL "NOT_DEFINED") execute_process( COMMAND bash -c "source ${GW_BASELINE_DIR}/ci/platforms/config.${MACHINE_ID} && echo \$ICSDIR_ROOT" OUTPUT_VARIABLE ICSDIR_ROOT diff --git a/ci/ctests/scripts/execute.sh.in b/ci/ctests/scripts/execute.sh.in index 621ea0f428..1212108a1c 100755 --- a/ci/ctests/scripts/execute.sh.in +++ b/ci/ctests/scripts/execute.sh.in @@ -22,18 +22,40 @@ cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${TEST_NAME}.sub" output=$(sbatch "${TEST_NAME}.sub") job_id=$(echo $output | awk '{print $4}') echo "Job ${job_id} submitted for test ${TEST_NAME} with job name ${JOB}" +stdout_file=$(scontrol show job $job_id | grep StdOut | awk -F= '{print $2}') # Check the status of the Slurm job +check_stdout_file() { + last_line=$(tail -n 1 "$stdout_file") + if [[ "$last_line" == "END"* && "$last_line" == *"error code 0"* ]]; then + echo "Job ${job_id} completed successfully with END and error code 0." + exit 0 + else + echo "Job ${job_id} did not complete successfully. Last line: $last_line" + exit -1 + fi +} + +# Check the status of the Slurm job +timeout=0 +TIMEOUT=60 while true; do job_status=$(squeue --job $job_id --noheader --format "%T") if [[ "$job_status" == "COMPLETED" ]]; then echo "Job ${job_id} completed successfully." - exit 0 + check_stdout_file elif [[ "$job_status" == "FAILED" || "$job_status" == "CANCELLED" || "$job_status" == "TIMEOUT" ]]; then echo "Job ${job_id} failed with status: $job_status." exit -1 + elif [[ -z "$job_status" ]]; then + echo "Job ${job_id} is no longer in the queue. Checking stdout file." + check_stdout_file else echo "Job ${job_id} is still running with status: $job_status." sleep 60 # Check every 60 seconds - fi -done \ No newline at end of file + timeout=$((timeout+1)) + if [[ $timeout -gt $TIMEOUT ]]; then + echo "Job ${job_id} has been running for more than $TIMEOUT minutes. Exiting." + exit -1 + fi + fi \ No newline at end of file From 30b3f3abd0011ae49fe88ea9b3a5c030fb94cf88 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 8 Jan 2025 12:14:24 -0600 Subject: [PATCH 090/144] should have checked for End not END for success --- ci/ctests/scripts/execute.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/ctests/scripts/execute.sh.in b/ci/ctests/scripts/execute.sh.in index 1212108a1c..6ee98dd74a 100755 --- a/ci/ctests/scripts/execute.sh.in +++ b/ci/ctests/scripts/execute.sh.in @@ -27,7 +27,7 @@ stdout_file=$(scontrol show job $job_id | grep StdOut | awk -F= '{print $2}') # Check the status of the Slurm job check_stdout_file() { last_line=$(tail -n 1 "$stdout_file") - if [[ "$last_line" == "END"* && "$last_line" == *"error code 0"* ]]; then + if [[ "$last_line" == "End"* && "$last_line" == *"error code 0"* ]]; then echo "Job ${job_id} completed successfully with END and error code 0." exit 0 else From 42084e71777607bbdb15e1e0c6e8b919806c4b67 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 8 Jan 2025 12:17:11 -0600 Subject: [PATCH 091/144] oops need done at then of loop in execute bash sript --- ci/ctests/scripts/execute.sh.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ci/ctests/scripts/execute.sh.in b/ci/ctests/scripts/execute.sh.in index 6ee98dd74a..753ed54ed1 100755 --- a/ci/ctests/scripts/execute.sh.in +++ b/ci/ctests/scripts/execute.sh.in @@ -58,4 +58,5 @@ while true; do echo "Job ${job_id} has been running for more than $TIMEOUT minutes. Exiting." exit -1 fi - fi \ No newline at end of file + fi +done From 8d71151f295f80dbae13fcdcbed139e9af5ae42d Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 8 Jan 2025 12:42:33 -0600 Subject: [PATCH 092/144] removed C48_S2SW.yaml for functional test as it is not ready yet --- ci/ctests/cases/C48_S2SW.yaml | 9 --------- workflow/generate_workflows.sh | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 ci/ctests/cases/C48_S2SW.yaml diff --git a/ci/ctests/cases/C48_S2SW.yaml b/ci/ctests/cases/C48_S2SW.yaml deleted file mode 100644 index 4c3122a1f7..0000000000 --- a/ci/ctests/cases/C48_S2SW.yaml +++ /dev/null @@ -1,9 +0,0 @@ -fcst_gfs: - staged_datapath: {{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ testcase }}/fcst_gfs - input_files: use_jinja_template_fcst - output_files: use_jinja_template_fcst - -gfs_atmos_pro: - staged_datapath: {{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ testcase }}/gfs_atmos_prod - input_files: use_jinja_template_gfs_atmos_pro - output_files: use_jinja_template_gfs_atmos_pro diff --git a/workflow/generate_workflows.sh b/workflow/generate_workflows.sh index f28a93d520..a5615a8b0d 100755 --- a/workflow/generate_workflows.sh +++ b/workflow/generate_workflows.sh @@ -442,7 +442,7 @@ echo "Running create_experiment.py for ${#_yaml_list[@]} cases" for _case in "${_yaml_list[@]}"; do [[ "${_verbose}" == false ]] && echo "${_case}" _pslot="${_case}${_tag}" - _create_exp_cmd="${HOMEgfs}/workflow/create_experiment.py -y ${HOMEgfs}/ci/cases/pr/${_case}.yaml --overwrite" + _create_exp_cmd="./create_experiment.py -y ../ci/cases/pr/${_case}.yaml --overwrite" if [[ "${_verbose}" == true ]]; then pslot=${_pslot} RUNTESTS=${_runtests} ${_create_exp_cmd} else From cf7be283a6fa3a09154b6b5bbca45e7e9f5cfa73 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 8 Jan 2025 14:01:19 -0600 Subject: [PATCH 093/144] working on shellnorms --- ci/ctests/scripts/execute.sh.in | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ci/ctests/scripts/execute.sh.in b/ci/ctests/scripts/execute.sh.in index 753ed54ed1..88640318ff 100755 --- a/ci/ctests/scripts/execute.sh.in +++ b/ci/ctests/scripts/execute.sh.in @@ -11,23 +11,23 @@ idate=$3 rocotoboot_dryrun=/work2/noaa/global/mterry/rocoto_dryrun/bin/rocotoboot CASEDIR="@CMAKE_CURRENT_BINARY_DIR@/RUNTESTS/EXPDIR/${TEST_NAME}" cd "${CASEDIR}" -rm -f *.db -rm -f jobcard +rm -f ./*.db +rm -f ./jobcard -job_card=$(yes | ${rocotoboot_dryrun} -d ${TEST_NAME}.db -w ${TEST_NAME}.xml -v 10 -c ${idate}00 -t ${JOB} 2> jobcard) +job_card=$(yes | ${rocotoboot_dryrun} -d ${TEST_NAME}.db -w ${TEST_NAME}.xml -v 10 -c ${idate}00 -t ${JOB} 2> jobcard) || true cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${TEST_NAME}.sub" #TODO - Generalize for batch system (hard coded to slurm) output=$(sbatch "${TEST_NAME}.sub") -job_id=$(echo $output | awk '{print $4}') +job_id=$(echo "${output}" | awk '{print $4}') echo "Job ${job_id} submitted for test ${TEST_NAME} with job name ${JOB}" -stdout_file=$(scontrol show job $job_id | grep StdOut | awk -F= '{print $2}') +stdout_file=$(scontrol show job "${job_id}" | grep StdOut | awk -F= '{print $2}') || true # Check the status of the Slurm job check_stdout_file() { last_line=$(tail -n 1 "$stdout_file") - if [[ "$last_line" == "End"* && "$last_line" == *"error code 0"* ]]; then + if [[ "${last_line}" == "End"* && "${last_line}" == *"error code 0"* ]]; then echo "Job ${job_id} completed successfully with END and error code 0." exit 0 else @@ -41,21 +41,21 @@ timeout=0 TIMEOUT=60 while true; do job_status=$(squeue --job $job_id --noheader --format "%T") - if [[ "$job_status" == "COMPLETED" ]]; then + if [[ "${job_status}" == "COMPLETED" ]]; then echo "Job ${job_id} completed successfully." check_stdout_file - elif [[ "$job_status" == "FAILED" || "$job_status" == "CANCELLED" || "$job_status" == "TIMEOUT" ]]; then - echo "Job ${job_id} failed with status: $job_status." + elif [[ "${job_status}" == "FAILED" || "${job_status}" == "CANCELLED" || "${job_status}" == "TIMEOUT" ]]; then + echo "Job ${job_id} failed with status: ${job_status}." exit -1 - elif [[ -z "$job_status" ]]; then + elif [[ -z "${job_status}" ]]; then echo "Job ${job_id} is no longer in the queue. Checking stdout file." check_stdout_file else - echo "Job ${job_id} is still running with status: $job_status." + echo "Job ${job_id} is still running with status: ${job_status}." sleep 60 # Check every 60 seconds timeout=$((timeout+1)) if [[ $timeout -gt $TIMEOUT ]]; then - echo "Job ${job_id} has been running for more than $TIMEOUT minutes. Exiting." + echo "Job ${job_id} has been running for more than ${TIMEOUT} minutes. Exiting." exit -1 fi fi From a49a642dbd475d7ab2fe812b3215a90339ba11f2 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 8 Jan 2025 14:05:49 -0600 Subject: [PATCH 094/144] working on more shellnorms --- ci/ctests/scripts/execute.sh.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ci/ctests/scripts/execute.sh.in b/ci/ctests/scripts/execute.sh.in index 88640318ff..2745060119 100755 --- a/ci/ctests/scripts/execute.sh.in +++ b/ci/ctests/scripts/execute.sh.in @@ -14,8 +14,8 @@ cd "${CASEDIR}" rm -f ./*.db rm -f ./jobcard -job_card=$(yes | ${rocotoboot_dryrun} -d ${TEST_NAME}.db -w ${TEST_NAME}.xml -v 10 -c ${idate}00 -t ${JOB} 2> jobcard) || true -cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${TEST_NAME}.sub" +job_card=$(yes | "${rocotoboot_dryrun}" -d "${TEST_NAME}.db" -w "${TEST_NAME}.xml" -v 10 -c "${idate}00" -t "${JOB}" 2> jobcard) || true +cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${TEST_NAME}.sub" || true #TODO - Generalize for batch system (hard coded to slurm) @@ -54,7 +54,7 @@ while true; do echo "Job ${job_id} is still running with status: ${job_status}." sleep 60 # Check every 60 seconds timeout=$((timeout+1)) - if [[ $timeout -gt $TIMEOUT ]]; then + if [[ "${timeout}" -gt "${TIMEOUT}" ]]; then echo "Job ${job_id} has been running for more than ${TIMEOUT} minutes. Exiting." exit -1 fi From 466831d9014795cb30dcc6fb3d6c4c7a748943d0 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 8 Jan 2025 14:11:24 -0600 Subject: [PATCH 095/144] working on even more shellnorms --- ci/ctests/scripts/execute.sh.in | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ci/ctests/scripts/execute.sh.in b/ci/ctests/scripts/execute.sh.in index 2745060119..9de78716c9 100755 --- a/ci/ctests/scripts/execute.sh.in +++ b/ci/ctests/scripts/execute.sh.in @@ -26,12 +26,12 @@ stdout_file=$(scontrol show job "${job_id}" | grep StdOut | awk -F= '{print $2}' # Check the status of the Slurm job check_stdout_file() { - last_line=$(tail -n 1 "$stdout_file") + last_line=$(tail -n 1 "${stdout_file}") if [[ "${last_line}" == "End"* && "${last_line}" == *"error code 0"* ]]; then echo "Job ${job_id} completed successfully with END and error code 0." exit 0 else - echo "Job ${job_id} did not complete successfully. Last line: $last_line" + echo "Job ${job_id} did not complete successfully. Last line: ${last_line}" exit -1 fi } @@ -46,7 +46,7 @@ while true; do check_stdout_file elif [[ "${job_status}" == "FAILED" || "${job_status}" == "CANCELLED" || "${job_status}" == "TIMEOUT" ]]; then echo "Job ${job_id} failed with status: ${job_status}." - exit -1 + exit 1 elif [[ -z "${job_status}" ]]; then echo "Job ${job_id} is no longer in the queue. Checking stdout file." check_stdout_file @@ -56,7 +56,7 @@ while true; do timeout=$((timeout+1)) if [[ "${timeout}" -gt "${TIMEOUT}" ]]; then echo "Job ${job_id} has been running for more than ${TIMEOUT} minutes. Exiting." - exit -1 + exit 1 fi fi done From 2d1846114f55312eb5b56e5200a5c39839c8d764 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 8 Jan 2025 14:15:12 -0600 Subject: [PATCH 096/144] working couple more shellnorms --- ci/ctests/scripts/execute.sh.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/ctests/scripts/execute.sh.in b/ci/ctests/scripts/execute.sh.in index 9de78716c9..aef8348a5c 100755 --- a/ci/ctests/scripts/execute.sh.in +++ b/ci/ctests/scripts/execute.sh.in @@ -32,7 +32,7 @@ check_stdout_file() { exit 0 else echo "Job ${job_id} did not complete successfully. Last line: ${last_line}" - exit -1 + exit 1 fi } @@ -40,7 +40,7 @@ check_stdout_file() { timeout=0 TIMEOUT=60 while true; do - job_status=$(squeue --job $job_id --noheader --format "%T") + job_status=$(squeue --job "${job_id}" --noheader --format "%T") if [[ "${job_status}" == "COMPLETED" ]]; then echo "Job ${job_id} completed successfully." check_stdout_file From 4ee8d8111c5099546b32f55a47140add4746b76e Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 10 Jan 2025 16:08:04 -0600 Subject: [PATCH 097/144] removed scripts used for getting system defaults and added top level CMakeLists.txt to use PROJECT_SOURCE_DIR for HOMEgfs in templiting bash wrapper sripts --- CMakeLists.txt | 27 +++++ ci/ctests/CMakeLists.txt | 111 ------------------ ctests/CMakeLists.txt | 80 +++++++++++++ .../cases/C48_ATM_gfs_fcst_seg0.yaml | 0 {ci/ctests => ctests}/scripts/execute.sh.in | 0 {ci/ctests => ctests}/scripts/setup.sh.in | 2 +- {ci/ctests => ctests}/scripts/stage.py | 22 ---- {ci/ctests => ctests}/scripts/stage.sh.in | 2 +- {ci/ctests => ctests}/scripts/validate.sh | 0 sorc/gsi_enkf.fd | 1 - sorc/gsi_utils.fd | 1 - 11 files changed, 109 insertions(+), 137 deletions(-) create mode 100644 CMakeLists.txt delete mode 100644 ci/ctests/CMakeLists.txt create mode 100644 ctests/CMakeLists.txt rename {ci/ctests => ctests}/cases/C48_ATM_gfs_fcst_seg0.yaml (100%) rename {ci/ctests => ctests}/scripts/execute.sh.in (100%) rename {ci/ctests => ctests}/scripts/setup.sh.in (95%) rename {ci/ctests => ctests}/scripts/stage.py (55%) rename {ci/ctests => ctests}/scripts/stage.sh.in (95%) rename {ci/ctests => ctests}/scripts/validate.sh (100%) delete mode 160000 sorc/gsi_enkf.fd delete mode 160000 sorc/gsi_utils.fd diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000..2bdc6d749f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,27 @@ +# ------------------------------------------------------------------------- # +# Global Workflow +# ------------------------------------------------------------------------- # + +# Check for minimum cmake requirement +cmake_minimum_required( VERSION 3.20 FATAL_ERROR ) + +project(global_workflow VERSION 1.0.0) + +include(GNUInstallDirs) +enable_testing() + +# Build type. +if(NOT CMAKE_BUILD_TYPE MATCHES "^(Debug|Release|RelWithDebInfo|MinSizeRel)$") + message(STATUS "Setting build type to 'Release' as none was specified.") + set(CMAKE_BUILD_TYPE + "Release" + CACHE STRING "Choose the type of build." FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" + "MinSizeRel" "RelWithDebInfo") +endif() + +# Build global-workflow source codes +# add_subdirectory(sorc) + +# Setup tests +add_subdirectory(ctests) \ No newline at end of file diff --git a/ci/ctests/CMakeLists.txt b/ci/ctests/CMakeLists.txt deleted file mode 100644 index 6c97fb30a9..0000000000 --- a/ci/ctests/CMakeLists.txt +++ /dev/null @@ -1,111 +0,0 @@ -cmake_minimum_required(VERSION 3.10) - -project(FunctionalTests) -enable_testing() -set(CMAKE_VERBOSE_MAKEFILE ON) - -function(set_from_env_or_default VAR_NAME ENV_VAR DEFAULT_VALUE) - if (DEFINED ENV{${ENV_VAR}} AND NOT DEFINED ${VAR_NAME}) - set(${VAR_NAME} $ENV{${ENV_VAR}} CACHE STRING "Set from environment variable ${ENV_VAR}") - elseif(NOT DEFINED ${VAR_NAME}) - set(${VAR_NAME} ${DEFAULT_VALUE} CACHE STRING "Default value for ${VAR_NAME}") - endif() -endfunction() - -if (DEFINED ENV{GW_BASELINE_DIR} AND NOT DEFINED GW_BASELINE_DIR) - set(GW_BASELINE_DIR $ENV{GW_BASELINE_DIR} CACHE FILEPATH "Path to global-workflow baselines") -else() - get_filename_component(GW_BASELINE_DIR ${CMAKE_SOURCE_DIR}/../.. ABSOLUTE) -endif() - -# If GW_BASELINE_DIR is not defined, tests will not be run, return -if(NOT DEFINED GW_BASELINE_DIR) - message(WARNING "gw: GW_BASELINE_DIR is not defined. Tests will not be run.") - return() -endif() - -set_from_env_or_default(RUNTESTS RUNTESTS "${CMAKE_BINARY_DIR}/RUNTESTS") - -set_from_env_or_default(MACHINE_ID MACHINE_ID "NOT_DEFINED") -if(${MACHINE_ID} STREQUAL "NOT_DEFINED") - execute_process( - COMMAND bash -c "source ${GW_BASELINE_DIR}/ush/detect_machine.sh && echo \$MACHINE_ID" - OUTPUT_VARIABLE MACHINE_ID - OUTPUT_STRIP_TRAILING_WHITESPACE - ) -endif() - -set_from_env_or_default(HPC_ACCOUNT HPC_ACCOUNT "NOT_DEFINED") -if(${HPC_ACCOUNT} STREQUAL "NOT_DEFINED") - execute_process( - COMMAND bash -c "source ${GW_BASELINE_DIR}/ci/platforms/config.${MACHINE_ID} && echo \$HPC_ACCOUNT" - OUTPUT_VARIABLE HPC_ACCOUNT - OUTPUT_STRIP_TRAILING_WHITESPACE - ) -endif() - -set_from_env_or_default(ICSDIR_ROOT ICSDIR_ROOT "NOT_DEFINED") -if(${ICSDIR_ROOT} STREQUAL "NOT_DEFINED") - execute_process( - COMMAND bash -c "source ${GW_BASELINE_DIR}/ci/platforms/config.${MACHINE_ID} && echo \$ICSDIR_ROOT" - OUTPUT_VARIABLE ICSDIR_ROOT - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - set(ICSDIR_ROOT ${ICSDIR_ROOT} CACHE FILEPATH "Path to ICS directory") -endif() - -message(STATUS "MACHINE_ID: '${MACHINE_ID}'") -message(STATUS "gw: global-workflow baselines will be used from: '${GW_BASELINE_DIR}'") -message(STATUS "gw: global-workflow tests will be run at: '${RUNTESTS}'") -message(STATUS "gw: global-workflow tests will use the allocation: '${HPC_ACCOUNT}'") -message(STATUS "gw: global-workflow tests will use ICSDIR_ROOT: '${ICSDIR_ROOT}'") - -# Prepare test scripts -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/setup.sh.in - ${CMAKE_CURRENT_BINARY_DIR}/scripts/setup.sh @ONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/stage.sh.in - ${CMAKE_CURRENT_BINARY_DIR}/scripts/stage.sh @ONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/execute.sh.in - ${CMAKE_CURRENT_BINARY_DIR}/scripts/execute.sh @ONLY) - -function(AddFunctionalTest) - - set(prefix ARG) - set(novals NOTRAPFPE NOVALGRIND) - set(singlevals CASE JOB) - set(multivals TEST_DEPENDS) - - cmake_parse_arguments(${prefix} - "${novals}" "${singlevals}" "${multivals}" - ${ARGN}) - - set(TEST_NAME ${ARG_CASE}_${ARG_JOB}) - set(CASE_PATH ${GW_BASELINE_DIR}/ci/cases/pr) - set(CASE_YAML ${CASE_PATH}/${ARG_CASE}.yaml) - - add_test(NAME test_${TEST_NAME}_setup - COMMAND ./setup.sh ${TEST_NAME} ${CASE_YAML} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) - set_tests_properties(test_${TEST_NAME}_setup PROPERTIES LABELS "${ARG_CASE};${ARG_JOB}") - - add_test(NAME test_${TEST_NAME}_stage - COMMAND ./stage.sh ${TEST_NAME} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) - set_tests_properties(test_${TEST_NAME}_stage PROPERTIES DEPENDS test_${TEST_NAME}_setup LABELS "${ARG_CASE};${ARG_JOB}") - - add_test(NAME test_${TEST_NAME}_execute - #TODO Need to get the idate for rocotoboot get the right cycle for the test (hard coded for now) - #TODO Need to add a loop to check for when job has been completed - COMMAND ./execute.sh ${TEST_NAME} ${ARG_JOB} 2021032312 - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) - set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${ARG_CASE};${ARG_JOB}") - - add_test(NAME test_${TEST_NAME}_validate - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${TEST_NAME}") - set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") -endfunction() - -AddFunctionalTest( - CASE "C48_ATM" - JOB "gfs_fcst_seg0" -) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt new file mode 100644 index 0000000000..c6f419c190 --- /dev/null +++ b/ctests/CMakeLists.txt @@ -0,0 +1,80 @@ +if (NOT DEFINED HOMEgfs) + set(HOMEgfs ${PROJECT_SOURCE_DIR}) +endif() + +if (DEFINED ENV{RUNTESTS} AND NOT DEFINED RUNTESTS) + set(RUNTESTS $ENV{RUNTESTS} CACHE FILEPATH "Path to global-workflow RUNTESTS directory") +else() + set(RUNTESTS ${CMAKE_CURRENT_BINARY_DIR}/RUNTESTS) +endif() + +if (DEFINED ENV{HPC_ACCOUNT} AND NOT DEFINED HPC_ACCOUNT) + set(HPC_ACCOUNT $ENV{HPC_ACCOUNT} CACHE STRING "Local location of glowbal-workflow initialconditions") +endif() + +if (NOT DEFINED HPC_ACCOUNT) + message(FATAL_ERROR "HPC_ACCOUNT must be set") + return() +endif() + +if (DEFINED ENV{ISCDIR_ROOT} AND NOT DEFINED ICSDIR_ROOT) + set(ICSDIR_ROOT $ENV{HPC_ACCOUNT} CACHE STRING "Local path to global-workflow initialconditions") +endif() +if(NOT DEFINED ICSDIR_ROOT) + message(FATAL_ERROR "ICSDIR_ROOT must be set") + return() +endif() + +message(STATUS "MACHINE_ID: '${MACHINE_ID}'") +message(STATUS "gw: global-workflow baselines will be used from: '${HOMEgfs}'") +message(STATUS "gw: global-workflow tests will be run at: '${RUNTESTS}'") +message(STATUS "gw: global-workflow tests will use the allocation: '${HPC_ACCOUNT}'") +message(STATUS "gw: global-workflow tests will use ICSDIR_ROOT: '${ICSDIR_ROOT}'") + +# Prepare test scripts +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/setup.sh.in + ${CMAKE_CURRENT_BINARY_DIR}/scripts/setup.sh @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/stage.sh.in + ${CMAKE_CURRENT_BINARY_DIR}/scripts/stage.sh @ONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/execute.sh.in + ${CMAKE_CURRENT_BINARY_DIR}/scripts/execute.sh @ONLY) + +function(AddJJOBTest) + + set(prefix ARG) + set(novals NOTRAPFPE NOVALGRIND) + set(singlevals CASE JOB) + set(multivals TEST_DEPENDS) + + cmake_parse_arguments(${prefix} + "${novals}" "${singlevals}" "${multivals}" + ${ARGN}) + + set(TEST_NAME ${ARG_CASE}_${ARG_JOB}) + set(CASE_PATH ${HOMEgfs}/ci/cases/pr) + set(CASE_YAML ${CASE_PATH}/${ARG_CASE}.yaml) + + add_test(NAME test_${TEST_NAME}_setup + COMMAND ./setup.sh ${TEST_NAME} ${CASE_YAML} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) + set_tests_properties(test_${TEST_NAME}_setup PROPERTIES LABELS "${ARG_CASE};${ARG_JOB}") + + add_test(NAME test_${TEST_NAME}_stage + COMMAND ./stage.sh ${TEST_NAME} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) + set_tests_properties(test_${TEST_NAME}_stage PROPERTIES DEPENDS test_${TEST_NAME}_setup LABELS "${ARG_CASE};${ARG_JOB}") + + add_test(NAME test_${TEST_NAME}_execute + COMMAND ./execute.sh ${TEST_NAME} ${ARG_JOB} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) + set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${ARG_CASE};${ARG_JOB}") + + add_test(NAME test_${TEST_NAME}_validate + COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${TEST_NAME}") + set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") +endfunction() + +AddJJOBTest( + CASE "C48_ATM" + JOB "gfs_fcst_seg0" +) diff --git a/ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml similarity index 100% rename from ci/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml rename to ctests/cases/C48_ATM_gfs_fcst_seg0.yaml diff --git a/ci/ctests/scripts/execute.sh.in b/ctests/scripts/execute.sh.in similarity index 100% rename from ci/ctests/scripts/execute.sh.in rename to ctests/scripts/execute.sh.in diff --git a/ci/ctests/scripts/setup.sh.in b/ctests/scripts/setup.sh.in similarity index 95% rename from ci/ctests/scripts/setup.sh.in rename to ctests/scripts/setup.sh.in index 93d85b9354..6c4a772b65 100755 --- a/ci/ctests/scripts/setup.sh.in +++ b/ctests/scripts/setup.sh.in @@ -6,7 +6,7 @@ TEST_NAME=${1:?"Name of the test is required"} YAML_FILE=${2:?"Name of the CI yaml file for the test"} # CMake to fill these variables -HOMEgfs="@GW_BASELINE_DIR@" +HOMEgfs="@PROJECT_SOURCE_DIR@" RUNTESTS="@RUNTESTS@" ICSDIR_ROOT="@ICSDIR_ROOT@" HPC_ACCOUNT="@HPC_ACCOUNT@" diff --git a/ci/ctests/scripts/stage.py b/ctests/scripts/stage.py similarity index 55% rename from ci/ctests/scripts/stage.py rename to ctests/scripts/stage.py index c10045ecd1..e6853033c2 100755 --- a/ci/ctests/scripts/stage.py +++ b/ctests/scripts/stage.py @@ -9,7 +9,6 @@ from argparse import ArgumentParser from pathlib import Path from wxflow import Configuration, AttrDict, parse_j2yaml, Logger, logit, which, CommandNotFoundError, ProcessError, FileHandler -from workflow.hosts import Host logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) @@ -26,7 +25,6 @@ def parse_args(): """ parser = ArgumentParser(description=description) - parser.add_argument('--build_dir', help='CMake build directory', required=False, type=Path, default=None) parser.add_argument('-y', '--yaml', help='full path to yaml file describing the job test configuration', type=Path, required=True) return parser.parse_args() @@ -34,25 +32,5 @@ def parse_args(): # Parse command line arguments args = parse_args() - data = AttrDict(HOMEgfs=_top) - data.update(os.environ) - - # Initialize host and platform configuration for getting PATH to staged data per machine - host = Host() - cfg = Configuration(f'{data.HOMEgfs}/ci/platforms') - platform_config = cfg.parse_config(f'config.{host.machine.lower()}') - data.update(platform_config) - - #pr_case_cfg = parse_j2yaml(path=pr_case_yaml_path, data=data) - #data["PDY"]=str(pr_case_cfg.arguments.idate)[0:8] - #data["HH"]=str(pr_case_cfg.arguments.idate)[8:10] - - # TODO get idate in lue of above - idate = "2021032312" - - data["PDY"]=str(idate)[0:8] - data["HH"]=str(idate)[8:10] - data["RUNTESTS"]=Path.joinpath(args.build_dir,"RUNTESTS") - data["TEST_NAME"]=args.yaml.stem case_cfg = parse_j2yaml(path=args.yaml, data=data) FileHandler(case_cfg.input_files).sync() diff --git a/ci/ctests/scripts/stage.sh.in b/ctests/scripts/stage.sh.in similarity index 95% rename from ci/ctests/scripts/stage.sh.in rename to ctests/scripts/stage.sh.in index 6f84a37a29..e7de1379fc 100755 --- a/ci/ctests/scripts/stage.sh.in +++ b/ctests/scripts/stage.sh.in @@ -5,7 +5,7 @@ set -ux TEST_NAME=${1:?"Name of the test is required"} # CMake to fill these variables -HOMEgfs="@GW_BASELINE_DIR@" +HOMEgfs="@PROJECT_SOURCE_DIR@" # Load the runtime environment for this script (needs wxflow and its dependencies) set +x diff --git a/ci/ctests/scripts/validate.sh b/ctests/scripts/validate.sh similarity index 100% rename from ci/ctests/scripts/validate.sh rename to ctests/scripts/validate.sh diff --git a/sorc/gsi_enkf.fd b/sorc/gsi_enkf.fd deleted file mode 160000 index 27c03e83a6..0000000000 --- a/sorc/gsi_enkf.fd +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 27c03e83a66fa2ba3b32781dab7cd6a8c0fc497d diff --git a/sorc/gsi_utils.fd b/sorc/gsi_utils.fd deleted file mode 160000 index f716012812..0000000000 --- a/sorc/gsi_utils.fd +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f716012812c2564e7eab24041f7a3ec14c7aa383 From b3518caeb083207fed1440fca8c0aa70be0ac9b8 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 10 Jan 2025 16:34:20 -0600 Subject: [PATCH 098/144] added to yaml fun conf file to us jinja string modification TEST_DATE --- ctests/CMakeLists.txt | 8 +++++++ ctests/cases/C48_ATM_gfs_fcst_seg0.yaml | 28 ++++++++++++------------- ctests/scripts/stage.sh.in | 4 +++- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index c6f419c190..d46f3705e4 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -25,6 +25,14 @@ if(NOT DEFINED ICSDIR_ROOT) return() endif() +if (DEFINED ENV{STAGED_FUNCTIONAL_TEST_DIR} AND NOT DEFINED STATED_FUNCTIONAL_TEST_DIR) + set(STATED_FUNCTIONAL_TEST_DIR $ENV{HPC_ACCOUNT} CACHE STRING "Local path to global-workflow staged data for functional test") +endif() +if(NOT DEFINED STATED_FUNCTIONAL_TEST_DIR) + message(FATAL_ERROR "STATED_FUNCTIONAL_TEST_DIR must be set") + return() +endif() + message(STATUS "MACHINE_ID: '${MACHINE_ID}'") message(STATUS "gw: global-workflow baselines will be used from: '${HOMEgfs}'") message(STATUS "gw: global-workflow tests will be run at: '${RUNTESTS}'") diff --git a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml index ec76ed794e..17738e69d1 100644 --- a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml +++ b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml @@ -1,17 +1,17 @@ input_files: mkdir: - - "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{PDY}}/{{HH}}/model/atmos/input" + - "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input" copy: - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_ctrl.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_ctrl.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile1.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile2.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile3.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile4.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}///gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile5.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/gfs_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/gfs_data.tile6.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile1.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile2.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile3.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile4.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile5.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ PDY }}/{{ HH }}/model/atmos/input/sfc_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{PDY}}/{{HH}}/model/atmos/input/sfc_data.tile6.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile3.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}///gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile6.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile1.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile2.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile3.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] diff --git a/ctests/scripts/stage.sh.in b/ctests/scripts/stage.sh.in index e7de1379fc..7695852836 100755 --- a/ctests/scripts/stage.sh.in +++ b/ctests/scripts/stage.sh.in @@ -5,6 +5,8 @@ set -ux TEST_NAME=${1:?"Name of the test is required"} # CMake to fill these variables +STAGED_FUNCTIONAL_TEST_DIR="@STAGED_FUNCTIONAL_TEST_DIR@" +RUNTESTS="@RUNTESTS@" HOMEgfs="@PROJECT_SOURCE_DIR@" # Load the runtime environment for this script (needs wxflow and its dependencies) @@ -18,7 +20,7 @@ export PYTHONPATH INPUTS_YAML="${HOMEgfs}/ci/ctests/cases/${TEST_NAME}.yaml" -"${HOMEgfs}/ci/ctests/scripts/stage.py" --build_dir "@CMAKE_CURRENT_BINARY_DIR@" --yaml "${INPUTS_YAML}" +"${HOMEgfs}/ci/ctests/scripts/stage.py" --yaml "${INPUTS_YAML}" rc=$? if [[ "${rc}" -ne 0 ]]; then set +x From 54f633b6b05642d95b01ba3ddaae8331bf1a716f Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 10 Jan 2025 17:24:26 -0600 Subject: [PATCH 099/144] typos in CMakeLists and module file for adding CMake on Orion --- ctests/CMakeLists.txt | 6 +++--- modulefiles/module_gwsetup.orion.lua | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index d46f3705e4..eefa4c5d22 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -25,10 +25,10 @@ if(NOT DEFINED ICSDIR_ROOT) return() endif() -if (DEFINED ENV{STAGED_FUNCTIONAL_TEST_DIR} AND NOT DEFINED STATED_FUNCTIONAL_TEST_DIR) - set(STATED_FUNCTIONAL_TEST_DIR $ENV{HPC_ACCOUNT} CACHE STRING "Local path to global-workflow staged data for functional test") +if (DEFINED ENV{STAGED_FUNCTIONAL_TEST_DIR} AND NOT DEFINED STAGED_FUNCTIONAL_TEST_DIR) + set(STAGED_FUNCTIONAL_TEST_DIR $ENV{STAGED_FUNCTIONAL_TEST_DIR} CACHE STRING "Local path to global-workflow staged data for functional test") endif() -if(NOT DEFINED STATED_FUNCTIONAL_TEST_DIR) +if(NOT DEFINED STAGED_FUNCTIONAL_TEST_DIR) message(FATAL_ERROR "STATED_FUNCTIONAL_TEST_DIR must be set") return() endif() diff --git a/modulefiles/module_gwsetup.orion.lua b/modulefiles/module_gwsetup.orion.lua index b8e2fc8a9f..5ffebc31a1 100644 --- a/modulefiles/module_gwsetup.orion.lua +++ b/modulefiles/module_gwsetup.orion.lua @@ -10,11 +10,13 @@ prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/orion/spack-st local stack_intel_ver=os.getenv("stack_intel_ver") or "2021.9.0" local python_ver=os.getenv("python_ver") or "3.11.6" +local cmake_ver=os.getenv("cmake_ver") or "3.23.1" load(pathJoin("stack-intel", stack_intel_ver)) load(pathJoin("python", python_ver)) load("py-jinja2") load("py-pyyaml") load("py-numpy") +load(pathJoin("cmake", cmake_ver)) whatis("Description: GFS run setup environment") From a182c4439064e5cea5b807d2d7601544eddab443 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 10 Jan 2025 17:57:06 -0600 Subject: [PATCH 100/144] added TEST_DATE as an agrment to adding a test in CMake List file --- ctests/CMakeLists.txt | 5 +++-- ctests/scripts/setup.sh.in | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index eefa4c5d22..95f66cc951 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -51,7 +51,7 @@ function(AddJJOBTest) set(prefix ARG) set(novals NOTRAPFPE NOVALGRIND) - set(singlevals CASE JOB) + set(singlevals CASE JOB TEST_DATE) set(multivals TEST_DEPENDS) cmake_parse_arguments(${prefix} @@ -63,7 +63,7 @@ function(AddJJOBTest) set(CASE_YAML ${CASE_PATH}/${ARG_CASE}.yaml) add_test(NAME test_${TEST_NAME}_setup - COMMAND ./setup.sh ${TEST_NAME} ${CASE_YAML} + COMMAND ./setup.sh ${TEST_NAME} ${CASE_YAML} ${ARG_TEST_DATE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) set_tests_properties(test_${TEST_NAME}_setup PROPERTIES LABELS "${ARG_CASE};${ARG_JOB}") @@ -85,4 +85,5 @@ endfunction() AddJJOBTest( CASE "C48_ATM" JOB "gfs_fcst_seg0" + TEST_DATE "2021032312" ) diff --git a/ctests/scripts/setup.sh.in b/ctests/scripts/setup.sh.in index 6c4a772b65..742b14afe4 100755 --- a/ctests/scripts/setup.sh.in +++ b/ctests/scripts/setup.sh.in @@ -4,6 +4,7 @@ set -ux TEST_NAME=${1:?"Name of the test is required"} YAML_FILE=${2:?"Name of the CI yaml file for the test"} +TEST_DATE=${3:?"idate of the test is required"} # CMake to fill these variables HOMEgfs="@PROJECT_SOURCE_DIR@" From fd8a8bc494abec5681fb66192564cfd6a81fc8a2 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 10 Jan 2025 18:17:39 -0600 Subject: [PATCH 101/144] needed idate in arg to exexcute --- ctests/CMakeLists.txt | 2 +- ctests/scripts/stage.sh.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index 95f66cc951..2f77805557 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -73,7 +73,7 @@ function(AddJJOBTest) set_tests_properties(test_${TEST_NAME}_stage PROPERTIES DEPENDS test_${TEST_NAME}_setup LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME test_${TEST_NAME}_execute - COMMAND ./execute.sh ${TEST_NAME} ${ARG_JOB} + COMMAND ./execute.sh ${TEST_NAME} ${ARG_JOB} ${ARG_TEST_DATE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${ARG_CASE};${ARG_JOB}") diff --git a/ctests/scripts/stage.sh.in b/ctests/scripts/stage.sh.in index 7695852836..b276ec3e6c 100755 --- a/ctests/scripts/stage.sh.in +++ b/ctests/scripts/stage.sh.in @@ -20,7 +20,7 @@ export PYTHONPATH INPUTS_YAML="${HOMEgfs}/ci/ctests/cases/${TEST_NAME}.yaml" -"${HOMEgfs}/ci/ctests/scripts/stage.py" --yaml "${INPUTS_YAML}" +"${HOMEgfs}/ctests/scripts/stage.py" --yaml "${INPUTS_YAML}" rc=$? if [[ "${rc}" -ne 0 ]]; then set +x From 472d89c07e67348532125551efebf0131172b765 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 10 Jan 2025 18:35:24 -0600 Subject: [PATCH 102/144] just use par_yaml --- ctests/scripts/stage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ctests/scripts/stage.py b/ctests/scripts/stage.py index e6853033c2..898e3767dd 100755 --- a/ctests/scripts/stage.py +++ b/ctests/scripts/stage.py @@ -8,7 +8,7 @@ from argparse import ArgumentParser from pathlib import Path -from wxflow import Configuration, AttrDict, parse_j2yaml, Logger, logit, which, CommandNotFoundError, ProcessError, FileHandler +from wxflow import parse_yaml, FileHandler logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) @@ -32,5 +32,5 @@ def parse_args(): # Parse command line arguments args = parse_args() - case_cfg = parse_j2yaml(path=args.yaml, data=data) + case_cfg = parse_yaml(path=args.yaml) FileHandler(case_cfg.input_files).sync() From 45d2901969f9c1d8fbe9a4a5bb04977a1a36ae09 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 10 Jan 2025 19:25:26 -0600 Subject: [PATCH 103/144] trying to get args into yaml --- ctests/cases/C48_ATM_gfs_fcst_seg0.yaml | 28 ++++++++++++------------- ctests/scripts/stage.py | 6 ++++-- ctests/scripts/stage.sh.in | 2 +- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml index 17738e69d1..937815b47b 100644 --- a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml +++ b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml @@ -1,17 +1,17 @@ input_files: mkdir: - - "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input" + - "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input" copy: - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile3.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}///gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile6.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile1.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile1.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile2.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile2.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile3.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile3.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{RUNTESTS}}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile3.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}///gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile6.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile1.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile2.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile3.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] + - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] diff --git a/ctests/scripts/stage.py b/ctests/scripts/stage.py index 898e3767dd..ed2f73e6e1 100755 --- a/ctests/scripts/stage.py +++ b/ctests/scripts/stage.py @@ -8,7 +8,7 @@ from argparse import ArgumentParser from pathlib import Path -from wxflow import parse_yaml, FileHandler +from wxflow import parse_j2yaml, FileHandler, AttrDict, Logger logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) @@ -32,5 +32,7 @@ def parse_args(): # Parse command line arguments args = parse_args() - case_cfg = parse_yaml(path=args.yaml) + data = AttrDict(TEST_DATE=os.environ.get("TEST_DATE")) + data.update(os.environ) + case_cfg = parse_j2yaml(path=args.yaml, data=data) FileHandler(case_cfg.input_files).sync() diff --git a/ctests/scripts/stage.sh.in b/ctests/scripts/stage.sh.in index b276ec3e6c..f0b7e822cd 100755 --- a/ctests/scripts/stage.sh.in +++ b/ctests/scripts/stage.sh.in @@ -18,7 +18,7 @@ set -x PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${HOMEgfs}/sorc/wxflow/src" export PYTHONPATH -INPUTS_YAML="${HOMEgfs}/ci/ctests/cases/${TEST_NAME}.yaml" +INPUTS_YAML="${HOMEgfs}/ctests/cases/${TEST_NAME}.yaml" "${HOMEgfs}/ctests/scripts/stage.py" --yaml "${INPUTS_YAML}" rc=$? From 8ca4d7a532635ae6c4bb6470528009bd9c6f82f4 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 10 Jan 2025 19:49:09 -0600 Subject: [PATCH 104/144] added TEST_DATA via data to template --- ctests/cases/C48_ATM_gfs_fcst_seg0.yaml | 28 ++++++++++++------------- ctests/scripts/stage.py | 3 +-- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml index 937815b47b..f12fd2fa8a 100644 --- a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml +++ b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml @@ -1,17 +1,17 @@ input_files: mkdir: - - "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input" + - "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input" copy: - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile3.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}///gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile6.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile1.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile2.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile3.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] - - ["{{ STAGED_FUNCTIONAL_TEST_DIR }}/{{ TEST_NAME }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ TEST_NAME }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile3.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}///gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile6.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile1.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile2.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile3.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] + - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] diff --git a/ctests/scripts/stage.py b/ctests/scripts/stage.py index ed2f73e6e1..90908316e4 100755 --- a/ctests/scripts/stage.py +++ b/ctests/scripts/stage.py @@ -32,7 +32,6 @@ def parse_args(): # Parse command line arguments args = parse_args() - data = AttrDict(TEST_DATE=os.environ.get("TEST_DATE")) - data.update(os.environ) + data = {'TEST_DATE': os.environ.get('TEST_DATE')} case_cfg = parse_j2yaml(path=args.yaml, data=data) FileHandler(case_cfg.input_files).sync() From 91d76e3687d39de83f66a1bf718dd141d56caffc Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Fri, 10 Jan 2025 19:57:56 -0600 Subject: [PATCH 105/144] added TEST_DATE into arg to bash stage --- ctests/CMakeLists.txt | 2 +- ctests/scripts/stage.sh.in | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index 2f77805557..34d7f52c65 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -68,7 +68,7 @@ function(AddJJOBTest) set_tests_properties(test_${TEST_NAME}_setup PROPERTIES LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME test_${TEST_NAME}_stage - COMMAND ./stage.sh ${TEST_NAME} + COMMAND ./stage.sh ${TEST_NAME} ${ARG_TEST_DATE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) set_tests_properties(test_${TEST_NAME}_stage PROPERTIES DEPENDS test_${TEST_NAME}_setup LABELS "${ARG_CASE};${ARG_JOB}") diff --git a/ctests/scripts/stage.sh.in b/ctests/scripts/stage.sh.in index f0b7e822cd..167c04ef62 100755 --- a/ctests/scripts/stage.sh.in +++ b/ctests/scripts/stage.sh.in @@ -3,6 +3,7 @@ set -ux TEST_NAME=${1:?"Name of the test is required"} +TEST_DATE=${2:?"idate of the test is required"} # CMake to fill these variables STAGED_FUNCTIONAL_TEST_DIR="@STAGED_FUNCTIONAL_TEST_DIR@" From 61e7ce316a13a7cd9759e1a5a363d3376493d00c Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 10:12:05 -0600 Subject: [PATCH 106/144] changed test_date argument to datetime object so it can be used with Jinja functions with in the templating class --- ci/platforms/config.hera | 2 +- ci/platforms/config.orion | 2 +- ctests/CMakeLists.txt | 49 ++++++++++++++++++++++++-------------- ctests/scripts/stage.py | 5 +++- ctests/scripts/stage.sh.in | 2 +- 5 files changed, 38 insertions(+), 22 deletions(-) diff --git a/ci/platforms/config.hera b/ci/platforms/config.hera index fa908f8eb1..09e2e28ddb 100644 --- a/ci/platforms/config.hera +++ b/ci/platforms/config.hera @@ -3,7 +3,7 @@ export GFS_CI_ROOT=/scratch1/NCEPDEV/global/Terry.McGuinness/GFS_CI_ROOT export ICSDIR_ROOT=/scratch1/NCEPDEV/global/glopara/data/ICSDIR -export STAGED_FUNCTIONAL_TEST_DIR=${GFS_CI_ROOT}/STAGED_FUNCTIONAL_TEST_DIR +export STAGED_TESTS_DIR=${GFS_CI_ROOT}/STAGED_TESTS_DIR export HPC_ACCOUNT=nems export max_concurrent_cases=5 export max_concurrent_pr=4 diff --git a/ci/platforms/config.orion b/ci/platforms/config.orion index 6b4810419d..b0b8c0e3a5 100644 --- a/ci/platforms/config.orion +++ b/ci/platforms/config.orion @@ -3,7 +3,7 @@ export GFS_CI_ROOT=/work2/noaa/stmp/GFS_CI_ROOT/ORION export ICSDIR_ROOT=/work/noaa/global/glopara/data/ICSDIR export HPC_ACCOUNT=nems -export STAGED_FUNCTIONAL_TEST_DIR=/work/noaa/stmp/GFS_CI_ROOT/ORION/STAGED_FUNCTIONAL_TEST_DIR +export STAGED_TESTS_DIR=/work/noaa/stmp/GFS_CI_ROOT/ORION/STAGED_TESTS_DIR export max_concurrent_cases=5 export max_concurrent_pr=4 diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index 34d7f52c65..7305390b2c 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -1,35 +1,48 @@ +# ------------------------------------------------------------------------- # +# CTests for Global Workflow +# ------------------------------------------------------------------------- # +# These ctests correspond to JJOBs (individual Rocoto jobs) that can be +# run independently, each requiring its own YAML definition of inputs +# and configurations. By integrating with Rocoto, these jobs can be +# validated, staged, and executed as self-contained tests using +# their own data and test parameters. +# ------------------------------------------------------------------------- # + +# Function to set a variable from an environment variable or default value +function(set_from_env_or_default VAR_NAME ENV_VAR DEFAULT_VALUE) + if (DEFINED ENV{${ENV_VAR}} AND NOT DEFINED ${VAR_NAME}) + set(${VAR_NAME} $ENV{${ENV_VAR}} CACHE STRING "Set from environment variable ${ENV_VAR}") + elseif(NOT DEFINED ${VAR_NAME}) + set(${VAR_NAME} ${DEFAULT_VALUE} CACHE STRING "Default value for ${VAR_NAME}") + endif() +endfunction() + +# Set HOMEgfs if (NOT DEFINED HOMEgfs) set(HOMEgfs ${PROJECT_SOURCE_DIR}) endif() -if (DEFINED ENV{RUNTESTS} AND NOT DEFINED RUNTESTS) - set(RUNTESTS $ENV{RUNTESTS} CACHE FILEPATH "Path to global-workflow RUNTESTS directory") -else() - set(RUNTESTS ${CMAKE_CURRENT_BINARY_DIR}/RUNTESTS) -endif() - -if (DEFINED ENV{HPC_ACCOUNT} AND NOT DEFINED HPC_ACCOUNT) - set(HPC_ACCOUNT $ENV{HPC_ACCOUNT} CACHE STRING "Local location of glowbal-workflow initialconditions") -endif() +# Set RUNTESTS +set_from_env_or_default(RUNTESTS RUNTESTS "${CMAKE_CURRENT_BINARY_DIR}/RUNTESTS") +# Set HPC_ACCOUNT +set_from_env_or_default(HPC_ACCOUNT HPC_ACCOUNT "") if (NOT DEFINED HPC_ACCOUNT) message(FATAL_ERROR "HPC_ACCOUNT must be set") return() endif() -if (DEFINED ENV{ISCDIR_ROOT} AND NOT DEFINED ICSDIR_ROOT) - set(ICSDIR_ROOT $ENV{HPC_ACCOUNT} CACHE STRING "Local path to global-workflow initialconditions") -endif() -if(NOT DEFINED ICSDIR_ROOT) +# Set ICSDIR_ROOT +set_from_env_or_default(ICSDIR_ROOT ICSDIR_ROOT "") +if (NOT DEFINED ICSDIR_ROOT) message(FATAL_ERROR "ICSDIR_ROOT must be set") return() endif() -if (DEFINED ENV{STAGED_FUNCTIONAL_TEST_DIR} AND NOT DEFINED STAGED_FUNCTIONAL_TEST_DIR) - set(STAGED_FUNCTIONAL_TEST_DIR $ENV{STAGED_FUNCTIONAL_TEST_DIR} CACHE STRING "Local path to global-workflow staged data for functional test") -endif() -if(NOT DEFINED STAGED_FUNCTIONAL_TEST_DIR) - message(FATAL_ERROR "STATED_FUNCTIONAL_TEST_DIR must be set") +# Set STAGED_TESTS_DIR +set_from_env_or_default(STAGED_TESTS_DIR STAGED_TESTS_DIR "") +if (NOT DEFINED STAGED_TESTS_DIR) + message(FATAL_ERROR "STAGED_TESTS_DIR must be set") return() endif() diff --git a/ctests/scripts/stage.py b/ctests/scripts/stage.py index 90908316e4..64a45da8b6 100755 --- a/ctests/scripts/stage.py +++ b/ctests/scripts/stage.py @@ -2,6 +2,8 @@ import os, sys import shutil +import datetime + _here = os.path.dirname(__file__) _top = os.path.abspath(os.path.join(os.path.abspath(_here), '../../..')) sys.path.insert(0, _top) @@ -26,12 +28,13 @@ def parse_args(): parser = ArgumentParser(description=description) parser.add_argument('-y', '--yaml', help='full path to yaml file describing the job test configuration', type=Path, required=True) + parser.add_argument('-d', '--test_date', help='full path to yaml file describing the job test configuration', type=datetime, required=False) return parser.parse_args() if __name__ == '__main__': # Parse command line arguments args = parse_args() - data = {'TEST_DATE': os.environ.get('TEST_DATE')} + data = {'TEST_DATE': args.test_date} case_cfg = parse_j2yaml(path=args.yaml, data=data) FileHandler(case_cfg.input_files).sync() diff --git a/ctests/scripts/stage.sh.in b/ctests/scripts/stage.sh.in index 167c04ef62..b2ba549388 100755 --- a/ctests/scripts/stage.sh.in +++ b/ctests/scripts/stage.sh.in @@ -6,7 +6,7 @@ TEST_NAME=${1:?"Name of the test is required"} TEST_DATE=${2:?"idate of the test is required"} # CMake to fill these variables -STAGED_FUNCTIONAL_TEST_DIR="@STAGED_FUNCTIONAL_TEST_DIR@" +STAGED_TESTS_DIR="@STAGED_TESTS_DIR@" RUNTESTS="@RUNTESTS@" HOMEgfs="@PROJECT_SOURCE_DIR@" From 1860e05a4fe2c0f8dfdb63731f5880901007c7b3 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 10:14:18 -0600 Subject: [PATCH 107/144] MACHINE_ID is no longer used (removed from messae) --- ctests/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index 7305390b2c..42df138874 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -46,7 +46,6 @@ if (NOT DEFINED STAGED_TESTS_DIR) return() endif() -message(STATUS "MACHINE_ID: '${MACHINE_ID}'") message(STATUS "gw: global-workflow baselines will be used from: '${HOMEgfs}'") message(STATUS "gw: global-workflow tests will be run at: '${RUNTESTS}'") message(STATUS "gw: global-workflow tests will use the allocation: '${HPC_ACCOUNT}'") From e979f75195168bfb02eead8f5ae3104ca47dc878 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 10:30:01 -0600 Subject: [PATCH 108/144] updated arg to stagy.py for test_date to a str --- ctests/scripts/stage.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ctests/scripts/stage.py b/ctests/scripts/stage.py index 64a45da8b6..6726853e5c 100755 --- a/ctests/scripts/stage.py +++ b/ctests/scripts/stage.py @@ -10,7 +10,7 @@ from argparse import ArgumentParser from pathlib import Path -from wxflow import parse_j2yaml, FileHandler, AttrDict, Logger +from wxflow import parse_j2yaml, FileHandler, Logger logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) @@ -28,13 +28,16 @@ def parse_args(): parser = ArgumentParser(description=description) parser.add_argument('-y', '--yaml', help='full path to yaml file describing the job test configuration', type=Path, required=True) - parser.add_argument('-d', '--test_date', help='full path to yaml file describing the job test configuration', type=datetime, required=False) + parser.add_argument('-d', '--test_date', help='test date in YYYYMMDDHH format', type=str, required=False) return parser.parse_args() if __name__ == '__main__': # Parse command line arguments args = parse_args() + data = {'TEST_DATE': args.test_date} + if args.test_date: + data['TEST_DATE'] = datetime.datetime.strptime(args.test_date, '%Y%m%d%H') case_cfg = parse_j2yaml(path=args.yaml, data=data) FileHandler(case_cfg.input_files).sync() From 91f433124cf7abc393e1fc18aa2ad960e092903c Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 10:42:15 -0600 Subject: [PATCH 109/144] missed commit (adding test_date arg to stage.py) --- ctests/scripts/stage.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctests/scripts/stage.sh.in b/ctests/scripts/stage.sh.in index b2ba549388..a0309b2922 100755 --- a/ctests/scripts/stage.sh.in +++ b/ctests/scripts/stage.sh.in @@ -21,7 +21,7 @@ export PYTHONPATH INPUTS_YAML="${HOMEgfs}/ctests/cases/${TEST_NAME}.yaml" -"${HOMEgfs}/ctests/scripts/stage.py" --yaml "${INPUTS_YAML}" +"${HOMEgfs}/ctests/scripts/stage.py" --yaml "${INPUTS_YAML} --test_date "${TEST_DATE}" rc=$? if [[ "${rc}" -ne 0 ]]; then set +x From 17fd1da0dda7905f4c83458814075800dd59497e Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 11:04:22 -0600 Subject: [PATCH 110/144] added env vars to starge.py in wrapper via prefixed values to call --- ctests/scripts/stage.sh.in | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ctests/scripts/stage.sh.in b/ctests/scripts/stage.sh.in index a0309b2922..9ced3d8f4e 100755 --- a/ctests/scripts/stage.sh.in +++ b/ctests/scripts/stage.sh.in @@ -21,7 +21,10 @@ export PYTHONPATH INPUTS_YAML="${HOMEgfs}/ctests/cases/${TEST_NAME}.yaml" -"${HOMEgfs}/ctests/scripts/stage.py" --yaml "${INPUTS_YAML} --test_date "${TEST_DATE}" +TEST_NAME="${TEST_NAME}" \ +RUNTESTS="${RUNTESTS}" \ +STAGED_TESTS_DIR="${STAGED_TESTS_DIR}" \ +"${HOMEgfs}/ctests/scripts/stage.py" --yaml "${INPUTS_YAML}" --test_date "${TEST_DATE}" rc=$? if [[ "${rc}" -ne 0 ]]; then set +x From 48ec7c6adccfb0cb346fec3765fc9d9566885ff0 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 11:23:04 -0600 Subject: [PATCH 111/144] check if default is not used and needs to be set to valule for error message to occure --- ctests/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index 42df138874..e5a5f21131 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -12,7 +12,7 @@ function(set_from_env_or_default VAR_NAME ENV_VAR DEFAULT_VALUE) if (DEFINED ENV{${ENV_VAR}} AND NOT DEFINED ${VAR_NAME}) set(${VAR_NAME} $ENV{${ENV_VAR}} CACHE STRING "Set from environment variable ${ENV_VAR}") - elseif(NOT DEFINED ${VAR_NAME}) + elseif(NOT DEFINED ${VAR_NAME} AND NOT ${DEFAULT_VALUE} STREQUAL "") set(${VAR_NAME} ${DEFAULT_VALUE} CACHE STRING "Default value for ${VAR_NAME}") endif() endfunction() @@ -26,7 +26,7 @@ endif() set_from_env_or_default(RUNTESTS RUNTESTS "${CMAKE_CURRENT_BINARY_DIR}/RUNTESTS") # Set HPC_ACCOUNT -set_from_env_or_default(HPC_ACCOUNT HPC_ACCOUNT "") +set_from_env_or_default(HPC_ACCOUNT HPC_ACCOUNT " ") if (NOT DEFINED HPC_ACCOUNT) message(FATAL_ERROR "HPC_ACCOUNT must be set") return() @@ -50,6 +50,7 @@ message(STATUS "gw: global-workflow baselines will be used from: '${HOMEgfs}'") message(STATUS "gw: global-workflow tests will be run at: '${RUNTESTS}'") message(STATUS "gw: global-workflow tests will use the allocation: '${HPC_ACCOUNT}'") message(STATUS "gw: global-workflow tests will use ICSDIR_ROOT: '${ICSDIR_ROOT}'") +message(STATUS "gw: global-workflow tests will use staged data from: '${STAGED_TESTS_DIR}'") # Prepare test scripts configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/setup.sh.in From 243d47b1b65231376102bf9c578269678c3364b6 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 11:31:15 -0600 Subject: [PATCH 112/144] did not have updated var name for STAGED_TEST_DIR in yaml file --- ctests/cases/C48_ATM_gfs_fcst_seg0.yaml | 26 ++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml index f12fd2fa8a..a30f91e85b 100644 --- a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml +++ b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml @@ -2,16 +2,16 @@ input_files: mkdir: - "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input" copy: - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile3.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}///gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile6.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile1.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile2.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile3.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] - - ["{{ 'STAGED_FUNCTIONAL_TEST' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile3.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}///gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile6.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile1.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile2.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile3.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] From c092b109609583a46a6d4c2d27c145ecf106ffa5 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 11:58:37 -0600 Subject: [PATCH 113/144] replaced scraping output file with status from sacct --- ctests/scripts/execute.sh.in | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/ctests/scripts/execute.sh.in b/ctests/scripts/execute.sh.in index aef8348a5c..8d5e7128d2 100755 --- a/ctests/scripts/execute.sh.in +++ b/ctests/scripts/execute.sh.in @@ -22,37 +22,23 @@ cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${TEST_NAME}.sub" || true output=$(sbatch "${TEST_NAME}.sub") job_id=$(echo "${output}" | awk '{print $4}') echo "Job ${job_id} submitted for test ${TEST_NAME} with job name ${JOB}" -stdout_file=$(scontrol show job "${job_id}" | grep StdOut | awk -F= '{print $2}') || true - -# Check the status of the Slurm job -check_stdout_file() { - last_line=$(tail -n 1 "${stdout_file}") - if [[ "${last_line}" == "End"* && "${last_line}" == *"error code 0"* ]]; then - echo "Job ${job_id} completed successfully with END and error code 0." - exit 0 - else - echo "Job ${job_id} did not complete successfully. Last line: ${last_line}" - exit 1 - fi -} # Check the status of the Slurm job timeout=0 TIMEOUT=60 while true; do - job_status=$(squeue --job "${job_id}" --noheader --format "%T") + job_status=$(sacct -j "${job_id}" --format=State --noheader -n | head -1) if [[ "${job_status}" == "COMPLETED" ]]; then echo "Job ${job_id} completed successfully." - check_stdout_file - elif [[ "${job_status}" == "FAILED" || "${job_status}" == "CANCELLED" || "${job_status}" == "TIMEOUT" ]]; then + elif [[ "${job_status}" =~ ^(FAILED|CANCELLED|TIMEOUT)$ ]]; then echo "Job ${job_id} failed with status: ${job_status}." exit 1 elif [[ -z "${job_status}" ]]; then - echo "Job ${job_id} is no longer in the queue. Checking stdout file." - check_stdout_file + echo "Job ${job_id} is no longer in sacct." + exit 1 else echo "Job ${job_id} is still running with status: ${job_status}." - sleep 60 # Check every 60 seconds + sleep 60 timeout=$((timeout+1)) if [[ "${timeout}" -gt "${TIMEOUT}" ]]; then echo "Job ${job_id} has been running for more than ${TIMEOUT} minutes. Exiting." From 41b6aeee65fab95c1aaf66eedacf9e80e7d68894 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 12:16:51 -0600 Subject: [PATCH 114/144] added extra step for making sure the submitted job_id is in the sacct system --- ctests/scripts/execute.sh.in | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/ctests/scripts/execute.sh.in b/ctests/scripts/execute.sh.in index 8d5e7128d2..bc18c389a0 100755 --- a/ctests/scripts/execute.sh.in +++ b/ctests/scripts/execute.sh.in @@ -23,23 +23,40 @@ output=$(sbatch "${TEST_NAME}.sub") job_id=$(echo "${output}" | awk '{print $4}') echo "Job ${job_id} submitted for test ${TEST_NAME} with job name ${JOB}" -# Check the status of the Slurm job +# First loop: wait until job appears +lack_of_job_count=0 +LACK_OF_JOB_LIMIT=5 + +while true; do + job_status=$(sacct -j "${job_id}" --format=State --noheader -n | head -1) + if [[ -n "${job_status}" ]]; then + echo "Job ${job_id} found in sacct." + break + fi + echo "Job ${job_id} not in sacct yet, attempt ${lack_of_job_count}/${LACK_OF_JOB_LIMIT}." + lack_of_job_count=$((lack_of_job_count + 1)) + if [[ "${lack_of_job_count}" -ge "${LACK_OF_JOB_LIMIT}" ]]; then + echo "Job ${job_id} not found after ${lack_of_job_count} attempts. Exiting." + exit 1 + fi + sleep 60 +done + +# Second loop: monitor job status until completion or failure timeout=0 TIMEOUT=60 while true; do job_status=$(sacct -j "${job_id}" --format=State --noheader -n | head -1) if [[ "${job_status}" == "COMPLETED" ]]; then echo "Job ${job_id} completed successfully." + break elif [[ "${job_status}" =~ ^(FAILED|CANCELLED|TIMEOUT)$ ]]; then echo "Job ${job_id} failed with status: ${job_status}." exit 1 - elif [[ -z "${job_status}" ]]; then - echo "Job ${job_id} is no longer in sacct." - exit 1 else echo "Job ${job_id} is still running with status: ${job_status}." sleep 60 - timeout=$((timeout+1)) + timeout=$((timeout + 1)) if [[ "${timeout}" -gt "${TIMEOUT}" ]]; then echo "Job ${job_id} has been running for more than ${TIMEOUT} minutes. Exiting." exit 1 From 42fbc2a7eaf419054f15b7d12b1f9541ce00e16d Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 12:53:17 -0600 Subject: [PATCH 115/144] remove white spaces from job_status --- ctests/scripts/execute.sh.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ctests/scripts/execute.sh.in b/ctests/scripts/execute.sh.in index bc18c389a0..4d5f8907be 100755 --- a/ctests/scripts/execute.sh.in +++ b/ctests/scripts/execute.sh.in @@ -46,7 +46,8 @@ done timeout=0 TIMEOUT=60 while true; do - job_status=$(sacct -j "${job_id}" --format=State --noheader -n | head -1) + # Trim trailing spaces from job_status + job_status=$(sacct -j "${job_id}" --format=State --noheader -n | head -1 | xargs) if [[ "${job_status}" == "COMPLETED" ]]; then echo "Job ${job_id} completed successfully." break From b17ca77bcc81455bd75dbc197b0f4681484ccce7 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 13:25:23 -0600 Subject: [PATCH 116/144] update path to validate stub and reduce first wait on sacct to 30 seconds --- ctests/CMakeLists.txt | 2 +- ctests/scripts/execute.sh.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index e5a5f21131..36052d6ad8 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -91,7 +91,7 @@ function(AddJJOBTest) set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${ARG_CASE};${ARG_JOB}") add_test(NAME test_${TEST_NAME}_validate - COMMAND bash -c "${GW_BASELINE_DIR}/ci/ctests/scripts/validate.sh ${TEST_NAME}") + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh ${TEST_NAME}") set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") endfunction() diff --git a/ctests/scripts/execute.sh.in b/ctests/scripts/execute.sh.in index 4d5f8907be..b15b893e06 100755 --- a/ctests/scripts/execute.sh.in +++ b/ctests/scripts/execute.sh.in @@ -39,7 +39,7 @@ while true; do echo "Job ${job_id} not found after ${lack_of_job_count} attempts. Exiting." exit 1 fi - sleep 60 + sleep 30 done # Second loop: monitor job status until completion or failure From bee8efc09bbd87cc959da14850ea132ae0a89745 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 15:30:09 -0600 Subject: [PATCH 117/144] update a few shellnorm suggestions --- ctests/scripts/execute.sh.in | 6 +++--- ctests/scripts/setup.sh.in | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ctests/scripts/execute.sh.in b/ctests/scripts/execute.sh.in index b15b893e06..69cf047449 100755 --- a/ctests/scripts/execute.sh.in +++ b/ctests/scripts/execute.sh.in @@ -14,8 +14,8 @@ cd "${CASEDIR}" rm -f ./*.db rm -f ./jobcard -job_card=$(yes | "${rocotoboot_dryrun}" -d "${TEST_NAME}.db" -w "${TEST_NAME}.xml" -v 10 -c "${idate}00" -t "${JOB}" 2> jobcard) || true -cat jobcard | sed '/^{{\|^}}/d' | sed '1d' > "${TEST_NAME}.sub" || true +yes | "${rocotoboot_dryrun}" -d "${TEST_NAME}.db" -w "${TEST_NAME}.xml" -v 10 -c "${idate}00" -t "${JOB}" 2> jobcard +sed '/^{{\|^}}/d' < jobcard | sed '1d' > "${TEST_NAME}.sub" || true #TODO - Generalize for batch system (hard coded to slurm) @@ -47,7 +47,7 @@ timeout=0 TIMEOUT=60 while true; do # Trim trailing spaces from job_status - job_status=$(sacct -j "${job_id}" --format=State --noheader -n | head -1 | xargs) + job_status=$(sacct -j "${job_id}" --format=State --noheader -n | head -1 | xargs) || true if [[ "${job_status}" == "COMPLETED" ]]; then echo "Job ${job_id} completed successfully." break diff --git a/ctests/scripts/setup.sh.in b/ctests/scripts/setup.sh.in index 742b14afe4..6c4a772b65 100755 --- a/ctests/scripts/setup.sh.in +++ b/ctests/scripts/setup.sh.in @@ -4,7 +4,6 @@ set -ux TEST_NAME=${1:?"Name of the test is required"} YAML_FILE=${2:?"Name of the CI yaml file for the test"} -TEST_DATE=${3:?"idate of the test is required"} # CMake to fill these variables HOMEgfs="@PROJECT_SOURCE_DIR@" From 613d951237fa307691f56d787161d3e9fe3e28f4 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 15:33:45 -0600 Subject: [PATCH 118/144] one more shellnorm for true on pipe --- ctests/scripts/execute.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctests/scripts/execute.sh.in b/ctests/scripts/execute.sh.in index 69cf047449..b254a53238 100755 --- a/ctests/scripts/execute.sh.in +++ b/ctests/scripts/execute.sh.in @@ -14,7 +14,7 @@ cd "${CASEDIR}" rm -f ./*.db rm -f ./jobcard -yes | "${rocotoboot_dryrun}" -d "${TEST_NAME}.db" -w "${TEST_NAME}.xml" -v 10 -c "${idate}00" -t "${JOB}" 2> jobcard +yes | "${rocotoboot_dryrun}" -d "${TEST_NAME}.db" -w "${TEST_NAME}.xml" -v 10 -c "${idate}00" -t "${JOB}" 2> jobcard || true sed '/^{{\|^}}/d' < jobcard | sed '1d' > "${TEST_NAME}.sub" || true #TODO - Generalize for batch system (hard coded to slurm) From 53bfb629d5fd058faaa1ff5973824ce7bf7b5df4 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 15:35:53 -0600 Subject: [PATCH 119/144] innocuous extra line at end of toplevel CMake file --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bdc6d749f..5044689f7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,4 +24,4 @@ endif() # add_subdirectory(sorc) # Setup tests -add_subdirectory(ctests) \ No newline at end of file +add_subdirectory(ctests) From c6cfefb483b3166528569ba8594ecc14cebf029c Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 15:39:22 -0600 Subject: [PATCH 120/144] consolated GFS ROOT path for staged data dir on orion --- ci/platforms/config.orion | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/platforms/config.orion b/ci/platforms/config.orion index b0b8c0e3a5..507068d4e7 100644 --- a/ci/platforms/config.orion +++ b/ci/platforms/config.orion @@ -2,8 +2,8 @@ export GFS_CI_ROOT=/work2/noaa/stmp/GFS_CI_ROOT/ORION export ICSDIR_ROOT=/work/noaa/global/glopara/data/ICSDIR +export STAGED_TESTS_DIR=${GFS_CI_ROOT}/STAGED_TESTS_DIR export HPC_ACCOUNT=nems -export STAGED_TESTS_DIR=/work/noaa/stmp/GFS_CI_ROOT/ORION/STAGED_TESTS_DIR export max_concurrent_cases=5 export max_concurrent_pr=4 From 02a03f193cfa74de58ddae2ddc6dc8a9830901bd Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 15:45:42 -0600 Subject: [PATCH 121/144] added some more notes for validate subs --- ctests/CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index 36052d6ad8..7e348f791d 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -59,6 +59,9 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/stage.sh.in ${CMAKE_CURRENT_BINARY_DIR}/scripts/stage.sh @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/execute.sh.in ${CMAKE_CURRENT_BINARY_DIR}/scripts/execute.sh @ONLY) +# TODO - Validation step add its CMake Teplate for its bash wrapper script +# configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/validate.sh.in +# ${CMAKE_CURRENT_BINARY_DIR}/scripts/validate.sh @ONLY) function(AddJJOBTest) @@ -89,9 +92,10 @@ function(AddJJOBTest) COMMAND ./execute.sh ${TEST_NAME} ${ARG_JOB} ${ARG_TEST_DATE} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) set_tests_properties(test_${TEST_NAME}_execute PROPERTIES DEPENDS test_${TEST_NAME}_stage LABELS "${ARG_CASE};${ARG_JOB}") - + + # TODO - This is a stub for the validation step add_test(NAME test_${TEST_NAME}_validate - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh ${TEST_NAME}") + COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh") set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") endfunction() From 02e1a9257bd22bd33d0d59c63f0413aa3ce11e54 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 15:52:08 -0600 Subject: [PATCH 122/144] remove extras from stage.py --- ctests/scripts/stage.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/ctests/scripts/stage.py b/ctests/scripts/stage.py index 6726853e5c..b0946c84c1 100755 --- a/ctests/scripts/stage.py +++ b/ctests/scripts/stage.py @@ -1,13 +1,8 @@ #!/usr/bin/env python3 -import os, sys -import shutil +import os import datetime -_here = os.path.dirname(__file__) -_top = os.path.abspath(os.path.join(os.path.abspath(_here), '../../..')) -sys.path.insert(0, _top) - from argparse import ArgumentParser from pathlib import Path from wxflow import parse_j2yaml, FileHandler, Logger @@ -36,7 +31,7 @@ def parse_args(): # Parse command line arguments args = parse_args() - data = {'TEST_DATE': args.test_date} + data = {} if args.test_date: data['TEST_DATE'] = datetime.datetime.strptime(args.test_date, '%Y%m%d%H') case_cfg = parse_j2yaml(path=args.yaml, data=data) From 3da4c54948472b937bc7b49631ea0bbb7aff9e21 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 16:09:53 -0600 Subject: [PATCH 123/144] still had path woring to valication stub (has no *.in file) --- ctests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index 7e348f791d..4aad8e5c9a 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -95,7 +95,7 @@ function(AddJJOBTest) # TODO - This is a stub for the validation step add_test(NAME test_${TEST_NAME}_validate - COMMAND bash -c "${HOMEgfs}/ci/ctests/scripts/validate.sh") + COMMAND bash -c "${HOMEgfs}/ctests/scripts/validate.sh") set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") endfunction() From c4163701d36f73c4dbdaa672fb1c70d3ef228d52 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 16:21:36 -0600 Subject: [PATCH 124/144] another shellnorm || true --- ctests/scripts/execute.sh.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctests/scripts/execute.sh.in b/ctests/scripts/execute.sh.in index b254a53238..9cf3ef5917 100755 --- a/ctests/scripts/execute.sh.in +++ b/ctests/scripts/execute.sh.in @@ -28,7 +28,7 @@ lack_of_job_count=0 LACK_OF_JOB_LIMIT=5 while true; do - job_status=$(sacct -j "${job_id}" --format=State --noheader -n | head -1) + job_status=$(sacct -j "${job_id}" --format=State --noheader -n | head -1) || true if [[ -n "${job_status}" ]]; then echo "Job ${job_id} found in sacct." break From 52c50811b5fcaf26f106ccbeaf5e7190576c097f Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 16:23:46 -0600 Subject: [PATCH 125/144] pynomrs spaces --- ctests/scripts/stage.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ctests/scripts/stage.py b/ctests/scripts/stage.py index b0946c84c1..5ff2722b68 100755 --- a/ctests/scripts/stage.py +++ b/ctests/scripts/stage.py @@ -9,12 +9,14 @@ logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) + def parse_args(): """ Parse command line arguments. Returns ------- + argparse.Namespace The parsed command line arguments. """ From 1b745595cc0d67496f1e359a586d809fe04be71d Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Mon, 13 Jan 2025 16:28:57 -0600 Subject: [PATCH 126/144] pynomrs line space two --- ctests/scripts/stage.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ctests/scripts/stage.py b/ctests/scripts/stage.py index 5ff2722b68..51b6c8051e 100755 --- a/ctests/scripts/stage.py +++ b/ctests/scripts/stage.py @@ -28,6 +28,7 @@ def parse_args(): parser.add_argument('-d', '--test_date', help='test date in YYYYMMDDHH format', type=str, required=False) return parser.parse_args() + if __name__ == '__main__': # Parse command line arguments From e965602cce40d7f1ec4d5efe742cd06ff4f2de2f Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 14 Jan 2025 10:20:35 -0600 Subject: [PATCH 127/144] added back missing submodels gsi_enkf and gsi_utils --- sorc/gsi_enkf.fd | 1 + sorc/gsi_utils.fd | 1 + 2 files changed, 2 insertions(+) create mode 160000 sorc/gsi_enkf.fd create mode 160000 sorc/gsi_utils.fd diff --git a/sorc/gsi_enkf.fd b/sorc/gsi_enkf.fd new file mode 160000 index 0000000000..7fc0057937 --- /dev/null +++ b/sorc/gsi_enkf.fd @@ -0,0 +1 @@ +Subproject commit 7fc00579378c67f20bf981ce5fbf1f5c2753abc7 diff --git a/sorc/gsi_utils.fd b/sorc/gsi_utils.fd new file mode 160000 index 0000000000..f716012812 --- /dev/null +++ b/sorc/gsi_utils.fd @@ -0,0 +1 @@ +Subproject commit f716012812c2564e7eab24041f7a3ec14c7aa383 From 241392da270e68212a9e2dd40f8456471020aa87 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 14 Jan 2025 11:34:23 -0600 Subject: [PATCH 128/144] updating to correct hash for submodule gsi_enkf --- sorc/gsi_enkf.fd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorc/gsi_enkf.fd b/sorc/gsi_enkf.fd index 7fc0057937..27c03e83a6 160000 --- a/sorc/gsi_enkf.fd +++ b/sorc/gsi_enkf.fd @@ -1 +1 @@ -Subproject commit 7fc00579378c67f20bf981ce5fbf1f5c2753abc7 +Subproject commit 27c03e83a66fa2ba3b32781dab7cd6a8c0fc497d From 4669e387ea5a9e796536d1e0c53e1e2b8e75b9ba Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 14 Jan 2025 12:00:42 -0600 Subject: [PATCH 129/144] added inline documentation to the stage file python script --- ctests/scripts/stage.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/ctests/scripts/stage.py b/ctests/scripts/stage.py index 51b6c8051e..b8a77a120d 100755 --- a/ctests/scripts/stage.py +++ b/ctests/scripts/stage.py @@ -1,5 +1,24 @@ #!/usr/bin/env python3 +""" +stage.py + +This script is part of the ctest framework for testing Rocoto JJOBS that stages the +input files needed to run a JJOB independently from other jobs in the workflow. +The YAML file specified at the command line contains the paths to the staged input files +and their corresponding directories under the COMROOT of the experiment for the JJOB. + +Usage: + stage.py -y [-d ] + +Arguments: + -y, --yaml Path to the YAML file describing the job test configuration (required) + -d, --test_date Test date in YYYYMMDDHH format (optional) + +Example: + ./stage.py -y /path/to/config.yaml -d 2021032312 +""" + import os import datetime @@ -7,6 +26,7 @@ from pathlib import Path from wxflow import parse_j2yaml, FileHandler, Logger +# Initialize logger with environment variable for logging level logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=False) @@ -16,15 +36,18 @@ def parse_args(): Returns ------- - argparse.Namespace - The parsed command line arguments. + The parsed command line arguments, including: + - yaml: Path to the YAML file describing the job test configuration. + - test_date: Optional test date in YYYYMMDDHH format. """ description = """Arguments for creating and updating error log files """ parser = ArgumentParser(description=description) + # Add argument for YAML file path parser.add_argument('-y', '--yaml', help='full path to yaml file describing the job test configuration', type=Path, required=True) + # Add optional argument for test date parser.add_argument('-d', '--test_date', help='test date in YYYYMMDDHH format', type=str, required=False) return parser.parse_args() @@ -36,6 +59,9 @@ def parse_args(): data = {} if args.test_date: + # Parse test date from string to datetime object data['TEST_DATE'] = datetime.datetime.strptime(args.test_date, '%Y%m%d%H') + # Parse YAML configuration file with optional data case_cfg = parse_j2yaml(path=args.yaml, data=data) + # Synchronize input files as per the parsed configuration FileHandler(case_cfg.input_files).sync() From 892a6bf0f2c3d74189ce818da3df1a7ed2e1df74 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 14 Jan 2025 12:52:41 -0600 Subject: [PATCH 130/144] added simple README.md file in the ctest directory --- ctests/README.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 ctests/README.md diff --git a/ctests/README.md b/ctests/README.md new file mode 100644 index 0000000000..87b7a136b4 --- /dev/null +++ b/ctests/README.md @@ -0,0 +1,48 @@ +# CTest Framework for NOAA Global Workflow + +This directory contains the CTest framework for testing Rocoto JJOBS. The framework allows you to stage, execute, and validate individual JJOBS independently from other jobs in the workflow. Each test requires its own YAML definition of inputs and configurations. + +## Overview + +The CTest framework consists of the following scripts: +- **setup.sh.in**: Prepares the environment and creates the experiment. +- **stage.sh.in**: Stages the input files needed to run a JJOB. +- **execute.sh.in**: Executes the JJOB and monitors its status. +- **validate.sh.in**: (TODO) Validates the results of the JJOB. + +## Usage + +### CMake Configuration + +To configure the CTest framework using CMake, you need to provide several environment variables or default values. Here is an example of how to configure and build the project: + +```bash +# Set environment variables (may also be include at command line with -D) +export HPC_ACCOUNT="your_hpc_account" +export ICSDIR_ROOT="/path/to/icsdir_root" +export STAGED_TESTS_DIR="/path/to/staged_tests_dir" + +# Run CMake to configure the ctest framework +cmake -S /path/to/source -B /path/to/build -DRUNTESTS=/path/to/runtests + +``` + +### Running Tests with CTest + +Once the project is configured, you can run the tests using CTest. Here are some examples: + +#### Run All Tests + +```bash +cd /path/to/build +ctest +``` + +#### Run Tests for a Specific Case + +You can use the `-L` option with CTest to run tests for a specific case. For example, to run tests for the `C48_ATM` case: + +```bash +cd /path/to/build +ctest -L C48_ATM +``` \ No newline at end of file From b7f80cba31f0cbba561ca302d255aaf70b6a7b57 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 14 Jan 2025 13:20:43 -0600 Subject: [PATCH 131/144] included instructions on how to add a new test in the README.md file --- ctests/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ctests/README.md b/ctests/README.md index 87b7a136b4..adeccfa682 100644 --- a/ctests/README.md +++ b/ctests/README.md @@ -45,4 +45,15 @@ You can use the `-L` option with CTest to run tests for a specific case. For exa ```bash cd /path/to/build ctest -L C48_ATM +``` + +To add a new test use the **AddJJOBTest()** function at the end of the `$HOMEgfs/ctest/CMakeLists.txt` file as follow. +Then auther a new YAML file with the required staged input files as is done with this example for `$HOMEgfs/ctests/cases/C48_ATM_gfs_fcts_seg0.yaml` + +```cmake +AddJJOBTest( + CASE "C48_ATM" + JOB "gfs_fcst_seg0" + TEST_DATE "2021032312" +) ``` \ No newline at end of file From 898fcfe60a6750d2ba12951246802de3de5b5f92 Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Tue, 14 Jan 2025 14:24:07 -0500 Subject: [PATCH 132/144] Update README.md update last bit --- ctests/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ctests/README.md b/ctests/README.md index adeccfa682..7c7c087ade 100644 --- a/ctests/README.md +++ b/ctests/README.md @@ -47,13 +47,12 @@ cd /path/to/build ctest -L C48_ATM ``` -To add a new test use the **AddJJOBTest()** function at the end of the `$HOMEgfs/ctest/CMakeLists.txt` file as follow. -Then auther a new YAML file with the required staged input files as is done with this example for `$HOMEgfs/ctests/cases/C48_ATM_gfs_fcts_seg0.yaml` - +To add a new test use the **AddJJOBTest()** function at the end of the `$HOMEgfs/ctest/CMakeLists.txt` file as follows: ```cmake AddJJOBTest( CASE "C48_ATM" JOB "gfs_fcst_seg0" TEST_DATE "2021032312" ) -``` \ No newline at end of file +``` +Then auther a new YAML file with the required staged input files as is done with this example for `$HOMEgfs/ctests/cases/C48_ATM_gfs_fcts_seg0.yaml` From 12cf0cf125c8f4f950febb920a826a2645c52241 Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Tue, 14 Jan 2025 14:24:58 -0500 Subject: [PATCH 133/144] Update README.md fix misspelled work with create --- ctests/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctests/README.md b/ctests/README.md index 7c7c087ade..1d402981b5 100644 --- a/ctests/README.md +++ b/ctests/README.md @@ -55,4 +55,4 @@ AddJJOBTest( TEST_DATE "2021032312" ) ``` -Then auther a new YAML file with the required staged input files as is done with this example for `$HOMEgfs/ctests/cases/C48_ATM_gfs_fcts_seg0.yaml` +Then create a new YAML file with the required staged input files as is done with this example for `$HOMEgfs/ctests/cases/C48_ATM_gfs_fcts_seg0.yaml` From eeb744f06c63878ed66b792075f7e247c5e9a4b7 Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Tue, 14 Jan 2025 14:26:00 -0500 Subject: [PATCH 134/144] Update README.md fixed a grammar in README.md --- ctests/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctests/README.md b/ctests/README.md index 1d402981b5..4134665420 100644 --- a/ctests/README.md +++ b/ctests/README.md @@ -55,4 +55,4 @@ AddJJOBTest( TEST_DATE "2021032312" ) ``` -Then create a new YAML file with the required staged input files as is done with this example for `$HOMEgfs/ctests/cases/C48_ATM_gfs_fcts_seg0.yaml` +Then create a new YAML file with the required staged input files as is done with this example found in `$HOMEgfs/ctests/cases/C48_ATM_gfs_fcts_seg0.yaml` From 73211bc67c32629ebe0b2b9ed1ac26839830a2db Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Tue, 14 Jan 2025 14:27:44 -0500 Subject: [PATCH 135/144] Update README.md path to source as HOMEgfs --- ctests/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctests/README.md b/ctests/README.md index 4134665420..95a32cd952 100644 --- a/ctests/README.md +++ b/ctests/README.md @@ -23,7 +23,7 @@ export ICSDIR_ROOT="/path/to/icsdir_root" export STAGED_TESTS_DIR="/path/to/staged_tests_dir" # Run CMake to configure the ctest framework -cmake -S /path/to/source -B /path/to/build -DRUNTESTS=/path/to/runtests +cmake -S /path/to/HOMEgfs -B /path/to/build -DRUNTESTS=/path/to/runtests ``` From f18f1ee9430e5e2bcea347b841cf238989467e7f Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Tue, 14 Jan 2025 17:06:02 -0500 Subject: [PATCH 136/144] Update ctests/scripts/validate.sh Co-authored-by: Rahul Mahajan --- ctests/scripts/validate.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ctests/scripts/validate.sh b/ctests/scripts/validate.sh index ea1d3c41d9..55e48dc417 100755 --- a/ctests/scripts/validate.sh +++ b/ctests/scripts/validate.sh @@ -1,2 +1,9 @@ #!/usr/bin/env bash -echo "This is a stub for the validate script." +set -ux + +TEST_NAME=${1:?"Name of the test is required"} +YAML_FILE=${2:?"Name of the CI yaml file for validating the test"} + +echo "validating '${TEST_NAME}' with yaml file '${YAML_FILE}'" + +exit 0 From b1a9fd2152ccf4301f05922e1dfec829b4d7a6e2 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 14 Jan 2025 16:18:31 -0600 Subject: [PATCH 137/144] added validate.sh.in template bash wrapper script --- ctests/CMakeLists.txt | 7 +++---- ctests/scripts/{validate.sh => validate.sh.in} | 8 ++++---- 2 files changed, 7 insertions(+), 8 deletions(-) rename ctests/scripts/{validate.sh => validate.sh.in} (94%) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index 4aad8e5c9a..ef72dc122b 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -59,9 +59,8 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/stage.sh.in ${CMAKE_CURRENT_BINARY_DIR}/scripts/stage.sh @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/execute.sh.in ${CMAKE_CURRENT_BINARY_DIR}/scripts/execute.sh @ONLY) -# TODO - Validation step add its CMake Teplate for its bash wrapper script -# configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/validate.sh.in -# ${CMAKE_CURRENT_BINARY_DIR}/scripts/validate.sh @ONLY) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/validate.sh.in + ${CMAKE_CURRENT_BINARY_DIR}/scripts/validate.sh @ONLY) function(AddJJOBTest) @@ -95,7 +94,7 @@ function(AddJJOBTest) # TODO - This is a stub for the validation step add_test(NAME test_${TEST_NAME}_validate - COMMAND bash -c "${HOMEgfs}/ctests/scripts/validate.sh") + COMMAND bash -c "${HOMEgfs}/ctests/scripts/validate.sh ${TEST_NAME} ${CASE_YAML}") set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") endfunction() diff --git a/ctests/scripts/validate.sh b/ctests/scripts/validate.sh.in similarity index 94% rename from ctests/scripts/validate.sh rename to ctests/scripts/validate.sh.in index 55e48dc417..0277699956 100755 --- a/ctests/scripts/validate.sh +++ b/ctests/scripts/validate.sh.in @@ -1,9 +1,9 @@ #!/usr/bin/env bash set -ux - + TEST_NAME=${1:?"Name of the test is required"} YAML_FILE=${2:?"Name of the CI yaml file for validating the test"} - + echo "validating '${TEST_NAME}' with yaml file '${YAML_FILE}'" - -exit 0 + +exit 0 \ No newline at end of file From f0584503971e8b1e1c5a3874baf482cb815e4616 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 14 Jan 2025 16:25:25 -0600 Subject: [PATCH 138/144] added cmake to Hercules gwsetup modulefile --- modulefiles/module_gwsetup.hercules.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/modulefiles/module_gwsetup.hercules.lua b/modulefiles/module_gwsetup.hercules.lua index 9d845fb71d..e7735e4aa1 100644 --- a/modulefiles/module_gwsetup.hercules.lua +++ b/modulefiles/module_gwsetup.hercules.lua @@ -9,6 +9,7 @@ prepend_path("MODULEPATH", "/work/noaa/epic/role-epic/spack-stack/hercules/spack local stack_intel_ver=os.getenv("stack_intel_ver") or "2021.9.0" local python_ver=os.getenv("python_ver") or "3.11.6" +local cmake_ver=os.getenv("cmake_ver") or "3.23.1" load(pathJoin("stack-intel", stack_intel_ver)) load(pathJoin("python", python_ver)) From eede5741b2927b91f51e3eefb0262ee9fbe04a86 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 14 Jan 2025 16:41:33 -0600 Subject: [PATCH 139/144] updated path to validate.sh --- ctests/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index ef72dc122b..5d4747810b 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -59,7 +59,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/stage.sh.in ${CMAKE_CURRENT_BINARY_DIR}/scripts/stage.sh @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/execute.sh.in ${CMAKE_CURRENT_BINARY_DIR}/scripts/execute.sh @ONLY) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/validate.sh.in +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/validate.sh.in ${CMAKE_CURRENT_BINARY_DIR}/scripts/validate.sh @ONLY) function(AddJJOBTest) @@ -94,7 +94,8 @@ function(AddJJOBTest) # TODO - This is a stub for the validation step add_test(NAME test_${TEST_NAME}_validate - COMMAND bash -c "${HOMEgfs}/ctests/scripts/validate.sh ${TEST_NAME} ${CASE_YAML}") + COMMAND bash -c ./validate.sh ${TEST_NAME} ${CASE_YAML} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") endfunction() From 7da3828c29b192d197ad59cc437fc286513d61e9 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Tue, 14 Jan 2025 19:39:12 -0600 Subject: [PATCH 140/144] needed to remove bash from the COMMAND line for validate.sh --- ctests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index 5d4747810b..14e6cd0150 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -94,7 +94,7 @@ function(AddJJOBTest) # TODO - This is a stub for the validation step add_test(NAME test_${TEST_NAME}_validate - COMMAND bash -c ./validate.sh ${TEST_NAME} ${CASE_YAML} + COMMAND ./validate.sh ${TEST_NAME} ${CASE_YAML} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/scripts) set_tests_properties(test_${TEST_NAME}_validate PROPERTIES DEPENDS test_${TEST_NAME}_execute LABELS "${ARG_CASE};${ARG_JOB}") endfunction() From e48ae52d7524d15649e0888bc2fd5a9202fe481e Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 15 Jan 2025 08:27:54 -0600 Subject: [PATCH 141/144] allow the build to continue whe ctests can not be created without the needed env vars set --- ctests/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ctests/CMakeLists.txt b/ctests/CMakeLists.txt index 14e6cd0150..f8d928f456 100644 --- a/ctests/CMakeLists.txt +++ b/ctests/CMakeLists.txt @@ -28,21 +28,21 @@ set_from_env_or_default(RUNTESTS RUNTESTS "${CMAKE_CURRENT_BINARY_DIR}/RUNTESTS" # Set HPC_ACCOUNT set_from_env_or_default(HPC_ACCOUNT HPC_ACCOUNT " ") if (NOT DEFINED HPC_ACCOUNT) - message(FATAL_ERROR "HPC_ACCOUNT must be set") + message(WARNING "HPC_ACCOUNT must be set. CTests will not be created.") return() endif() # Set ICSDIR_ROOT set_from_env_or_default(ICSDIR_ROOT ICSDIR_ROOT "") if (NOT DEFINED ICSDIR_ROOT) - message(FATAL_ERROR "ICSDIR_ROOT must be set") + message(WARNING "ICSDIR_ROOT must be set. CTests will not be created.") return() endif() # Set STAGED_TESTS_DIR set_from_env_or_default(STAGED_TESTS_DIR STAGED_TESTS_DIR "") if (NOT DEFINED STAGED_TESTS_DIR) - message(FATAL_ERROR "STAGED_TESTS_DIR must be set") + message(WARNING "STAGED_TESTS_DIR must be set. CTests will not be created.") return() endif() From b691a5967e27febf4ebf358732b50a65d1607deb Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 15 Jan 2025 14:57:16 -0600 Subject: [PATCH 142/144] added inpt_files in the path of stagged file to seperate them from output_files --- ctests/cases/C48_ATM_gfs_fcst_seg0.yaml | 28 ++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml index a30f91e85b..390e13bd1e 100644 --- a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml +++ b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml @@ -1,17 +1,17 @@ input_files: mkdir: - - "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input" + - "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//input_files/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input" copy: - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile3.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}///gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile6.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile1.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile2.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile3.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile3.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}///gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile6.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile1.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile2.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile3.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] From 5c8a176d07f864259095d0e73908f76864abbc18 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 15 Jan 2025 15:09:15 -0600 Subject: [PATCH 143/144] added ouput date into case yaml file --- ctests/cases/C48_ATM_gfs_fcst_seg0.yaml | 169 ++++++++++++++++++++++++ 1 file changed, 169 insertions(+) diff --git a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml index 390e13bd1e..1fff629c76 100644 --- a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml +++ b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml @@ -15,3 +15,172 @@ input_files: - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] + +output_files: +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/conf/ufs.diag_table +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/conf/ufs.input.nml +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/conf/ufs.model_configure +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf000.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf003.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf006.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf009.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf012.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf015.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf018.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf021.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf024.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf027.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf030.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf033.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf036.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf039.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf042.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf045.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf048.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf051.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf054.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf057.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf060.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf063.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf066.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf069.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf072.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf075.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf078.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf081.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf084.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf087.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf090.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf093.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf096.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf099.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf102.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf105.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf108.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf111.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf114.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf117.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf120.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf000.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf003.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf006.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf009.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf012.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf015.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf018.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf021.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf024.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf027.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf030.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf033.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf036.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf039.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf042.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf045.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf048.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf051.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf054.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf057.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf060.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf063.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf066.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf069.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf072.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf075.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf078.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf081.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf084.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf087.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf090.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf093.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf096.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf099.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf102.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf105.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf108.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf111.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf114.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf117.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf120.nc +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f000 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f003 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f006 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f009 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f012 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f015 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f018 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f021 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f024 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f027 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f030 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f033 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f036 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f039 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f042 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f045 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f048 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f051 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f054 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f057 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f060 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f063 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f066 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f069 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f072 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f075 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f078 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f081 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f084 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f087 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f090 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f093 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f096 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f099 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f102 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f105 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f108 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f111 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f114 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f117 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f120 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf000.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf003.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf006.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf009.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf012.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf015.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf018.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf021.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf024.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf027.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf030.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf033.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf036.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf039.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf042.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf045.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf048.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf051.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf054.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf057.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf060.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf063.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf066.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf069.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf072.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf075.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf078.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf081.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf084.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf087.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf090.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf093.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf096.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf099.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf102.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf105.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf108.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf111.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf114.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf117.grib2 +- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf120.grib2 From bfe10a253e7d795e81d6374b05e5280e217032f4 Mon Sep 17 00:00:00 2001 From: Terry McGuinness Date: Wed, 15 Jan 2025 17:10:50 -0600 Subject: [PATCH 144/144] removed output_files from C48_ATM --- ctests/cases/C48_ATM_gfs_fcst_seg0.yaml | 181 +----------------------- 1 file changed, 6 insertions(+), 175 deletions(-) diff --git a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml index 1fff629c76..ec0ce88ff1 100644 --- a/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml +++ b/ctests/cases/C48_ATM_gfs_fcst_seg0.yaml @@ -1,13 +1,13 @@ input_files: mkdir: - - "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//input_files/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input" + - "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input" copy: - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_ctrl.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_ctrl.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile1.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile2.nc"] - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile3.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile3.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}//gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] - - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}///gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile4.nc"] + - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile5.nc"] - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/gfs_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/gfs_data.tile6.nc"] - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile1.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile1.nc"] - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile2.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile2.nc"] @@ -15,172 +15,3 @@ input_files: - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile4.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile4.nc"] - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile5.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile5.nc"] - ["{{ 'STAGED_TESTS_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/input_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/input/sfc_data.tile6.nc", "{{ 'RUNTESTS' | getenv }}/COMROOT/{{ 'TEST_NAME' | getenv }}/gfs.{{TEST_DATE | to_YMD}}/{{TEST_DATE | strftime('%H')}}/model/atmos/input/sfc_data.tile6.nc"] - -output_files: -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/conf/ufs.diag_table -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/conf/ufs.input.nml -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/conf/ufs.model_configure -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf000.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf003.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf006.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf009.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf012.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf015.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf018.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf021.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf024.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf027.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf030.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf033.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf036.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf039.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf042.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf045.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf048.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf051.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf054.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf057.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf060.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf063.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf066.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf069.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf072.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf075.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf078.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf081.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf084.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf087.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf090.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf093.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf096.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf099.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf102.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf105.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf108.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf111.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf114.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf117.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.atmf120.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf000.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf003.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf006.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf009.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf012.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf015.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf018.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf021.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf024.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf027.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf030.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf033.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf036.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf039.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf042.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf045.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf048.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf051.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf054.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf057.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf060.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf063.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf066.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf069.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf072.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf075.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf078.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf081.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf084.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf087.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf090.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf093.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf096.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf099.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf102.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf105.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf108.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf111.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf114.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf117.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/history/gfs.t12z.sfcf120.nc -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f000 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f003 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f006 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f009 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f012 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f015 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f018 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f021 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f024 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f027 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f030 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f033 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f036 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f039 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f042 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f045 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f048 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f051 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f054 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f057 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f060 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f063 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f066 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f069 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f072 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f075 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f078 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f081 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f084 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f087 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f090 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f093 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f096 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f099 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f102 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f105 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f108 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f111 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f114 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f117 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.master.grb2f120 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf000.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf003.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf006.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf009.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf012.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf015.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf018.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf021.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf024.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf027.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf030.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf033.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf036.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf039.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf042.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf045.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf048.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf051.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf054.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf057.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf060.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf063.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf066.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf069.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf072.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf075.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf078.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf081.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf084.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf087.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf090.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf093.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf096.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf099.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf102.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf105.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf108.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf111.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf114.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf117.grib2 -- {{ 'STAGED_TEST_DIR' | getenv }}/{{ 'TEST_NAME' | getenv }}/output_files/gfs.{{ TEST_DATE | to_YMD }}/{{ TEST_DATE | strftime('%H') }}/model/atmos/master/gfs.t12z.sfluxgrbf120.grib2