From 2f4842f527f45118862a528c346491b75dcea056 Mon Sep 17 00:00:00 2001 From: Akshaya Jagannadharao Date: Tue, 17 Jul 2018 14:12:20 -0700 Subject: [PATCH] Adding documentation and changing website layout Signed-off-by: Akshaya Jagannadharao --- _config.yml | 2 - docs/README.md | 249 +++----------- docs/_config.yml | 2 +- docs/_layouts/default.html | 140 +++++--- docs/assets/css/style.scss | 307 ++++++++---------- docs/assets/images/ini_struct.png | Bin 0 -> 30065 bytes docs/assets/images/mtt-functional.png | Bin 0 -> 106583 bytes docs/pages/community.md | 22 ++ docs/pages/developer_guide.md | 1 + docs/pages/doxygen.md | 1 + docs/pages/faq.md | 1 + docs/pages/ini_docs.md | 68 ++++ docs/pages/plugins_docs.md | 177 ++++++++++ docs/pages/resources.md | 5 + docs/pages/tips_and_tricks.md | 30 ++ docs/pages/travis.md | 1 + docs/pages/user_guide.md | 1 + pylib/Stages/BIOS/BIOSMTTStage.py | 2 +- pylib/Stages/Firmware/FirmwareMTTStage.py | 2 +- .../LauncherDefaultsMTTStage.py | 2 +- .../Stages/MTTDefaults/DefaultMTTDefaults.py | 1 + .../Stages/MTTDefaults/MTTDefaultsMTTStage.py | 2 +- .../MiddlewareBuildMTTStage.py | 2 +- .../MiddlewareGet/MiddlewareGetMTTStage.py | 2 +- pylib/Stages/Profile/DefaultProfile.py | 1 + .../Profile/DefaultProfile.yapsy-plugin | 2 +- pylib/Stages/Profile/ProfileMTTStage.py | 2 +- .../Stages/Provisioning/ProvisionMTTStage.py | 2 +- pylib/Stages/Provisioning/WWulf3.py | 1 + pylib/Stages/Reporter/IUDatabase.py | 1 + pylib/Stages/Reporter/JunitXML.py | 1 + pylib/Stages/Reporter/ReporterMTTStage.py | 2 +- pylib/Stages/Reporter/TextFile.py | 1 + pylib/Stages/TestBuild/DefaultTestBuild.py | 1 + pylib/Stages/TestBuild/TestBuildMTTStage.py | 2 +- pylib/Stages/TestGet/TestGetMTTStage.py | 2 +- pylib/Stages/TestRun/TestRunMTTStage.py | 2 +- pylib/Tools/Build/Autotools.py | 1 + pylib/Tools/Build/Hostfile.py | 1 + pylib/Tools/Build/Shell.py | 1 + pylib/Tools/CNC/IPMITool.py | 1 + pylib/Tools/Executor/combinatorial.py | 1 + pylib/Tools/Executor/sequential.py | 1 + pylib/Tools/Fetch/AlreadyInstalled.py | 1 + pylib/Tools/Fetch/Git.py | 1 + pylib/Tools/Fetch/OMPI_Snapshot.py | 1 + pylib/Tools/Harasser/Harasser.py | 1 + pylib/Tools/Launcher/ALPS.py | 1 + pylib/Tools/Launcher/OpenMPI.py | 1 + pylib/Tools/Launcher/SLURM.py | 1 + pylib/Tools/Version/MTTVersionPlugin.py | 1 + pylib/Utilities/Compilers.py | 1 + pylib/Utilities/Copytree.py | 1 + pylib/Utilities/Environ.py | 1 + pylib/Utilities/ExecuteCmd.py | 1 + pylib/Utilities/Logger.py | 1 + pylib/Utilities/MPIVersion.py | 1 + pylib/Utilities/ModuleCmd.py | 1 + pylib/Utilities/Watchdog.py | 1 + 59 files changed, 636 insertions(+), 426 deletions(-) delete mode 100644 _config.yml create mode 100644 docs/assets/images/ini_struct.png create mode 100644 docs/assets/images/mtt-functional.png create mode 100644 docs/pages/community.md create mode 100644 docs/pages/developer_guide.md create mode 100644 docs/pages/doxygen.md create mode 100644 docs/pages/faq.md create mode 100644 docs/pages/ini_docs.md create mode 100644 docs/pages/plugins_docs.md create mode 100644 docs/pages/resources.md create mode 100644 docs/pages/tips_and_tricks.md create mode 100644 docs/pages/travis.md create mode 100644 docs/pages/user_guide.md diff --git a/_config.yml b/_config.yml deleted file mode 100644 index a7af03880..000000000 --- a/_config.yml +++ /dev/null @@ -1,2 +0,0 @@ -theme: jekyll-theme-leap-day -title: MTT Python Client diff --git a/docs/README.md b/docs/README.md index 752fa18cf..e097d88ce 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,224 +1,65 @@ -What is this software? ----------------------- - -This is the MPI Testing Tool (MTT) software package. It is a -standalone tool for testing the correctness and performance of -arbitrary MPI implementations. - -The MTT is an attempt to create a single tool to download and build a -variety of different MPI implementations, and then compile and run any -number of test suites against each of the MPI installations, storing -the results in a back-end database that then becomes available for -historical data mining. The test suites can be for both correctness -and performance analysis (e.g., tests such as nightly snapshot compile -results as well as the latency of MPI_SEND can be historically -archived with this tool). - -The MTT provides the glue to obtain and install MPI installations -(e.g., download and compile/build source distributions such as nightly -snapshots, or copy/install binary distributions, or utilize an -already-existing MPI installation), and then obtain, compile, and run -the tests. Results of each phase are submitted to a centralized -PostgresSQL database via HTTP/HTTPS. Simply put, MTT is a common -infrastructure that can be distributed to many different sites in -order to run a common set of tests against a group of MPI -implementations that all feed into a common PostgresSQL database of -results. - -The MTT client is written almost entirely in perl; the MTT server side -is written almost entirely in PHP and relies on a back-end PostgresSQL -database. - -The main (loose) requirements that we had for the MTT are: - -- Use a back-end database / archival system. -- Ability to obtain arbitrary MPI implementations from a variety of - sources (web/FTP download, filesystem copy, Subversion export, - etc.). -- Ability to install the obtained MPI implementations, regardless of - whether they are source or binary distributions. For source - distributions, include the ability to compile each MPI - implementation in a variety of different ways (e.g., with different - compilers and/or compile flags). -- Ability to obtain arbitrary test suites from a variety of sources - (web/FTP download, filesystem copy, Subversion export, etc.). -- Ability to build each of the obtained test suites against each of - the MPI implementation installations (e.g., for source MPI - distributions, there may be more than one installation). -- Ability to run each of the built test suites in a variety of - different ways (e.g, with a set of different run-time options). -- Ability to record the output from each of the steps above and - submit securely them to a centralized database. -- Ability to run the entire test process in a completely automated - fashion (e.g., via cron). -- Ability to run each of the steps above on physically different - machines. For example, some sites may require running the - obtain/download steps on machines that have general internet access, - running the compile/install steps on dedicated compile servers, - running the MPI tests on dedicated parallel resources, and then - running the final submit steps on machines that have general - internet access. -- Use a component-based system (i.e., plugins) for the above steps so - that extending the system to download (for example) a new MPI - implementation is simply a matter of writing a new module with a - well-defined interface. - - -How to cite this software -------------------------- -Hursey J., Mallove E., Squyres J.M., Lumsdaine A. (2007) An Extensible -Framework for Distributed Testing of MPI Implementations. In Recent -Advances in Parallel Virtual Machine and Message Passing Interface. -EuroPVM/MPI 2007. Lecture Notes in Computer Science, vol 4757. Springer, -Berlin, Heidelberg. -https://doi.org/10.1007/978-3-540-75416-9_15 - - -Overview --------- - -The MTT divides its execution into six phases: - -1. MPI get: obtain MPI software package(s) (e.g., download, copy) -2. MPI install: install the MPI software package(s) obtained in phase 1. - This may involve a binary installation or a build from source. -3. Test get: obtain MPI test(s) -4. Test build: build the test(s) against all MPI installations - installed in phase 2. -5. Test run: run all the tests build in phase 4. -6. Report: report the results of phases 2, 4, and 5. - -The phases are divided in order to allow a multiplicative effect. For -example, each MPI package obtained in phase 1 may be installed in -multiple different ways in phase 2. Tests that are built in phase 4 -may be run multiple different ways in phase 5. And so on. - -This multiplicative effect allows testing many different code paths -through MPI even with a small number of actual tests. For example, -the Open MPI Project uses the MTT for nightly regression testing. -Even with only several hundred MPI test source codes, Open MPI is -tested against a variety of different compilers, networks, number of -processes, and other run-time tunable options. A typical night of -testing yields around 150,000 Open MPI tests. - - -Quick start ------------ - -Testers run the MTT client on their systems to do all the work. A -configuration file is used to specify which MPI implementations to use -and which tests to run. - -The Open MPI Project uses MTT for nightly regression testing. A -sample Perl client configuration file is included in -samples/perl/ompi-core-template.ini. This template will require -customization for each site's specific requirements. It is also -suitable as an example for organizations outside of the Open MPI -Project. - -Open MPI members should visit the MTT wiki for instructions on how to -setup for nightly regression testing: - - https://github.com/open-mpi/mtt/wiki/OMPITesting - -The MTT client requires a few perl packages to be installed locally, -such as LWP::UserAgent. Currently, the best way to determine if you -have all the required packages is simply to try running the client and -see if it fails due to any missing packages. - -Note that the INI file can be used to specify web proxies if -necessary. See comments in the ompi-core-template.ini file for -details. - - -Running the MTT Perl client ---------------------------- - -Having run the MTT client across several organizations within the Open -MPI Project for quite a while, we have learned that even with common -goals (such as Open MPI nightly regression testing), MTT tends to get -used quite differently at each site where it is used. The -command-line client was designed to allow a high degree of flexibility -for site-specific requirements. - -The MTT client has many command line options; see the following for a -full list: - -$ client/mtt --help - -Some sites add an upper layer of logic/scripting above the invocation -of the MTT client. For example, some sites run the MTT on -SLURM-maintained clusters. A variety of compilers are tested, -yielding multiple unique (MPI get, MPI install, Test get, Test build) -tuples. Each tuple is run in its own 1-node SLURM allocation, -allowing the many installations/builds to run in parallel. When the -install/build tuple has completed, more SLURM jobs are queued for each -desired number of nodes/processes to test. These jobs all execute in -parallel (pending resource availability) in order to achieve maximum -utilization of the testing cluster. +# What is this software? +This is the Middleware Testing Tool (MTT) software package. It is a standalone tool for testing the correctness and performance of arbitrary MPI implementations. -Other scenarios are also possible; the above is simply one way to use -the MTT. +This website focuses on documenting the Python Client. For more documentation on the Perl Client, please refer to the [Wiki Pages](https://github.com/open-mpi/mtt/wiki/MTTOverview). +MTT is a single tool created to download and build a variety of different middleware implementations, and then compile and run any number of test suites against each of the installations, storing the results in a back-end database that then becomes available for +historical data mining. The test suites can be for both correctness and performance analysis (e.g., tests such as nightly snapshot compile results as well as the latency of MPI_SEND can be historically archived with this tool). -Current status --------------- +MTT provides the glue to obtain and install middleware installations (e.g., download and compile/build source distributions such as nightly snapshots, or copy/install binary distributions, or utilize an already-existing middleware installation), and then obtain, compile, and run the tests. -This tool was initially developed by the Open MPI team for nightly and -periodic compile and regression testing. However, enough other -parties have expressed [significant] interest that we have open-sourced -the tool and are eagerly accepting input from others. Indeed, having -a common tool to help objectively evaluate MPI implementations may be -an enormous help to the High Performance Computing (HPC) community at -large. +Results of each phase are submitted to a centralized PostgresSQL database via HTTP/HTTPS. Simply put, MTT is a common infrastructure that can be distributed to many different sites in +order to run a common set of tests against a group of Middleware implementations that all feed into a common PostgresSQL database of results. -We have no illusions of MTT becoming the be-all/end-all tool for -testing software -- we do want to keep it somewhat focused on the -needs and requires of testing MPI implementations. As such, the usage -flow is somewhat structured towards that bias. +# Overview -It should be noted that the software has been mostly developed internally -to the Open MPI project and will likely experience some growing pains -while adjusting to a larger community. +MTT is divided into multiple phases of execution to split up grabbing content, building content, running content, and reporting results (please refer to the [INI documentation](/mtt/pages/ini_docs.html) to learn more). +The phases are divided to allow a multiplicative effect. For example, each middleware package obtained may be installed in multiple different ways. The built tests may be executed in multiple different ways. And so on. -License -------- +Phases are effectively templated to allow multiple executions of each phase based on parameterization. For example, you can specify a single middleware implementation, but have MTT compile it against both the GNU and Intel compilers. MTT will automatically track that there is one middleware source, but two installations of it. Every test suite that is specified will therefore be compiled and run against _both_ middleware installations, and their results filed accordingly. Hence, the MTT gives a multiplicitive effect. A simplistic view: +- M middleware implementations are specified +- I installations of each middleware implementation are specified +- A total of (M * I) installations are created (assuming all are successful) +- T test suites are specified, each of which is compiled against the (M * I) middleware installation +- R different run parameters are specified for each test suite +- A total of (T * R * M * I) tests are run. -Because we want MTT to be a valuable resource to the entire HPC -community, the MTT uses the new BSD license -- see the LICENSE file in -the MTT distribution for details. +Hence, you must be careful not to specify too much work to MTT -- it will happily do all of it, but it may take a long, long time! +*Note:* MTT takes care of all PATH and LD_LIBRARY_PATH issues when building and installing both middleware implementations and test suites. There is no need for the user to setup anything special in their shell startup files. -Get involved ------------- +The following graphic is a decent representation of the relationships of the phases to each other, and the general sequence of phases. It shows two example middleware implementations (open MPI and MPICH), but any middleware implementation could be used (even multiple versions of the same middleware implementation): -We *want* your feedback. We *want* you to get involved. +![](/mtt/assets/images/mtt-functional.png) -The main web site for the MTT is: +# Quick start +Testers run the MTT client on their systems to do all the work. A configuration file is used to specify which middleware implementations to use and which tests to run. - http://www.open-mpi.org/projects/mtt/ +The Open MPI Project uses MTT for nightly regression testing. A sample Python client configuration file is included in samples/python/ompi_hello_world.ini. It is also suitable as an example for organizations outside of the Open MPI Project. -User-level questions and comments should generally be sent to the -user's mailing list (mtt-users@open-mpi.org). Because of spam, only -subscribers are allowed to post to this list (ensure that you -subscribe with and post from *exactly* the same e-mail address -- -joe@example.com is considered different than -joe@mycomputer.example.com!). Visit this page to subscribe to the -user's list: +# Nightly Regression Testing +Open MPI members should visit the [MTT Wiki](https://github.com/open-mpi/mtt/wiki/OMPITesting) for instructions on how to setup for nightly regression testing. - https://lists.open-mpi.org/mailman/listinfo/mtt-users +To configure nightly testing with Travis CI, please refer to the [Travis CI documentation](/mtt/pages/travis.html). -Developer-level bug reports, questions, and comments should generally -be sent to the developer's mailing list (mtt-devel@open-mpi.org). -Please do not post the same question to both lists. As with the -user's list, only subscribers are allowed to post to the developer's -list. Visit the following web page to subscribe: +# Running the MTT Python client - https://lists.open-mpi.org/mailman/listinfo/mtt-devel - http://www.open-mpi.org/mailman/listinfo.cgi/mtt-devel +Having run the MTT client across several organizations within the Open MPI Project for quite a while, we have learned that even with common goals (such as Open MPI nightly regression testing), MTT tends to get used quite differently at each site where it is used. The +command-line client was designed to allow a high degree of flexibility for site-specific requirements. -When submitting bug reports to either list, be sure to include as much -extra information as possible. +The MTT client has many command line options; try the following command to see the full list of options: + +```mtt/pyclient/pymtt.py --help``` + +Some sites add an upper layer of logic/scripting above the invocation of the MTT client. For example, some sites run the MTT on SLURM-maintained clusters. A variety of compilers are tested, yielding multiple unique (MiddlewareGet, MiddlewareBuild, TestGet, TestBuild) tuples. Each tuple is run in its own 1-node SLURM allocation, allowing the many installations/builds to run in parallel. When the install/build tuple has completed, more SLURM jobs are queued for each desired number of nodes/processes to test. These jobs all execute in parallel (pending resource availability) in order to achieve maximum utilization of the testing cluster. + +Other scenarios are also possible; the above is simply one way to use MTT. + +# How to cite this software + +Hursey J., Mallove E., Squyres J.M., Lumsdaine A. (2007) An Extensible Framework for Distributed Testing of MPI Implementations. In Recent Advances in Parallel Virtual Machine and Message Passing Interface. EuroPVM/MPI 2007. Lecture Notes in Computer Science, vol 4757. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-540-75416-9_15 + +# License +Because we want MTT to be a valuable resource to the entire HPC community, the MTT uses the new BSD license -- see the LICENSE file in the MTT distribution for details. -Thanks for your time. diff --git a/docs/_config.yml b/docs/_config.yml index e82298cdd..7e25c1eb7 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,4 +1,4 @@ title: MTT -description: MPI Testing Tool +description: Middleware Testing Tool show_downloads: true theme: jekyll-theme-leap-day diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index d09290491..26cecc934 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -14,59 +14,115 @@ - - +

