diff --git a/doc-sphinx/source/user_guide/adding_new_test.rst b/doc-sphinx/source/user_guide/adding_new_test.rst index 218f698..cd1203e 100644 --- a/doc-sphinx/source/user_guide/adding_new_test.rst +++ b/doc-sphinx/source/user_guide/adding_new_test.rst @@ -26,11 +26,15 @@ The application repository must be structured as shown below: .. code-block:: - //Scripts/ + // + Scripts/ /rgt_test_input.ini / / / + Source/ (optional) + / + / /Source/ / / @@ -44,6 +48,8 @@ and other required scripts (see :ref:`required-application-test-scripts` below). This directory contains templates and input files for the test -- a test must not modify files in this directory. Second, the application's source code and required build script should reside within the *Source* directory of the repository. +Optionally, a test may add or override files from the application's *Source* tree by providing a *Source* directory within the test directory. +This directory will be overlayed over the application *Source* directory, so it may use the same internal directory structure. Example Repository Structure ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -59,6 +65,7 @@ To add a single node test and a two node test, we would create a separate subdir /Source Note that the test names are not required to follow any specific naming convention, but you should avoid spaces and special characters in the names. +Since these tests are going to share the same source and build script, we are not going to create a *Source* subdirectory in either of the tests' subdirectories. .. _application-test-input: @@ -207,7 +214,8 @@ An example SLURM template script for the *hello_mpi* application follows: cd $WORK_DIR env &> job.environ - scontrol show hostnames > job.nodes + scontrol show hostnames &> job.nodes + ldd $BUILD_DIR/bin/$EXECUTABLE &> ldd.log # Run the executable. log_binary_execution_time.py --scriptsdir $SCRIPTS_DIR --uniqueid $HARNESS_ID --mode start diff --git a/doc-sphinx/source/user_guide/envvars.rst b/doc-sphinx/source/user_guide/envvars.rst index f2aadcd..d29105d 100644 --- a/doc-sphinx/source/user_guide/envvars.rst +++ b/doc-sphinx/source/user_guide/envvars.rst @@ -89,6 +89,7 @@ These variables are detailed below: RGT_APP_SOURCE_DIR Path to the 'Source' directory of the current application. RGT_TEST_BUILD_DIR Path to the build directory of the currently-running test. RGT_TEST_RUNARCHIVE_DIR Path to the run archive directory of the currently-running test. + RGT_TEST_SOURCE_DIR Path to the source overlay directory of the currently-running test. RGT_TEST_SCRIPTS_DIR Path to the scripts directory of the currently-running test. RGT_TEST_STATUS_DIR Path to the status directory of the currently-running test. RGT_TEST_WORK_DIR Path to the work (scratch) directory of the currently-running test. diff --git a/doc-sphinx/source/user_guide/launching.rst b/doc-sphinx/source/user_guide/launching.rst index 329023f..baac2b3 100644 --- a/doc-sphinx/source/user_guide/launching.rst +++ b/doc-sphinx/source/user_guide/launching.rst @@ -19,8 +19,8 @@ This can be done in two ways: by obtaining your own copy of the code or using th Option 1: Using the centralized (pre-built) OTH ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -On Andes, Crusher, Frontier, and Summit -""""""""""""""""""""""""""""""""""""""" +On Andes and Frontier +""""""""""""""""""""" On most OLCF machines, the code is already installed in: */sw/acceptance/olcf-test-harness* @@ -31,7 +31,7 @@ Setup the environment: export OLCF_HARNESS_DIR=/sw/acceptance/olcf-test-harness module use $OLCF_HARNESS_DIR/modulefiles module load olcf_harness - # Machine name examples: andes, crusher, frontier, summit + # Machine name examples: andes, frontier, odo # Check ${OLCF_HARNESS_DIR}/configs/*.ini to see all available machines export OLCF_HARNESS_MACHINE= diff --git a/docs/_sources/user_guide/adding_new_test.rst.txt b/docs/_sources/user_guide/adding_new_test.rst.txt index 218f698..cd1203e 100644 --- a/docs/_sources/user_guide/adding_new_test.rst.txt +++ b/docs/_sources/user_guide/adding_new_test.rst.txt @@ -26,11 +26,15 @@ The application repository must be structured as shown below: .. code-block:: - //Scripts/ + // + Scripts/ /rgt_test_input.ini / / / + Source/ (optional) + / + / /Source/ / / @@ -44,6 +48,8 @@ and other required scripts (see :ref:`required-application-test-scripts` below). This directory contains templates and input files for the test -- a test must not modify files in this directory. Second, the application's source code and required build script should reside within the *Source* directory of the repository. +Optionally, a test may add or override files from the application's *Source* tree by providing a *Source* directory within the test directory. +This directory will be overlayed over the application *Source* directory, so it may use the same internal directory structure. Example Repository Structure ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -59,6 +65,7 @@ To add a single node test and a two node test, we would create a separate subdir /Source Note that the test names are not required to follow any specific naming convention, but you should avoid spaces and special characters in the names. +Since these tests are going to share the same source and build script, we are not going to create a *Source* subdirectory in either of the tests' subdirectories. .. _application-test-input: @@ -207,7 +214,8 @@ An example SLURM template script for the *hello_mpi* application follows: cd $WORK_DIR env &> job.environ - scontrol show hostnames > job.nodes + scontrol show hostnames &> job.nodes + ldd $BUILD_DIR/bin/$EXECUTABLE &> ldd.log # Run the executable. log_binary_execution_time.py --scriptsdir $SCRIPTS_DIR --uniqueid $HARNESS_ID --mode start diff --git a/docs/_sources/user_guide/envvars.rst.txt b/docs/_sources/user_guide/envvars.rst.txt index f2aadcd..d29105d 100644 --- a/docs/_sources/user_guide/envvars.rst.txt +++ b/docs/_sources/user_guide/envvars.rst.txt @@ -89,6 +89,7 @@ These variables are detailed below: RGT_APP_SOURCE_DIR Path to the 'Source' directory of the current application. RGT_TEST_BUILD_DIR Path to the build directory of the currently-running test. RGT_TEST_RUNARCHIVE_DIR Path to the run archive directory of the currently-running test. + RGT_TEST_SOURCE_DIR Path to the source overlay directory of the currently-running test. RGT_TEST_SCRIPTS_DIR Path to the scripts directory of the currently-running test. RGT_TEST_STATUS_DIR Path to the status directory of the currently-running test. RGT_TEST_WORK_DIR Path to the work (scratch) directory of the currently-running test. diff --git a/docs/_sources/user_guide/launching.rst.txt b/docs/_sources/user_guide/launching.rst.txt index 329023f..baac2b3 100644 --- a/docs/_sources/user_guide/launching.rst.txt +++ b/docs/_sources/user_guide/launching.rst.txt @@ -19,8 +19,8 @@ This can be done in two ways: by obtaining your own copy of the code or using th Option 1: Using the centralized (pre-built) OTH ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -On Andes, Crusher, Frontier, and Summit -""""""""""""""""""""""""""""""""""""""" +On Andes and Frontier +""""""""""""""""""""" On most OLCF machines, the code is already installed in: */sw/acceptance/olcf-test-harness* @@ -31,7 +31,7 @@ Setup the environment: export OLCF_HARNESS_DIR=/sw/acceptance/olcf-test-harness module use $OLCF_HARNESS_DIR/modulefiles module load olcf_harness - # Machine name examples: andes, crusher, frontier, summit + # Machine name examples: andes, frontier, odo # Check ${OLCF_HARNESS_DIR}/configs/*.ini to see all available machines export OLCF_HARNESS_MACHINE= diff --git a/docs/_static/basic.css b/docs/_static/basic.css index eeb0519..4e9a9f1 100644 --- a/docs/_static/basic.css +++ b/docs/_static/basic.css @@ -236,16 +236,6 @@ div.body p, div.body dd, div.body li, div.body blockquote { a.headerlink { visibility: hidden; } -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - h1:hover > a.headerlink, h2:hover > a.headerlink, @@ -334,11 +324,15 @@ aside.sidebar { p.sidebar-title { font-weight: bold; } +nav.contents, +aside.topic, div.admonition, div.topic, blockquote { clear: left; } /* -- topics ---------------------------------------------------------------- */ +nav.contents, +aside.topic, div.topic { border: 1px solid #ccc; padding: 7px; @@ -377,6 +371,8 @@ div.body p.centered { div.sidebar > :last-child, aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; @@ -384,6 +380,8 @@ div.admonition > :last-child { div.sidebar::after, aside.sidebar::after, +nav.contents::after, +aside.topic::after, div.topic::after, div.admonition::after, blockquote::after { @@ -608,19 +606,26 @@ ol.simple p, ul.simple p { margin-bottom: 0; } -dl.footnote > dt, -dl.citation > dt { +aside.footnote > span, +div.citation > span { float: left; - margin-right: 0.5em; } - -dl.footnote > dd, -dl.citation > dd { +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { margin-bottom: 0em; } - -dl.footnote > dd:after, -dl.citation > dd:after { +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { content: ""; clear: both; } @@ -636,10 +641,6 @@ dl.field-list > dt { padding-left: 0.5em; padding-right: 5px; } -dl.field-list > dt:after { - content: ":"; -} - dl.field-list > dd { padding-left: 0.5em; diff --git a/docs/_static/pygments.css b/docs/_static/pygments.css index 0d49244..691aeb8 100644 --- a/docs/_static/pygments.css +++ b/docs/_static/pygments.css @@ -17,7 +17,6 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ diff --git a/docs/developer_guide/intro.html b/docs/developer_guide/intro.html index 21e0d00..8da2214 100644 --- a/docs/developer_guide/intro.html +++ b/docs/developer_guide/intro.html @@ -4,7 +4,8 @@ - + + Introduction — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
  • Quick-Start Guide
    • Installation
      • Option 1: Using the centralized (pre-built) OTH
      • Option 2: Using your own copy of the harness
      • @@ -242,11 +243,11 @@
        -
        +

        Introduction

        -
        +

        Raison d’etre

        The OLCF Test Harness, hereafter referred as the Harness, is used for OLCF machine acceptances, and is generally designed for Linux @@ -255,8 +256,8 @@

        Raison d’etre +

        +

        Organizational Structure

        The Harness top-level directory contains the directory .git and is hereafter referred to as olcf-test-harness. The Harness organization structure has 4 @@ -278,8 +279,8 @@

        Organizational Structure +

        +

        Prequisites

        The harness requires:

        @@ -293,16 +294,16 @@

        Prequisites +

        +

        Indices and tables

        -
        -
        + +
        diff --git a/docs/developer_guide/modules.html b/docs/developer_guide/modules.html index e484af9..8407a1d 100644 --- a/docs/developer_guide/modules.html +++ b/docs/developer_guide/modules.html @@ -4,7 +4,8 @@ - + + harness — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
      • Quick-Start Guide
        • Installation
          • Option 1: Using the centralized (pre-built) OTH
          • Option 2: Using your own copy of the harness
          • @@ -242,11 +243,11 @@
            -
            +

            harness

            -
            +
            diff --git a/docs/developer_guide/modules/create_alt_config_file.html b/docs/developer_guide/modules/create_alt_config_file.html index 72307ef..01efac0 100644 --- a/docs/developer_guide/modules/create_alt_config_file.html +++ b/docs/developer_guide/modules/create_alt_config_file.html @@ -4,7 +4,8 @@ - + + create_alt_config_file.py Module Documentation — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
          • Quick-Start Guide
            • Installation
              • Option 1: Using the centralized (pre-built) OTH
              • Option 2: Using your own copy of the harness
              • @@ -242,9 +243,9 @@
                -
                +

                create_alt_config_file.py Module Documentation

                -
                +
                diff --git a/docs/developer_guide/modules/layout_of_apps_directory.html b/docs/developer_guide/modules/layout_of_apps_directory.html index a055c01..10b0ec6 100644 --- a/docs/developer_guide/modules/layout_of_apps_directory.html +++ b/docs/developer_guide/modules/layout_of_apps_directory.html @@ -4,7 +4,8 @@ - + + layout_of_apps_directory.py Module Documentation — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
              • Quick-Start Guide
                • Installation
                  • Option 1: Using the centralized (pre-built) OTH
                  • Option 2: Using your own copy of the harness
                  • @@ -242,9 +243,9 @@
                    -
                    +

                    layout_of_apps_directory.py Module Documentation

                    -
                    +
                    diff --git a/docs/developer_guide/modules/repositories/git_repository.html b/docs/developer_guide/modules/repositories/git_repository.html index 93401b8..80c3e6b 100644 --- a/docs/developer_guide/modules/repositories/git_repository.html +++ b/docs/developer_guide/modules/repositories/git_repository.html @@ -4,7 +4,8 @@ - + + git_repository Module Documentation — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
                  • Quick-Start Guide
                    • Installation
                      • Option 1: Using the centralized (pre-built) OTH
                      • Option 2: Using your own copy of the harness
                      • @@ -242,7 +243,7 @@
                        -
                        +

                        git_repository Module Documentation

                        @@ -251,7 +252,7 @@ class GitRepository(git_remote_repository_url=None, my_repository_branch='master')

                        This class encapsulates the data transfer from the remote git repository

                        -
                        Parameters
                        +
                        Parameters:
                        • git_remote_repository_url (str) – A string that is URL for cloning the repository.

                        • my_repository_branch (str) – A string that is the branch of the remote repository.

                        • @@ -309,7 +310,7 @@ get_repository_git_branch()
                        -
                        +
                        diff --git a/docs/developer_guide/modules/runtests.html b/docs/developer_guide/modules/runtests.html index 39ad62f..9ac5b8c 100644 --- a/docs/developer_guide/modules/runtests.html +++ b/docs/developer_guide/modules/runtests.html @@ -4,7 +4,8 @@ - + + runtests.py Module Documentation — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
                      • Quick-Start Guide
                        • Installation
                          • Option 1: Using the centralized (pre-built) OTH
                          • Option 2: Using your own copy of the harness
                          • @@ -242,9 +243,9 @@
                            -
                            +

                            runtests.py Module Documentation

                            -
                            +
                            diff --git a/docs/developer_guide/notational_conventions.html b/docs/developer_guide/notational_conventions.html index 14b50a2..f117ff5 100644 --- a/docs/developer_guide/notational_conventions.html +++ b/docs/developer_guide/notational_conventions.html @@ -4,7 +4,8 @@ - + + Notational Conventions — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
                          • Quick-Start Guide
                            • Installation
                              • Option 1: Using the centralized (pre-built) OTH
                              • Option 2: Using your own copy of the harness
                              • @@ -242,7 +243,7 @@
                                -
                                +

                                Notational Conventions

                                @@ -271,15 +272,15 @@

                                Notational Conventions

                                ./helloWorld.sh

                                -
                                -

                                + +
                                diff --git a/docs/developer_guide/packages.html b/docs/developer_guide/packages.html index 6942e8f..b224f81 100644 --- a/docs/developer_guide/packages.html +++ b/docs/developer_guide/packages.html @@ -4,7 +4,8 @@ - + + NCCS Harness Python Packages — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
                              • Quick-Start Guide
                              • diff --git a/docs/developer_guide/references.html b/docs/developer_guide/references.html index c0e41fd..5974b85 100644 --- a/docs/developer_guide/references.html +++ b/docs/developer_guide/references.html @@ -4,7 +4,8 @@ - + + References — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
                              • Quick-Start Guide
                                • Installation
                                  • Option 1: Using the centralized (pre-built) OTH
                                  • Option 2: Using your own copy of the harness
                                  • @@ -242,14 +243,15 @@
                                    -
                                    +

                                    References

                                    -
                                    -
                                    NR1998
                                    -

                                    Newham, C., & Rosenblatt, B. (1998). Learning the bash Shell, 3rd edition. Sesbastopol, USA: O’Reilly

                                    -
                                    -
                                    +
                                    +
                                    +[NR1998] +

                                    Newham, C., & Rosenblatt, B. (1998). Learning the bash Shell, 3rd edition. Sesbastopol, USA: O’Reilly

                                    +
                                    +
                                    diff --git a/docs/developer_guide/unit_test_framework.html b/docs/developer_guide/unit_test_framework.html index 1fd6c2b..7385d1e 100644 --- a/docs/developer_guide/unit_test_framework.html +++ b/docs/developer_guide/unit_test_framework.html @@ -4,7 +4,8 @@ - + + Git Unit Test Framework — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
                                  • Quick-Start Guide
                                    • Installation
                                      • Option 1: Using the centralized (pre-built) OTH
                                      • Option 2: Using your own copy of the harness
                                      • @@ -242,13 +243,13 @@
                                        -
                                        +

                                        Git Unit Test Framework

                                        The Harness unit testing framework uses Python’s pytest module to implement the unit tests, and GitLab’s CI/CD service to run the tests. The unit tests can also be ran without GitLabs CI/CD service.

                                        -
                                        +

                                        Organizational Structure

                                        The source for the Harness unit tests are located in directory olcf-test-harness/ci_testing_utilities. The main driver scripts to run the @@ -284,10 +285,10 @@

                                        Organizational Structure +

                                        +

                                        Setting Up the Harness Unit Testing Runtime Environment

                                        -
                                        +

                                        Generic Tests

                                        To set up the runtime environment to run the generic Harness unit tests, within directory olcf-test-harness @@ -297,8 +298,8 @@

                                        Generic Tests +

                                        +

                                        Machine Specific Tests

                                        To set up the runtime environment to run the machine specific Harness unit tests, within directory olcf-test-harness @@ -310,18 +311,18 @@

                                        Machine Specific Testsexport HUT_MACHINE_NAME <The machine name>

                                        export HUT_CONFIG_TAG <The config tag for the machine>

                                        -
                                        -
                                        -
                                        + + +

                                        Running the Harness Unit Tests

                                        -
                                        +

                                        Generic Tests

                                        To run the generic unit tests run the command:

                                        run_generic_unit_tests.py

                                        -
                                        -
                                        +
                                        +

                                        Machine Specific Tests

                                        To run the machine specific unit tests, appropiately define the environmental variables HUT_MACHINE_NAME and HUT_CONFIG_TAG, then run the command:

                                        @@ -329,9 +330,9 @@

                                        Machine Specific Tests +

                                        + +

                                        Harness Unit Testing API

                                        -
                                        -
                                        + +
                                        diff --git a/docs/developer_guide/unit_test_framework/git_ci_test_framework.html b/docs/developer_guide/unit_test_framework/git_ci_test_framework.html index ffb2c98..0bf8894 100644 --- a/docs/developer_guide/unit_test_framework/git_ci_test_framework.html +++ b/docs/developer_guide/unit_test_framework/git_ci_test_framework.html @@ -4,7 +4,8 @@ - + + Usage and Developer Documentation for GitLab CI/CD — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
                                      • Quick-Start Guide
                                        • Installation
                                          • Option 1: Using the centralized (pre-built) OTH
                                          • Option 2: Using your own copy of the harness
                                          • @@ -242,12 +243,12 @@
                                            -
                                            +

                                            Usage and Developer Documentation for GitLab CI/CD

                                            Stud text for git ci test framework.

                                            -
                                            +
                                            diff --git a/docs/developer_guide/unit_test_framework/pytest_test_framework.html b/docs/developer_guide/unit_test_framework/pytest_test_framework.html index f96df10..5ee75a5 100644 --- a/docs/developer_guide/unit_test_framework/pytest_test_framework.html +++ b/docs/developer_guide/unit_test_framework/pytest_test_framework.html @@ -4,7 +4,8 @@ - + + Usage and Developer Documentation for Harness’ pytest Unit Tests — NCCS_Test_Harness 1.0 documentation @@ -108,7 +109,7 @@
                                          • Quick-Start Guide
                                            • Installation
                                              • Option 1: Using the centralized (pre-built) OTH
                                              • Option 2: Using your own copy of the harness
                                              • @@ -242,11 +243,11 @@
                                                -
                                                +

                                                Usage and Developer Documentation for Harness’ pytest Unit Tests

                                                -
                                                +
                                                diff --git a/docs/genindex.html b/docs/genindex.html index 21e79bb..66c60ec 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -108,7 +108,7 @@
                                              • Quick-Start Guide
                                                • Installation
                                                  • Option 1: Using the centralized (pre-built) OTH
                                                  • Option 2: Using your own copy of the harness
                                                  • diff --git a/docs/index.html b/docs/index.html index 37d5ffd..22d2fce 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,7 +4,8 @@ - + + OLCF Test Harness Documentation — NCCS_Test_Harness 1.0 documentation @@ -109,7 +110,7 @@
                                                  • Quick-Start Guide
                                                    • Installation
                                                      • Option 1: Using the centralized (pre-built) OTH
                                                      • Option 2: Using your own copy of the harness
                                                      • @@ -243,7 +244,7 @@
                                                        -
                                                        +

                                                        OLCF Test Harness Documentation

                                                        User Guide

                                                        @@ -292,15 +293,15 @@

                                                        OLCF Test Harness Documentation +

                                                        +

                                                        Indices and tables

                                                        -
                                                        +
                                                        diff --git a/docs/py-modindex.html b/docs/py-modindex.html index 63c77db..9149f0d 100644 --- a/docs/py-modindex.html +++ b/docs/py-modindex.html @@ -115,7 +115,7 @@
                                                      • Quick-Start Guide
                                                        • Installation
                                                          • Option 1: Using the centralized (pre-built) OTH
                                                          • Option 2: Using your own copy of the harness
                                                          • diff --git a/docs/search.html b/docs/search.html index 28612df..72459b1 100644 --- a/docs/search.html +++ b/docs/search.html @@ -111,7 +111,7 @@
                                                          • Quick-Start Guide
                                                            • Installation
                                                              • Option 1: Using the centralized (pre-built) OTH
                                                              • Option 2: Using your own copy of the harness
                                                              • diff --git a/docs/searchindex.js b/docs/searchindex.js index 1982b6c..170226e 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["developer_guide/intro", "developer_guide/modules", "developer_guide/modules/create_alt_config_file", "developer_guide/modules/layout_of_apps_directory", "developer_guide/modules/repositories/git_repository", "developer_guide/modules/runtests", "developer_guide/notational_conventions", "developer_guide/packages", "developer_guide/packages/bin", "developer_guide/packages/repositories", "developer_guide/references", "developer_guide/unit_test_framework", "developer_guide/unit_test_framework/git_ci_test_framework", "developer_guide/unit_test_framework/pytest_test_framework", "index", "user_guide/adding_new_machine", "user_guide/adding_new_test", "user_guide/contributing", "user_guide/envvars", "user_guide/extensions", "user_guide/launching", "user_guide/overview"], "filenames": ["developer_guide/intro.rst", "developer_guide/modules.rst", "developer_guide/modules/create_alt_config_file.rst", "developer_guide/modules/layout_of_apps_directory.rst", "developer_guide/modules/repositories/git_repository.rst", "developer_guide/modules/runtests.rst", "developer_guide/notational_conventions.rst", "developer_guide/packages.rst", "developer_guide/packages/bin.rst", "developer_guide/packages/repositories.rst", "developer_guide/references.rst", "developer_guide/unit_test_framework.rst", "developer_guide/unit_test_framework/git_ci_test_framework.rst", "developer_guide/unit_test_framework/pytest_test_framework.rst", "index.rst", "user_guide/adding_new_machine.rst", "user_guide/adding_new_test.rst", "user_guide/contributing.rst", "user_guide/envvars.rst", "user_guide/extensions.rst", "user_guide/launching.rst", "user_guide/overview.rst"], "titles": ["Introduction", "harness", "create_alt_config_file.py Module Documentation", "layout_of_apps_directory.py Module Documentation", "git_repository Module Documentation", "runtests.py Module Documentation", "Notational Conventions", "NCCS Harness Python Packages", "NCCS Harness bin package", "NCCS Harness repositories package", "References", "Git Unit Test Framework", "Usage and Developer Documentation for GitLab CI/CD", "Usage and Developer Documentation for Harness\u2019 pytest Unit Tests", "OLCF Test Harness Documentation", "Adding a New Machine", "Adding a New Test", "Contributing", "Environment Variables", "Extensions", "Quick-Start Guide", "Overview of the Test Harness"], "terms": {"The": [0, 4, 6, 8, 9, 11, 15, 16, 17, 18, 19, 20, 21], "olcf": [0, 9, 11, 16, 17, 18, 19, 20, 21], "test": [0, 9, 12, 15, 17, 18, 19], "har": [0, 15, 16, 17, 18, 19], "hereaft": 0, "refer": 0, "i": [0, 4, 6, 8, 9, 15, 16, 17, 18, 19, 20, 21], "us": [0, 6, 9, 11, 15, 17, 18, 19, 21], "machin": [0, 9, 14, 16, 17, 18, 19, 20], "accept": [0, 20], "gener": [0, 16, 18, 20], "design": [0, 16, 20], "linux": [0, 16], "unix": [0, 6], "like": [0, 16, 17, 19, 20], "oper": [0, 21], "system": [0, 9, 15, 16, 18, 19, 20, 21], "goal": 0, "replic": 0, "user": [0, 6, 15, 16, 18, 19, 20, 21], "develop": [0, 11, 16, 17, 19], "product": [0, 18, 21], "environ": [0, 14, 15, 17, 19], "valid": [0, 16], "stress": 0, "thi": [0, 4, 8, 9, 15, 16, 17, 18, 19, 20], "accomplish": [0, 16], "repeatedli": 0, "build": [0, 15, 18, 19, 21], "applic": [0, 9, 14, 15, 18, 21], "submit": [0, 15, 16, 17, 18, 19], "job": [0, 15, 18, 19, 20, 21], "schedul": [0, 15, 16, 17, 18, 19, 20], "pb": [0, 15, 18], "lsf": [0, 15, 16, 18], "etc": [0, 19], "record": [0, 19], "result": [0, 16, 19, 20, 21], "run": [0, 6, 8, 14, 15, 16, 17, 19, 21], "top": [0, 16, 20], "level": [0, 16, 20], "directori": [0, 6, 11, 15, 16, 18, 19, 20], "contain": [0, 9, 11, 15, 16, 17, 18, 19, 20], "git": [0, 4, 9, 12, 15, 16, 17, 18, 20], "organ": [0, 18], "ha": [0, 16, 19, 21], "4": [0, 15, 16, 17, 19, 20], "part": [0, 9], "first": [0, 16, 19, 20], "python": [0, 11, 16], "file": [0, 6, 11, 15, 16, 17, 18, 19, 21], "These": [0, 11, 15, 16, 18, 19, 20], "ar": [0, 6, 9, 11, 15, 16, 17, 18, 19, 20], "predominantli": 0, "locat": [0, 9, 11, 15, 16, 18, 19, 20], "second": [0, 16, 19], "runtim": 0, "configur": [0, 14, 16, 17, 19, 20], "variou": 0, "modulefil": [0, 11, 16, 20], "config": [0, 11, 15, 20], "third": 0, "unit": 0, "ci": [0, 11], "ci_testing_util": [0, 11], "fourth": 0, "document": [0, 8, 9, 11, 16], "doc": 0, "sphinx": 0, "requir": [0, 11, 14, 15, 18, 19], "3": [0, 16, 19], "6": [0, 15], "greater": 0, "need": [0, 9, 11, 15, 16, 18], "lmod": 0, "modul": [0, 6, 11, 14, 15, 16, 18, 20], "bash": [0, 6, 10, 16, 19], "shell": [0, 6, 10, 16], "via": [0, 18, 20], "sourc": [0, 11, 14, 18, 19, 20], "control": [0, 21], "gitlab": [0, 9, 11, 16, 20], "cd": [0, 11, 16, 17, 20], "index": [0, 6, 14, 19], "search": [0, 6, 14, 19], "page": [0, 6, 14, 17], "class": [4, 17], "gitrepositori": 4, "git_remote_repository_url": 4, "none": [4, 18, 19], "my_repository_branch": 4, "master": [4, 9, 15, 18], "encapsul": 4, "data": [4, 9, 18, 19, 20], "transfer": [4, 9], "from": [4, 14, 15, 17, 18, 19, 20], "remot": [4, 9, 15, 17, 20], "repositori": [4, 7, 14, 15, 17, 18, 20], "paramet": [4, 15, 17], "str": 4, "A": [4, 15, 17, 18, 19, 21], "string": [4, 15, 18, 19], "url": [4, 9, 15, 18, 19], "clone": [4, 9, 15, 17, 18, 20], "branch": [4, 9, 15, 17, 18, 20], "properti": 4, "binarynam": 4, "name": [4, 9, 11, 15, 16, 17, 18, 19, 20], "binari": [4, 8, 16], "repository_branch": 4, "remote_repository_url": 4, "clonerepositori": 4, "destination_directori": 4, "destination_dir": 4, "must": [4, 9, 16, 18, 19, 20], "get_type_of_repositori": 4, "get_application_parent_directori": 4, "get_fully_qualified_url_of_application_parent_directori": 4, "get_repository_url_of_appl": 4, "get_repository_git_branch": 4, "we": [6, 9, 15, 16, 20], "shall": 6, "adopt": 6, "book": 6, "learn": [6, 10], "nr1998": [6, 10], "ital": 6, "font": 6, "filenam": 6, "non": [6, 16, 17], "command": [6, 9, 11, 16, 17, 18, 21], "function": [6, 9, 16], "bold": 6, "built": [6, 16], "variabl": [6, 11, 14, 15, 17, 19, 20], "option": [6, 15, 16, 18, 19, 21], "line": [6, 16, 17, 18, 19, 21], "when": [6, 15, 16, 18, 19, 20], "thei": [6, 16], "within": [6, 11, 16], "regular": 6, "text": [6, 12], "type": [6, 9, 15, 18, 19], "constant": 6, "width": 6, "content": [6, 16, 17, 19], "follow": [6, 9, 11, 15, 16, 17, 19, 20, 21], "demonstr": 6, "some": [6, 15, 16, 19, 20], "creat": [6, 14, 16, 17, 18, 19, 20], "program": [6, 16, 21], "call": [6, 16, 19], "hellowold": 6, "sh": [6, 16], "vi": 6, "editor": 6, "usr": [6, 16], "bin": [6, 7, 11, 16], "env": [6, 16], "declar": 6, "gr": 6, "messag": [6, 17, 19, 20], "hello": [6, 16], "world": [6, 16], "printf": [6, 16], "": [6, 11, 15, 16, 17, 18, 20], "n": [6, 16, 18, 19], "It": [6, 16, 19], "necessari": 6, "set": [6, 9, 15, 17, 18, 19, 20, 21], "execut": [6, 14, 16, 19, 20], "permiss": 6, "helloworld": [6, 9], "chmod": 6, "x": [6, 16], "after": [6, 20], "provid": [8, 9, 15, 16, 17, 18, 19, 20, 21], "perform": [8, 16, 19], "task": [8, 16, 20], "major": 8, "runtest": [8, 17, 20, 21], "py": [8, 11, 16, 17, 19, 20, 21], "entri": [8, 16], "point": [8, 17], "create_alt_config_fil": 8, "current": [9, 15, 16, 17, 18, 20], "onli": [9, 15, 16, 18, 19], "support": [9, 15, 17, 18, 19, 20, 21], "passwordless": 9, "authent": [9, 18], "rgt_type_of_repositori": [9, 18], "permit": 9, "valu": [9, 16, 18, 19, 20], "rgt_git_data_transfer_protocol": [9, 18], "protocol": [9, 15, 18], "ssh": [9, 15, 18], "rgt_git_https_server_url": [9, 18], "base": [9, 16], "http": [9, 15, 17, 18, 19, 20], "rgt_git_ssh_server_url": [9, 18], "rgt_git_server_application_parent_dir": [9, 18], "parent": [9, 18], "rgt_git_machine_nam": [9, 18], "rgt_git_reps_branch": [9, 18, 20], "check": [9, 14, 18, 21], "out": [9, 20], "consid": [9, 18], "cc": 9, "ornl": 9, "gov": 9, "summit": 9, "server": [9, 18, 20], "checkout": [9, 15, 17, 20], "As": [9, 16], "given": [9, 16], "abov": [9, 16], "git_repositori": 9, "newham": 10, "c": [10, 16, 20], "rosenblatt": 10, "b": [10, 17], "1998": 10, "3rd": 10, "edit": [10, 17], "sesbastopol": 10, "usa": 10, "o": [10, 16, 19, 20], "reilli": 10, "pytest": 11, "implement": [11, 17], "servic": 11, "can": [11, 15, 16, 18, 19, 20], "also": [11, 15, 16, 18, 19, 20], "ran": [11, 16], "without": 11, "main": [11, 16], "driver": [11, 20], "script": [11, 14, 15, 18, 19, 20, 21], "harness_unit_test": 11, "an": [11, 15, 16, 17, 18, 19, 20], "eponym": 11, "subdirectori": [11, 16], "For": [11, 15, 16, 17, 18, 19, 20], "ascent": 11, "its": [11, 16, 21], "tet": 11, "input_fil": 11, "input": [11, 14, 15, 17, 20, 21], "sometim": 11, "fixtur": 11, "lastli": 11, "runtime_environ": 11, "__init__": 11, "run_generic_unit_test": 11, "run_machine_specific_unit_test": 11, "__pycache__": 11, "harness_unittests_except": 11, "harness_unittests_log": 11, "test_concurr": 11, "test_runtest": 11, "olcf5_accept": 11, "unit_test": 11, "lua": 11, "genericmachin": 11, "genericconfigtag": 11, "To": [11, 16, 17, 18, 19, 20], "one": [11, 16, 18, 19, 20], "do": [11, 15, 16, 17, 18], "export": [11, 16, 19, 20], "olcf_harness_dir": [11, 15, 16, 20], "pwd": [11, 16, 20], "ignor": [11, 16], "cach": 11, "load": [11, 16, 20], "olcf_har": [11, 16, 20], "hut_machine_nam": 11, "hut_config_tag": 11, "tag": [11, 15, 18, 19], "appropi": 11, "defin": [11, 15, 18, 19, 20], "environment": 11, "see": [11, 15, 16, 19, 20], "list": [11, 16, 19, 20, 21], "usag": [11, 15, 17], "stud": 12, "framework": 12, "overview": [14, 20], "purpos": [14, 15, 16, 18], "quick": 14, "start": [14, 16, 19, 21], "instal": 14, "launch": [14, 15, 16, 18, 19], "oth": [14, 15, 16, 17, 18, 19, 21], "find": [14, 16, 18], "output": [14, 16, 17, 19], "time": [14, 15, 19], "extens": [14, 20], "specif": [14, 15, 16, 17, 19, 20], "ad": [14, 20], "new": [14, 20], "code": [14, 15, 18, 19, 20], "structur": 14, "exampl": [14, 15, 18, 19, 20], "ground": 14, "up": 14, "best": 14, "practic": 14, "basic": [14, 16, 17], "influxdb": [14, 18], "event": [14, 16, 20], "log": [14, 17, 18], "metric": [14, 16, 20], "monitor": 14, "health": [14, 18], "individu": [14, 21], "node": [14, 16, 18], "alia": 14, "contribut": 14, "report": [14, 20], "bug": 14, "request": 14, "featur": [14, 16, 19], "step": [15, 16, 17], "add": [15, 16, 17, 19, 20], "e": [15, 16, 20], "g": [15, 16, 20], "lyra": 15, "ini": [15, 16, 17, 18, 20], "place": [15, 16, 19, 20], "hold": [15, 16], "all": [15, 16, 17, 18, 20], "particular": 15, "which": [15, 16, 18, 19, 20], "path_to_test": [15, 20], "discuss": [15, 16, 19], "below": [15, 16, 18, 19], "creation": 15, "detail": [15, 16, 18, 19, 20], "explan": [15, 19], "throughout": 15, "gpus_per_nod": 15, "rgt_gpus_per_nod": [15, 18], "could": 15, "overrid": [15, 18, 20], "exist": [15, 17, 19, 20], "If": [15, 16, 18, 19, 20], "rgt_scheduler_typ": [15, 18], "machinedetail": 15, "machine_nam": [15, 16, 18, 20], "frontier": 15, "linux_x86_64": [15, 18], "ibm_power9": [15, 18], "machine_typ": 15, "slurm": [15, 16, 18], "scheduler_typ": 15, "srun": [15, 16, 18], "aprun": 15, "jsrun": [15, 18], "poe": 15, "joblauncher_typ": 15, "specifi": [15, 16, 17, 18, 19, 20], "about": [15, 16, 18, 19], "each": [15, 16, 18, 19, 20, 21], "becom": 15, "ie": [15, 16, 17, 18, 19, 20], "rgt_cpus_per_nod": [15, 16, 18], "templat": 15, "sitecustom": 15, "doe": [15, 20], "attempt": 15, "read": [15, 19], "just": [15, 20], "doesn": 15, "t": [15, 16, 19], "act": 15, "yet": 15, "node_count": 15, "9408": 15, "cpus_per_nod": 15, "56": 15, "sockets_per_nod": 15, "1": [15, 16, 18, 19], "8": 15, "section": [15, 16, 18, 19, 20], "mode": [15, 16, 20, 21], "repodetail": 15, "type_of_repositori": 15, "repo": [15, 16, 17, 18, 20], "recommend": [15, 16, 19], "NOT": 15, "unless": 15, "git_reps_branch": [15, 20], "git_data_transfer_protocol": 15, "sub": [15, 16], "project": [15, 18, 20], "group": [15, 16, 18], "git_server_application_parent_dir": 15, "your": [15, 16, 17, 18, 19], "look": [15, 16, 19], "git_ssh_server_url": 15, "git_machine_nam": 15, "github": [15, 16, 17, 20], "com": [15, 17, 19, 20], "git_https_server_url": 15, "www": 15, "default": [15, 16, 18, 19, 20], "testshot": 15, "testshotdefault": 15, "path": [15, 16, 17, 18, 19, 20], "scratch": [15, 16, 18, 19, 20], "space": [15, 16, 17, 18, 19], "path_to_sspac": 15, "identifi": [15, 17, 19], "summit_tshot_cuda11": 15, "system_log_tag": 15, "frontier_test": 15, "queue": [15, 18, 20], "partit": [15, 18], "batch_queu": [15, 18, 20], "batch": [15, 16, 20], "overridden": [15, 18, 20], "project_id": [15, 20], "account": [15, 17, 19, 20], "ani": [15, 16, 17, 18, 19, 20], "flag": [15, 17, 18, 20], "m": [15, 17, 18, 20], "clusternam": 15, "submit_arg": 15, "where": [15, 16, 20], "you": [15, 16, 17, 18, 19, 20], "custom": 15, "might": [15, 16], "tell": 15, "what": [15, 17], "mpi": [15, 16], "my_mpi_module_nam": 15, "openmpi": [15, 16], "rgt_": [15, 18], "variable_nam": 15, "prior": [15, 18], "howev": 15, "rgt_batch_queu": [15, 18, 20], "rgt_project_id": [15, 18, 20], "mai": [15, 16, 18, 19, 20], "incorrect": [15, 16, 19], "handl": 15, "pleas": [15, 17, 19], "describ": [16, 18], "how": [16, 17, 19, 20], "associ": [16, 19], "target": [16, 20], "should": [16, 20], "have": [16, 18, 19, 20, 21], "shown": 16, "rgt_test_input": [16, 17, 18, 20], "other": [16, 21], "share": 16, "multipl": [16, 19, 20], "own": [16, 21], "mandatori": 16, "modifi": 16, "resid": 16, "instanc": [16, 18, 19, 20], "let": 16, "assum": 16, "hello_mpi": [16, 20], "singl": [16, 19, 21], "two": [16, 19, 20], "would": [16, 17, 19, 20], "separ": [16, 18, 19, 20], "includ": [16, 17], "c_n001": [16, 20], "c_n002": [16, 20], "note": [16, 18, 19, 20], "convent": [16, 18, 19], "avoid": [16, 17], "special": 16, "charact": 16, "inform": [16, 17, 19], "python3": 16, "configpars": 16, "format": [16, 17, 18, 19, 20], "field": [16, 19], "re": [16, 18, 19], "cannot": [16, 18, 20], "referenc": [16, 19, 20], "allow": [16, 19], "stage": [16, 18, 20], "abl": 16, "v": 16, "definit": 16, "foo": 16, "bar": 16, "issu": [16, 17, 20], "132": 16, "sampl": 16, "mention": 16, "comment": [16, 17, 19], "my_custom_vari": 16, "abc": 16, "job_nam": 16, "hello_mpi_c": 16, "walltim": 16, "10": 16, "variablenam": 16, "notat": 16, "previous": 16, "batch_filenam": 16, "run_": 16, "build_cmd": 16, "build_hello_mpi_c": 16, "check_cmd": [16, 19], "check_hello_mpi_c": 16, "report_cmd": [16, 19], "report_hello_mpi_c": 16, "executable_path": 16, "resubmit": [16, 21], "0": [16, 19], "conjunct": 16, "argument": 16, "limit": 16, "total": 16, "submiss": [16, 19, 20], "inclus": 16, "initi": 16, "don": 16, "indefinit": 16, "resubmiss": 16, "max_submiss": 16, "kei": 16, "__nodes__": 16, "total_process": 16, "16": 16, "processes_per_nod": 16, "obtain_from_environ": [16, 18], "pull": [16, 17], "rgt_node": 16, "2": [16, 19], "echo": 16, "case": [16, 18, 19], "reli": 16, "standard": [16, 17, 19], "tool": [16, 21], "remov": 16, "empti": 16, "fail": [16, 19, 20], "subprocess": 16, "return": 16, "success": [16, 19, 20], "zero": 16, "otherwis": [16, 18], "l": [16, 20], "gcc": 16, "mkdir": [16, 20], "p": [16, 18], "mpicc": 16, "build_dir": [16, 20], "copi": 16, "mean": 16, "written": 16, "were": 16, "regardless": 16, "actual": 16, "likewis": 16, "rel": 16, "keyword": [16, 19], "form": [16, 17], "__keyword__": 16, "appropri": 16, "match": 16, "sbatch": 16, "j": 16, "__job_name__": 16, "__walltime__": 16, "__executable_path__": 16, "scripts_dir": 16, "__scripts_dir__": 16, "work_dir": [16, 20], "__working_dir__": 16, "results_dir": [16, 17, 20], "__results_dir__": 16, "harness_id": 16, "__harness_id__": 16, "__build_dir__": 16, "print": [16, 18, 20], "fgrep": 16, "rgt_app_source_": 16, "rgt_test_": 16, "setup": [16, 20], "reduc": [16, 19], "duplic": 16, "ensur": 16, "same": [16, 18, 19, 20], "common_script": 16, "setup_env": 16, "make": [16, 17], "work": [16, 18, 19], "fi": 16, "chang": [16, 17, 20], "scontrol": 16, "show": [16, 20], "hostnam": [16, 19], "log_binary_execution_tim": [16, 19], "scriptsdir": 16, "uniqueid": 16, "__total_processes__": 16, "final": 16, "back": 16, "depend": 16, "size": [16, 19], "want": [16, 17], "cp": 16, "rf": 16, "output_build": [16, 19, 20], "txt": [16, 19, 20], "check_executable_driv": 16, "alwai": 16, "kill_test": 16, "present": [16, 19], "condit": 16, "around": 16, "test_harness_driv": 16, "__resubmit__": 16, "No": [16, 20], "r": 16, "__max_submissions__": 16, "esac": 16, "run_arch": [16, 18, 19, 20], "workspac": 16, "deriv": [16, 19], "rgt_path_to_sspac": [16, 18, 19, 20], "One": 16, "access": [16, 18, 20], "script_dir": 16, "store": [16, 19, 20], "correctresult": 16, "insid": [16, 18], "popul": 16, "still": 16, "previou": 16, "so": [16, 19, 20], "either": [16, 18], "absolut": [16, 19], "verifi": [16, 20], "thu": 16, "most": [16, 19, 20], "succeed": 16, "complet": [16, 20], "gave": 16, "answer": 16, "5": 16, "correctli": 16, "exit": [16, 19, 20], "than": [16, 18], "been": [16, 19], "stdout": [16, 20], "stderr": [16, 20], "captur": [16, 18], "output_check": [16, 19, 20], "comput": [16, 19, 20], "output_report": 16, "In": [16, 17, 18, 19, 20, 21], "mani": [16, 18, 19], "serv": [16, 20], "both": 16, "often": 16, "altern": 16, "op": 16, "thought": 16, "process": [16, 19], "differ": [16, 18, 19], "count": 16, "integr": [16, 17], "focus": 16, "At": 16, "check_hello_world": 16, "hello_world_n0001": 16, "hello_world_n0002": 16, "veri": [16, 19], "common": [16, 19], "go": [16, 20], "ahead": 16, "root": [16, 18], "test_src": 16, "stdio": [16, 20], "h": [16, 20], "int": 16, "argc": 16, "char": 16, "argv": 16, "rank": 16, "nrank": 16, "mpi_init": 16, "mpi_comm_rank": 16, "mpi_comm_world": 16, "mpi_comm_s": 16, "d": 16, "mpi_fin": 16, "hello_world": 16, "good": [16, 19], "reset": 16, "here": [16, 20], "our": 16, "now": 16, "compil": 16, "o1": 16, "wall": 16, "give": 16, "construct": [16, 17, 19], "ll": 16, "infus": 16, "sinc": [16, 18, 19, 20], "number": [16, 18, 19], "per": [16, 18, 20], "too": 16, "ppn": 16, "held": 16, "think": 16, "later": [16, 19], "anyth": 16, "notic": 16, "help": [16, 17, 20, 21], "u": [16, 17], "much": 16, "possibl": [16, 19], "difficult": [16, 19], "maintain": 16, "long": 16, "next": [16, 20], "move": 16, "shouldn": 16, "try": [16, 17], "debug": [16, 20], "slurm_nnod": 16, "over": [16, 19], "sever": [16, 18], "reason": [16, 19], "correct": [16, 19], "inadvert": 16, "rgt_submit_arg": [16, 18], "adapt": 16, "__ppn__": 16, "ntask": 16, "leav": [16, 19], "write": [16, 18, 19], "recal": 16, "expected_rank": 16, "grep": 16, "wc": 16, "found": [16, 20], "put": 16, "immedi": 16, "link": [16, 20], "symbol": [16, 20], "achiev": 16, "ln": 16, "expand": 16, "everyth": 16, "els": 16, "modif": 16, "flexibl": [16, 18, 21], "lot": 16, "power": [16, 19], "That": 16, "diminish": 16, "poor": 16, "With": [16, 18], "mind": 16, "dure": [16, 18, 19], "independ": 16, "statement": 16, "chanc": 16, "those": [16, 18, 19], "diverg": 16, "simpli": [16, 19], "usabl": [16, 19], "respons": 16, "understand": 16, "outsid": [16, 18], "my_custom_var_default": 16, "my_env_var": 16, "Then": [16, 19], "__my_custom_variable__": 16, "rgt_machine_nam": [16, 18, 19], "inherit": 16, "intern": [16, 20], "translat": 16, "__machine_name__": 16, "lead": 16, "last": [16, 19], "error": [16, 17, 19, 20], "increas": 16, "reusabl": 16, "aid": 16, "collabor": 17, "improv": 17, "greatli": 17, "appreci": 17, "highli": 17, "encourag": 17, "effici": 17, "method": [17, 20], "rgt": [17, 20], "inp": 17, "logfil": [17, 20], "begin": [17, 19], "titl": 17, "team": 17, "quickli": 17, "lack": 17, "block": 17, "invok": 17, "welcom": 17, "through": [17, 18, 19], "pr": 17, "fix": 17, "cite": 17, "bodi": 17, "fork": 17, "person": 17, "usernam": [17, 19], "devel": 17, "upstream": 17, "fetch": [17, 18], "updat": [17, 20], "local": 17, "issue64": 17, "commit": 17, "file1": 17, "summar": 17, "push": 17, "origin": 17, "open": 17, "guid": 17, "under": 17, "more": [17, 18, 20], "regard": 17, "meantim": 17, "rule": 17, "indent": 17, "lowercas": 17, "underscor": 17, "example_var": 17, "explain": 17, "trivial": 17, "hard": 17, "undergo": 17, "review": 17, "evalu": [17, 18], "util": [17, 19], "approv": 17, "discret": 17, "extrem": 18, "wai": [18, 19, 20], "There": [18, 20], "few": 18, "addit": [18, 19], "behavior": 18, "mpi_vers": 18, "rgt_mpi_vers": 18, "cover": 18, "ingest": [18, 20], "core": [18, 21], "parameter": 18, "ONE": 18, "avail": [18, 20], "canl": 18, "replac": 18, "while": 18, "explicitli": 18, "olcf_harness_machin": [18, 20], "statu": [18, 19, 20], "databas": [18, 19, 20], "rgt_machine_typ": 18, "architectur": 18, "rgt_joblauncher_typ": 18, "launcher": 18, "mpirun": 18, "cpu": 18, "gpu": 18, "rgt_submit_queu": [18, 20], "enforc": 18, "q": 18, "id": [18, 19, 20], "proj_id": 18, "highest": [18, 20], "preced": [18, 20], "rgt_submit_acct": [18, 20], "rgt_nccs_test_harness_modul": 18, "commun": 18, "navig": 18, "correspond": [18, 20], "collect": [18, 21], "client": 18, "rgt_system_log_tag": [18, 19], "path_to_rgt_packag": [18, 19], "rgt_app_source_dir": 18, "rgt_test_build_dir": 18, "rgt_test_runarchive_dir": 18, "archiv": [18, 19], "rgt_test_scripts_dir": 18, "rgt_test_status_dir": 18, "rgt_test_work_dir": 18, "_": 18, "rgt_influxdb_dis": 18, "disabl": 18, "disable_influxdb": 18, "dot": 18, "test_id": [18, 19], "prevent": 18, "futur": 18, "rgt_influxdb_uri": [18, 19], "semi": 18, "colon": 18, "my": [18, 19, 20], "port": 18, "api": [18, 19], "v2": [18, 19], "org": [18, 19], "myorg": 18, "bucket": [18, 19], "mybucket": 18, "OR": 18, "latter": 18, "rgt_influxdb_bucket": 18, "rgt_influxdb_org": 18, "automat": [18, 19, 20], "detect": 18, "precis": [18, 19], "rgt_influxdb_token": [18, 19], "token": [18, 19], "encod": 18, "rgt_influxdb_precis": 18, "millisecond": 18, "nanosecond": 18, "rgt_influxdb_dry_run": 18, "send": 18, "rgt_node_location_fil": [18, 19], "metadata": [18, 19], "physic": 18, "sensit": [18, 19], "enabl": 19, "behind": 19, "timestamp": 19, "filesystem": 19, "addition": 19, "seri": 19, "domain": 19, "minim": 19, "suppli": 19, "semicolon": 19, "uri": 19, "full": 19, "relat": 19, "measur": 19, "runtag": 19, "equal": [19, 20], "app": [19, 20], "uniqu": 19, "recent": [19, 20], "kept": [19, 20], "build_directori": [19, 20], "workdir": [19, 20], "event_filenam": 19, "mirror": 19, "event_nam": 19, "build_start": 19, "event_subtyp": 19, "whether": [19, 21], "end": 19, "event_tim": 19, "event_typ": 19, "binary_execut": 19, "event_valu": 19, "indic": 19, "wa": [19, 20], "job_account_id": 19, "job_id": 19, "jobid": 19, "failur": 19, "output_txt": 19, "mine": 19, "64": 19, "kb": 19, "check_alia": 19, "alpha": 19, "numer": 19, "supplement": 19, "larg": [19, 21], "self": 19, "explanatori": 19, "build_end": 19, "submit_end": 19, "binary_execute_end": 19, "check_end": 19, "encount": 19, "err": [19, 20], "capabl": 19, "great": 19, "visual": 19, "certain": 19, "conform": 19, "hashtag": 19, "metric_name_1": 19, "value_1": 19, "metric_name_2": 19, "value_2": 19, "value_3": 19, "metric_name_3": 19, "tvalue_3": 19, "least": 19, "calcul": 19, "between": 19, "binary_execute_start": 19, "build_tim": 19, "execution_tim": 19, "respect": 19, "interest": 19, "dummi": 19, "proper": 19, "placement": 19, "address": 19, "centric": 19, "similar": 19, "trigger": 19, "presenc": 19, "nodecheck": 19, "geospati": 19, "nodenam": 19, "node1": 19, "pass": 19, "node2": 19, "node3": 19, "hw": 19, "column": 19, "dashboard": 19, "squar": 19, "brace": 19, "status": 19, "bad": 19, "ok": 19, "perf": 19, "classifi": 19, "intend": 19, "known": 19, "eas": 19, "hardwar": 19, "bu": 19, "fault": 19, "network": 19, "node_health": 19, "tabl": 19, "By": 19, "cabinet": 19, "board": 19, "row": 19, "correl": 19, "bypass": 19, "json": 19, "desir": 19, "portion": 19, "node001": 19, "c0": 19, "switch": 19, "s0": 19, "slot": 19, "node002": 19, "s1": 19, "queri": 19, "filter": 19, "alias": 19, "dictat": 19, "come": 19, "shape": 19, "distinct": 19, "mpi_err": 19, "bus_err": 19, "timeout": 19, "input_err": 19, "alphabet": 19, "dimens": 19, "categor": 19, "sent": 19, "alongsid": 19, "done": 20, "obtain": 20, "alreadi": 20, "sw": 20, "andes": 20, "example_machin": 20, "olcf_exampl": 20, "summit_testshot": 20, "prepar": 20, "visibl": 20, "host": 20, "manual": 20, "area": 20, "latest": 20, "version": 20, "well": 20, "prefer": 20, "inputfil": 20, "stop": [20, 21], "instead": 20, "harness_task": 20, "testid": 20, "cleanli": 20, "simultan": 20, "warn": 20, "continu": [20, 21], "receiv": 20, "primari": 20, "configfil": 20, "loglevel": 20, "notset": 20, "info": 20, "critic": 20, "screen": 20, "destin": 20, "consol": 20, "use_harness_tasks_in_rgt_input_fil": 20, "firework": 20, "beta": 20, "sb": 20, "build_out": 20, "appli": 20, "track": 20, "130": 20, "nearli": 20, "directli": 20, "lowest": 20, "except": 20, "whatev": 20, "becaus": 20, "know": 20, "who": 20, "onc": 20, "relev": 20, "status_dir": 20, "consist": 20, "seen": 20, "uncaptur": 20, "mechan": 20, "commonli": 20, "produc": 20, "autom": 21, "softwar": 21, "standalon": 21, "simul": 21, "workload": 21, "iter": 21, "anoth": 21, "brief": 21, "logic": 21, "flow": 21}, "objects": {"": [[2, 0, 0, "-", "create_alt_config_file"], [4, 0, 0, "-", "git_repository"], [3, 0, 0, "-", "layout_of_apps_directory"], [5, 0, 0, "-", "runtests"]], "git_repository": [[4, 1, 1, "", "GitRepository"], [4, 3, 1, "", "get_application_parent_directory"], [4, 3, 1, "", "get_fully_qualified_url_of_application_parent_directory"], [4, 3, 1, "", "get_repository_git_branch"], [4, 3, 1, "", "get_repository_url_of_application"], [4, 3, 1, "", "get_type_of_repository"]], "git_repository.GitRepository": [[4, 2, 1, "", "binaryName"], [4, 2, 1, "", "cloneRepository"], [4, 2, 1, "", "remote_repository_URL"], [4, 2, 1, "", "repository_branch"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"]}, "titleterms": {"introduct": 0, "raison": 0, "d": 0, "etr": 0, "organiz": [0, 11], "structur": [0, 11, 16], "prequisit": 0, "indic": [0, 6, 14], "tabl": [0, 6, 14], "har": [1, 7, 8, 9, 11, 13, 14, 20, 21], "create_alt_config_fil": 2, "py": [2, 3, 5], "modul": [2, 3, 4, 5, 8, 9], "document": [2, 3, 4, 5, 12, 13, 14], "layout_of_apps_directori": 3, "git_repositori": 4, "runtest": 5, "notat": 6, "convent": 6, "ncc": [7, 8, 9], "python": 7, "packag": [7, 8, 9], "bin": 8, "intoduct": [8, 9], "repositori": [9, 16], "prerequisit": 9, "environment": 9, "variabl": [9, 16, 18], "exampl": [9, 16], "refer": 10, "git": 11, "unit": [11, 13], "test": [11, 13, 14, 16, 20, 21], "framework": 11, "set": [11, 16], "up": [11, 16], "runtim": 11, "environ": [11, 16, 18, 20], "gener": 11, "machin": [11, 15], "specif": [11, 18], "run": [11, 18, 20], "api": 11, "usag": [12, 13, 20], "develop": [12, 13], "gitlab": 12, "ci": 12, "cd": 12, "pytest": 13, "olcf": 14, "user": 14, "guid": [14, 20], "ad": [15, 16], "new": [15, 16, 17], "creat": 15, "basic": [15, 20], "configur": [15, 18], "applic": [16, 19, 20], "sourc": [16, 17], "code": [16, 17], "url": 16, "input": 16, "requir": 16, "script": 16, "build": [16, 20], "job": 16, "templat": 16, "check": [16, 19, 20], "report": [16, 17], "from": 16, "ground": 16, "best": 16, "practic": 16, "us": [16, 20], "central": [16, 20], "defin": 16, "replac": 16, "instead": 16, "just": 16, "envvar": 16, "expect": 16, "contribut": 17, "bug": 17, "request": 17, "featur": 17, "time": [18, 20], "extens": [18, 19], "influxdb": 19, "event": 19, "log": [19, 20], "metric": 19, "monitor": 19, "health": 19, "individu": 19, "node": 19, "alia": 19, "quick": 20, "start": 20, "instal": 20, "option": 20, "1": 20, "pre": 20, "built": 20, "oth": 20, "On": 20, "Andes": 20, "crusher": 20, "frontier": 20, "summit": 20, "2": 20, "your": 20, "own": 20, "copi": 20, "launch": 20, "command": 20, "line": 20, "paramet": 20, "find": 20, "output": 20, "submit": 20, "maintain": 20, "file": 20, "overview": 21, "purpos": 21, "execut": 21}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 57}, "alltitles": {"Introduction": [[0, "introduction"]], "Raison d\u2019etre": [[0, "raison-d-etre"]], "Organizational Structure": [[0, "organizational-structure"], [11, "organizational-structure"]], "Prequisites": [[0, "prequisites"]], "Indices and tables": [[0, "indices-and-tables"], [6, "indices-and-tables"], [14, "indices-and-tables"]], "harness": [[1, "harness"]], "create_alt_config_file.py Module Documentation": [[2, "create-alt-config-file-py-module-documentation"]], "layout_of_apps_directory.py Module Documentation": [[3, "layout-of-apps-directory-py-module-documentation"]], "git_repository Module Documentation": [[4, "git-repository-module-documentation"]], "runtests.py Module Documentation": [[5, "runtests-py-module-documentation"]], "Notational Conventions": [[6, "notational-conventions"]], "NCCS Harness Python Packages": [[7, "nccs-harness-python-packages"]], "NCCS Harness bin package": [[8, "nccs-harness-bin-package"]], "Intoduction": [[8, "intoduction"], [9, "intoduction"]], "Modules": [[8, "modules"], [9, "modules"]], "NCCS Harness repositories package": [[9, "nccs-harness-repositories-package"]], "Prerequisite Environmental Variables": [[9, "prerequisite-environmental-variables"]], "Examples": [[9, "examples"]], "References": [[10, "references"]], "Git Unit Test Framework": [[11, "git-unit-test-framework"]], "Setting Up the Harness Unit Testing Runtime Environment": [[11, "setting-up-the-harness-unit-testing-runtime-environment"]], "Generic Tests": [[11, "generic-tests"], [11, "id1"]], "Machine Specific Tests": [[11, "machine-specific-tests"], [11, "id2"]], "Running the Harness Unit Tests": [[11, "running-the-harness-unit-tests"]], "Harness Unit Testing API": [[11, "harness-unit-testing-api"]], "Usage and Developer Documentation for GitLab CI/CD": [[12, "usage-and-developer-documentation-for-gitlab-ci-cd"]], "Usage and Developer Documentation for Harness\u2019 pytest Unit Tests": [[13, "usage-and-developer-documentation-for-harness-pytest-unit-tests"]], "OLCF Test Harness Documentation": [[14, "olcf-test-harness-documentation"]], "User Guide": [[14, null]], "Adding a New Machine": [[15, "adding-a-new-machine"]], "Create a Basic Machine Configuration": [[15, "create-a-basic-machine-configuration"]], "Adding a New Test": [[16, "adding-a-new-test"]], "Application Source Code Repository Structure": [[16, "application-source-code-repository-structure"]], "Repository URL": [[16, "repository-url"]], "Repository structure": [[16, "repository-structure"]], "Example Repository Structure": [[16, "example-repository-structure"]], "Application Test Input": [[16, "application-test-input"]], "Required Application Test Scripts": [[16, "required-application-test-scripts"]], "Build Script": [[16, "build-script"]], "Job Script Template": [[16, "job-script-template"]], "Check Script": [[16, "check-script"]], "Report Script": [[16, "report-script"]], "Example Test from the Ground Up": [[16, "example-test-from-the-ground-up"]], "Best Practices": [[16, "best-practices"]], "Use a centralized script to set up the environment": [[16, "use-a-centralized-script-to-set-up-the-environment"]], "Define replacement variables instead of just EnvVars": [[16, "define-replacement-variables-instead-of-just-envvars"]], "Check for expected environment variables": [[16, "check-for-expected-environment-variables"]], "Contributing": [[17, "contributing"]], "Reporting Bugs": [[17, "reporting-bugs"]], "Requesting New Features": [[17, "requesting-new-features"]], "Contributing Source Code": [[17, "contributing-source-code"]], "Environment Variables": [[18, "environment-variables"]], "Configuration Variables": [[18, "configuration-variables"]], "Run-Time Variables": [[18, "run-time-variables"]], "Extension-specific Variables": [[18, "extension-specific-variables"]], "Extensions": [[19, "extensions"]], "InfluxDB Event Logging": [[19, "influxdb-event-logging"]], "Logging application metrics to InfluxDB": [[19, "logging-application-metrics-to-influxdb"]], "Monitoring the health of individual nodes": [[19, "monitoring-the-health-of-individual-nodes"]], "Check Alias": [[19, "check-alias"]], "Quick-Start Guide": [[20, "quick-start-guide"]], "Installation": [[20, "installation"]], "Option 1: Using the centralized (pre-built) OTH": [[20, "option-1-using-the-centralized-pre-built-oth"]], "On Andes, Crusher, Frontier, and Summit": [[20, "on-andes-crusher-frontier-and-summit"]], "Option 2: Using your own copy of the harness": [[20, "option-2-using-your-own-copy-of-the-harness"]], "Launching the OTH": [[20, "launching-the-oth"]], "Basic Usage": [[20, "basic-usage"]], "Command-line Options": [[20, "command-line-options"]], "Run-time environment parameters": [[20, "run-time-environment-parameters"]], "Finding Test Output": [[20, "finding-test-output"]], "Build, Submit, and Check Output": [[20, "build-submit-and-check-output"]], "Application Output": [[20, "application-output"]], "Harness-maintained Log Files": [[20, "harness-maintained-log-files"]], "Overview of the Test Harness": [[21, "overview-of-the-test-harness"]], "Purpose": [[21, "purpose"]], "Execution Overview": [[21, "execution-overview"]]}, "indexentries": {"create_alt_config_file": [[2, "module-create_alt_config_file"]], "module": [[2, "module-create_alt_config_file"], [3, "module-layout_of_apps_directory"], [4, "module-git_repository"], [5, "module-runtests"]], "layout_of_apps_directory": [[3, "module-layout_of_apps_directory"]], "gitrepository (class in git_repository)": [[4, "git_repository.GitRepository"]], "binaryname (gitrepository property)": [[4, "git_repository.GitRepository.binaryName"]], "clonerepository() (gitrepository method)": [[4, "git_repository.GitRepository.cloneRepository"]], "get_application_parent_directory() (in module git_repository)": [[4, "git_repository.get_application_parent_directory"]], "get_fully_qualified_url_of_application_parent_directory() (in module git_repository)": [[4, "git_repository.get_fully_qualified_url_of_application_parent_directory"]], "get_repository_git_branch() (in module git_repository)": [[4, "git_repository.get_repository_git_branch"]], "get_repository_url_of_application() (in module git_repository)": [[4, "git_repository.get_repository_url_of_application"]], "get_type_of_repository() (in module git_repository)": [[4, "git_repository.get_type_of_repository"]], "git_repository": [[4, "module-git_repository"]], "remote_repository_url (gitrepository property)": [[4, "git_repository.GitRepository.remote_repository_URL"]], "repository_branch (gitrepository property)": [[4, "git_repository.GitRepository.repository_branch"]], "runtests": [[5, "module-runtests"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["developer_guide/intro", "developer_guide/modules", "developer_guide/modules/create_alt_config_file", "developer_guide/modules/layout_of_apps_directory", "developer_guide/modules/repositories/git_repository", "developer_guide/modules/runtests", "developer_guide/notational_conventions", "developer_guide/packages", "developer_guide/packages/bin", "developer_guide/packages/repositories", "developer_guide/references", "developer_guide/unit_test_framework", "developer_guide/unit_test_framework/git_ci_test_framework", "developer_guide/unit_test_framework/pytest_test_framework", "index", "user_guide/adding_new_machine", "user_guide/adding_new_test", "user_guide/contributing", "user_guide/envvars", "user_guide/extensions", "user_guide/launching", "user_guide/overview"], "filenames": ["developer_guide/intro.rst", "developer_guide/modules.rst", "developer_guide/modules/create_alt_config_file.rst", "developer_guide/modules/layout_of_apps_directory.rst", "developer_guide/modules/repositories/git_repository.rst", "developer_guide/modules/runtests.rst", "developer_guide/notational_conventions.rst", "developer_guide/packages.rst", "developer_guide/packages/bin.rst", "developer_guide/packages/repositories.rst", "developer_guide/references.rst", "developer_guide/unit_test_framework.rst", "developer_guide/unit_test_framework/git_ci_test_framework.rst", "developer_guide/unit_test_framework/pytest_test_framework.rst", "index.rst", "user_guide/adding_new_machine.rst", "user_guide/adding_new_test.rst", "user_guide/contributing.rst", "user_guide/envvars.rst", "user_guide/extensions.rst", "user_guide/launching.rst", "user_guide/overview.rst"], "titles": ["Introduction", "harness", "create_alt_config_file.py Module Documentation", "layout_of_apps_directory.py Module Documentation", "git_repository Module Documentation", "runtests.py Module Documentation", "Notational Conventions", "NCCS Harness Python Packages", "NCCS Harness bin package", "NCCS Harness repositories package", "References", "Git Unit Test Framework", "Usage and Developer Documentation for GitLab CI/CD", "Usage and Developer Documentation for Harness\u2019 pytest Unit Tests", "OLCF Test Harness Documentation", "Adding a New Machine", "Adding a New Test", "Contributing", "Environment Variables", "Extensions", "Quick-Start Guide", "Overview of the Test Harness"], "terms": {"The": [0, 4, 6, 8, 9, 11, 15, 16, 17, 18, 19, 20, 21], "olcf": [0, 9, 11, 16, 17, 18, 19, 20, 21], "test": [0, 9, 12, 15, 17, 18, 19], "har": [0, 15, 16, 17, 18, 19], "hereaft": 0, "refer": 0, "i": [0, 4, 6, 8, 9, 15, 16, 17, 18, 19, 20, 21], "us": [0, 6, 9, 11, 15, 17, 18, 19, 21], "machin": [0, 9, 14, 16, 17, 18, 19, 20], "accept": [0, 20], "gener": [0, 16, 18, 20], "design": [0, 16, 20], "linux": [0, 16], "unix": [0, 6], "like": [0, 16, 17, 19, 20], "oper": [0, 21], "system": [0, 9, 15, 16, 18, 19, 20, 21], "goal": 0, "replic": 0, "user": [0, 6, 15, 16, 18, 19, 20, 21], "develop": [0, 11, 16, 17, 19], "product": [0, 18, 21], "environ": [0, 14, 15, 17, 19], "valid": [0, 16], "stress": 0, "thi": [0, 4, 8, 9, 15, 16, 17, 18, 19, 20], "accomplish": [0, 16], "repeatedli": 0, "build": [0, 15, 18, 19, 21], "applic": [0, 9, 14, 15, 18, 21], "submit": [0, 15, 16, 17, 18, 19], "job": [0, 15, 18, 19, 20, 21], "schedul": [0, 15, 16, 17, 18, 19, 20], "pb": [0, 15, 18], "lsf": [0, 15, 16, 18], "etc": [0, 19], "record": [0, 19], "result": [0, 16, 19, 20, 21], "run": [0, 6, 8, 14, 15, 16, 17, 19, 21], "top": [0, 16, 20], "level": [0, 16, 20], "directori": [0, 6, 11, 15, 16, 18, 19, 20], "contain": [0, 9, 11, 15, 16, 17, 18, 19, 20], "git": [0, 4, 9, 12, 15, 16, 17, 18, 20], "organ": [0, 18], "ha": [0, 16, 19, 21], "4": [0, 15, 16, 17, 19, 20], "part": [0, 9], "first": [0, 16, 19, 20], "python": [0, 11, 16], "file": [0, 6, 11, 15, 16, 17, 18, 19, 21], "These": [0, 11, 15, 16, 18, 19, 20], "ar": [0, 6, 9, 11, 15, 16, 17, 18, 19, 20], "predominantli": 0, "locat": [0, 9, 11, 15, 16, 18, 19, 20], "second": [0, 16, 19], "runtim": 0, "configur": [0, 14, 16, 17, 19, 20], "variou": 0, "modulefil": [0, 11, 16, 20], "config": [0, 11, 15, 20], "third": 0, "unit": 0, "ci": [0, 11], "ci_testing_util": [0, 11], "fourth": 0, "document": [0, 8, 9, 11, 16], "doc": 0, "sphinx": 0, "requir": [0, 11, 14, 15, 18, 19], "3": [0, 16, 19], "6": [0, 15], "greater": 0, "need": [0, 9, 11, 15, 16, 18], "lmod": 0, "modul": [0, 6, 11, 14, 15, 16, 18, 20], "bash": [0, 6, 10, 16, 19], "shell": [0, 6, 10, 16], "via": [0, 18, 20], "sourc": [0, 11, 14, 18, 19, 20], "control": [0, 21], "gitlab": [0, 9, 11, 16, 20], "cd": [0, 11, 16, 17, 20], "index": [0, 6, 14, 19], "search": [0, 6, 14, 19], "page": [0, 6, 14, 17], "class": [4, 17], "gitrepositori": 4, "git_remote_repository_url": 4, "none": [4, 18, 19], "my_repository_branch": 4, "master": [4, 9, 15, 18], "encapsul": 4, "data": [4, 9, 18, 19, 20], "transfer": [4, 9], "from": [4, 14, 15, 17, 18, 19, 20], "remot": [4, 9, 15, 17, 20], "repositori": [4, 7, 14, 15, 17, 18, 20], "paramet": [4, 15, 17], "str": 4, "A": [4, 15, 17, 18, 19, 21], "string": [4, 15, 18, 19], "url": [4, 9, 15, 18, 19], "clone": [4, 9, 15, 17, 18, 20], "branch": [4, 9, 15, 17, 18, 20], "properti": 4, "binarynam": 4, "name": [4, 9, 11, 15, 16, 17, 18, 19, 20], "binari": [4, 8, 16], "repository_branch": 4, "remote_repository_url": 4, "clonerepositori": 4, "destination_directori": 4, "destination_dir": 4, "must": [4, 9, 16, 18, 19, 20], "get_type_of_repositori": 4, "get_application_parent_directori": 4, "get_fully_qualified_url_of_application_parent_directori": 4, "get_repository_url_of_appl": 4, "get_repository_git_branch": 4, "we": [6, 9, 15, 16, 20], "shall": 6, "adopt": 6, "book": 6, "learn": [6, 10], "nr1998": [6, 10], "ital": 6, "font": 6, "filenam": 6, "non": [6, 16, 17], "command": [6, 9, 11, 16, 17, 18, 21], "function": [6, 9, 16], "bold": 6, "built": [6, 16], "variabl": [6, 11, 14, 15, 17, 19, 20], "option": [6, 15, 16, 18, 19, 21], "line": [6, 16, 17, 18, 19, 21], "when": [6, 15, 16, 18, 19, 20], "thei": [6, 16], "within": [6, 11, 16], "regular": 6, "text": [6, 12], "type": [6, 9, 15, 18, 19], "constant": 6, "width": 6, "content": [6, 16, 17, 19], "follow": [6, 9, 11, 15, 16, 17, 19, 20, 21], "demonstr": 6, "some": [6, 15, 16, 19, 20], "creat": [6, 14, 16, 17, 18, 19, 20], "program": [6, 16, 21], "call": [6, 16, 19], "hellowold": 6, "sh": [6, 16], "vi": 6, "editor": 6, "usr": [6, 16], "bin": [6, 7, 11, 16], "env": [6, 16], "declar": 6, "gr": 6, "messag": [6, 17, 19, 20], "hello": [6, 16], "world": [6, 16], "printf": [6, 16], "": [6, 11, 15, 16, 17, 18, 20], "n": [6, 16, 18, 19], "It": [6, 16, 19], "necessari": 6, "set": [6, 9, 15, 17, 18, 19, 20, 21], "execut": [6, 14, 16, 19, 20], "permiss": 6, "helloworld": [6, 9], "chmod": 6, "x": [6, 16], "after": [6, 20], "provid": [8, 9, 15, 16, 17, 18, 19, 20, 21], "perform": [8, 16, 19], "task": [8, 16, 20], "major": 8, "runtest": [8, 17, 20, 21], "py": [8, 11, 16, 17, 19, 20, 21], "entri": [8, 16], "point": [8, 17], "create_alt_config_fil": 8, "current": [9, 15, 16, 17, 18, 20], "onli": [9, 15, 16, 18, 19], "support": [9, 15, 17, 18, 19, 20, 21], "passwordless": 9, "authent": [9, 18], "rgt_type_of_repositori": [9, 18], "permit": 9, "valu": [9, 16, 18, 19, 20], "rgt_git_data_transfer_protocol": [9, 18], "protocol": [9, 15, 18], "ssh": [9, 15, 18], "rgt_git_https_server_url": [9, 18], "base": [9, 16], "http": [9, 15, 17, 18, 19, 20], "rgt_git_ssh_server_url": [9, 18], "rgt_git_server_application_parent_dir": [9, 18], "parent": [9, 18], "rgt_git_machine_nam": [9, 18], "rgt_git_reps_branch": [9, 18, 20], "check": [9, 14, 18, 21], "out": [9, 20], "consid": [9, 18], "cc": 9, "ornl": 9, "gov": 9, "summit": [9, 20], "server": [9, 18, 20], "checkout": [9, 15, 17, 20], "As": [9, 16], "given": [9, 16], "abov": [9, 16], "git_repositori": 9, "newham": 10, "c": [10, 16, 20], "rosenblatt": 10, "b": [10, 17], "1998": 10, "3rd": 10, "edit": [10, 17], "sesbastopol": 10, "usa": 10, "o": [10, 16, 19, 20], "reilli": 10, "pytest": 11, "implement": [11, 17], "servic": 11, "can": [11, 15, 16, 18, 19, 20], "also": [11, 15, 16, 18, 19, 20], "ran": [11, 16], "without": 11, "main": [11, 16], "driver": [11, 20], "script": [11, 14, 15, 18, 19, 20, 21], "harness_unit_test": 11, "an": [11, 15, 16, 17, 18, 19, 20], "eponym": 11, "subdirectori": [11, 16], "For": [11, 15, 16, 17, 18, 19, 20], "ascent": 11, "its": [11, 16, 21], "tet": 11, "input_fil": 11, "input": [11, 14, 15, 17, 20, 21], "sometim": 11, "fixtur": 11, "lastli": 11, "runtime_environ": 11, "__init__": 11, "run_generic_unit_test": 11, "run_machine_specific_unit_test": 11, "__pycache__": 11, "harness_unittests_except": 11, "harness_unittests_log": 11, "test_concurr": 11, "test_runtest": 11, "olcf5_accept": 11, "unit_test": 11, "lua": 11, "genericmachin": 11, "genericconfigtag": 11, "To": [11, 16, 17, 18, 19, 20], "one": [11, 16, 18, 19, 20], "do": [11, 15, 16, 17, 18], "export": [11, 16, 19, 20], "olcf_harness_dir": [11, 15, 16, 20], "pwd": [11, 16, 20], "ignor": [11, 16], "cach": 11, "load": [11, 16, 20], "olcf_har": [11, 16, 20], "hut_machine_nam": 11, "hut_config_tag": 11, "tag": [11, 15, 18, 19], "appropi": 11, "defin": [11, 15, 18, 19, 20], "environment": 11, "see": [11, 15, 16, 19, 20], "list": [11, 16, 19, 20, 21], "usag": [11, 15, 17], "stud": 12, "framework": 12, "overview": [14, 20], "purpos": [14, 15, 16, 18], "quick": 14, "start": [14, 16, 19, 21], "instal": 14, "launch": [14, 15, 16, 18, 19], "oth": [14, 15, 16, 17, 18, 19, 21], "find": [14, 16, 18], "output": [14, 16, 17, 19], "time": [14, 15, 19], "extens": [14, 20], "specif": [14, 15, 16, 17, 19, 20], "ad": [14, 20], "new": [14, 20], "code": [14, 15, 18, 19, 20], "structur": 14, "exampl": [14, 15, 18, 19, 20], "ground": 14, "up": 14, "best": 14, "practic": 14, "basic": [14, 16, 17], "influxdb": [14, 18], "event": [14, 16, 20], "log": [14, 16, 17, 18], "metric": [14, 16, 20], "monitor": 14, "health": [14, 18], "individu": [14, 21], "node": [14, 16, 18], "alia": 14, "contribut": 14, "report": [14, 20], "bug": 14, "request": 14, "featur": [14, 16, 19], "step": [15, 16, 17], "add": [15, 16, 17, 19, 20], "e": [15, 16, 20], "g": [15, 16, 20], "lyra": 15, "ini": [15, 16, 17, 18, 20], "place": [15, 16, 19, 20], "hold": [15, 16], "all": [15, 16, 17, 18, 20], "particular": 15, "which": [15, 16, 18, 19, 20], "path_to_test": [15, 20], "discuss": [15, 16, 19], "below": [15, 16, 18, 19], "creation": 15, "detail": [15, 16, 18, 19, 20], "explan": [15, 19], "throughout": 15, "gpus_per_nod": 15, "rgt_gpus_per_nod": [15, 18], "could": 15, "overrid": [15, 16, 18, 20], "exist": [15, 17, 19, 20], "If": [15, 16, 18, 19, 20], "rgt_scheduler_typ": [15, 18], "machinedetail": 15, "machine_nam": [15, 16, 18, 20], "frontier": 15, "linux_x86_64": [15, 18], "ibm_power9": [15, 18], "machine_typ": 15, "slurm": [15, 16, 18], "scheduler_typ": 15, "srun": [15, 16, 18], "aprun": 15, "jsrun": [15, 18], "poe": 15, "joblauncher_typ": 15, "specifi": [15, 16, 17, 18, 19, 20], "about": [15, 16, 18, 19], "each": [15, 16, 18, 19, 20, 21], "becom": 15, "ie": [15, 16, 17, 18, 19, 20], "rgt_cpus_per_nod": [15, 16, 18], "templat": 15, "sitecustom": 15, "doe": [15, 20], "attempt": 15, "read": [15, 19], "just": [15, 20], "doesn": 15, "t": [15, 16, 19], "act": 15, "yet": 15, "node_count": 15, "9408": 15, "cpus_per_nod": 15, "56": 15, "sockets_per_nod": 15, "1": [15, 16, 18, 19], "8": 15, "section": [15, 16, 18, 19, 20], "mode": [15, 16, 20, 21], "repodetail": 15, "type_of_repositori": 15, "repo": [15, 16, 17, 18, 20], "recommend": [15, 16, 19], "NOT": 15, "unless": 15, "git_reps_branch": [15, 20], "git_data_transfer_protocol": 15, "sub": [15, 16], "project": [15, 18, 20], "group": [15, 16, 18], "git_server_application_parent_dir": 15, "your": [15, 16, 17, 18, 19], "look": [15, 16, 19], "git_ssh_server_url": 15, "git_machine_nam": 15, "github": [15, 16, 17, 20], "com": [15, 17, 19, 20], "git_https_server_url": 15, "www": 15, "default": [15, 16, 18, 19, 20], "testshot": 15, "testshotdefault": 15, "path": [15, 16, 17, 18, 19, 20], "scratch": [15, 16, 18, 19, 20], "space": [15, 16, 17, 18, 19], "path_to_sspac": 15, "identifi": [15, 17, 19], "summit_tshot_cuda11": 15, "system_log_tag": 15, "frontier_test": 15, "queue": [15, 18, 20], "partit": [15, 18], "batch_queu": [15, 18, 20], "batch": [15, 16, 20], "overridden": [15, 18, 20], "project_id": [15, 20], "account": [15, 17, 19, 20], "ani": [15, 16, 17, 18, 19, 20], "flag": [15, 17, 18, 20], "m": [15, 17, 18, 20], "clusternam": 15, "submit_arg": 15, "where": [15, 16, 20], "you": [15, 16, 17, 18, 19, 20], "custom": 15, "might": [15, 16], "tell": 15, "what": [15, 17], "mpi": [15, 16], "my_mpi_module_nam": 15, "openmpi": [15, 16], "rgt_": [15, 18], "variable_nam": 15, "prior": [15, 18], "howev": 15, "rgt_batch_queu": [15, 18, 20], "rgt_project_id": [15, 18, 20], "mai": [15, 16, 18, 19, 20], "incorrect": [15, 16, 19], "handl": 15, "pleas": [15, 17, 19], "describ": [16, 18], "how": [16, 17, 19, 20], "associ": [16, 19], "target": [16, 20], "should": [16, 20], "have": [16, 18, 19, 20, 21], "shown": 16, "rgt_test_input": [16, 17, 18, 20], "altern": 16, "modifi": 16, "other": [16, 21], "share": 16, "multipl": [16, 19, 20], "own": [16, 21], "mandatori": 16, "resid": 16, "tree": 16, "overlai": [16, 18], "over": [16, 19], "so": [16, 19, 20], "same": [16, 18, 19, 20], "intern": [16, 20], "instanc": [16, 18, 19, 20], "let": 16, "assum": 16, "hello_mpi": [16, 20], "singl": [16, 19, 21], "two": [16, 19, 20], "would": [16, 17, 19, 20], "separ": [16, 18, 19, 20], "includ": [16, 17], "c_n001": [16, 20], "c_n002": [16, 20], "note": [16, 18, 19, 20], "convent": [16, 18, 19], "avoid": [16, 17], "special": 16, "charact": 16, "sinc": [16, 18, 19, 20], "go": [16, 20], "either": [16, 18], "inform": [16, 17, 19], "python3": 16, "configpars": 16, "format": [16, 17, 18, 19, 20], "field": [16, 19], "re": [16, 18, 19], "cannot": [16, 18, 20], "referenc": [16, 19, 20], "allow": [16, 19], "stage": [16, 18, 20], "abl": 16, "v": 16, "definit": 16, "foo": 16, "bar": 16, "issu": [16, 17, 20], "132": 16, "sampl": 16, "mention": 16, "comment": [16, 17, 19], "my_custom_vari": 16, "abc": 16, "job_nam": 16, "hello_mpi_c": 16, "walltim": 16, "10": 16, "variablenam": 16, "notat": 16, "previous": 16, "batch_filenam": 16, "run_": 16, "build_cmd": 16, "build_hello_mpi_c": 16, "check_cmd": [16, 19], "check_hello_mpi_c": 16, "report_cmd": [16, 19], "report_hello_mpi_c": 16, "executable_path": 16, "resubmit": [16, 21], "0": [16, 19], "conjunct": 16, "argument": 16, "limit": 16, "total": 16, "submiss": [16, 19, 20], "inclus": 16, "initi": 16, "don": 16, "indefinit": 16, "resubmiss": 16, "max_submiss": 16, "kei": 16, "__nodes__": 16, "total_process": 16, "16": 16, "processes_per_nod": 16, "obtain_from_environ": [16, 18], "pull": [16, 17], "rgt_node": 16, "2": [16, 19], "echo": 16, "case": [16, 18, 19], "reli": 16, "standard": [16, 17, 19], "tool": [16, 21], "remov": 16, "empti": 16, "fail": [16, 19, 20], "subprocess": 16, "return": 16, "success": [16, 19, 20], "zero": 16, "otherwis": [16, 18], "l": [16, 20], "gcc": 16, "mkdir": [16, 20], "p": [16, 18], "mpicc": 16, "build_dir": [16, 20], "copi": 16, "mean": 16, "written": 16, "were": 16, "regardless": 16, "actual": 16, "likewis": 16, "rel": 16, "keyword": [16, 19], "form": [16, 17], "__keyword__": 16, "appropri": 16, "match": 16, "sbatch": 16, "j": 16, "__job_name__": 16, "__walltime__": 16, "__executable_path__": 16, "scripts_dir": 16, "__scripts_dir__": 16, "work_dir": [16, 20], "__working_dir__": 16, "results_dir": [16, 17, 20], "__results_dir__": 16, "harness_id": 16, "__harness_id__": 16, "__build_dir__": 16, "print": [16, 18, 20], "fgrep": 16, "rgt_app_source_": 16, "rgt_test_": 16, "setup": [16, 20], "reduc": [16, 19], "duplic": 16, "ensur": 16, "common_script": 16, "setup_env": 16, "make": [16, 17], "work": [16, 18, 19], "fi": 16, "chang": [16, 17, 20], "scontrol": 16, "show": [16, 20], "hostnam": [16, 19], "ldd": 16, "log_binary_execution_tim": [16, 19], "scriptsdir": 16, "uniqueid": 16, "__total_processes__": 16, "final": 16, "back": 16, "depend": 16, "size": [16, 19], "want": [16, 17], "cp": 16, "rf": 16, "output_build": [16, 19, 20], "txt": [16, 19, 20], "check_executable_driv": 16, "alwai": 16, "kill_test": 16, "present": [16, 19], "condit": 16, "around": 16, "test_harness_driv": 16, "__resubmit__": 16, "No": [16, 20], "r": 16, "__max_submissions__": 16, "esac": 16, "run_arch": [16, 18, 19, 20], "workspac": 16, "deriv": [16, 19], "rgt_path_to_sspac": [16, 18, 19, 20], "One": 16, "access": [16, 18, 20], "script_dir": 16, "store": [16, 19, 20], "correctresult": 16, "insid": [16, 18], "popul": 16, "still": 16, "previou": 16, "absolut": [16, 19], "verifi": [16, 20], "thu": 16, "most": [16, 19, 20], "succeed": 16, "complet": [16, 20], "gave": 16, "answer": 16, "5": 16, "correctli": 16, "exit": [16, 19, 20], "than": [16, 18], "been": [16, 19], "stdout": [16, 20], "stderr": [16, 20], "captur": [16, 18], "output_check": [16, 19, 20], "comput": [16, 19, 20], "output_report": 16, "In": [16, 17, 18, 19, 20, 21], "mani": [16, 18, 19], "serv": [16, 20], "both": 16, "often": 16, "op": 16, "thought": 16, "process": [16, 19], "differ": [16, 18, 19], "count": 16, "integr": [16, 17], "focus": 16, "At": 16, "check_hello_world": 16, "hello_world_n0001": 16, "hello_world_n0002": 16, "veri": [16, 19], "common": [16, 19], "ahead": 16, "root": [16, 18], "test_src": 16, "stdio": [16, 20], "h": [16, 20], "int": 16, "argc": 16, "char": 16, "argv": 16, "rank": 16, "nrank": 16, "mpi_init": 16, "mpi_comm_rank": 16, "mpi_comm_world": 16, "mpi_comm_s": 16, "d": 16, "mpi_fin": 16, "hello_world": 16, "good": [16, 19], "reset": 16, "here": [16, 20], "our": 16, "now": 16, "compil": 16, "o1": 16, "wall": 16, "give": 16, "construct": [16, 17, 19], "ll": 16, "infus": 16, "number": [16, 18, 19], "per": [16, 18, 20], "too": 16, "ppn": 16, "held": 16, "think": 16, "later": [16, 19], "anyth": 16, "notic": 16, "help": [16, 17, 20, 21], "u": [16, 17], "much": 16, "possibl": [16, 19], "difficult": [16, 19], "maintain": 16, "long": 16, "next": [16, 20], "move": 16, "shouldn": 16, "try": [16, 17], "debug": [16, 20], "slurm_nnod": 16, "sever": [16, 18], "reason": [16, 19], "correct": [16, 19], "inadvert": 16, "rgt_submit_arg": [16, 18], "adapt": 16, "__ppn__": 16, "ntask": 16, "leav": [16, 19], "write": [16, 18, 19], "recal": 16, "expected_rank": 16, "grep": 16, "wc": 16, "found": [16, 20], "put": 16, "immedi": 16, "link": [16, 20], "symbol": [16, 20], "achiev": 16, "ln": 16, "expand": 16, "everyth": 16, "els": 16, "modif": 16, "flexibl": [16, 18, 21], "lot": 16, "power": [16, 19], "That": 16, "diminish": 16, "poor": 16, "With": [16, 18], "mind": 16, "dure": [16, 18, 19], "independ": 16, "statement": 16, "chanc": 16, "those": [16, 18, 19], "diverg": 16, "simpli": [16, 19], "usabl": [16, 19], "respons": 16, "understand": 16, "outsid": [16, 18], "my_custom_var_default": 16, "my_env_var": 16, "Then": [16, 19], "__my_custom_variable__": 16, "rgt_machine_nam": [16, 18, 19], "inherit": 16, "translat": 16, "__machine_name__": 16, "lead": 16, "last": [16, 19], "error": [16, 17, 19, 20], "increas": 16, "reusabl": 16, "aid": 16, "collabor": 17, "improv": 17, "greatli": 17, "appreci": 17, "highli": 17, "encourag": 17, "effici": 17, "method": [17, 20], "rgt": [17, 20], "inp": 17, "logfil": [17, 20], "begin": [17, 19], "titl": 17, "team": 17, "quickli": 17, "lack": 17, "block": 17, "invok": 17, "welcom": 17, "through": [17, 18, 19], "pr": 17, "fix": 17, "cite": 17, "bodi": 17, "fork": 17, "person": 17, "usernam": [17, 19], "devel": 17, "upstream": 17, "fetch": [17, 18], "updat": [17, 20], "local": 17, "issue64": 17, "commit": 17, "file1": 17, "summar": 17, "push": 17, "origin": 17, "open": 17, "guid": 17, "under": 17, "more": [17, 18, 20], "regard": 17, "meantim": 17, "rule": 17, "indent": 17, "lowercas": 17, "underscor": 17, "example_var": 17, "explain": 17, "trivial": 17, "hard": 17, "undergo": 17, "review": 17, "evalu": [17, 18], "util": [17, 19], "approv": 17, "discret": 17, "extrem": 18, "wai": [18, 19, 20], "There": [18, 20], "few": 18, "addit": [18, 19], "behavior": 18, "mpi_vers": 18, "rgt_mpi_vers": 18, "cover": 18, "ingest": [18, 20], "core": [18, 21], "parameter": 18, "ONE": 18, "avail": [18, 20], "canl": 18, "replac": 18, "while": 18, "explicitli": 18, "olcf_harness_machin": [18, 20], "statu": [18, 19, 20], "databas": [18, 19, 20], "rgt_machine_typ": 18, "architectur": 18, "rgt_joblauncher_typ": 18, "launcher": 18, "mpirun": 18, "cpu": 18, "gpu": 18, "rgt_submit_queu": [18, 20], "enforc": 18, "q": 18, "id": [18, 19, 20], "proj_id": 18, "highest": [18, 20], "preced": [18, 20], "rgt_submit_acct": [18, 20], "rgt_nccs_test_harness_modul": 18, "commun": 18, "navig": 18, "correspond": [18, 20], "collect": [18, 21], "client": 18, "rgt_system_log_tag": [18, 19], "path_to_rgt_packag": [18, 19], "rgt_app_source_dir": 18, "rgt_test_build_dir": 18, "rgt_test_runarchive_dir": 18, "archiv": [18, 19], "rgt_test_source_dir": 18, "rgt_test_scripts_dir": 18, "rgt_test_status_dir": 18, "rgt_test_work_dir": 18, "_": 18, "rgt_influxdb_dis": 18, "disabl": 18, "disable_influxdb": 18, "dot": 18, "test_id": [18, 19], "prevent": 18, "futur": 18, "rgt_influxdb_uri": [18, 19], "semi": 18, "colon": 18, "my": [18, 19, 20], "port": 18, "api": [18, 19], "v2": [18, 19], "org": [18, 19], "myorg": 18, "bucket": [18, 19], "mybucket": 18, "OR": 18, "latter": 18, "rgt_influxdb_bucket": 18, "rgt_influxdb_org": 18, "automat": [18, 19, 20], "detect": 18, "precis": [18, 19], "rgt_influxdb_token": [18, 19], "token": [18, 19], "encod": 18, "rgt_influxdb_precis": 18, "millisecond": 18, "nanosecond": 18, "rgt_influxdb_dry_run": 18, "send": 18, "rgt_node_location_fil": [18, 19], "metadata": [18, 19], "physic": 18, "sensit": [18, 19], "enabl": 19, "behind": 19, "timestamp": 19, "filesystem": 19, "addition": 19, "seri": 19, "domain": 19, "minim": 19, "suppli": 19, "semicolon": 19, "uri": 19, "full": 19, "relat": 19, "measur": 19, "runtag": 19, "equal": [19, 20], "app": [19, 20], "uniqu": 19, "recent": [19, 20], "kept": [19, 20], "build_directori": [19, 20], "workdir": [19, 20], "event_filenam": 19, "mirror": 19, "event_nam": 19, "build_start": 19, "event_subtyp": 19, "whether": [19, 21], "end": 19, "event_tim": 19, "event_typ": 19, "binary_execut": 19, "event_valu": 19, "indic": 19, "wa": [19, 20], "job_account_id": 19, "job_id": 19, "jobid": 19, "failur": 19, "output_txt": 19, "mine": 19, "64": 19, "kb": 19, "check_alia": 19, "alpha": 19, "numer": 19, "supplement": 19, "larg": [19, 21], "self": 19, "explanatori": 19, "build_end": 19, "submit_end": 19, "binary_execute_end": 19, "check_end": 19, "encount": 19, "err": [19, 20], "capabl": 19, "great": 19, "visual": 19, "certain": 19, "conform": 19, "hashtag": 19, "metric_name_1": 19, "value_1": 19, "metric_name_2": 19, "value_2": 19, "value_3": 19, "metric_name_3": 19, "tvalue_3": 19, "least": 19, "calcul": 19, "between": 19, "binary_execute_start": 19, "build_tim": 19, "execution_tim": 19, "respect": 19, "interest": 19, "dummi": 19, "proper": 19, "placement": 19, "address": 19, "centric": 19, "similar": 19, "trigger": 19, "presenc": 19, "nodecheck": 19, "geospati": 19, "nodenam": 19, "node1": 19, "pass": 19, "node2": 19, "node3": 19, "hw": 19, "column": 19, "dashboard": 19, "squar": 19, "brace": 19, "status": 19, "bad": 19, "ok": 19, "perf": 19, "classifi": 19, "intend": 19, "known": 19, "eas": 19, "hardwar": 19, "bu": 19, "fault": 19, "network": 19, "node_health": 19, "tabl": 19, "By": 19, "cabinet": 19, "board": 19, "row": 19, "correl": 19, "bypass": 19, "json": 19, "desir": 19, "portion": 19, "node001": 19, "c0": 19, "switch": 19, "s0": 19, "slot": 19, "node002": 19, "s1": 19, "queri": 19, "filter": 19, "alias": 19, "dictat": 19, "come": 19, "shape": 19, "distinct": 19, "mpi_err": 19, "bus_err": 19, "timeout": 19, "input_err": 19, "alphabet": 19, "dimens": 19, "categor": 19, "sent": 19, "alongsid": 19, "done": 20, "obtain": 20, "alreadi": 20, "sw": 20, "andes": 20, "odo": 20, "example_machin": 20, "olcf_exampl": 20, "summit_testshot": 20, "prepar": 20, "visibl": 20, "host": 20, "manual": 20, "area": 20, "latest": 20, "version": 20, "well": 20, "prefer": 20, "inputfil": 20, "stop": [20, 21], "instead": 20, "harness_task": 20, "testid": 20, "cleanli": 20, "simultan": 20, "warn": 20, "continu": [20, 21], "receiv": 20, "primari": 20, "configfil": 20, "loglevel": 20, "notset": 20, "info": 20, "critic": 20, "screen": 20, "destin": 20, "consol": 20, "use_harness_tasks_in_rgt_input_fil": 20, "firework": 20, "beta": 20, "sb": 20, "build_out": 20, "appli": 20, "track": 20, "130": 20, "nearli": 20, "directli": 20, "lowest": 20, "except": 20, "whatev": 20, "becaus": 20, "know": 20, "who": 20, "onc": 20, "relev": 20, "status_dir": 20, "consist": 20, "seen": 20, "uncaptur": 20, "mechan": 20, "commonli": 20, "produc": 20, "autom": 21, "softwar": 21, "standalon": 21, "simul": 21, "workload": 21, "iter": 21, "anoth": 21, "brief": 21, "logic": 21, "flow": 21}, "objects": {"": [[2, 0, 0, "-", "create_alt_config_file"], [4, 0, 0, "-", "git_repository"], [3, 0, 0, "-", "layout_of_apps_directory"], [5, 0, 0, "-", "runtests"]], "git_repository": [[4, 1, 1, "", "GitRepository"], [4, 3, 1, "", "get_application_parent_directory"], [4, 3, 1, "", "get_fully_qualified_url_of_application_parent_directory"], [4, 3, 1, "", "get_repository_git_branch"], [4, 3, 1, "", "get_repository_url_of_application"], [4, 3, 1, "", "get_type_of_repository"]], "git_repository.GitRepository": [[4, 2, 1, "", "binaryName"], [4, 2, 1, "", "cloneRepository"], [4, 2, 1, "", "remote_repository_URL"], [4, 2, 1, "", "repository_branch"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"]}, "titleterms": {"introduct": 0, "raison": 0, "d": 0, "etr": 0, "organiz": [0, 11], "structur": [0, 11, 16], "prequisit": 0, "indic": [0, 6, 14], "tabl": [0, 6, 14], "har": [1, 7, 8, 9, 11, 13, 14, 20, 21], "create_alt_config_fil": 2, "py": [2, 3, 5], "modul": [2, 3, 4, 5, 8, 9], "document": [2, 3, 4, 5, 12, 13, 14], "layout_of_apps_directori": 3, "git_repositori": 4, "runtest": 5, "notat": 6, "convent": 6, "ncc": [7, 8, 9], "python": 7, "packag": [7, 8, 9], "bin": 8, "intoduct": [8, 9], "repositori": [9, 16], "prerequisit": 9, "environment": 9, "variabl": [9, 16, 18], "exampl": [9, 16], "refer": 10, "git": 11, "unit": [11, 13], "test": [11, 13, 14, 16, 20, 21], "framework": 11, "set": [11, 16], "up": [11, 16], "runtim": 11, "environ": [11, 16, 18, 20], "gener": 11, "machin": [11, 15], "specif": [11, 18], "run": [11, 18, 20], "api": 11, "usag": [12, 13, 20], "develop": [12, 13], "gitlab": 12, "ci": 12, "cd": 12, "pytest": 13, "olcf": 14, "user": 14, "guid": [14, 20], "ad": [15, 16], "new": [15, 16, 17], "creat": 15, "basic": [15, 20], "configur": [15, 18], "applic": [16, 19, 20], "sourc": [16, 17], "code": [16, 17], "url": 16, "input": 16, "requir": 16, "script": 16, "build": [16, 20], "job": 16, "templat": 16, "check": [16, 19, 20], "report": [16, 17], "from": 16, "ground": 16, "best": 16, "practic": 16, "us": [16, 20], "central": [16, 20], "defin": 16, "replac": 16, "instead": 16, "just": 16, "envvar": 16, "expect": 16, "contribut": 17, "bug": 17, "request": 17, "featur": 17, "time": [18, 20], "extens": [18, 19], "influxdb": 19, "event": 19, "log": [19, 20], "metric": 19, "monitor": 19, "health": 19, "individu": 19, "node": 19, "alia": 19, "quick": 20, "start": 20, "instal": 20, "option": 20, "1": 20, "pre": 20, "built": 20, "oth": 20, "On": 20, "Andes": 20, "frontier": 20, "2": 20, "your": 20, "own": 20, "copi": 20, "launch": 20, "command": 20, "line": 20, "paramet": 20, "find": 20, "output": 20, "submit": 20, "maintain": 20, "file": 20, "overview": 21, "purpos": 21, "execut": 21}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 57}, "alltitles": {"Introduction": [[0, "introduction"]], "Raison d\u2019etre": [[0, "raison-d-etre"]], "Organizational Structure": [[0, "organizational-structure"], [11, "organizational-structure"]], "Prequisites": [[0, "prequisites"]], "Indices and tables": [[0, "indices-and-tables"], [6, "indices-and-tables"], [14, "indices-and-tables"]], "harness": [[1, "harness"]], "create_alt_config_file.py Module Documentation": [[2, "create-alt-config-file-py-module-documentation"]], "layout_of_apps_directory.py Module Documentation": [[3, "layout-of-apps-directory-py-module-documentation"]], "git_repository Module Documentation": [[4, "git-repository-module-documentation"]], "runtests.py Module Documentation": [[5, "runtests-py-module-documentation"]], "Notational Conventions": [[6, "notational-conventions"]], "NCCS Harness Python Packages": [[7, "nccs-harness-python-packages"]], "NCCS Harness bin package": [[8, "nccs-harness-bin-package"]], "Intoduction": [[8, "intoduction"], [9, "intoduction"]], "Modules": [[8, "modules"], [9, "modules"]], "NCCS Harness repositories package": [[9, "nccs-harness-repositories-package"]], "Prerequisite Environmental Variables": [[9, "prerequisite-environmental-variables"]], "Examples": [[9, "examples"]], "References": [[10, "references"]], "Git Unit Test Framework": [[11, "git-unit-test-framework"]], "Setting Up the Harness Unit Testing Runtime Environment": [[11, "setting-up-the-harness-unit-testing-runtime-environment"]], "Generic Tests": [[11, "generic-tests"], [11, "id1"]], "Machine Specific Tests": [[11, "machine-specific-tests"], [11, "id2"]], "Running the Harness Unit Tests": [[11, "running-the-harness-unit-tests"]], "Harness Unit Testing API": [[11, "harness-unit-testing-api"]], "Usage and Developer Documentation for GitLab CI/CD": [[12, "usage-and-developer-documentation-for-gitlab-ci-cd"]], "Usage and Developer Documentation for Harness\u2019 pytest Unit Tests": [[13, "usage-and-developer-documentation-for-harness-pytest-unit-tests"]], "OLCF Test Harness Documentation": [[14, "olcf-test-harness-documentation"]], "User Guide": [[14, null]], "Adding a New Machine": [[15, "adding-a-new-machine"]], "Create a Basic Machine Configuration": [[15, "create-a-basic-machine-configuration"]], "Adding a New Test": [[16, "adding-a-new-test"]], "Application Source Code Repository Structure": [[16, "application-source-code-repository-structure"]], "Repository URL": [[16, "repository-url"]], "Repository structure": [[16, "repository-structure"]], "Example Repository Structure": [[16, "example-repository-structure"]], "Application Test Input": [[16, "application-test-input"]], "Required Application Test Scripts": [[16, "required-application-test-scripts"]], "Build Script": [[16, "build-script"]], "Job Script Template": [[16, "job-script-template"]], "Check Script": [[16, "check-script"]], "Report Script": [[16, "report-script"]], "Example Test from the Ground Up": [[16, "example-test-from-the-ground-up"]], "Best Practices": [[16, "best-practices"]], "Use a centralized script to set up the environment": [[16, "use-a-centralized-script-to-set-up-the-environment"]], "Define replacement variables instead of just EnvVars": [[16, "define-replacement-variables-instead-of-just-envvars"]], "Check for expected environment variables": [[16, "check-for-expected-environment-variables"]], "Contributing": [[17, "contributing"]], "Reporting Bugs": [[17, "reporting-bugs"]], "Requesting New Features": [[17, "requesting-new-features"]], "Contributing Source Code": [[17, "contributing-source-code"]], "Environment Variables": [[18, "environment-variables"]], "Configuration Variables": [[18, "configuration-variables"]], "Run-Time Variables": [[18, "run-time-variables"]], "Extension-specific Variables": [[18, "extension-specific-variables"]], "Extensions": [[19, "extensions"]], "InfluxDB Event Logging": [[19, "influxdb-event-logging"]], "Logging application metrics to InfluxDB": [[19, "logging-application-metrics-to-influxdb"]], "Monitoring the health of individual nodes": [[19, "monitoring-the-health-of-individual-nodes"]], "Check Alias": [[19, "check-alias"]], "Quick-Start Guide": [[20, "quick-start-guide"]], "Installation": [[20, "installation"]], "Option 1: Using the centralized (pre-built) OTH": [[20, "option-1-using-the-centralized-pre-built-oth"]], "On Andes and Frontier": [[20, "on-andes-and-frontier"]], "Option 2: Using your own copy of the harness": [[20, "option-2-using-your-own-copy-of-the-harness"]], "Launching the OTH": [[20, "launching-the-oth"]], "Basic Usage": [[20, "basic-usage"]], "Command-line Options": [[20, "command-line-options"]], "Run-time environment parameters": [[20, "run-time-environment-parameters"]], "Finding Test Output": [[20, "finding-test-output"]], "Build, Submit, and Check Output": [[20, "build-submit-and-check-output"]], "Application Output": [[20, "application-output"]], "Harness-maintained Log Files": [[20, "harness-maintained-log-files"]], "Overview of the Test Harness": [[21, "overview-of-the-test-harness"]], "Purpose": [[21, "purpose"]], "Execution Overview": [[21, "execution-overview"]]}, "indexentries": {"create_alt_config_file": [[2, "module-create_alt_config_file"]], "module": [[2, "module-create_alt_config_file"], [3, "module-layout_of_apps_directory"], [4, "module-git_repository"], [5, "module-runtests"]], "layout_of_apps_directory": [[3, "module-layout_of_apps_directory"]], "gitrepository (class in git_repository)": [[4, "git_repository.GitRepository"]], "binaryname (gitrepository property)": [[4, "git_repository.GitRepository.binaryName"]], "clonerepository() (gitrepository method)": [[4, "git_repository.GitRepository.cloneRepository"]], "get_application_parent_directory() (in module git_repository)": [[4, "git_repository.get_application_parent_directory"]], "get_fully_qualified_url_of_application_parent_directory() (in module git_repository)": [[4, "git_repository.get_fully_qualified_url_of_application_parent_directory"]], "get_repository_git_branch() (in module git_repository)": [[4, "git_repository.get_repository_git_branch"]], "get_repository_url_of_application() (in module git_repository)": [[4, "git_repository.get_repository_url_of_application"]], "get_type_of_repository() (in module git_repository)": [[4, "git_repository.get_type_of_repository"]], "git_repository": [[4, "module-git_repository"]], "remote_repository_url (gitrepository property)": [[4, "git_repository.GitRepository.remote_repository_URL"]], "repository_branch (gitrepository property)": [[4, "git_repository.GitRepository.repository_branch"]], "runtests": [[5, "module-runtests"]]}}) \ No newline at end of file diff --git a/docs/user_guide/adding_new_machine.html b/docs/user_guide/adding_new_machine.html index 29be320..b88a568 100644 --- a/docs/user_guide/adding_new_machine.html +++ b/docs/user_guide/adding_new_machine.html @@ -4,7 +4,8 @@ - + + Adding a New Machine — NCCS_Test_Harness 1.0 documentation @@ -110,7 +111,7 @@
                                                              • Quick-Start Guide
                                                      • -
                                                        + +

                                                        Required Application Test Scripts

                                                        The OTH requires each application test to provide (1) a build script, (2) a job script template, (3) a check script, and (4) a reporting script. These scripts should be placed in the locations described in Repository structure. @@ -349,7 +357,7 @@

                                                        Example Repository Structure/usr/bin/echo to remove the need to have an empty build script. If the OTH cannot find the scripts specified by the test input file (rgt_test_input.ini), it will fail to launch.

                                                        -
                                                        +

                                                        Build Script

                                                        The build script can be a shell script, a Python script, or other executable command. It is specified in the test input file as build_cmd, and the OTH will execute the provided value as a subprocess. @@ -369,8 +377,8 @@

                                                        Build Script +

                                                        +

                                                        Job Script Template

                                                        The OTH will generate the batch job script from the job script template by replacing keywords of the form __keyword__ with the values specified in the test input [Replacements] section.

                                                        @@ -414,7 +422,8 @@

                                                        Build Scriptcd $WORK_DIR env &> job.environ -scontrol show hostnames > job.nodes +scontrol show hostnames &> job.nodes +ldd $BUILD_DIR/bin/$EXECUTABLE &> ldd.log # Run the executable. log_binary_execution_time.py --scriptsdir $SCRIPTS_DIR --uniqueid $HARNESS_ID --mode start @@ -460,8 +469,8 @@

                                                        Build Scriptexecutable_path entry in rgt_test_input.ini file. The executable may still be inside $BUILD_DIR from the previous step, so one would need to either copy it to $WORK_DIR or provide the absolute path in the job script such as $BUILD_DIR/$EXECUTABLE.

                                                        -

                                                        -
                                                        +

                                                        +

                                                        Check Script

                                                        The check script can be a shell script, Python script, or other executable command. This must be an absolute path to a command (ie, /usr/bin/echo instead of echo).

                                                        @@ -490,8 +499,8 @@

                                                        Check Scriptexit 0

                                              • -
                                          • -
                                            + +

                                            Report Script

                                            Like the check script, the report script can be a shell script, Python script, or other executable command. Report scripts are generally used to compute performance metrics from the run. @@ -503,9 +512,9 @@

                                            Report Scriptexit 0. An alternative to a no-op bash script, you may use /usr/bin/echo on most Linux systems.

                                            -
                                  • -
                                    -
                                    + + +

                                    Example Test from the Ground Up

                                    This section details the thought process when developing a new test from the ground up. In this section, we develop an application repository named mpi-tests, which contains two “Hello, World!” MPI tests at different node counts. @@ -662,7 +671,7 @@

                                    Example Test from the Ground Up# 1. for testing purposes, it's good to ensure that SLURM_NNODES is correct, since users will use that # 2. if you inadvertently set $RGT_SUBMIT_ARGS, using SLURM_NNODES will adapt to the size of the job set -x -srun -N ${SLURM_NNODES} -n $((${SLURM_NNODES}*__ppn__)) --ntasks-per-node=__ppn__ $BUILD_DIR/$EXECUTABLE &> stdout.txt +srun -N ${SLURM_NNODES} -n $((${SLURM_NNODES}*__ppn__)) --ntasks-per-node=__ppn__ $BUILD_DIR/$EXECUTABLE &> stdout.txt set +x log_binary_execution_time.py --scriptsdir $SCRIPTS_DIR --uniqueid $HARNESS_ID --mode final @@ -718,13 +727,13 @@

                                    Example Test from the Ground Up +

                                    +

                                    Best Practices

                                    The OTH is very flexible and gives the user a lot of power. That power can be diminished by poor test design.

                                    With that in mind, this section presents some of the best practices in test design.

                                    -
                                    +

                                    Use a centralized script to set up the environment

                                    During a test run, the environment is independently set up during the build and run stages. If the build script and job script each contain several module load statements, there is a chance that those can diverge. @@ -732,8 +741,8 @@

                                    Use a centralized script to set up the environmentsource that script from the build and job scripts. For the build script, this can be accomplished as simply source env.sh, if the script is in the top level of the Source directory. For the job script, this can be accomplished by source $BUILD_DIR/env.sh, if the $BUILD_DIR environment variable is defined as in the Job Script Template section above.

                                    -

                                    -
                                    +
                                    +

                                    Define replacement variables instead of just EnvVars

                                    In rgt_test_input.ini, it is recommended that if you define an environment variable in the [EnvVars] section, that you also define a replacement variable in [Replacements] that is used in the job script to re-define that environment variable. @@ -768,15 +777,15 @@

                                    Define replacement variables instead of just EnvVars

                          • The same feature cannot be used in the build script, which leads to the next best practice, checking for expected environment variables.

                            -
                      • -
                        + +

                        Check for expected environment variables

                        Following on the last best practice, if the harness or environment script define any environment variables required in the build and job scripts, the scripts should check that those are set and return an error if they are not. This increases the reusability of the scripts outside of the test harness and aids debugging.

                        -
                        -
                  • -
              • + + +
          • diff --git a/docs/user_guide/contributing.html b/docs/user_guide/contributing.html index a407751..f2f9471 100644 --- a/docs/user_guide/contributing.html +++ b/docs/user_guide/contributing.html @@ -4,7 +4,8 @@ - + + Contributing — NCCS_Test_Harness 1.0 documentation @@ -109,7 +110,7 @@
          • Quick-Start Guide
      • -
        + +

        Contributing Source Code

        Source-code contribution is welcomed through GitHub Pull Requests to the OTH GitHub Repository Pull Requests page. For PRs that fix bugs or implement a new feature, please cite the specific Issue in the body of the PR. @@ -328,8 +329,8 @@

        Contributing Source Code - + + Environment Variables — NCCS_Test_Harness 1.0 documentation @@ -110,7 +111,7 @@
      • Quick-Start Guide
      • +

        Run-Time Variables

        The OLCF Test Harness also SETS many variables while inside of a test. These variables cannot be used by the rgt_test_input.ini file via <obtain_from_environment>. @@ -320,13 +321,14 @@

        Environment VariablesRGT_APP_SOURCE_DIR Path to the 'Source' directory of the current application. RGT_TEST_BUILD_DIR Path to the build directory of the currently-running test. RGT_TEST_RUNARCHIVE_DIR Path to the run archive directory of the currently-running test. +RGT_TEST_SOURCE_DIR Path to the source overlay directory of the currently-running test. RGT_TEST_SCRIPTS_DIR Path to the scripts directory of the currently-running test. RGT_TEST_STATUS_DIR Path to the status directory of the currently-running test. RGT_TEST_WORK_DIR Path to the work (scratch) directory of the currently-running test.

        - -
        + +

        Extension-specific Variables

        With the addition of several extensions to the OTH, there are a few more environment variables that configure extension behavior. These are grouped below by extension. The general naming convention is RGT_<extension>_<option>.

        @@ -354,8 +356,8 @@

        Environment Variables

        - - + + diff --git a/docs/user_guide/extensions.html b/docs/user_guide/extensions.html index d2115eb..45aaf8c 100644 --- a/docs/user_guide/extensions.html +++ b/docs/user_guide/extensions.html @@ -4,7 +4,8 @@ - + + Extensions — NCCS_Test_Harness 1.0 documentation @@ -110,7 +111,7 @@
      • Quick-Start Guide
        • Installation
          • Option 1: Using the centralized (pre-built) OTH
          • Option 2: Using your own copy of the harness
          • @@ -244,13 +245,13 @@
            -
            +

            Extensions

            Optional extensions have been developed for use with the OLCF Test Harness (OTH). Extensions are enabled through environment variables and metadata files placed in the Run_Archive directory of a test launch.

            -
            +

            InfluxDB Event Logging

            The OTH leaves behind event information in files on the file system, with data like timestamp, filesystem paths for work, scratch and archive directories, test name, etc. This information can additionally be logged to an InfluxDB time-series database. @@ -308,8 +309,8 @@

            InfluxDB Event Loggingbinary_execute_end, the OTH looks for a file with the extension .o${job_id}, and reads the last 64 kB from that file. This file is not automatically created by the harness. For check_end, the OTH looks for a file named output_check.txt, which is automatically created by the harness to store output from the check script.

            -

            -
            +
            +

            Logging application metrics to InfluxDB

            The OTH provides capability to log metrics from each test to InfluxDB. This extension is a great way to visualize performance of a certain test over time. @@ -332,8 +333,8 @@

            Logging application metrics to InfluxDBdummy=1. Note that the correct computation of execution_time requires proper placement of the log_binary_execution_time.py calls in the job script, since execution_time is the difference in time between the two log_binary_execution_time.py calls.

            -

            -
            + +

            Monitoring the health of individual nodes

            In many-node systems, it can be very difficult to monitor the health of each node. To address this, the OTH supports node-centric monitoring. @@ -383,8 +384,8 @@

            Monitoring the health of individual nodes +

            +

            Check Alias

            Check aliasing allows codes to provide an alpha-numeric explanation to the check script exit code. For example, the OTH uses a check_end event value of 1 to dictate a failure. @@ -394,8 +395,8 @@

            Check Alias - + + Quick-Start Guide — NCCS_Test_Harness 1.0 documentation @@ -110,7 +111,7 @@
          • Quick-Start Guide
            • Installation
              • Option 1: Using the centralized (pre-built) OTH
              • Option 2: Using your own copy of the harness
              • @@ -244,32 +245,32 @@
                -
                +

                Quick-Start Guide

                This section serves as a quick-start guide for installing the OTH and launching an existing test. For creating a new test, see Adding a New Test. For adding support for a new machine, see Adding a New Machine.

                -
                +

                Installation

                To launch the OLCF Test Harness (OTH) you must first access the harness code. This can be done in two ways: by obtaining your own copy of the code or using the centralized harness code that is available on most OLCF systems.

                -
                +

                Option 1: Using the centralized (pre-built) OTH

                -
                -

                On Andes, Crusher, Frontier, and Summit

                +
                +

                On Andes and Frontier

                On most OLCF machines, the code is already installed in: /sw/acceptance/olcf-test-harness

                Setup the environment:

                export OLCF_HARNESS_DIR=/sw/acceptance/olcf-test-harness
                 module use $OLCF_HARNESS_DIR/modulefiles
                 module load olcf_harness
                -# Machine name examples: andes, crusher, frontier, summit
                +# Machine name examples: andes, frontier, odo
                 # Check ${OLCF_HARNESS_DIR}/configs/*.ini to see all available machines
                 export OLCF_HARNESS_MACHINE=<machine_name>
                 
                -
                -
                -
                +
                +
                +

                Option 2: Using your own copy of the harness

                Clone the repo on the target system:

                git clone https://github.com/olcf/olcf-test-harness.git
                @@ -290,11 +291,11 @@ 

                Option 2: Using your own copy of the harnessAdding a New Machine.

                -
                -
                -
                +
          • + +

            Launching the OTH

            -
            +

            Basic Usage

            Create a directory where you will place input files. No computation will be done here:

            mkdir summit_testshot
            @@ -350,8 +351,8 @@ 

            Basic Usage +

            +

            Command-line Options

            The OTH receives configurations from two primary methods: command-line flags and environment variables. This section details the command-line parameters and the next section details available environment variables.

            @@ -381,8 +382,8 @@

            Basic Usage--loglevel flag currently does not apply to all output from the OTH. This issue is tracked by Issue 130.

            -
            -
            + +

            Run-time environment parameters

            The OTH is designed to automatically ingest some parameters from user-set environment variables at launch time. Nearly all parameters in the $OLCF_HARNESS_MACHINE.ini file can be directly overridden by a corresponding environment variable. @@ -405,9 +406,9 @@

            Basic Usage +

            + +

            Finding Test Output

            This section details where all output files can be found once a harness run completes. There are 4 directories referenced in this section:

            @@ -417,7 +418,7 @@

            Finding Test Output +

            Build, Submit, and Check Output

            Each OTH test run consists of 4 primary stages – build, submit, run, and check, as can be seen in Overview of the Test Harness. The build, submit, and check stages have pre-defined locations for the output:

            @@ -426,23 +427,23 @@

            Build, Submit, and Check Output +

            +

            Application Output

            Output from the executable run can be found in one of two places.

            • Uncaptured output will go to the scheduler’s stdout/stderr mechanism, and will commonly be found in ${RESULTS_DIR}

            • Any output files created by the application should be in ${WORK_DIR}

            -

            -
            + +

            Harness-maintained Log Files

            The OTH also produces log files, which contain messages from the harness with data useful for debugging failed tests. These log files can be used to check internal error messages reported by extensions of the OTH such as database event and metric logging. These log files are found in ${RESULTS_DIR}/LogFiles.

            -
            -
            -
            + + + diff --git a/docs/user_guide/overview.html b/docs/user_guide/overview.html index 0c794b8..b5b3b1c 100644 --- a/docs/user_guide/overview.html +++ b/docs/user_guide/overview.html @@ -4,7 +4,8 @@ - + + Overview of the Test Harness — NCCS_Test_Harness 1.0 documentation @@ -110,7 +111,7 @@
          • Quick-Start Guide
            • Installation
              • Option 1: Using the centralized (pre-built) OTH
              • Option 2: Using your own copy of the harness
              • @@ -244,9 +245,9 @@
                -
                +

                Overview of the Test Harness

                -
                +

                Purpose

                @@ -256,8 +257,8 @@

                Purpose +

                +

                Execution Overview

                runtests.py is the program used to execute the OTH. Users provide a test input file that lists the set of application tests to run, and a command-line @@ -267,8 +268,8 @@

                Execution Overview OTH Flowchart -

                -
                + +
                diff --git a/harness/bin/test_harness_driver.py b/harness/bin/test_harness_driver.py index 58e08bd..99a4bf2 100755 --- a/harness/bin/test_harness_driver.py +++ b/harness/bin/test_harness_driver.py @@ -449,6 +449,7 @@ def test_harness_driver(argv=None): 'TEST_SCRIPTS_DIR' : testscripts, 'TEST_BUILD_DIR' : apptest.get_path_to_workspace_build(), 'TEST_WORK_DIR' : apptest.get_path_to_workspace_run(), + 'TEST_SOURCE_DIR' : apptest.get_path_to_test_source(), 'TEST_STATUS_DIR' : status_dir, 'TEST_RUNARCHIVE_DIR' : ra_dir } diff --git a/harness/libraries/layout_of_apps_directory.py b/harness/libraries/layout_of_apps_directory.py index 391b8ce..a3bfdcf 100644 --- a/harness/libraries/layout_of_apps_directory.py +++ b/harness/libraries/layout_of_apps_directory.py @@ -52,6 +52,7 @@ class apptest_layout: test_run_archive_dirname = 'Run_Archive' test_scripts_dirname = 'Scripts' test_status_dirname = 'Status' + test_source_dirname = 'Source' test_performance_dirname = 'Performance' test_logfile_dirname = 'LogFiles' @@ -67,6 +68,7 @@ class apptest_layout: 'test' : os.path.join("${pdir}", "${app}", "${test}"), 'test_info' : os.path.join("${pdir}", "${app}", "${test}", test_info_filename), 'test_rc' : os.path.join("${pdir}", "${app}", "${test}", test_rc_filename), + 'test_source' : os.path.join("${pdir}", "${app}", "${test}", test_source_dirname), 'test_correct' : os.path.join("${pdir}", "${app}", "${test}", test_correct_results_dirname), 'test_perf' : os.path.join("${pdir}", "${app}", "${test}", test_performance_dirname), 'runarchive_dir' : os.path.join("${pdir}", "${app}", "${test}", test_run_archive_dirname, "${id}"), @@ -175,6 +177,12 @@ def get_path_to_application(self): def get_path_to_source(self): return self.__apptest_layout['app_source'] + # + # Returns the path to the test's source directory. + # + def get_path_to_test_source(self): + return self.__apptest_layout['test_source'] + # # Returns the path to the test directory. # diff --git a/harness/machine_types/base_machine.py b/harness/machine_types/base_machine.py index 526fc14..a76202b 100644 --- a/harness/machine_types/base_machine.py +++ b/harness/machine_types/base_machine.py @@ -12,6 +12,7 @@ import shutil import subprocess import shlex +import sys # Harness imports from libraries.apptest import subtest @@ -303,7 +304,10 @@ def build_executable(self): self.logger.doInfoLogging(message) # Copy the source to the build directory. - self._copy_source_to_build_directory() + copy_rc = self._copy_source_to_build_directory() + # short-circuit if the copy failed + if not copy_rc == 0: + return copy_rc message = f"{messloc} Copied source to build directory.\n" self.logger.doInfoLogging(message) @@ -452,6 +456,7 @@ def _copy_source_to_build_directory(self): messloc = "In function {functionname}:".format(functionname=self._name_of_current_function()) path_to_source = self.apptest.get_path_to_source() + path_to_test_source = self.apptest.get_path_to_test_source() # Use Error threshold to show this message all the time self.logger.doErrorLogging(f"Path to Source: {path_to_source}") @@ -467,6 +472,21 @@ def _copy_source_to_build_directory(self): dst=path_to_build_directory, symlinks=True) + # If a Source directory exists inside test, overlay that over source directory + if os.path.exists(path_to_test_source): + # Python 3.8 adds the dirs_exist_ok keyword to allow overwriting a destination + # Prior to that, it's easier to use shell commands to do what we want + if sys.version_info[0] == 3 and sys.version_info[1] >= 8: + shutil.copytree(src=path_to_test_source, + dst=path_to_build_directory, + symlinks=False, dirs_exist_ok=True) + else: + proc = subprocess.run(['cp', '-rTL', os.path.realpath(path_to_test_source), path_to_build_directory]) + if not proc.returncode == 0: + self.logger.doCriticalLogging(f"Encountered an error copying a test's Source directory from {path_to_test_source} to {path_to_build_directory}") + return proc.returncode + return 0 + def _write_check_exit_status(self, cstatus): """ Write the status of checking results to the status directory.""" messloc = "In function {functionname}:".format(functionname=self._name_of_current_function())