{{ site.title | default: site.github.repository_name }}

{{ site.description | default: site.github.project_tagline }}

+ + + + -
- -
- {{ content }} + Community + View on GitHub +
+--> + - - - +
+ +
+ {{ content }} +
+ + +
- {% if site.google_analytics %} - - {% endif %} + {% if site.google_analytics %} + + {% endif %} diff --git a/docs/assets/css/style.scss b/docs/assets/css/style.scss index 9805a65bd..c2f9c18fb 100644 --- a/docs/assets/css/style.scss +++ b/docs/assets/css/style.scss @@ -1,12 +1,14 @@ --- --- +@import "{{ site.theme }}"; + body { font:14px/22px 'Quattrocento Sans', "Helvetica Neue", Helvetica, Arial, sans-serif; color:#666; font-weight:300; margin: 0px; padding:0px 0 20px 0px; - background: url(../images/body-background.png) #eae6d1; + background: #fff; } h1, h2, h3, h4, h5, h6 { @@ -85,9 +87,10 @@ code { color:#efefef; text-shadow: 0px 1px 0px #000; margin: 0 4px; - padding: 2px 6px; + padding: 5px 10px; background: #333; border-radius: 2px; + } pre { @@ -141,15 +144,15 @@ dt { } header { - padding: 25px 20px 40px 20px; - margin: 0; - position: fixed; + padding: 40px 20px 40px 20px; + margin: 40px 0px 0px 0px; + position: relative; top: 0; left:0; right:0; width: 100%; text-align: center; - background: url(../images/background.png) #4276b6; + background: #286282; box-shadow: 1px 0px 2px rgba(0,0,0,.75); z-index:99; -webkit-font-smoothing:antialiased; @@ -157,8 +160,8 @@ header { h1 { font: 40px/48px 'Copse', "Helvetica Neue", Helvetica, Arial, sans-serif; - color: #f3f3f3; - text-shadow: 0px 2px 0px #235796; + color: #fff; + text-shadow: 0px 2px 0px #17384a; margin: 0px; white-space: nowrap; overflow: hidden; @@ -167,144 +170,147 @@ header { -ms-text-overflow: ellipsis; } - p { - color: #d8d8d8; + p{ + color: #fff; text-shadow:rgba(#000, 0.2) 0 1px 0; font-size: 18px; margin: 0px; } } -#banner { - z-index: 100; - left:0; - right:50%; - height: 50px; - margin-right:-382px; +.navbar { position: fixed; - top: 115px; - background: #ffcc00; - border: 1px solid #f0b500; - box-shadow: 0px 1px 3px rgba(0,0,0,.25); - border-radius: 0px 2px 2px 0px; - padding-right: 10px; - - .button { - border: 1px solid #dba500; - /* To change button color, overwrite this line in other button classes*/ - background: linear-gradient(rgb(255, 231, 136), rgb(255, 206, 56)); - border-radius: 2px; - box-shadow: inset 0px 1px 0px rgba(255,255,255,.4), 0px 1px 1px rgba(0,0,0,.1); - background-color: #FFE788; - margin-left: 5px; - padding: 10px 12px; - margin-top: 6px; - line-height:14px; - font-size:14px; - color:#333; - font-weight: bold; - display:inline-block; - text-align:center; + z-index: 100; + top: 0; + width: 100%; + overflow: hidden; + background-color: #fff; + padding: 0; + box-shadow: 1px 0px 5px rgba(0,0,0,.75); +} - &:hover { - background: linear-gradient(rgb(255, 231, 136), rgb(255, 231, 136)); - background-color: #ffeca0; - } +.navbar ul { + list-style: none; + text-align: center; + margin: 0; + width: 100%; + padding: 0; + max-height: 40px; + + li { + display: inline-block; + font-size: 20px; + color: white; + padding: 0px 10px; + text-decoration: none; } +} - .fork { - float:left; - left:50%; - margin-left:0px; - padding: 10px 12px; - margin-top: 6px; - line-height:14px; - font-size:14px; - background-color: #FFE788; - border: 1px solid #dba500; - } +.navbar a { + float: left; + font-size: 20px; + color: #333; + text-align: center; + padding: 10px; + text-decoration: none; - .codeview { - float:left; - left:50%; - margin-left:155px; - padding: 10px 12px; - margin-top: 6px; - line-height:14px; - font-size:14px; - background-color: #FFE788; - border: 1px solid #dba500; + &:hover { + background-color: #F2973C; } +} - .doxygen { - float:left; - left:50%; - margin-left:10px; - padding: 10px 12px; - margin-top: 6px; - line-height:14px; - font-size:14px; - background-color: #FFE788; - } +.dropdown { + float: left; + overflow: hidden; - .codeinfo { - position:fixed; - left:50%; - margin-left:-340px; + &:hover { + background-color: #ddd; } +} - .downloads { - float: right; - margin:0 45px 0 0; - - span { - float:left; - line-height:52px; - font-size:90%; - color:#9d7f0d; - text-transform:uppercase; - text-shadow:rgba(#fff, 0.2) 0 1px 0; - } +.dropdown button { + float: left; + font-size: 20px; + border: none; + outline: none; + color: #333; + padding: 10px 10px 10px 10px; + background-color: inherit; + font-family: inherit; + margin: 0; + + &:hover { + background-color: #F2973C; } +} - ul { - list-style:none; - height:40px; - padding:0; - float: left; - margin-left:10px; +.dropdown-content { + display: none; + position: absolute; + background-color: #333; + z-index: 102; +} - li { - display:inline; +.dropdown-content a { + background-color: #333; + color: white; + padding: 60px 10px 60px 10px; + text-decoration: none; + display: block; + text-align: center; - a.button { - background-color: #FFE788; - } - } + &:hover { + background-color: #666; + } +} + +.dropdown-content .block { + background-color: inherit; + color: white; + text-decoration: none; + text-align: center; + display: block; + float: left; + min-width: 200px; + padding: 10px 0px; + + span { + // text-decoration: underline; + color: #7acdf6; } - #logo { - position:absolute; - height: 36px; - width: 36px; - right:7px; - top:7px; + a { + background-color: inherit; + color: white; display: block; - background: url(../images/octocat-logo.svg); + float: none; + padding: 10px; + font-size: 16px; + + &:hover { + color: #53bbf0; + } } } +.dropdown:hover .dropdown-content { + position: fixed; + display: block; + margin: 40px 0px; + box-shadow: 0px 1px 3px rgba(0,0,0,.75); +} + section { width:590px; padding: 30px 30px 50px 30px; margin: 20px 0; - margin-top: 190px; + margin-top: 20px; position:relative; - background: #fbfbfb; + background: #fff; border-radius: 3px; - border: 1px solid #cbcbcb; - box-shadow: 0px 1px 2px rgba(0,0,0,.09), inset 0px 0px 2px 2px rgba(255,255,255,.5), inset 0 0 5px 5px rgba(255,255,255,.4); + border: none; + box-shadow: none; } small { @@ -314,10 +320,13 @@ small { nav { width: 230px; position: fixed; - top: 220px; + top: 245px; left:50%; margin-left:-580px; text-align: right; + background: #fff; + max-height: 300px; + overflow-y: auto; ul { list-style: none; @@ -399,29 +408,9 @@ footer { } } - #banner { - width: 100%; - - .downloads { - margin-right: 60px; - } - - //.fork { - //} - - .codeinfo { - } - - #logo { - margin-right: 15px; - } - } - section { - border:1px solid #e5e5e5; - border-width:1px 0; - padding:20px auto; - margin: 190px auto 20px; + padding:20px; + margin: 20px auto 20px; max-width: 600px; } @@ -441,7 +430,7 @@ footer { } header { - padding:20px 20px; + padding:80px 20px 0px 20px; margin: 0; h1 { @@ -456,28 +445,8 @@ footer { p { display: none;} } - #banner { - top: 80px; - - .codeinfo { - display: inline-block; - margin-left: 0px; - position:fixed; - left:20px; - } - - /*.fork { - float: left; - display: inline-block; - margin-left: 0px; - // position:fixed; - left:20px; - }*/ - - } - section { - margin-top: 130px; + margin-top: 30px; margin-bottom: 0px; width: auto; } @@ -491,9 +460,8 @@ footer { body { } - header{ - position: relative; - padding: 5px 0px; + header { + padding: 10px 0px, 0px, 0px; min-height: 0px; h1 { @@ -515,6 +483,16 @@ footer { } } +@media print, screen and (max-width: 480px) { + body { + } + + header { + padding: 40px 20px 10px 20px; + min-height: 0px; + } +} + @media print { body { padding:0.4in; @@ -540,6 +518,10 @@ footer { display: none; } + header { + + } + footer { text-align: center; margin: 20px auto; @@ -550,6 +532,3 @@ footer { } } -@import "{{ site.theme }}"; - - diff --git a/docs/assets/images/ini_struct.png b/docs/assets/images/ini_struct.png new file mode 100644 index 0000000000000000000000000000000000000000..c2de35ade04c30560f831268a2ab41d9372cfe7e GIT binary patch literal 30065 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/mtt-functional.png b/docs/assets/images/mtt-functional.png new file mode 100644 index 0000000000000000000000000000000000000000..afb9fe34e2a1dd14b26616457c23ae04f1a490be GIT binary patch literal 106583 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 WdCxCwY~Er8u8p5Xv+F-i%=;I0{DiCk literal 0 HcmV?d00001 diff --git a/docs/pages/community.md b/docs/pages/community.md new file mode 100644 index 000000000..4933fcedb --- /dev/null +++ b/docs/pages/community.md @@ -0,0 +1,22 @@ +# Get involved + +We *want* your feedback. We *want* you to get involved. + +The main web site for the MTT is located [here](http://www.open-mpi.org/projects/mtt/). + +**User-level** questions and comments should generally be sent to the +user's mailing list (mtt-users@open-mpi.org). Because of spam, only +subscribers are allowed to post to this list (ensure that you +subscribe with and post from *exactly* the same e-mail address!). Please subscribe to the +[user's list](https://lists.open-mpi.org/mailman/listinfo/mtt-users). + +**Developer-level** bug reports, questions, and comments should generally +be sent to the developer's mailing list (mtt-devel@open-mpi.org). +Please do not post the same question to both lists. As with the +user's list, only subscribers are allowed to post to the [developer's +list](https://lists.open-mpi.org/mailman/listinfo/mtt-devel). Visit the following web page to subscribe: + +When submitting bug reports to either list, be sure to include as much +extra information as possible. + +Thank you for your time. diff --git a/docs/pages/developer_guide.md b/docs/pages/developer_guide.md new file mode 100644 index 000000000..62270fa89 --- /dev/null +++ b/docs/pages/developer_guide.md @@ -0,0 +1 @@ +# COMING SOON diff --git a/docs/pages/doxygen.md b/docs/pages/doxygen.md new file mode 100644 index 000000000..62270fa89 --- /dev/null +++ b/docs/pages/doxygen.md @@ -0,0 +1 @@ +# COMING SOON diff --git a/docs/pages/faq.md b/docs/pages/faq.md new file mode 100644 index 000000000..62270fa89 --- /dev/null +++ b/docs/pages/faq.md @@ -0,0 +1 @@ +# COMING SOON diff --git a/docs/pages/ini_docs.md b/docs/pages/ini_docs.md new file mode 100644 index 000000000..0a1df24b2 --- /dev/null +++ b/docs/pages/ini_docs.md @@ -0,0 +1,68 @@ +INI Files Overview +---------- +MTT uses .ini files as execution scripts. An .ini file is a simple text file with a structure composed of sections, names, and values. + +MTT .ini files includes unique features: + - Sections names with embedded Stage Names + - Stage names are a nifty mechanism for the test harness to execute stages in a specific order and with a specific purpose + +Example: +![](/mtt/assets/images/ini_struct.png) + +Setup of INI files: +--- +The file is split up into sections for each phase plus a global parameters section. Each section is denoted with strings inside brackets and parameters are specified as "key=value" pair. + +Stages +--- +The 12 MTT stages are executed according to an ordering as shown in the table. The lower the ordering, the sooner the stage is executed. + +|Ordering | Stage Name | Description | +| :-----: | :--------------: | ------------------------------------------------------------------------------------------------------------------------------------------ | +| 0 | MTTDefaults | Collect defaults for this test definition. | +| 50 | BIOS | Select BIOS setting to be applied after the next reboot. If user specified setting, scan inventory to check if match is found. | +| 100 | Firmware | Flash specified FW versions; if user specified FW versions, scan inventory to check if matches are found. | +| 200 | Provision | Select an image and reboot target nodes. If user specified an image, scan inventory to check if match is found. | +| 210 | Profile | Collect information on system state. Also details configured system prior to tests being run. | +| 300 | MiddlewareGet | Get requested middleware. (Downloading a git repo is the typical usage model) | +| 400 | MiddlewareBuild | Build and install requested middleware. Middleware usage is optional and will be added to the LD_LIBRARY_PATH for the stage. | +| 450 | TestGet | Get the tests. (Downloading a git repo is the typical usage model) | +| 475 | TestBuild | Compile the tests; user can specify the modules to be loaded prior to tests building and be unloaded after the stage completes. | +| 490 | LauncherDefaults | Collect parameters passed to test launcher; these include job names and job options. | +| 500 | TestRun | Run the tests; tests are selected from the test library by matching tags associated with each test. | +| 600 | Reporter | Report the test results. Test results can be sent to the console, to a text file, to a Junit XML file, and/or to the test result database. | + +Parameter Passing +--- +In general, parameters for each MTT stage are set in the .ini file under the corresponding section. However, there are exceptions: + +### Environment Variables +The MTT parser has a specific syntax to reference environment variables. This is useful when writing modular .ini files that execute with different behavior for a given test cycle. +``` +[TestGet:Environ] +plugin = Environ +KERNEL_RELEASE = ${ENV:KERNEL_VERSION} +``` +In the above example, KERNEL_VERSION is grabbed from the environment and passed to the Environ plugin. + +### Accessing Stage Log +The + +Expectation of Test Content Behavior +--- +Test content source code/binaries can come from a variety of source. The primary requirement will be a binary that can be run on assigned nodes. Binaries can be serial, shared-memory parallel, or distributed-memory parallel codes. + +Test content is expected to produce a per-test summary of its results in its standard process exit status (0 for success; non-zero for failure) which is the primary test result. Additional results include either stdout or stderr. Additional options can be set to tell MTT what the expected successful return code should be if the binary does not produce the standard exit status -- "fail_returncodes" option in SLURM, OpenMPI, and ALPS plugins and "fail_returncode" option in the Shell plugin. + +All test content output to stdout and stderr will be captured as a part of the raw test results and stored in the results database. + +If content does not return non-zero status but does have a simple keyword to search you can easily pass the results to tee and then parse them with sed to issue a non-zero return code: + +``run_mytest.sh | tee results.txt && sed -i '/FAIL/q 1' results.txt`` + +Certain classes of test content such as benchmarks will produce more valuable results as a performance measure and not as a simple pass/fail result. These cases will need in-test self checking support. + +Ok, I Have a Test Script: What Next? +--- +### TestGet, TestRun, & Reporter +Start with the TestGet, TestRun, and Reporter stages. There three stages enable you to copy your test to the scratch area, execute your test, and report back the status of the test. diff --git a/docs/pages/plugins_docs.md b/docs/pages/plugins_docs.md new file mode 100644 index 000000000..7fe0618f4 --- /dev/null +++ b/docs/pages/plugins_docs.md @@ -0,0 +1,177 @@ +# MTT Plugin Overview +To make the tool more modular and easier to generate tests, MTT makes use of the yapsy plugin system for python. Each stage that executes an .ini file makes use of at least one plugin. + +Example: +``` +[TestGet:HelloWorld] +plugin = Copytree +src = /opt/mtt/samples/python/ +``` + +Plugins are divided into categories: +- Stages: Stages of test execution + - MTTDefaults + - BIOS + - Firmware + - Provision + - Profile + - MiddlewareGet + - MiddlewareBuild + - TestGet + - TestBuild + - LauncherDefaults + - TestRun + - Reporter +- System: Plugins essential for MTT to run +- Tools: Plugins required by Stages + - The Tools plugins are split into modules: + - Build + - CNC + - Executor + - Fetch + - Harraser + - Launcher + - Version +- Utilities: Plugins used by the MTT framework + +You can see the hierarchy where the plugins are defined along with their ordering on [Doxygen](/mtt/html/inherits.html). + +### Stages +The stages, as mentioned above, are used for stages. Some stages may contain additional plugins (i.e. [Reporter](https://github.com/open-mpi/mtt/tree/master/pylib/Stages/Reporter)). Each plugin in the Stages category has a set ordering which dictates what order the plugins should run. + +A list of stages and their ordering can be found on [Doxygen](/mtt/html/group__Stages.html) + +### System +These plugins are essential for MTT to run. However, they are not actually plugins although we treat them as such. They simply extend the object class. For explanation purposes, we will continue to refer to them as plugins. +- [LoadClasses.py](https://github.com/open-mpi/mtt/blob/master/pylib/System/LoadClasses.py) +- [TestDef.py](https://github.com/open-mpi/mtt/blob/master/pylib/System/TestDef.py) + +LoadClasses is called by TestDef and loads all plugins by going through the directories and loading plugins to memory. + +TestDef is passed to all other plugins so that they have access to the log, to global plugins (i.e. logger, modcmd, execmd, etc. that are saved to TestDef so they are accessible by other plugins) and to the options. This plugin is important for several reasons: +- It is the center point for setting configurations for MTT +- Sets the configuration for tests +- Logs results +- Loads plugins by called LoadClasses +- Starts execution of tests by calling one of the [Executor](https://github.com/open-mpi/mtt/tree/master/pylib/Tools/Executor) plugins. The [sequential](https://github.com/open-mpi/mtt/blob/master/pylib/Tools/Executor/sequential.py) plugin is currently the default plugin; however, the [combinatorial](https://github.com/open-mpi/mtt/blob/master/pylib/Tools/Executor/combinatorial.py) plugin can be set by using the ```--executor=combinatorial``` flag. +- Will add two hidden sections to ConfigParser (ENV and LOG) where environment variables are stuffed into ENV and log results from other plugins are added to LOG. + - [ConfigParser](https://docs.python.org/3/library/configparser.html) is a python library for parsing INI files + +### Tools +The tool plugins are separated into modules that have no ordering. These plugins are required by the Stage plugins. + +A list of available modules and their modules along with descriptions of what they do are found on [Doxygen](/mtt/html/group__Tools.html). + +### Utilities +Utility plugins are used by the MTT framework. Like the tool plugins, there is no ordering for plugins in the Utilities category. + +A list of Utility plugins can be found on [Doxygen](/mtt/html/group__Utilities.html). + + +# Plugin Ingredients +Each plugin is composed of two files. A yapsy-plugin file and a python file. Both of these are required when you are creating your own plugin so that MTT's plugin manager can identify where the files are located and how to connect them to the plugin framework. + +## Yapsy-Plugin Config File +A yapsy-plugin requires a few key elements: +- Name of the plugin +- Author of the plugin +- Short plugin description +- Plugin version + +## Python file +The python file provides the execution phase of the plugin. There are a few requirements for the python file. + +Also, a key note is that while some plugins will only run in a certain stage, not all plugins have such a requirement (i.e. [Shell.py](https://github.com/open-mpi/mtt/blob/master/pylib/Tools/Build/Shell.py)). + + +### Doxygen Documentation +To make sure the plugin with all its parameters are properly recorded in Doxygen, we require a certain syntax. +``` +# @addtogroup +# @{ +# @addtogroup +# @section +# Description of plugin! +# @param option_name Description of option +# @param another_option Additional params follow same syntax +# @} +``` + +### Imports +To integrate the python file into the plugin framework, there are few required imports. These imports are based on the type of plugin that you are implementing. There are four main types of plugins in MTT. + +- Stage Plugins +```from import * ``` +- System Plugins + - These are not plugins, but technically classes that extend the Python object class. However, they are treated as plugins, hence why they are listed here. +- Tools Plugins +``` from import * ``` +- Utilities Plugins +``` from BaseMTTUtility import * ``` + +### Options +Each plugin has a set of options that you can configure via an INI file that controls their operation. + +These are set with the following syntax: +``` +self.options = {} +self.options['option'] = (None, 'Description') +``` +Options are the only method an INI file has to control the plugin. Options are defined in the ```__init__``` function of the plugin class. + +### Required Functions +**Init Function** +The init function needs to be defined. This is where the INI file will configure the plugin through the option object. +``` +def __init__(self): + # Define options +``` +**Print Name** +Return the name of the function. This function is required by MTT to display the plugin in use in the logs. +``` +def print_name(self): + return "Name of Plugin" +``` +**Activate Function** +This function is **not** necessary, but may be useful when the plugin activates. The following example models the structure of the function. Add in additional functionality as needed. +``` +def activate(self): + if not self.activated: + IPlugin.activate(self) + self.activated = True +``` +**Deactivate Function** +This function is **not** necessary, but may be useful when the plugin deactivates (i.e. acts like a destructor function for cleaning up). The following example models the structure of the function. Add in additional functionality as needed. +``` +def deactivate(self): + if self.activates: + IPlugin.deactivate(self) + self.activated = False +``` + **Execute Function** + This function controls the execution of the plugin. There are a couple key things that this function needs to do. For a complete example, please view [Shell.py](https://github.com/open-mpi/mtt/blob/master/pylib/Tools/Build/Shell.py). + +- Parse Options: +``` +testDef.parseOptions(log, self.options, keyvals, cmds) +``` +- Verify cmds have the correct format and error if they do not. Errors would look like this: +``` +log['status'] = 1 # 0 on success, otherwise non-zero +log['stderr'] = "error that happened" +``` +- Return "location" to log: (this could be inherited from the parent log) +``` +log['location'] = +``` +- Execute plugin functionality. For example, in the Shell plugin, it will execute a shell command. Another thing to note is that ```execmd``` is a utility plugin (executeCmd plugin) which is meant to be called in the context of other plugins and **not** to be called by an INI file. +``` +status,stdout,stderr,time = testDef.execmd.execute(cmds, cmdargs, testDef) +``` +- Send output of plugin to log. Some log information is required to be filled out for other plugins (i.e. Build Stage Plugins **need** to record ```log['compiler']``` and ```log['mpi_info']```). +``` +log['status'] = 0 # if success, otherwise non-zero +log['stdout'] = output of plugin +log['stderr'] = record any errors +log['location'] = location # record location for children plugins +``` diff --git a/docs/pages/resources.md b/docs/pages/resources.md new file mode 100644 index 000000000..29e4c693f --- /dev/null +++ b/docs/pages/resources.md @@ -0,0 +1,5 @@ +Resources +--------- + +To learn more about the yapsy-plugin system, please read more here: +http://yapsy.sourceforge.net/ diff --git a/docs/pages/tips_and_tricks.md b/docs/pages/tips_and_tricks.md new file mode 100644 index 000000000..ce287b195 --- /dev/null +++ b/docs/pages/tips_and_tricks.md @@ -0,0 +1,30 @@ +# INI File Creation +MTT offers a high degree of flexibility by allowing phases to be effectively parameterized allowing for multiple executions of each phase. + +Caution needs to be executed when creating an INI file that will not take days (or weeks!) to complete. Use the ```--print-time``` option to see how long each phase is taking to help tune your INI file. + +# Run Time Execution +We recommend running with `--verbose`. This provides a decent amount of output that confirms that most MTT things are running. However, if you run into weird issues that cannot be explained, run with `--debug`. This will provide a _lot_ of output (you'll want to save both stdout and stderr into a file for later analysis). + +# Compiler Configuration +Some compilers (such as the Intel compilers) require additional environment variables such as PATH and LD_LIBRARY_PATH to be set properly in order to find their relevant parts. It is easiest to simply set these values _before_ invoking the MTT client, but it is also possible to set them within the INI file directly (so that you don't have to worry about local environments). However, the syntax is a little odd, so it's worth describing here: +``` +[MPI Install: Intel compiler] +...all the other fields... +setenv = PATH /path/to/intel/compiler/bin:/usr/bin/:...rest of path +setenv = LD_LIBRARY_PATH /path/to/intel/compiler/lib:...rest of LD path +``` +# MPI Install Errors +Sometimes MTT finds a problem in a middleware install, but a human wants to go examine it manually. When MTT installs a middleware under its scratch tree, it will automatically drop two files -- one for sh-flavored shells and one for csh-flavored shells -- that set the PATH and LD_LIBRARY_PATH to get to the middleware install. The exact location of these files depends on the section names in your INI file and the exact version number of the MPI in question. Specifically, these files will be in: +``` +/installs////mpi_installed_vars.sh +/installs////mpi_installed_vars.csh +``` + +Hence, you can source these files like this (assuming a csh-flavored shell): +``` +shell% cd /installs/// +shell% source mpi_installed_vars.csh +``` + +Mpicc, mpirun, etc. will then be in your PATH, and the appropriate libraries will be in your LD_LIBRARY_PATH. Additionally, the environment variable MPI_ROOT will be set that points to the top-level installation directory for the middlewareBuild. This is useful with Open MPI's ```--prefix``` option to mpirun, for example. Note that _all_ the files related to the testing of that MPI are under this tree -- the source tree, the tests, etc. So you can go examine the entire test -- not just put the MPI in question in your path. diff --git a/docs/pages/travis.md b/docs/pages/travis.md new file mode 100644 index 000000000..62270fa89 --- /dev/null +++ b/docs/pages/travis.md @@ -0,0 +1 @@ +# COMING SOON diff --git a/docs/pages/user_guide.md b/docs/pages/user_guide.md new file mode 100644 index 000000000..62270fa89 --- /dev/null +++ b/docs/pages/user_guide.md @@ -0,0 +1 @@ +# COMING SOON diff --git a/pylib/Stages/BIOS/BIOSMTTStage.py b/pylib/Stages/BIOS/BIOSMTTStage.py index 5b06b349b..65ad73866 100644 --- a/pylib/Stages/BIOS/BIOSMTTStage.py +++ b/pylib/Stages/BIOS/BIOSMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup BIOS -# ordering 50 +# [Ordering 50] BIOS flash and query stage # @} class BIOSMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Stages/Firmware/FirmwareMTTStage.py b/pylib/Stages/Firmware/FirmwareMTTStage.py index 908bfe302..10871ec85 100644 --- a/pylib/Stages/Firmware/FirmwareMTTStage.py +++ b/pylib/Stages/Firmware/FirmwareMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup Firmware -# ordering 100 +# [Ordering 100] Firmware flash and query stage # @} class FirmwareMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Stages/LauncherDefaults/LauncherDefaultsMTTStage.py b/pylib/Stages/LauncherDefaults/LauncherDefaultsMTTStage.py index 1e7c68255..8e1bd8540 100644 --- a/pylib/Stages/LauncherDefaults/LauncherDefaultsMTTStage.py +++ b/pylib/Stages/LauncherDefaults/LauncherDefaultsMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup LauncherDefaults -# ordering 490 +# [Ordering 490] Allow a user to set default values for a specific launcher # @} class LauncherDefaultsMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Stages/MTTDefaults/DefaultMTTDefaults.py b/pylib/Stages/MTTDefaults/DefaultMTTDefaults.py index 6933aa4f4..4fabc48a4 100644 --- a/pylib/Stages/MTTDefaults/DefaultMTTDefaults.py +++ b/pylib/Stages/MTTDefaults/DefaultMTTDefaults.py @@ -17,6 +17,7 @@ # @{ # @addtogroup MTTDefaults # @section DefaultMTTDefaults +# Store any provided default MTT settings # @param trial Use when testing your MTT client setup; results that are generated and submitted to the database are marked as \"trials\" and are not included in normal reporting. # @param scratch Specify the DIRECTORY under which scratch files are to be stored # @param description Provide a brief title/description to be included in the log for this test diff --git a/pylib/Stages/MTTDefaults/MTTDefaultsMTTStage.py b/pylib/Stages/MTTDefaults/MTTDefaultsMTTStage.py index 972fe052c..be9a49463 100644 --- a/pylib/Stages/MTTDefaults/MTTDefaultsMTTStage.py +++ b/pylib/Stages/MTTDefaults/MTTDefaultsMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup MTTDefaults -# ordering 0 +# [Ordering 0] Set MTT defaults for this test definition # @} class MTTDefaultsMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Stages/MiddlewareBuild/MiddlewareBuildMTTStage.py b/pylib/Stages/MiddlewareBuild/MiddlewareBuildMTTStage.py index 722386047..77ba3c727 100644 --- a/pylib/Stages/MiddlewareBuild/MiddlewareBuildMTTStage.py +++ b/pylib/Stages/MiddlewareBuild/MiddlewareBuildMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup MiddlewareBuild -# ordering 400 +# [Ordering 400] Stage for building middleware such as MPI # @} class MiddlewareBuildMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Stages/MiddlewareGet/MiddlewareGetMTTStage.py b/pylib/Stages/MiddlewareGet/MiddlewareGetMTTStage.py index 65d55d29f..6d11318ec 100644 --- a/pylib/Stages/MiddlewareGet/MiddlewareGetMTTStage.py +++ b/pylib/Stages/MiddlewareGet/MiddlewareGetMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup MiddlewareGet -# ordering 300 +# [Ordering 300] Stage for getting middleware source code # @} class MiddlewareGetMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Stages/Profile/DefaultProfile.py b/pylib/Stages/Profile/DefaultProfile.py index aaa0ca9d2..dcba40551 100644 --- a/pylib/Stages/Profile/DefaultProfile.py +++ b/pylib/Stages/Profile/DefaultProfile.py @@ -16,6 +16,7 @@ # @{ # @addtogroup Profile # @section DefaultProfile +# Collect hardware and software profile of the system # @param kernelName Kernel name # @param kernelRelease Kernel release string # @param kernelVersion Kernel version string diff --git a/pylib/Stages/Profile/DefaultProfile.yapsy-plugin b/pylib/Stages/Profile/DefaultProfile.yapsy-plugin index b0709da12..8e92f4bbd 100644 --- a/pylib/Stages/Profile/DefaultProfile.yapsy-plugin +++ b/pylib/Stages/Profile/DefaultProfile.yapsy-plugin @@ -15,4 +15,4 @@ Module = DefaultProfile Author = Ralph Castain Version = 0.1 Website = N/A -Description = Collect hardware ands software profile of the system +Description = Collect hardware and software profile of the system diff --git a/pylib/Stages/Profile/ProfileMTTStage.py b/pylib/Stages/Profile/ProfileMTTStage.py index fb2afcb01..fda4010b3 100644 --- a/pylib/Stages/Profile/ProfileMTTStage.py +++ b/pylib/Stages/Profile/ProfileMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup Profile -# ordering 210 +# [Ordering 210] Stage for profiling the system upon which the tests will be conducted # @} class ProfileMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Stages/Provisioning/ProvisionMTTStage.py b/pylib/Stages/Provisioning/ProvisionMTTStage.py index f196d7542..feee5f2c7 100644 --- a/pylib/Stages/Provisioning/ProvisionMTTStage.py +++ b/pylib/Stages/Provisioning/ProvisionMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup Provision -# ordering 200 +# [Ordering 200] Provisioning stage # @} class ProvisionMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Stages/Provisioning/WWulf3.py b/pylib/Stages/Provisioning/WWulf3.py index 7f46648b1..20e3874f9 100644 --- a/pylib/Stages/Provisioning/WWulf3.py +++ b/pylib/Stages/Provisioning/WWulf3.py @@ -16,6 +16,7 @@ # @{ # @addtogroup Provision # @section WWulf3 +# Plugin for provisioning nodes using the Warewulf v3 image manager # @param target List of remote host names or LAN interfaces to be provisioned # @param image Name of image to be instantiated # @param bootstrap Name of bootstrap to be used diff --git a/pylib/Stages/Reporter/IUDatabase.py b/pylib/Stages/Reporter/IUDatabase.py index b8f92ef43..16c495af0 100755 --- a/pylib/Stages/Reporter/IUDatabase.py +++ b/pylib/Stages/Reporter/IUDatabase.py @@ -28,6 +28,7 @@ # @{ # @addtogroup Reporter # @section IUDatabase +# MTT Database reporter plugin for the legacy IU submission server # @param realm Database name # @param username Username to be used for submitting data # @param password Password for that username diff --git a/pylib/Stages/Reporter/JunitXML.py b/pylib/Stages/Reporter/JunitXML.py index 9564c6f0c..7cba4c187 100644 --- a/pylib/Stages/Reporter/JunitXML.py +++ b/pylib/Stages/Reporter/JunitXML.py @@ -19,6 +19,7 @@ # @{ # @addtogroup Reporter # @section JunitXML +# Junit XML plugin # @param filename Name of the file into which the report is to be written # @param textwrap Max line length before wrapping # @} diff --git a/pylib/Stages/Reporter/ReporterMTTStage.py b/pylib/Stages/Reporter/ReporterMTTStage.py index 7b480a494..380671606 100644 --- a/pylib/Stages/Reporter/ReporterMTTStage.py +++ b/pylib/Stages/Reporter/ReporterMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup Reporter -# ordering 600 +# [Ordering 600] Report tests results stage # @} class ReporterMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Stages/Reporter/TextFile.py b/pylib/Stages/Reporter/TextFile.py index 26da40308..486753460 100755 --- a/pylib/Stages/Reporter/TextFile.py +++ b/pylib/Stages/Reporter/TextFile.py @@ -17,6 +17,7 @@ # @{ # @addtogroup Reporter # @section TextFile +# File reporter plugin # @param filename Name of the file into which the report is to be written # @param summary_footer Footer to be placed at bottom of summary # @param detail_header Header to be put at top of detail report diff --git a/pylib/Stages/TestBuild/DefaultTestBuild.py b/pylib/Stages/TestBuild/DefaultTestBuild.py index 04db93e96..695c52a21 100644 --- a/pylib/Stages/TestBuild/DefaultTestBuild.py +++ b/pylib/Stages/TestBuild/DefaultTestBuild.py @@ -16,6 +16,7 @@ # @{ # @addtogroup TestBuild # @section DefaultTestBuild +# Build tools using Autotools plus an installed middleware version # @param middleware Middleware stage that these tests are to be built against # @param build_in_place Build tests in current location (no prefix or install) # @param merge_stdout_stderr Merge stdout and stderr into one output stream diff --git a/pylib/Stages/TestBuild/TestBuildMTTStage.py b/pylib/Stages/TestBuild/TestBuildMTTStage.py index 888ba401a..c5bb8575a 100644 --- a/pylib/Stages/TestBuild/TestBuildMTTStage.py +++ b/pylib/Stages/TestBuild/TestBuildMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup TestBuild -# ordering 475 +# [Ordering 475] Build test software package # @} class TestBuildMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Stages/TestGet/TestGetMTTStage.py b/pylib/Stages/TestGet/TestGetMTTStage.py index 25fbf58c0..8a56bf673 100644 --- a/pylib/Stages/TestGet/TestGetMTTStage.py +++ b/pylib/Stages/TestGet/TestGetMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup TestGet -# ordering 450 +# [Ordering 450] Get test software package # @} class TestGetMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Stages/TestRun/TestRunMTTStage.py b/pylib/Stages/TestRun/TestRunMTTStage.py index fa3e87518..98ce6abf6 100644 --- a/pylib/Stages/TestRun/TestRunMTTStage.py +++ b/pylib/Stages/TestRun/TestRunMTTStage.py @@ -14,7 +14,7 @@ ## @addtogroup Stages # @{ # @addtogroup TestRun -# ordering 500 +# [Ordering 500] Run test software package # @} class TestRunMTTStage(IPlugin): def __init__(self): diff --git a/pylib/Tools/Build/Autotools.py b/pylib/Tools/Build/Autotools.py index faca720df..dc261236b 100644 --- a/pylib/Tools/Build/Autotools.py +++ b/pylib/Tools/Build/Autotools.py @@ -20,6 +20,7 @@ # @{ # @addtogroup Build # @section Autotools +# Run typical autotools commands to configure and build a software package # @param middleware Middleware stage that these tests are to be built against # @param parent Section that precedes this one in the dependency tree # @param autogen_cmd Command to be executed to setup the configure script, usually called autogen.sh or autogen.pl diff --git a/pylib/Tools/Build/Hostfile.py b/pylib/Tools/Build/Hostfile.py index f80ef61a2..27ff57057 100644 --- a/pylib/Tools/Build/Hostfile.py +++ b/pylib/Tools/Build/Hostfile.py @@ -20,6 +20,7 @@ # @{ # @addtogroup Build # @section Hostfile +# Builds a hostfile based on a nodelist # @param parent Section that precedes this one in the dependency tree # @param nodelist list of nodes to create hostfile from # @param hostfile name of hostfile to generate diff --git a/pylib/Tools/Build/Shell.py b/pylib/Tools/Build/Shell.py index 0916d5acb..81cb08707 100644 --- a/pylib/Tools/Build/Shell.py +++ b/pylib/Tools/Build/Shell.py @@ -18,6 +18,7 @@ # @{ # @addtogroup Build # @section Shell +# Run shell commands to configure and build a software package # @param middleware Middleware stage that these tests are to be built against # @param command Command to execute # @param parent Section that precedes this one in the dependency tree diff --git a/pylib/Tools/CNC/IPMITool.py b/pylib/Tools/CNC/IPMITool.py index aefc8be95..6f4cd0094 100644 --- a/pylib/Tools/CNC/IPMITool.py +++ b/pylib/Tools/CNC/IPMITool.py @@ -133,6 +133,7 @@ def run(self): # @{ # @addtogroup CNC # @section IPMITool +# Interface to the ipmitool cmd line # @param target List of remote host names or LAN interfaces to monitor during reset operations # @param controller List of IP addresses of remote node controllers/BMCs # @param username Remote session username diff --git a/pylib/Tools/Executor/combinatorial.py b/pylib/Tools/Executor/combinatorial.py index d9dfb693f..7904347fd 100644 --- a/pylib/Tools/Executor/combinatorial.py +++ b/pylib/Tools/Executor/combinatorial.py @@ -28,6 +28,7 @@ # @{ # @addtogroup Executor # @section CombinatorialEx +# Combinatorial execution executor # @} class CombinatorialEx(ExecutorMTTTool): diff --git a/pylib/Tools/Executor/sequential.py b/pylib/Tools/Executor/sequential.py index 6684639c4..7ad186b89 100755 --- a/pylib/Tools/Executor/sequential.py +++ b/pylib/Tools/Executor/sequential.py @@ -36,6 +36,7 @@ # @{ # @addtogroup Executor # @section SequentialEx +# Sequential execution executor # @} class SequentialEx(ExecutorMTTTool): diff --git a/pylib/Tools/Fetch/AlreadyInstalled.py b/pylib/Tools/Fetch/AlreadyInstalled.py index be0269a57..6d62a0557 100644 --- a/pylib/Tools/Fetch/AlreadyInstalled.py +++ b/pylib/Tools/Fetch/AlreadyInstalled.py @@ -17,6 +17,7 @@ # @{ # @addtogroup Fetch # @section AlreadyInstalled +# No-op plugin for using existing middleware installation # @param exec Executable that should be in path # @param module Modules (or lmod modules) to be loaded for accessing this package # @} diff --git a/pylib/Tools/Fetch/Git.py b/pylib/Tools/Fetch/Git.py index 9d783991d..c9f761a80 100644 --- a/pylib/Tools/Fetch/Git.py +++ b/pylib/Tools/Fetch/Git.py @@ -20,6 +20,7 @@ # @{ # @addtogroup Fetch # @section Git +# Plugin for getting software via Git # @param module Modules (or lmod modules) to be loaded for accessing this package # @param url URL to access the repository # @param username Username required for accessing the repository diff --git a/pylib/Tools/Fetch/OMPI_Snapshot.py b/pylib/Tools/Fetch/OMPI_Snapshot.py index 881f18cd9..242f21799 100644 --- a/pylib/Tools/Fetch/OMPI_Snapshot.py +++ b/pylib/Tools/Fetch/OMPI_Snapshot.py @@ -24,6 +24,7 @@ # @{ # @addtogroup Fetch # @section OMPI_Snapshot +# Plugin for getting software via OMPI Nightly tarballs # @param url URL to access the OMPI nightly tarball (e.g. https://www.open-mpi.org/nightly/v2.x) # @param version_file optional file containing name of most recent tarball version tested # @param mpi_name optional name for the OMPI snapshot tarball diff --git a/pylib/Tools/Harasser/Harasser.py b/pylib/Tools/Harasser/Harasser.py index 1c9c898a7..8a2b1bdca 100644 --- a/pylib/Tools/Harasser/Harasser.py +++ b/pylib/Tools/Harasser/Harasser.py @@ -20,6 +20,7 @@ # @{ # @addtogroup Harasser # @section Harasser +# Run harasser scripts while test-content is running # @param trigger_scripts Scripts to run to launch harassers # @param stop_scripts Scripts to run to stop and clean-up harassers # @param join_timeout Seconds to wait for process to finish diff --git a/pylib/Tools/Launcher/ALPS.py b/pylib/Tools/Launcher/ALPS.py index ae6ff963c..5cabb919f 100644 --- a/pylib/Tools/Launcher/ALPS.py +++ b/pylib/Tools/Launcher/ALPS.py @@ -17,6 +17,7 @@ # @{ # @addtogroup Launcher # @section ALPS +# Plugin for using ALPS to launch tests # @param hostfile The hostfile for OpenMPI to use # @param command Command for executing the application # @param np Number of processes to run diff --git a/pylib/Tools/Launcher/OpenMPI.py b/pylib/Tools/Launcher/OpenMPI.py index 700472a0b..a3352bb50 100644 --- a/pylib/Tools/Launcher/OpenMPI.py +++ b/pylib/Tools/Launcher/OpenMPI.py @@ -19,6 +19,7 @@ # @{ # @addtogroup Launcher # @section OpenMPI +# Plugin for using the Open MPI mpirun launch tool # @param hostfile The hostfile for OpenMPI to use # @param command Command for executing the application # @param np Number of processes to run diff --git a/pylib/Tools/Launcher/SLURM.py b/pylib/Tools/Launcher/SLURM.py index 13705d450..7d78d81fe 100644 --- a/pylib/Tools/Launcher/SLURM.py +++ b/pylib/Tools/Launcher/SLURM.py @@ -17,6 +17,7 @@ # @{ # @addtogroup Launcher # @section SLURM +# Plugin for using SLURM to launch tests # @param hostfile The hostfile for OpenMPI to use # @param command Command for executing the application # @param np Number of processes to run diff --git a/pylib/Tools/Version/MTTVersionPlugin.py b/pylib/Tools/Version/MTTVersionPlugin.py index 583b318b7..deee3ab5a 100644 --- a/pylib/Tools/Version/MTTVersionPlugin.py +++ b/pylib/Tools/Version/MTTVersionPlugin.py @@ -29,6 +29,7 @@ # @{ # @addtogroup Version # @section MTTVersionPlugin +# A simple plugin for returning the MTT Version # @} class MTTVersionPlugin(VersionMTTTool): diff --git a/pylib/Utilities/Compilers.py b/pylib/Utilities/Compilers.py index 59eaccb0f..df499d737 100644 --- a/pylib/Utilities/Compilers.py +++ b/pylib/Utilities/Compilers.py @@ -15,6 +15,7 @@ ## @addtogroup Utilities # @{ # @section Compilers +# Identify the type and version of compilers in-use # @} class Compilers(BaseMTTUtility): def __init__(self): diff --git a/pylib/Utilities/Copytree.py b/pylib/Utilities/Copytree.py index 2eb65c9c2..6aa156a56 100644 --- a/pylib/Utilities/Copytree.py +++ b/pylib/Utilities/Copytree.py @@ -18,6 +18,7 @@ ## @addtogroup Utilities # @{ # @section Copytree +# Copy a directory tree from source to the same relative loation under the MTT scratch directory # @param src The top directory of the tree to be copied # @param preserve_symlinks Preserve symlinks instead of copying the contents # @param preserve_directory Copies directory instead of contents diff --git a/pylib/Utilities/Environ.py b/pylib/Utilities/Environ.py index 62805b90d..a246566db 100644 --- a/pylib/Utilities/Environ.py +++ b/pylib/Utilities/Environ.py @@ -16,6 +16,7 @@ ## @addtogroup Utilities # @{ # @section Environ +# Set environment variables # @} class Environ(BaseMTTUtility): def __init__(self): diff --git a/pylib/Utilities/ExecuteCmd.py b/pylib/Utilities/ExecuteCmd.py index cc361c9e1..f027dbc01 100644 --- a/pylib/Utilities/ExecuteCmd.py +++ b/pylib/Utilities/ExecuteCmd.py @@ -20,6 +20,7 @@ ## @addtogroup Utilities # @{ # @section ExecuteCmd +# Execute a command and capture its stdout and stderr # @} class ExecuteCmd(BaseMTTUtility): def __init__(self): diff --git a/pylib/Utilities/Logger.py b/pylib/Utilities/Logger.py index 26582ef1a..31960bbd6 100644 --- a/pylib/Utilities/Logger.py +++ b/pylib/Utilities/Logger.py @@ -17,6 +17,7 @@ ## @addtogroup Utilities # @{ # @section Logger +# Log results and provide debug output when directed # @} class Logger(BaseMTTUtility): def __init__(self): diff --git a/pylib/Utilities/MPIVersion.py b/pylib/Utilities/MPIVersion.py index 32e7c2c7c..9dc9b808f 100644 --- a/pylib/Utilities/MPIVersion.py +++ b/pylib/Utilities/MPIVersion.py @@ -16,6 +16,7 @@ ## @addtogroup Utilities # @{ # @section MPIVersion +# Identify the name and version of MPI in-use # @} class MPIVersion(BaseMTTUtility): def __init__(self): diff --git a/pylib/Utilities/ModuleCmd.py b/pylib/Utilities/ModuleCmd.py index 4cb2eae6d..1b7f8a24e 100644 --- a/pylib/Utilities/ModuleCmd.py +++ b/pylib/Utilities/ModuleCmd.py @@ -20,6 +20,7 @@ ## @addtogroup Utilities # @{ # @section ModuleCmd +# Load/Unload an environmental module # @} class ModuleCmd(BaseMTTUtility): def __init__(self): diff --git a/pylib/Utilities/Watchdog.py b/pylib/Utilities/Watchdog.py index d9459d974..12d8f69ed 100644 --- a/pylib/Utilities/Watchdog.py +++ b/pylib/Utilities/Watchdog.py @@ -22,6 +22,7 @@ ## @addtogroup Utilities # @{ # @section Watchdog +# Generate and exception after a given amount of time # @param timeout Time in seconds before generating exception # @} class Watchdog(BaseMTTUtility):