From ff14ade21edde8f2c22be73c87683d4365b62dc9 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Thu, 14 Mar 2024 17:09:40 -0700 Subject: [PATCH 01/46] Adding python scripts to manage baseline io --- geos_ats_package/geos_ats/baseline_io.py | 106 +++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 geos_ats_package/geos_ats/baseline_io.py diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py new file mode 100644 index 0000000..d554800 --- /dev/null +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -0,0 +1,106 @@ +import os +import logging +import tempfile +import shutil +from google.cloud import storage + +logger = logging.getLogger( 'geos_ats' ) + + +def download_baselines( bucket_name, blob_name, baseline_path, force_redownload=False ): + """ + Download and unpack baselines from GCP to the local machine + + Args: + bucket_name (str): Name of the GCP bucket + blob_name (str): Name of the baseline blob + baseline_path (str): Path to unpack the baselines + """ + # Setup + baseline_path = os.path.abspath( os.path.expanduser( baseline_path ) ) + status_path = os.path.join( baseline_path, '.blob_name' ) + + # Check to see if the baselines are already downloaded + logger.info( 'Checking for existing baseline files...' ) + if os.path.isdir( baseline_path ): + logger.info( f'Target baseline directory already exists: {baseline_path}' ) + if os.path.isfile( status_path ): + last_blob_name = open( status_path, 'r' ).read() + if ( blob_name == last_blob_name ) and not force_redownload: + logger.info( f'Target baselines are already downloaded: {blob_name}' ) + logger.info( 'To re-download these files, run with the force_redownload option' ) + return + + logger.info( 'Deleting old baselines...' ) + shutil.rmtree( baseline_path ) + + else: + os.makedirs( os.path.dirname( baseline_path ), exist_ok=True ) + + # Download new baselines + try: + logger.info( 'Downloading baselines...' ) + tmpdir = tempfile.TemporaryDirectory() + archive_name = os.path.join( tmpdir.name, 'baselines.tar.gz' ) + bucket = storage_client.bucket( bucket_name ) + blob = bucket.blob( blob_name ) + blob.download_to_filename( archive_name ) + + # Unpack new baselines + logger.info( 'Unpacking baselines...' ) + shutil.unpack_archive( archive_name, baseline_path, format='gztar' ) + with open( status_path, 'w' ) as f: + f.write( blob_name ) + + logger.info( 'Finished fetching baselines!' ) + + except Exception as e: + logger.error( 'Failed to fetch baseline files' ) + logger.error( str( e ) ) + + +def upload_baselines( bucket_name, blob_name, baseline_path ): + """ + Pack and upload baselines to GCP + + Args: + bucket_name (str): Name of the GCP bucket + blob_name (str): Name of the baseline blob + baseline_path (str): Path to unpack the baselines + """ + # Setup + baseline_path = os.path.abspath( os.path.expanduser( baseline_path ) ) + status_path = os.path.join( baseline_path, '.blob_name' ) + + # Check to see if the baselines are already downloaded + logger.info( 'Checking for existing baseline files...' ) + if not os.path.isdir( baseline_path ): + logger.error( f'Could not find target baselines: {baseline_path}' ) + raise FileNotFoundError( 'Could not find target baseline files' ) + + # Check for old blob name files and over-write if necessary + last_blob_name = '' + if os.path.isfile( status_path ): + last_blob_name = open( status_path, 'r' ).read() + with open( status_path, 'w' ) as f: + f.write( blob_name ) + + try: + logger.info( 'Archiving baseline files...' ) + tmpdir = tempfile.TemporaryDirectory() + archive_name = os.path.join( tmpdir.name, 'baselines.tar.gz' ) + shutil.make_archive( archive_name, format='gztar', base_dir=baseline_path ) + + logger.info( 'Uploading baseline files...' ) + bucket = storage_client.bucket( bucket_name ) + blob = bucket.blob( blob_name ) + blob.upload_from_filename( archive_name, if_generation_match=0 ) + logger.info( 'Finished uploading baselines!' ) + + except Exception as e: + logger.error( 'Failed to upload baselines!' ) + logger.error( str( e ) ) + + # Reset the local blob name + with open( status_path, 'w' ) as f: + f.write( last_blob_name ) From d8b0e141d6219455a1b2dc26d04c7af92a7402a8 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 15 Mar 2024 10:33:07 -0700 Subject: [PATCH 02/46] Wiring in new baseline management tools --- geos_ats_package/geos_ats/baseline_io.py | 57 +++++++++++++++++-- .../geos_ats/command_line_parsers.py | 4 ++ geos_ats_package/geos_ats/main.py | 3 +- geos_ats_package/setup.cfg | 2 + 4 files changed, 60 insertions(+), 6 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index d554800..c8e7127 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -2,6 +2,8 @@ import logging import tempfile import shutil +import yaml +import time from google.cloud import storage logger = logging.getLogger( 'geos_ats' ) @@ -42,16 +44,14 @@ def download_baselines( bucket_name, blob_name, baseline_path, force_redownload= logger.info( 'Downloading baselines...' ) tmpdir = tempfile.TemporaryDirectory() archive_name = os.path.join( tmpdir.name, 'baselines.tar.gz' ) - bucket = storage_client.bucket( bucket_name ) + client = storage.Client() + bucket = client.bucket( bucket_name ) blob = bucket.blob( blob_name ) blob.download_to_filename( archive_name ) # Unpack new baselines logger.info( 'Unpacking baselines...' ) shutil.unpack_archive( archive_name, baseline_path, format='gztar' ) - with open( status_path, 'w' ) as f: - f.write( blob_name ) - logger.info( 'Finished fetching baselines!' ) except Exception as e: @@ -92,7 +92,8 @@ def upload_baselines( bucket_name, blob_name, baseline_path ): shutil.make_archive( archive_name, format='gztar', base_dir=baseline_path ) logger.info( 'Uploading baseline files...' ) - bucket = storage_client.bucket( bucket_name ) + client = storage.Client() + bucket = client.bucket( bucket_name ) blob = bucket.blob( blob_name ) blob.upload_from_filename( archive_name, if_generation_match=0 ) logger.info( 'Finished uploading baselines!' ) @@ -104,3 +105,49 @@ def upload_baselines( bucket_name, blob_name, baseline_path ): # Reset the local blob name with open( status_path, 'w' ) as f: f.write( last_blob_name ) + + +def manage_baselines( options ): + """ + Manage the integrated test baselines + """ + # Check for integrated test yaml file + test_yaml = '' + if options.integrateTestsYAML: + test_yaml = options.integrateTestsYAML + else: + os.path.join( options.geos_bin_dir ), '..', '..', '.integrated_tests.yaml' + + if not os.path.isfile( test_yaml ): + raise Exception( f'Could not find the integrated test yaml file: {test_yaml}' ) + + test_options = yaml.load( open( test_yaml ) ) + baseline_options = test_options.get( 'baselines', {} ) + for k in [ 'bucket', 'latest' ]: + if k not in baseline_options: + raise Exception( + f'Required information (baselines/{k}) missing from integrated test yaml file: {test_yaml}' ) + + # Manage baselines + if options.action == 'upload_baselines': + if os.path.isdir( options.baselineDir ): + epoch = int( time.time() ) + upload_name = f'integrated_test_baseline_{epoch}.tar.gz' + upload_baselines( baseline_options[ 'bucket' ], upload_name, options.baselineDir ) + + # Update the test config file + baseline_options[ 'latest' ] = upload_name + with open( test_yaml, 'w' ) as f: + yaml.dump( baseline_options, f ) + quit() + else: + raise Exception( f'Could not find the requested baselines to upload: {options.baselineDir}' ) + + download_baselines( baseline_options[ 'bucket' ], baseline_options[ 'latest' ], options.baselineDir ) + + # Cleanup + if not os.path.isdir( options.baselineDir ): + raise Exception( f'Could not find the specified baseline directory: {options.baselineDir}' ) + + if options.action == 'download_baselines': + quit() diff --git a/geos_ats_package/geos_ats/command_line_parsers.py b/geos_ats_package/geos_ats/command_line_parsers.py index 09ead6f..d39720f 100644 --- a/geos_ats_package/geos_ats/command_line_parsers.py +++ b/geos_ats_package/geos_ats/command_line_parsers.py @@ -17,6 +17,8 @@ "rebaseline": "rebaseline the testcases from a previous run.", "rebaselinefailed": "rebaseline only failed testcases from a previous run.", "report": "generate a text or html report, see config for the reporting options.", + "upload_baselines": "Upload baselines to bucket", + "download_baselines": "Download baselines from bucket", } check_options = { @@ -46,6 +48,8 @@ def build_command_line_parser(): parser.add_argument( "-b", "--baselineDir", type=str, help="Root baseline directory" ) + parser.add_argument( "-y", "--integrateTestsYAML", type=str, help="Baseline bucket name", default='' ) + action_names = ','.join( action_options.keys() ) parser.add_argument( "-a", "--action", type=str, default="run", help=f"Test actions options ({action_names})" ) diff --git a/geos_ats_package/geos_ats/main.py b/geos_ats_package/geos_ats/main.py index 42e43c1..5de47bc 100644 --- a/geos_ats_package/geos_ats/main.py +++ b/geos_ats_package/geos_ats/main.py @@ -5,7 +5,7 @@ import subprocess import time import logging -from geos_ats import command_line_parsers +from geos_ats import command_line_parsers, baseline_io test_actions = ( "run", "rerun", "check", "continue" ) report_actions = ( "run", "rerun", "report", "continue" ) @@ -292,6 +292,7 @@ def main(): os.chdir( ats_root_dir ) os.makedirs( options.workingDir, exist_ok=True ) create_log_directory( options ) + baseline_io.manage_baselines( options ) # Check the test configuration from geos_ats import configuration_record diff --git a/geos_ats_package/setup.cfg b/geos_ats_package/setup.cfg index 2d64f43..d2e7859 100644 --- a/geos_ats_package/setup.cfg +++ b/geos_ats_package/setup.cfg @@ -17,6 +17,8 @@ install_requires = numpy lxml tabulate + pyyaml + google-cloud ats @ https://github.com/LLNL/ATS/archive/refs/tags/7.0.105.tar.gz python_requires = >=3.7 From f3d28600f5b142a4ef890bf605acc81b0a986333 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 15 Mar 2024 10:46:25 -0700 Subject: [PATCH 03/46] Fixing typo in geos_ats parser --- geos_ats_package/geos_ats/baseline_io.py | 4 ++-- geos_ats_package/geos_ats/command_line_parsers.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index c8e7127..ee5a748 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -113,8 +113,8 @@ def manage_baselines( options ): """ # Check for integrated test yaml file test_yaml = '' - if options.integrateTestsYAML: - test_yaml = options.integrateTestsYAML + if options.testYAML: + test_yaml = options.testYAML else: os.path.join( options.geos_bin_dir ), '..', '..', '.integrated_tests.yaml' diff --git a/geos_ats_package/geos_ats/command_line_parsers.py b/geos_ats_package/geos_ats/command_line_parsers.py index d39720f..3d3c125 100644 --- a/geos_ats_package/geos_ats/command_line_parsers.py +++ b/geos_ats_package/geos_ats/command_line_parsers.py @@ -48,7 +48,7 @@ def build_command_line_parser(): parser.add_argument( "-b", "--baselineDir", type=str, help="Root baseline directory" ) - parser.add_argument( "-y", "--integrateTestsYAML", type=str, help="Baseline bucket name", default='' ) + parser.add_argument( "-y", "--testYAML", type=str, help="Baseline bucket name", default='' ) action_names = ','.join( action_options.keys() ) parser.add_argument( "-a", "--action", type=str, default="run", help=f"Test actions options ({action_names})" ) From 93fcf9c8e7b5d83e66de5e0c2edb66ea12f804e2 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 15 Mar 2024 11:32:02 -0700 Subject: [PATCH 04/46] Fixing package import bug --- geos_ats_package/geos_ats/baseline_io.py | 10 +++++++--- geos_ats_package/setup.cfg | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index ee5a748..14d9ef9 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -4,7 +4,6 @@ import shutil import yaml import time -from google.cloud import storage logger = logging.getLogger( 'geos_ats' ) @@ -44,6 +43,9 @@ def download_baselines( bucket_name, blob_name, baseline_path, force_redownload= logger.info( 'Downloading baselines...' ) tmpdir = tempfile.TemporaryDirectory() archive_name = os.path.join( tmpdir.name, 'baselines.tar.gz' ) + + # Download from GCP + from google.cloud import storage client = storage.Client() bucket = client.bucket( bucket_name ) blob = bucket.blob( blob_name ) @@ -91,6 +93,8 @@ def upload_baselines( bucket_name, blob_name, baseline_path ): archive_name = os.path.join( tmpdir.name, 'baselines.tar.gz' ) shutil.make_archive( archive_name, format='gztar', base_dir=baseline_path ) + # Upload to gcp + from google.cloud import storage logger.info( 'Uploading baseline files...' ) client = storage.Client() bucket = client.bucket( bucket_name ) @@ -116,12 +120,12 @@ def manage_baselines( options ): if options.testYAML: test_yaml = options.testYAML else: - os.path.join( options.geos_bin_dir ), '..', '..', '.integrated_tests.yaml' + test_yaml = os.path.join( options.geos_bin_dir, '..', '..', '.integrated_tests.yaml' ) if not os.path.isfile( test_yaml ): raise Exception( f'Could not find the integrated test yaml file: {test_yaml}' ) - test_options = yaml.load( open( test_yaml ) ) + test_options = yaml.safe_load( open( test_yaml ) ) baseline_options = test_options.get( 'baselines', {} ) for k in [ 'bucket', 'latest' ]: if k not in baseline_options: diff --git a/geos_ats_package/setup.cfg b/geos_ats_package/setup.cfg index d2e7859..fb72001 100644 --- a/geos_ats_package/setup.cfg +++ b/geos_ats_package/setup.cfg @@ -18,7 +18,7 @@ install_requires = lxml tabulate pyyaml - google-cloud + google-cloud-storage ats @ https://github.com/LLNL/ATS/archive/refs/tags/7.0.105.tar.gz python_requires = >=3.7 From dccdc28e70f71eb9e46371bee0e8f3fcdf57b5d3 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Mon, 18 Mar 2024 10:09:24 -0700 Subject: [PATCH 05/46] Updating geos_ats input args, various baseline method updates --- geos_ats_package/geos_ats/baseline_io.py | 50 +++++++++++++++---- .../geos_ats/command_line_parsers.py | 46 ++++++++--------- 2 files changed, 60 insertions(+), 36 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 14d9ef9..556bce4 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -4,11 +4,16 @@ import shutil import yaml import time +from google.cloud import storage logger = logging.getLogger( 'geos_ats' ) -def download_baselines( bucket_name, blob_name, baseline_path, force_redownload=False ): +def download_baselines( bucket_name: str, + blob_name: str, + baseline_path: str, + force_redownload: bool = False, + ok_delete_old_baselines: bool = False ): """ Download and unpack baselines from GCP to the local machine @@ -16,6 +21,8 @@ def download_baselines( bucket_name, blob_name, baseline_path, force_redownload= bucket_name (str): Name of the GCP bucket blob_name (str): Name of the baseline blob baseline_path (str): Path to unpack the baselines + force_redownload (bool): Force re-download baseline files + ok_delete_old_baselines (bool): Automatically delete old baseline files if present """ # Setup baseline_path = os.path.abspath( os.path.expanduser( baseline_path ) ) @@ -32,6 +39,22 @@ def download_baselines( bucket_name, blob_name, baseline_path, force_redownload= logger.info( 'To re-download these files, run with the force_redownload option' ) return + if not ok_delete_old_baselines: + for ii in range( 10 ): + print( f'Existing baseline files found: {baseline_path}' ) + user_input = input( 'Delete old baselines? [y/n]' ) + user_input = user_input.strip().lower() + if user_input in [ "y", "yes" ]: + logger.debug( 'User chose to delete old baselines' ) + break + elif user_input in [ "n", "no" ]: + logger.debug( 'User chose to keep old baselines' ) + logger.warning( 'Running with out of date baseline files' ) + return + else: + print( f'Unrecognized option: {user_input}' ) + raise Exception( 'Failed to parse user options for old baselines' ) + logger.info( 'Deleting old baselines...' ) shutil.rmtree( baseline_path ) @@ -45,8 +68,7 @@ def download_baselines( bucket_name, blob_name, baseline_path, force_redownload= archive_name = os.path.join( tmpdir.name, 'baselines.tar.gz' ) # Download from GCP - from google.cloud import storage - client = storage.Client() + client = storage.Client( use_auth_w_custom_endpoint=False ) bucket = client.bucket( bucket_name ) blob = bucket.blob( blob_name ) blob.download_to_filename( archive_name ) @@ -61,7 +83,7 @@ def download_baselines( bucket_name, blob_name, baseline_path, force_redownload= logger.error( str( e ) ) -def upload_baselines( bucket_name, blob_name, baseline_path ): +def upload_baselines( bucket_name: str, blob_name: str, baseline_path: str ): """ Pack and upload baselines to GCP @@ -94,7 +116,6 @@ def upload_baselines( bucket_name, blob_name, baseline_path ): shutil.make_archive( archive_name, format='gztar', base_dir=baseline_path ) # Upload to gcp - from google.cloud import storage logger.info( 'Uploading baseline files...' ) client = storage.Client() bucket = client.bucket( bucket_name ) @@ -117,17 +138,20 @@ def manage_baselines( options ): """ # Check for integrated test yaml file test_yaml = '' - if options.testYAML: - test_yaml = options.testYAML + if options.yaml: + test_yaml = options.yaml else: test_yaml = os.path.join( options.geos_bin_dir, '..', '..', '.integrated_tests.yaml' ) if not os.path.isfile( test_yaml ): raise Exception( f'Could not find the integrated test yaml file: {test_yaml}' ) - test_options = yaml.safe_load( open( test_yaml ) ) + test_options = {} + with open( test_yaml ) as f: + test_options = yaml.safe_load( f ) + baseline_options = test_options.get( 'baselines', {} ) - for k in [ 'bucket', 'latest' ]: + for k in [ 'bucket', 'baseline' ]: if k not in baseline_options: raise Exception( f'Required information (baselines/{k}) missing from integrated test yaml file: {test_yaml}' ) @@ -140,14 +164,18 @@ def manage_baselines( options ): upload_baselines( baseline_options[ 'bucket' ], upload_name, options.baselineDir ) # Update the test config file - baseline_options[ 'latest' ] = upload_name + baseline_options[ 'baseline' ] = upload_name with open( test_yaml, 'w' ) as f: yaml.dump( baseline_options, f ) quit() else: raise Exception( f'Could not find the requested baselines to upload: {options.baselineDir}' ) - download_baselines( baseline_options[ 'bucket' ], baseline_options[ 'latest' ], options.baselineDir ) + download_baselines( baseline_options[ 'bucket' ], + baseline_options[ 'baseline' ], + options.baselineDir, + force_redownload=options.update_baselines, + ok_delete_old_baselines=options.delete_old_baselines ) # Cleanup if not os.path.isdir( options.baselineDir ): diff --git a/geos_ats_package/geos_ats/command_line_parsers.py b/geos_ats_package/geos_ats/command_line_parsers.py index 3d3c125..4cba88d 100644 --- a/geos_ats_package/geos_ats/command_line_parsers.py +++ b/geos_ats_package/geos_ats/command_line_parsers.py @@ -1,8 +1,5 @@ -import logging import argparse import os -import shutil -from pydoc import locate action_options = { "run": "execute the test cases that previously did not pass.", @@ -48,7 +45,19 @@ def build_command_line_parser(): parser.add_argument( "-b", "--baselineDir", type=str, help="Root baseline directory" ) - parser.add_argument( "-y", "--testYAML", type=str, help="Baseline bucket name", default='' ) + parser.add_argument( "-y", "--yaml", type=str, help="Path to YAML config file", default='' ) + + parser.add_argument( "-d", + "--delete-old-baselines", + action="store_true", + default=False, + help="Automatically delete old baselines" ) + + parser.add_argument( "-u", + "--update-baselines", + action="store_true", + default=False, + help="Force baseline file update" ) action_names = ','.join( action_options.keys() ) parser.add_argument( "-a", "--action", type=str, default="run", help=f"Test actions options ({action_names})" ) @@ -63,14 +72,6 @@ def build_command_line_parser(): default="info", help=f"Log verbosity options ({verbosity_names})" ) - parser.add_argument( "-d", - "--detail", - action="store_true", - default=False, - help="Show detailed action/check options" ) - - parser.add_argument( "-i", "--info", action="store_true", default=False, help="Info on various topics" ) - parser.add_argument( "-r", "--restartCheckOverrides", nargs='+', @@ -119,17 +120,20 @@ def parse_command_line_arguments( args ): # Check action, check, verbosity items check = options.check if check not in check_options: - print( - f"Selected check option ({check}) not recognized. Try running with --help/--details for more information" ) + print( f"Selected check option ({check}) not recognized" ) exit_flag = True action = options.action if action not in action_options: - print( - f"Selected action option ({action}) not recognized. Try running with --help/--details for more information" - ) + print( f"Selected action option ({action}) not recognized" ) exit_flag = True + if exit_flag: + for option_type, details in zip( [ 'action', 'check' ], [ action_options, check_options ] ): + print( f'\nAvailable {option_type} options:' ) + for k, v in details.items(): + print( f' {k}: {v}' ) + verbose = options.verbose if verbose not in verbose_options: print( f"Selected verbose option ({verbose}) not recognized" ) @@ -142,14 +146,6 @@ def parse_command_line_arguments( args ): if not options.baselineDir: options.baselineDir = options.workingDir - # Print detailed information - if options.detail: - for option_type, details in zip( [ 'action', 'check' ], [ action_options, check_options ] ): - print( f'\nAvailable {option_type} options:' ) - for k, v in details.items(): - print( f' {k}: {v}' ) - exit_flag = True - if exit_flag: quit() From 6e4ce12dd8de7369935d7612b0a34a4413b31a45 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Thu, 21 Mar 2024 13:58:54 -0700 Subject: [PATCH 06/46] Updating geos ats command line parsing --- geos_ats_package/geos_ats/command_line_parsers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geos_ats_package/geos_ats/command_line_parsers.py b/geos_ats_package/geos_ats/command_line_parsers.py index 4cba88d..ff3e180 100644 --- a/geos_ats_package/geos_ats/command_line_parsers.py +++ b/geos_ats_package/geos_ats/command_line_parsers.py @@ -129,7 +129,7 @@ def parse_command_line_arguments( args ): exit_flag = True if exit_flag: - for option_type, details in zip( [ 'action', 'check' ], [ action_options, check_options ] ): + for option_type, details in ( 'action', action_options ), ( 'check', check_options ): print( f'\nAvailable {option_type} options:' ) for k, v in details.items(): print( f' {k}: {v}' ) From bb688138dd8167ec7fec1f8263c77f61f8fa980c Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 29 Mar 2024 09:54:58 -0700 Subject: [PATCH 07/46] Adding yaml path to ats environment setup --- geos_ats_package/geos_ats/environment_setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/geos_ats_package/geos_ats/environment_setup.py b/geos_ats_package/geos_ats/environment_setup.py index 47ced31..1dc66e0 100644 --- a/geos_ats_package/geos_ats/environment_setup.py +++ b/geos_ats_package/geos_ats/environment_setup.py @@ -14,6 +14,7 @@ def setup_ats( src_path, build_path, baseline_dir, working_dir, ats_xargs, ats_m baseline_dir = os.path.abspath( baseline_dir ) working_dir = os.path.abspath( working_dir ) ats_main_file = os.path.abspath( os.path.join( src_path, 'inputFiles', 'main.ats' ) ) + yaml_file = os.path.abspath( os.path.join( src_path, '.integrated_tests.yaml' ) ) # Create a symbolic link to working directory for d in [ baseline_dir, working_dir, test_path ]: @@ -35,7 +36,7 @@ def setup_ats( src_path, build_path, baseline_dir, working_dir, ats_xargs, ats_m with open( run_script_fname, "w" ) as g: g.write( "#!/bin/bash\n" ) g.write( - f"{geos_ats_fname} {bin_dir} {ats_main_file} --workingDir {working_dir} --baselineDir {baseline_dir} --logs {log_dir} {ats_args} \"$@\"\n" + f"{geos_ats_fname} {bin_dir} {ats_main_file} --yaml {yaml_file} --workingDir {working_dir} --baselineDir {baseline_dir} --logs {log_dir} {ats_args} \"$@\"\n" ) # Make the script executable From d9b4c1199d99809bf7c9bcced4ed6c4818e582d5 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 29 Mar 2024 13:52:07 -0700 Subject: [PATCH 08/46] Splitting baseline archive packing, upload --- geos_ats_package/geos_ats/baseline_io.py | 59 +++++++++++++------ .../geos_ats/command_line_parsers.py | 3 + .../geos_ats/environment_setup.py | 3 +- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 556bce4..593842a 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -83,13 +83,12 @@ def download_baselines( bucket_name: str, logger.error( str( e ) ) -def upload_baselines( bucket_name: str, blob_name: str, baseline_path: str ): +def pack_baselines( archive_name: str, baseline_path: str ): """ Pack and upload baselines to GCP Args: - bucket_name (str): Name of the GCP bucket - blob_name (str): Name of the baseline blob + archive_name (str): Name of the target archive baseline_path (str): Path to unpack the baselines """ # Setup @@ -102,24 +101,37 @@ def upload_baselines( bucket_name: str, blob_name: str, baseline_path: str ): logger.error( f'Could not find target baselines: {baseline_path}' ) raise FileNotFoundError( 'Could not find target baseline files' ) - # Check for old blob name files and over-write if necessary - last_blob_name = '' - if os.path.isfile( status_path ): - last_blob_name = open( status_path, 'r' ).read() + # Update the blob name with open( status_path, 'w' ) as f: - f.write( blob_name ) + f.write( os.path.basename( archive_name ) ) try: logger.info( 'Archiving baseline files...' ) - tmpdir = tempfile.TemporaryDirectory() archive_name = os.path.join( tmpdir.name, 'baselines.tar.gz' ) shutil.make_archive( archive_name, format='gztar', base_dir=baseline_path ) + except Exception as e: + logger.error( 'Failed to create baseline archive' ) + logger.error( str( e ) ) + + +def upload_baselines( bucket_name: str, archive_name: str ): + """ + Pack and upload baselines to GCP - # Upload to gcp + Args: + bucket_name (str): Name of the GCP bucket + archive_name (str): Name of the target archive + """ + # Setup + if not os.path.isfile( archive_name ): + logger.error( f'Could not find target archive:{archive_name}' ) + return + + try: logger.info( 'Uploading baseline files...' ) client = storage.Client() bucket = client.bucket( bucket_name ) - blob = bucket.blob( blob_name ) + blob = bucket.blob( os.path.basename( archive_name ) ) blob.upload_from_filename( archive_name, if_generation_match=0 ) logger.info( 'Finished uploading baselines!' ) @@ -127,10 +139,6 @@ def upload_baselines( bucket_name: str, blob_name: str, baseline_path: str ): logger.error( 'Failed to upload baselines!' ) logger.error( str( e ) ) - # Reset the local blob name - with open( status_path, 'w' ) as f: - f.write( last_blob_name ) - def manage_baselines( options ): """ @@ -157,13 +165,26 @@ def manage_baselines( options ): f'Required information (baselines/{k}) missing from integrated test yaml file: {test_yaml}' ) # Manage baselines - if options.action == 'upload_baselines': + if options.action in [ 'pack_baselines', 'upload_baselines' ]: if os.path.isdir( options.baselineDir ): - epoch = int( time.time() ) - upload_name = f'integrated_test_baseline_{epoch}.tar.gz' - upload_baselines( baseline_options[ 'bucket' ], upload_name, options.baselineDir ) + # Check the baseline name and open a temporary directory if required + tmpdir = tempfile.TemporaryDirectory() + upload_name = options.baselineArchiveName + if not upload_name: + epoch = int( time.time() ) + upload_name = os.path.join( tmpdir.name, f'integrated_test_baseline_{epoch}.tar.gz' ) + else: + dirname = os.path.dirname( upload_name ) + os.makedirs( dirname, exist_ok=True ) + + pack_baselines( upload_name, options.baselineDir ) + if options.action == 'pack_baselines': + quit() + + upload_baselines( baseline_options[ 'bucket' ], upload_name ) # Update the test config file + blob_name = os.path.basename( upload_name ) baseline_options[ 'baseline' ] = upload_name with open( test_yaml, 'w' ) as f: yaml.dump( baseline_options, f ) diff --git a/geos_ats_package/geos_ats/command_line_parsers.py b/geos_ats_package/geos_ats/command_line_parsers.py index ff3e180..e9e0629 100644 --- a/geos_ats_package/geos_ats/command_line_parsers.py +++ b/geos_ats_package/geos_ats/command_line_parsers.py @@ -14,6 +14,7 @@ "rebaseline": "rebaseline the testcases from a previous run.", "rebaselinefailed": "rebaseline only failed testcases from a previous run.", "report": "generate a text or html report, see config for the reporting options.", + "pack_baselines": "Pack baselines into archive", "upload_baselines": "Upload baselines to bucket", "download_baselines": "Download baselines from bucket", } @@ -47,6 +48,8 @@ def build_command_line_parser(): parser.add_argument( "-y", "--yaml", type=str, help="Path to YAML config file", default='' ) + parser.add_argument( "--baselineArchiveName", type=str, help="Baseline archive name", default='' ) + parser.add_argument( "-d", "--delete-old-baselines", action="store_true", diff --git a/geos_ats_package/geos_ats/environment_setup.py b/geos_ats_package/geos_ats/environment_setup.py index 1dc66e0..c165ae1 100644 --- a/geos_ats_package/geos_ats/environment_setup.py +++ b/geos_ats_package/geos_ats/environment_setup.py @@ -11,13 +11,14 @@ def setup_ats( src_path, build_path, baseline_dir, working_dir, ats_xargs, ats_m link_path = os.path.join( test_path, "integratedTests" ) run_script_fname = os.path.join( test_path, "geos_ats.sh" ) log_dir = os.path.join( test_path, "TestResults" ) + archive_dir = os.path.join( test_path, "archive" ) baseline_dir = os.path.abspath( baseline_dir ) working_dir = os.path.abspath( working_dir ) ats_main_file = os.path.abspath( os.path.join( src_path, 'inputFiles', 'main.ats' ) ) yaml_file = os.path.abspath( os.path.join( src_path, '.integrated_tests.yaml' ) ) # Create a symbolic link to working directory - for d in [ baseline_dir, working_dir, test_path ]: + for d in [ baseline_dir, working_dir, test_path, archive_dir ]: os.makedirs( d, exist_ok=True ) if os.path.islink( link_path ): print( 'integratedTests symlink already exists' ) From 97f063eb5e5d80f9d234c8f6f680e5b37ae9a9e7 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 2 Apr 2024 10:04:24 -0700 Subject: [PATCH 09/46] Fixing bug in baseline packing --- geos_ats_package/geos_ats/baseline_io.py | 1 - 1 file changed, 1 deletion(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 593842a..b26d70c 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -107,7 +107,6 @@ def pack_baselines( archive_name: str, baseline_path: str ): try: logger.info( 'Archiving baseline files...' ) - archive_name = os.path.join( tmpdir.name, 'baselines.tar.gz' ) shutil.make_archive( archive_name, format='gztar', base_dir=baseline_path ) except Exception as e: logger.error( 'Failed to create baseline archive' ) From 80ae85c36df42f383c812df6f585747726f75305 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 2 Apr 2024 13:43:46 -0700 Subject: [PATCH 10/46] Adding https baseline fetch option --- geos_ats_package/geos_ats/baseline_io.py | 74 +++++++++++++++++++----- geos_ats_package/setup.cfg | 2 + 2 files changed, 60 insertions(+), 16 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index b26d70c..3091742 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -4,18 +4,55 @@ import shutil import yaml import time +import requests +import pathlib +from functools import partial +from tqdm.auto import tqdm from google.cloud import storage logger = logging.getLogger( 'geos_ats' ) -def download_baselines( bucket_name: str, - blob_name: str, - baseline_path: str, - force_redownload: bool = False, - ok_delete_old_baselines: bool = False ): +def file_download_progress( headers: dict, url: str, filename: str ): """ - Download and unpack baselines from GCP to the local machine + Download a file from a url in chunks, showing a progress bar + + Args: + headers (dict): Request headers + url (str): Target address + filename (str): Download filename + """ + + path = pathlib.Path( filename ).expanduser().resolve() + path.parent.mkdir( parents=True, exist_ok=True ) + + r = requests.get( url, stream=True, allow_redirects=True, headers=headers ) + if r.status_code != 200: + r.raise_for_status() + raise RuntimeError( f"Request to {url} returned status code {r.status_code}" ) + + file_size = int( r.headers.get( 'Content-Length', 0 ) ) + desc = "(Unknown total file size)" if file_size == 0 else "" + + try: + r.raw.read = partial( r.raw.read, decode_content=True ) + with tqdm.wrapattr( r.raw, "read", total=file_size, desc=desc ) as r_raw: + with path.open( "wb" ) as f: + shutil.copyfileobj( r_raw, f ) + + except: + with path.open( "wb" ) as f: + for chunk in r.iter_content( chunk_size=128 ): + f.write( chunk ) + + +def collect_baselines( bucket_name: str, + blob_name: str, + baseline_path: str, + force_redownload: bool = False, + ok_delete_old_baselines: bool = False ): + """ + Collect and unpack test baselines Args: bucket_name (str): Name of the GCP bucket @@ -67,11 +104,14 @@ def download_baselines( bucket_name: str, tmpdir = tempfile.TemporaryDirectory() archive_name = os.path.join( tmpdir.name, 'baselines.tar.gz' ) - # Download from GCP - client = storage.Client( use_auth_w_custom_endpoint=False ) - bucket = client.bucket( bucket_name ) - blob = bucket.blob( blob_name ) - blob.download_to_filename( archive_name ) + if 'https://' in bucket_name: + file_download_progress( {}, f"{bucket_name}/{blob_name}", archive_name ) + else: + # Download from GCP + client = storage.Client( use_auth_w_custom_endpoint=False ) + bucket = client.bucket( bucket_name ) + blob = bucket.blob( blob_name ) + blob.download_to_filename( archive_name ) # Unpack new baselines logger.info( 'Unpacking baselines...' ) @@ -92,6 +132,7 @@ def pack_baselines( archive_name: str, baseline_path: str ): baseline_path (str): Path to unpack the baselines """ # Setup + archive_name = os.path.abspath( archive_name ) baseline_path = os.path.abspath( os.path.expanduser( baseline_path ) ) status_path = os.path.join( baseline_path, '.blob_name' ) @@ -108,6 +149,7 @@ def pack_baselines( archive_name: str, baseline_path: str ): try: logger.info( 'Archiving baseline files...' ) shutil.make_archive( archive_name, format='gztar', base_dir=baseline_path ) + logger.info( f'Created {archive_name}' ) except Exception as e: logger.error( 'Failed to create baseline archive' ) logger.error( str( e ) ) @@ -191,11 +233,11 @@ def manage_baselines( options ): else: raise Exception( f'Could not find the requested baselines to upload: {options.baselineDir}' ) - download_baselines( baseline_options[ 'bucket' ], - baseline_options[ 'baseline' ], - options.baselineDir, - force_redownload=options.update_baselines, - ok_delete_old_baselines=options.delete_old_baselines ) + collect_baselines( baseline_options[ 'bucket' ], + baseline_options[ 'baseline' ], + options.baselineDir, + force_redownload=options.update_baselines, + ok_delete_old_baselines=options.delete_old_baselines ) # Cleanup if not os.path.isdir( options.baselineDir ): diff --git a/geos_ats_package/setup.cfg b/geos_ats_package/setup.cfg index fb72001..f993965 100644 --- a/geos_ats_package/setup.cfg +++ b/geos_ats_package/setup.cfg @@ -18,6 +18,8 @@ install_requires = lxml tabulate pyyaml + tqdm + requests google-cloud-storage ats @ https://github.com/LLNL/ATS/archive/refs/tags/7.0.105.tar.gz python_requires = >=3.7 From 0bacdcee96de29be0ab24b8447a451792e400d9a Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 2 Apr 2024 14:40:04 -0700 Subject: [PATCH 11/46] Adding options to work with baseline cache files --- geos_ats_package/geos_ats/baseline_io.py | 64 ++++++++++++++----- .../geos_ats/command_line_parsers.py | 1 + 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 3091742..9e2f943 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -11,6 +11,8 @@ from google.cloud import storage logger = logging.getLogger( 'geos_ats' ) +tmpdir = tempfile.TemporaryDirectory() +baseline_temporary_directory = tmpdir.name def file_download_progress( headers: dict, url: str, filename: str ): @@ -50,7 +52,8 @@ def collect_baselines( bucket_name: str, blob_name: str, baseline_path: str, force_redownload: bool = False, - ok_delete_old_baselines: bool = False ): + ok_delete_old_baselines: bool = False, + cache_directory: str = '' ): """ Collect and unpack test baselines @@ -60,10 +63,12 @@ def collect_baselines( bucket_name: str, baseline_path (str): Path to unpack the baselines force_redownload (bool): Force re-download baseline files ok_delete_old_baselines (bool): Automatically delete old baseline files if present + cache_directory (str): Search this directory first for files that are already downloaded """ # Setup baseline_path = os.path.abspath( os.path.expanduser( baseline_path ) ) status_path = os.path.join( baseline_path, '.blob_name' ) + cache_directory = os.path.abspath( os.path.expanduser( cache_directory ) ) # Check to see if the baselines are already downloaded logger.info( 'Checking for existing baseline files...' ) @@ -98,29 +103,54 @@ def collect_baselines( bucket_name: str, else: os.makedirs( os.path.dirname( baseline_path ), exist_ok=True ) + # Check for old baselines + archive_name = '' + if cache_directory and not force_redownload: + logger.info( f'Checking cache directory for existing baseline: {blob_name}' ) + f = os.path.join( cache_directory, blob_name ) + if os.path.isfile( f ): + logger.info( 'Baseline found!' ) + archive_name = f + # Download new baselines - try: + if not archive_name: logger.info( 'Downloading baselines...' ) - tmpdir = tempfile.TemporaryDirectory() - archive_name = os.path.join( tmpdir.name, 'baselines.tar.gz' ) + if cache_directory: + archive_name = os.path.join( cache_directory, blob_name ) + else: + archive_name = os.path.join( baseline_temporary_directory, blob_name ) if 'https://' in bucket_name: - file_download_progress( {}, f"{bucket_name}/{blob_name}", archive_name ) + # Download from URL + try: + file_download_progress( {}, f"{bucket_name}/{blob_name}", archive_name ) + except Exception as e: + logger.error( f'Failed to download baseline from URL ({bucket_name}/{blob_name})' ) + logger.error( str( e ) ) else: # Download from GCP - client = storage.Client( use_auth_w_custom_endpoint=False ) - bucket = client.bucket( bucket_name ) - blob = bucket.blob( blob_name ) - blob.download_to_filename( archive_name ) - + try: + client = storage.Client( use_auth_w_custom_endpoint=False ) + bucket = client.bucket( bucket_name ) + blob = bucket.blob( blob_name ) + blob.download_to_filename( archive_name ) + except Exception as e: + logger.error( f'Failed to download baseline from GCP ({bucket_name}/{blob_name})' ) + logger.error( str( e ) ) + + if os.path.isfile( archive_name ): # Unpack new baselines logger.info( 'Unpacking baselines...' ) - shutil.unpack_archive( archive_name, baseline_path, format='gztar' ) - logger.info( 'Finished fetching baselines!' ) + try: + shutil.unpack_archive( archive_name, baseline_path, format='gztar' ) + logger.info( 'Finished fetching baselines!' ) + except Exception as e: + logger.error( str( e ) ) + raise Exception( f'Failed to unpack baselines: {archive_name}' ) - except Exception as e: - logger.error( 'Failed to fetch baseline files' ) + else: logger.error( str( e ) ) + raise Exception( f'Could not find baseline files to unpack: expected={archive_name}' ) def pack_baselines( archive_name: str, baseline_path: str ): @@ -209,11 +239,10 @@ def manage_baselines( options ): if options.action in [ 'pack_baselines', 'upload_baselines' ]: if os.path.isdir( options.baselineDir ): # Check the baseline name and open a temporary directory if required - tmpdir = tempfile.TemporaryDirectory() upload_name = options.baselineArchiveName if not upload_name: epoch = int( time.time() ) - upload_name = os.path.join( tmpdir.name, f'integrated_test_baseline_{epoch}.tar.gz' ) + upload_name = os.path.join( baseline_temporary_directory, f'integrated_test_baseline_{epoch}.tar.gz' ) else: dirname = os.path.dirname( upload_name ) os.makedirs( dirname, exist_ok=True ) @@ -237,7 +266,8 @@ def manage_baselines( options ): baseline_options[ 'baseline' ], options.baselineDir, force_redownload=options.update_baselines, - ok_delete_old_baselines=options.delete_old_baselines ) + ok_delete_old_baselines=options.delete_old_baselines, + cache_directory=options.baselineCacheDirectory ) # Cleanup if not os.path.isdir( options.baselineDir ): diff --git a/geos_ats_package/geos_ats/command_line_parsers.py b/geos_ats_package/geos_ats/command_line_parsers.py index e9e0629..75d3688 100644 --- a/geos_ats_package/geos_ats/command_line_parsers.py +++ b/geos_ats_package/geos_ats/command_line_parsers.py @@ -49,6 +49,7 @@ def build_command_line_parser(): parser.add_argument( "-y", "--yaml", type=str, help="Path to YAML config file", default='' ) parser.add_argument( "--baselineArchiveName", type=str, help="Baseline archive name", default='' ) + parser.add_argument( "--baselineCacheDirectory", type=str, help="Baseline cache directory", default='' ) parser.add_argument( "-d", "--delete-old-baselines", From 7325ae06a8b9d2305c94650626c4ae0d6d683633 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 2 Apr 2024 15:17:55 -0700 Subject: [PATCH 12/46] Fixing baseline archive names --- geos_ats_package/geos_ats/baseline_io.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 9e2f943..fe30285 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -106,8 +106,8 @@ def collect_baselines( bucket_name: str, # Check for old baselines archive_name = '' if cache_directory and not force_redownload: - logger.info( f'Checking cache directory for existing baseline: {blob_name}' ) - f = os.path.join( cache_directory, blob_name ) + logger.info( 'Checking cache directory for existing baseline...' ) + f = os.path.join( cache_directory, f'{blob_name}.tar.gz' ) if os.path.isfile( f ): logger.info( 'Baseline found!' ) archive_name = f @@ -116,9 +116,9 @@ def collect_baselines( bucket_name: str, if not archive_name: logger.info( 'Downloading baselines...' ) if cache_directory: - archive_name = os.path.join( cache_directory, blob_name ) + archive_name = os.path.join( cache_directory, f'{blob_name}.tar.gz' ) else: - archive_name = os.path.join( baseline_temporary_directory, blob_name ) + archive_name = os.path.join( baseline_temporary_directory, f'{blob_name}.tar.gz' ) if 'https://' in bucket_name: # Download from URL @@ -140,7 +140,7 @@ def collect_baselines( bucket_name: str, if os.path.isfile( archive_name ): # Unpack new baselines - logger.info( 'Unpacking baselines...' ) + logger.info( f'Unpacking baselines: {archive_name}' ) try: shutil.unpack_archive( archive_name, baseline_path, format='gztar' ) logger.info( 'Finished fetching baselines!' ) @@ -179,7 +179,7 @@ def pack_baselines( archive_name: str, baseline_path: str ): try: logger.info( 'Archiving baseline files...' ) shutil.make_archive( archive_name, format='gztar', base_dir=baseline_path ) - logger.info( f'Created {archive_name}' ) + logger.info( f'Created {archive_name}.tar.gz' ) except Exception as e: logger.error( 'Failed to create baseline archive' ) logger.error( str( e ) ) @@ -240,9 +240,12 @@ def manage_baselines( options ): if os.path.isdir( options.baselineDir ): # Check the baseline name and open a temporary directory if required upload_name = options.baselineArchiveName + if upload_name.endswith( '.tar.gz' ): + upload_name = upload_name[ :-7 ] + if not upload_name: epoch = int( time.time() ) - upload_name = os.path.join( baseline_temporary_directory, f'integrated_test_baseline_{epoch}.tar.gz' ) + upload_name = os.path.join( baseline_temporary_directory, f'integrated_test_baseline_{epoch}' ) else: dirname = os.path.dirname( upload_name ) os.makedirs( dirname, exist_ok=True ) From 0b0591c0c31f1c42b257c424f679b91081077776 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 2 Apr 2024 16:08:14 -0700 Subject: [PATCH 13/46] Fixing baseline archive structure, copying log files --- geos_ats_package/geos_ats/baseline_io.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index fe30285..261d90b 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -153,13 +153,14 @@ def collect_baselines( bucket_name: str, raise Exception( f'Could not find baseline files to unpack: expected={archive_name}' ) -def pack_baselines( archive_name: str, baseline_path: str ): +def pack_baselines( archive_name: str, baseline_path: str, log_path: str = '' ): """ Pack and upload baselines to GCP Args: archive_name (str): Name of the target archive baseline_path (str): Path to unpack the baselines + log_path (str): Path to log files (optional) """ # Setup archive_name = os.path.abspath( archive_name ) @@ -176,9 +177,17 @@ def pack_baselines( archive_name: str, baseline_path: str ): with open( status_path, 'w' ) as f: f.write( os.path.basename( archive_name ) ) + # Copy the log directory + if os.path.isdir( log_path ): + shutil.rmtree( log_path ) + if log_path: + log_path = os.path.abspath( os.path.expanduser( log_path ) ) + log_target = os.path.join( baseline_path, 'logs' ) + shutil.copytree( log_path, log_target ) + try: logger.info( 'Archiving baseline files...' ) - shutil.make_archive( archive_name, format='gztar', base_dir=baseline_path ) + shutil.make_archive( archive_name, format='gztar', root_dir=baseline_path ) logger.info( f'Created {archive_name}.tar.gz' ) except Exception as e: logger.error( 'Failed to create baseline archive' ) @@ -250,7 +259,7 @@ def manage_baselines( options ): dirname = os.path.dirname( upload_name ) os.makedirs( dirname, exist_ok=True ) - pack_baselines( upload_name, options.baselineDir ) + pack_baselines( upload_name, options.baselineDir, log_path=options.logs ) if options.action == 'pack_baselines': quit() From a7facad62c7e0fe40e12d94bbeec8e3404072a8a Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 2 Apr 2024 16:22:25 -0700 Subject: [PATCH 14/46] Fixing blob download name --- geos_ats_package/geos_ats/baseline_io.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 261d90b..85ea44e 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -105,9 +105,10 @@ def collect_baselines( bucket_name: str, # Check for old baselines archive_name = '' + blob_tar = f'{blob_name}.tar.gz' if cache_directory and not force_redownload: logger.info( 'Checking cache directory for existing baseline...' ) - f = os.path.join( cache_directory, f'{blob_name}.tar.gz' ) + f = os.path.join( cache_directory, blob_tar ) if os.path.isfile( f ): logger.info( 'Baseline found!' ) archive_name = f @@ -116,26 +117,26 @@ def collect_baselines( bucket_name: str, if not archive_name: logger.info( 'Downloading baselines...' ) if cache_directory: - archive_name = os.path.join( cache_directory, f'{blob_name}.tar.gz' ) + archive_name = os.path.join( cache_directory, blob_tar ) else: - archive_name = os.path.join( baseline_temporary_directory, f'{blob_name}.tar.gz' ) + archive_name = os.path.join( baseline_temporary_directory, blob_tar ) if 'https://' in bucket_name: # Download from URL try: - file_download_progress( {}, f"{bucket_name}/{blob_name}", archive_name ) + file_download_progress( {}, f"{bucket_name}/{blob_tar}", archive_name ) except Exception as e: - logger.error( f'Failed to download baseline from URL ({bucket_name}/{blob_name})' ) + logger.error( f'Failed to download baseline from URL ({bucket_name}/{blob_tar})' ) logger.error( str( e ) ) else: # Download from GCP try: client = storage.Client( use_auth_w_custom_endpoint=False ) bucket = client.bucket( bucket_name ) - blob = bucket.blob( blob_name ) + blob = bucket.blob( blob_tar ) blob.download_to_filename( archive_name ) except Exception as e: - logger.error( f'Failed to download baseline from GCP ({bucket_name}/{blob_name})' ) + logger.error( f'Failed to download baseline from GCP ({bucket_name}/{blob_tar})' ) logger.error( str( e ) ) if os.path.isfile( archive_name ): From 8a17acc29fa3fc8bab4f7ff98f6af8d4177acd05 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Wed, 10 Apr 2024 11:33:56 -0700 Subject: [PATCH 15/46] Handling empty directories for baseline management --- geos_ats_package/geos_ats/baseline_io.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 85ea44e..73fbf46 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -73,13 +73,16 @@ def collect_baselines( bucket_name: str, # Check to see if the baselines are already downloaded logger.info( 'Checking for existing baseline files...' ) if os.path.isdir( baseline_path ): - logger.info( f'Target baseline directory already exists: {baseline_path}' ) - if os.path.isfile( status_path ): - last_blob_name = open( status_path, 'r' ).read() - if ( blob_name == last_blob_name ) and not force_redownload: - logger.info( f'Target baselines are already downloaded: {blob_name}' ) - logger.info( 'To re-download these files, run with the force_redownload option' ) - return + if os.listdir( baseline_path ): + logger.info( f'Target baseline directory already exists: {baseline_path}' ) + if os.path.isfile( status_path ): + last_blob_name = open( status_path, 'r' ).read() + if ( blob_name == last_blob_name ) and not force_redownload: + logger.info( f'Target baselines are already downloaded: {blob_name}' ) + logger.info( 'To re-download these files, run with the force_redownload option' ) + return + else: + ok_delete_old_baselines = True if not ok_delete_old_baselines: for ii in range( 10 ): From 18aa1d9d42c21e41c4753b47f94489abb993eee4 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Wed, 10 Apr 2024 12:34:09 -0700 Subject: [PATCH 16/46] Allowing integrated tests to run without baselines --- geos_ats_package/geos_ats/baseline_io.py | 11 +++++------ geos_ats_package/geos_ats/main.py | 7 ++++++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 73fbf46..99d07b9 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -130,7 +130,7 @@ def collect_baselines( bucket_name: str, file_download_progress( {}, f"{bucket_name}/{blob_tar}", archive_name ) except Exception as e: logger.error( f'Failed to download baseline from URL ({bucket_name}/{blob_tar})' ) - logger.error( str( e ) ) + logger.error( repr( e ) ) else: # Download from GCP try: @@ -140,7 +140,7 @@ def collect_baselines( bucket_name: str, blob.download_to_filename( archive_name ) except Exception as e: logger.error( f'Failed to download baseline from GCP ({bucket_name}/{blob_tar})' ) - logger.error( str( e ) ) + logger.error( repr( e ) ) if os.path.isfile( archive_name ): # Unpack new baselines @@ -149,11 +149,10 @@ def collect_baselines( bucket_name: str, shutil.unpack_archive( archive_name, baseline_path, format='gztar' ) logger.info( 'Finished fetching baselines!' ) except Exception as e: - logger.error( str( e ) ) + logger.error( repr( e ) ) raise Exception( f'Failed to unpack baselines: {archive_name}' ) else: - logger.error( str( e ) ) raise Exception( f'Could not find baseline files to unpack: expected={archive_name}' ) @@ -195,7 +194,7 @@ def pack_baselines( archive_name: str, baseline_path: str, log_path: str = '' ): logger.info( f'Created {archive_name}.tar.gz' ) except Exception as e: logger.error( 'Failed to create baseline archive' ) - logger.error( str( e ) ) + logger.error( repr( e ) ) def upload_baselines( bucket_name: str, archive_name: str ): @@ -221,7 +220,7 @@ def upload_baselines( bucket_name: str, archive_name: str ): except Exception as e: logger.error( 'Failed to upload baselines!' ) - logger.error( str( e ) ) + logger.error( repr( e ) ) def manage_baselines( options ): diff --git a/geos_ats_package/geos_ats/main.py b/geos_ats_package/geos_ats/main.py index 5de47bc..c859853 100644 --- a/geos_ats_package/geos_ats/main.py +++ b/geos_ats_package/geos_ats/main.py @@ -292,7 +292,12 @@ def main(): os.chdir( ats_root_dir ) os.makedirs( options.workingDir, exist_ok=True ) create_log_directory( options ) - baseline_io.manage_baselines( options ) + try: + baseline_io.manage_baselines( options ) + except Exception as e: + logger.error( 'Failed to download/locate baselines... Continuing to run tests without them' ) + logger.error( repr( e ) ) + os.makedirs( options.baselineDir, exist_ok=True ) # Check the test configuration from geos_ats import configuration_record From 02ee8ab69176825120940e82b260b38817cfcda4 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Wed, 10 Apr 2024 14:24:43 -0700 Subject: [PATCH 17/46] Adding baseline management error check --- geos_ats_package/geos_ats/main.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/geos_ats_package/geos_ats/main.py b/geos_ats_package/geos_ats/main.py index c859853..131dea6 100644 --- a/geos_ats_package/geos_ats/main.py +++ b/geos_ats_package/geos_ats/main.py @@ -299,6 +299,10 @@ def main(): logger.error( repr( e ) ) os.makedirs( options.baselineDir, exist_ok=True ) + if options.action in [ "pack_baselines", "upload_baselines", "download_baselines" ]: + logger.error( 'geos_ats should have already quit if only managing baselines... exiting now' ) + quit() + # Check the test configuration from geos_ats import configuration_record configuration_record.initializeConfig( configFile, configOverride, options ) From 89ff13069896edb228722fd517f7c7702787c053 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Wed, 10 Apr 2024 15:43:49 -0700 Subject: [PATCH 18/46] Adding additional logging to baseline management code --- geos_ats_package/geos_ats/baseline_io.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 99d07b9..69acea4 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -176,16 +176,25 @@ def pack_baselines( archive_name: str, baseline_path: str, log_path: str = '' ): logger.error( f'Could not find target baselines: {baseline_path}' ) raise FileNotFoundError( 'Could not find target baseline files' ) + print( 'baseline contents:' ) + print( os.listdir( baseline_path ) ) + # Update the blob name + logger.info( 'Setting the blob name...' ) with open( status_path, 'w' ) as f: f.write( os.path.basename( archive_name ) ) # Copy the log directory + logger.info( 'Copying the logs...' ) if os.path.isdir( log_path ): shutil.rmtree( log_path ) + if log_path: log_path = os.path.abspath( os.path.expanduser( log_path ) ) log_target = os.path.join( baseline_path, 'logs' ) + + print( 'log parameters:' ) + print( log_path, log_target ) shutil.copytree( log_path, log_target ) try: From 6e9ae4ee2f71fdc5d21fa4b5a117f05f784a1b19 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Wed, 10 Apr 2024 16:05:30 -0700 Subject: [PATCH 19/46] Adding additional logging to baseline management code --- geos_ats_package/geos_ats/baseline_io.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 69acea4..752711d 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -199,6 +199,14 @@ def pack_baselines( archive_name: str, baseline_path: str, log_path: str = '' ): try: logger.info( 'Archiving baseline files...' ) + + print('archive parameters:') + print(os.path.isdir(os.path.dirname(archive_name))) + print(archive_name) + + print('baseline parameters:') + print(os.path.isdir(baseline_path)) + print(baseline_path) shutil.make_archive( archive_name, format='gztar', root_dir=baseline_path ) logger.info( f'Created {archive_name}.tar.gz' ) except Exception as e: From 6c1a49dffe6a00f2e9556ac1a5e1de04dc8937c7 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Wed, 10 Apr 2024 17:06:52 -0700 Subject: [PATCH 20/46] Fixing log copying bug --- geos_ats_package/geos_ats/baseline_io.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 752711d..8d02de9 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -186,27 +186,31 @@ def pack_baselines( archive_name: str, baseline_path: str, log_path: str = '' ): # Copy the log directory logger.info( 'Copying the logs...' ) - if os.path.isdir( log_path ): - shutil.rmtree( log_path ) - if log_path: log_path = os.path.abspath( os.path.expanduser( log_path ) ) log_target = os.path.join( baseline_path, 'logs' ) print( 'log parameters:' ) print( log_path, log_target ) - shutil.copytree( log_path, log_target ) + + try: + if os.path.isdir( log_target ): + shutil.rmtree( log_target ) + shutil.copytree( log_path, log_target ) + except Exception as e: + logger.warning( 'Failed to remove old logs' ) + logger.warning( repr( e ) ) try: logger.info( 'Archiving baseline files...' ) - print('archive parameters:') - print(os.path.isdir(os.path.dirname(archive_name))) - print(archive_name) + print( 'archive parameters:' ) + print( os.path.isdir( os.path.dirname( archive_name ) ) ) + print( archive_name ) - print('baseline parameters:') - print(os.path.isdir(baseline_path)) - print(baseline_path) + print( 'baseline parameters:' ) + print( os.path.isdir( baseline_path ) ) + print( baseline_path ) shutil.make_archive( archive_name, format='gztar', root_dir=baseline_path ) logger.info( f'Created {archive_name}.tar.gz' ) except Exception as e: From b35d7f8a34e8907cb9e4dfbee800a6ba6a9242b0 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Thu, 11 Apr 2024 09:41:20 -0700 Subject: [PATCH 21/46] Removing test messages from geos_ats --- geos_ats_package/geos_ats/baseline_io.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 8d02de9..ddfb6a5 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -176,9 +176,6 @@ def pack_baselines( archive_name: str, baseline_path: str, log_path: str = '' ): logger.error( f'Could not find target baselines: {baseline_path}' ) raise FileNotFoundError( 'Could not find target baseline files' ) - print( 'baseline contents:' ) - print( os.listdir( baseline_path ) ) - # Update the blob name logger.info( 'Setting the blob name...' ) with open( status_path, 'w' ) as f: @@ -189,10 +186,6 @@ def pack_baselines( archive_name: str, baseline_path: str, log_path: str = '' ): if log_path: log_path = os.path.abspath( os.path.expanduser( log_path ) ) log_target = os.path.join( baseline_path, 'logs' ) - - print( 'log parameters:' ) - print( log_path, log_target ) - try: if os.path.isdir( log_target ): shutil.rmtree( log_target ) @@ -203,14 +196,6 @@ def pack_baselines( archive_name: str, baseline_path: str, log_path: str = '' ): try: logger.info( 'Archiving baseline files...' ) - - print( 'archive parameters:' ) - print( os.path.isdir( os.path.dirname( archive_name ) ) ) - print( archive_name ) - - print( 'baseline parameters:' ) - print( os.path.isdir( baseline_path ) ) - print( baseline_path ) shutil.make_archive( archive_name, format='gztar', root_dir=baseline_path ) logger.info( f'Created {archive_name}.tar.gz' ) except Exception as e: From 49af05ecd1310e0da7af95f05ad4755af1a32779 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Thu, 11 Apr 2024 11:41:39 -0700 Subject: [PATCH 22/46] Adding simple log check script --- .../geos_ats/helpers/log_check.py | 33 +++++++++++++++++++ geos_ats_package/setup.cfg | 3 ++ 2 files changed, 36 insertions(+) create mode 100644 geos_ats_package/geos_ats/helpers/log_check.py diff --git a/geos_ats_package/geos_ats/helpers/log_check.py b/geos_ats_package/geos_ats/helpers/log_check.py new file mode 100644 index 0000000..22f89dd --- /dev/null +++ b/geos_ats_package/geos_ats/helpers/log_check.py @@ -0,0 +1,33 @@ +from configparser import ConfigParser +import argparse +import os + + +def main( fname ): + log = ConfigParser() + log.read( os.path.expanduser( fname ) ) + + Nfail = 0 + status_fail = [ 'TIMEDOUT', 'HALTED', 'LSFERROR', 'FAILED' ] + + print( '=======================' ) + print( 'Integrated test results' ) + print( '=======================' ) + for status_code, tests in log[ 'Results' ].items(): + N = len( tests ) + print( f'{status_code}: {N}' ) + if status_code in status_fail: + Nfail += Nfail + + if Nfail: + print( '\nOverall status: FAILED' ) + else: + print( '\nOverall status: PASSED' ) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( description="GEOS ATS Test Log Check" ) + parser.add_argument( "log_file", type=str, help="Path to the log file" ) + args = parser.parse_args() + + main( args.log_file ) diff --git a/geos_ats_package/setup.cfg b/geos_ats_package/setup.cfg index f993965..668b3a3 100644 --- a/geos_ats_package/setup.cfg +++ b/geos_ats_package/setup.cfg @@ -28,3 +28,6 @@ python_requires = >=3.7 console_scripts = run_geos_ats = geos_ats.main:main setup_ats_environment = geos_ats.environment_setup:main + geos_ats_log_check = geos_ats.helpers.log_check:main + geos_ats_restart_check = geos_ats.helpers.restart_check:main + geos_ats_curve_check = geos_ats.helpers.curve_check:main From fead5c90244473a32402368be33f4c447f399180 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Thu, 11 Apr 2024 14:42:34 -0700 Subject: [PATCH 23/46] Updating log checker for geos ats --- .../geos_ats/helpers/log_check.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/geos_ats_package/geos_ats/helpers/log_check.py b/geos_ats_package/geos_ats/helpers/log_check.py index 22f89dd..7af9045 100644 --- a/geos_ats_package/geos_ats/helpers/log_check.py +++ b/geos_ats_package/geos_ats/helpers/log_check.py @@ -9,20 +9,31 @@ def main( fname ): Nfail = 0 status_fail = [ 'TIMEDOUT', 'HALTED', 'LSFERROR', 'FAILED' ] + overall_status = 'PASSED' + fail_names = [] print( '=======================' ) print( 'Integrated test results' ) print( '=======================' ) for status_code, tests in log[ 'Results' ].items(): - N = len( tests ) + tmp = tests.split( ';' ) + N = len( tmp ) print( f'{status_code}: {N}' ) if status_code in status_fail: Nfail += Nfail + fail_names.extend( tmp ) if Nfail: - print( '\nOverall status: FAILED' ) - else: - print( '\nOverall status: PASSED' ) + overall_status = 'FAILED' + print( '=======================' ) + print( 'Test failures' ) + print( '=======================' ) + for name in fail_names: + print( name ) + + print( '=======================' ) + print( f'Overall status: {overall_status}' ) + print( '=======================' ) if __name__ == '__main__': From 2ceda4f60826f4c61a44db79fd4555cc0e1b5742 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Thu, 11 Apr 2024 14:44:52 -0700 Subject: [PATCH 24/46] Fixing log checker script --- geos_ats_package/geos_ats/helpers/log_check.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/geos_ats_package/geos_ats/helpers/log_check.py b/geos_ats_package/geos_ats/helpers/log_check.py index 7af9045..8776b2f 100644 --- a/geos_ats_package/geos_ats/helpers/log_check.py +++ b/geos_ats_package/geos_ats/helpers/log_check.py @@ -3,7 +3,7 @@ import os -def main( fname ): +def log_check( fname ): log = ConfigParser() log.read( os.path.expanduser( fname ) ) @@ -36,9 +36,12 @@ def main( fname ): print( '=======================' ) -if __name__ == '__main__': +def main(): parser = argparse.ArgumentParser( description="GEOS ATS Test Log Check" ) parser.add_argument( "log_file", type=str, help="Path to the log file" ) args = parser.parse_args() + log_check( args.log_file ) + - main( args.log_file ) +if __name__ == '__main__': + main() From 683f82b2045c83e919b5aa2101a076a3ad12e368 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Thu, 11 Apr 2024 17:00:05 -0700 Subject: [PATCH 25/46] Fixing log check script --- geos_ats_package/geos_ats/helpers/log_check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geos_ats_package/geos_ats/helpers/log_check.py b/geos_ats_package/geos_ats/helpers/log_check.py index 8776b2f..b72ab19 100644 --- a/geos_ats_package/geos_ats/helpers/log_check.py +++ b/geos_ats_package/geos_ats/helpers/log_check.py @@ -8,7 +8,7 @@ def log_check( fname ): log.read( os.path.expanduser( fname ) ) Nfail = 0 - status_fail = [ 'TIMEDOUT', 'HALTED', 'LSFERROR', 'FAILED' ] + status_fail = [ 'timedout', 'halted', 'lsferror', 'failed' ] overall_status = 'PASSED' fail_names = [] From b7da05857b77104cd43b24a0eea15aef4fddd141 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Thu, 11 Apr 2024 17:10:08 -0700 Subject: [PATCH 26/46] Attempting to use an anonymous gcp client for baseline fetch --- geos_ats_package/geos_ats/baseline_io.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index ddfb6a5..18c40f2 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -134,7 +134,8 @@ def collect_baselines( bucket_name: str, else: # Download from GCP try: - client = storage.Client( use_auth_w_custom_endpoint=False ) + client = storage.Client.create_anonymous_client() + # client = storage.Client( use_auth_w_custom_endpoint=False ) bucket = client.bucket( bucket_name ) blob = bucket.blob( blob_tar ) blob.download_to_filename( archive_name ) From 070fc1241d1ed8b3280c76d91ab9f74e71ea45fc Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 12 Apr 2024 10:03:27 -0700 Subject: [PATCH 27/46] Fixing log check, allowing baselines to be packed to various folders --- geos_ats_package/geos_ats/baseline_io.py | 15 ++++++++------- geos_ats_package/geos_ats/helpers/log_check.py | 17 ++++++++++------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 18c40f2..effe026 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -69,6 +69,7 @@ def collect_baselines( bucket_name: str, baseline_path = os.path.abspath( os.path.expanduser( baseline_path ) ) status_path = os.path.join( baseline_path, '.blob_name' ) cache_directory = os.path.abspath( os.path.expanduser( cache_directory ) ) + short_blob_name = os.path.basename( blob_name ) # Check to see if the baselines are already downloaded logger.info( 'Checking for existing baseline files...' ) @@ -77,8 +78,8 @@ def collect_baselines( bucket_name: str, logger.info( f'Target baseline directory already exists: {baseline_path}' ) if os.path.isfile( status_path ): last_blob_name = open( status_path, 'r' ).read() - if ( blob_name == last_blob_name ) and not force_redownload: - logger.info( f'Target baselines are already downloaded: {blob_name}' ) + if ( short_blob_name == last_blob_name ) and not force_redownload: + logger.info( f'Target baselines are already downloaded: {short_blob_name}' ) logger.info( 'To re-download these files, run with the force_redownload option' ) return else: @@ -108,10 +109,11 @@ def collect_baselines( bucket_name: str, # Check for old baselines archive_name = '' - blob_tar = f'{blob_name}.tar.gz' + blob_tar = f'{short_blob_name}.tar.gz' + short_blob_tar = f'{short_blob_name}.tar.gz' if cache_directory and not force_redownload: logger.info( 'Checking cache directory for existing baseline...' ) - f = os.path.join( cache_directory, blob_tar ) + f = os.path.join( cache_directory, short_blob_tar ) if os.path.isfile( f ): logger.info( 'Baseline found!' ) archive_name = f @@ -120,9 +122,9 @@ def collect_baselines( bucket_name: str, if not archive_name: logger.info( 'Downloading baselines...' ) if cache_directory: - archive_name = os.path.join( cache_directory, blob_tar ) + archive_name = os.path.join( cache_directory, short_blob_tar ) else: - archive_name = os.path.join( baseline_temporary_directory, blob_tar ) + archive_name = os.path.join( baseline_temporary_directory, short_blob_tar ) if 'https://' in bucket_name: # Download from URL @@ -135,7 +137,6 @@ def collect_baselines( bucket_name: str, # Download from GCP try: client = storage.Client.create_anonymous_client() - # client = storage.Client( use_auth_w_custom_endpoint=False ) bucket = client.bucket( bucket_name ) blob = bucket.blob( blob_tar ) blob.download_to_filename( archive_name ) diff --git a/geos_ats_package/geos_ats/helpers/log_check.py b/geos_ats_package/geos_ats/helpers/log_check.py index b72ab19..125357f 100644 --- a/geos_ats_package/geos_ats/helpers/log_check.py +++ b/geos_ats_package/geos_ats/helpers/log_check.py @@ -16,19 +16,22 @@ def log_check( fname ): print( 'Integrated test results' ) print( '=======================' ) for status_code, tests in log[ 'Results' ].items(): - tmp = tests.split( ';' ) - N = len( tmp ) - print( f'{status_code}: {N}' ) - if status_code in status_fail: - Nfail += Nfail - fail_names.extend( tmp ) + if tests: + tmp = tests.split( ';' ) + N = len( tmp ) + print( f'{status_code}: {N}' ) + if status_code in status_fail: + Nfail += N + fail_names.extend( tmp ) + else: + print( f'{status_code}: 0' ) if Nfail: overall_status = 'FAILED' print( '=======================' ) print( 'Test failures' ) print( '=======================' ) - for name in fail_names: + for name in sorted( fail_names, key=lambda v: v.lower() ): print( name ) print( '=======================' ) From cbed575c8326f0aa12f97d75bb0fa0fe9b17c43d Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 12 Apr 2024 12:49:48 -0700 Subject: [PATCH 28/46] Fixing geos ats blob name --- geos_ats_package/geos_ats/baseline_io.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index effe026..598c8c6 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -109,7 +109,7 @@ def collect_baselines( bucket_name: str, # Check for old baselines archive_name = '' - blob_tar = f'{short_blob_name}.tar.gz' + blob_tar = f'{blob_name}.tar.gz' short_blob_tar = f'{short_blob_name}.tar.gz' if cache_directory and not force_redownload: logger.info( 'Checking cache directory for existing baseline...' ) From 37bcbfb7e1c4b1b86c119561148c67bf9eedfe78 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Mon, 15 Apr 2024 09:53:27 -0700 Subject: [PATCH 29/46] Adding whitelist for geos ats log check script --- .../geos_ats/helpers/log_check.py | 46 ++++++++++++++++--- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/geos_ats_package/geos_ats/helpers/log_check.py b/geos_ats_package/geos_ats/helpers/log_check.py index 125357f..bbf9a98 100644 --- a/geos_ats_package/geos_ats/helpers/log_check.py +++ b/geos_ats_package/geos_ats/helpers/log_check.py @@ -1,12 +1,22 @@ from configparser import ConfigParser import argparse import os +from typing import Iterable -def log_check( fname ): +def log_check( fname: str, ignored: Iterable[ str ] ) -> None: + """ + Check logs produced by geos_ats + + Args: + fname (str): Path to geos_ats log + ignored (list): List of test name failures to ignore + """ log = ConfigParser() log.read( os.path.expanduser( fname ) ) + Nignore = 0 + ignore_names = [] Nfail = 0 status_fail = [ 'timedout', 'halted', 'lsferror', 'failed' ] overall_status = 'PASSED' @@ -18,14 +28,32 @@ def log_check( fname ): for status_code, tests in log[ 'Results' ].items(): if tests: tmp = tests.split( ';' ) - N = len( tmp ) - print( f'{status_code}: {N}' ) + tmp_a = [ x for x in tmp if x not in ignored ] + tmp_b = [ x for x in tmp if x in ignored ] + Na = len( tmp_a ) + Nb = len( tmp_b ) + if status_code in status_fail: - Nfail += N - fail_names.extend( tmp ) + if Nb: + print( f'{status_code}: {Na} ({Nb} ignored)' ) + else: + print( f'{status_code}: {Na}' ) + Nfail += Na + fail_names.extend( tmp_a ) + Nignore += Nb + ignore_names.extend( tmp_b ) + else: + print( f'{status_code}: {Na+Nb}' ) else: print( f'{status_code}: 0' ) + if Nignore: + print( '=======================' ) + print( 'Ignored tests' ) + print( '=======================' ) + for name in sorted( ignore_names, key=lambda v: v.lower() ): + print( name ) + if Nfail: overall_status = 'FAILED' print( '=======================' ) @@ -42,8 +70,14 @@ def log_check( fname ): def main(): parser = argparse.ArgumentParser( description="GEOS ATS Test Log Check" ) parser.add_argument( "log_file", type=str, help="Path to the log file" ) + parser.add_argument( "-i", + "--ignore-fail", + nargs='+', + default=[], + action="extend", + help='Ignore specific tests when evaluating success' ) args = parser.parse_args() - log_check( args.log_file ) + log_check( args.log_file, args.ignore_check ) if __name__ == '__main__': From f7525462afb7106f37b54b40cdc4435a81012e0e Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Mon, 15 Apr 2024 10:32:20 -0700 Subject: [PATCH 30/46] Adding yaml input option to geos_ats log checker --- .../geos_ats/helpers/log_check.py | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/geos_ats_package/geos_ats/helpers/log_check.py b/geos_ats_package/geos_ats/helpers/log_check.py index bbf9a98..ce32404 100644 --- a/geos_ats_package/geos_ats/helpers/log_check.py +++ b/geos_ats_package/geos_ats/helpers/log_check.py @@ -1,20 +1,51 @@ from configparser import ConfigParser import argparse import os +import yaml +import socket from typing import Iterable -def log_check( fname: str, ignored: Iterable[ str ] ) -> None: +def check_yaml( yaml_file: str ) -> Iterable[ str ]: + """ + Check the integrated test yaml file for tests to ignore + + Args: + yaml_file (str): Integrated test yaml file + + Returns: + list: List of tests to ignore + """ + hostname = socket.gethostname() + ignored_tests = [] + with open( yaml_file ) as f: + test_options = yaml.safe_load( f ) + allow_fail = test_options.get( 'allow_fail', {} ) + for k, v in allow_fail.items(): + if ( k in hostname ) or ( k == 'all' ): + if v: + ignored_tests.extend( [ x.strip() for x in v.split( ',' ) ] ) + + return ignored_tests + + +def log_check( fname: str, yaml_file: str, ignored: Iterable[ str ] ) -> None: """ Check logs produced by geos_ats Args: fname (str): Path to geos_ats log + yaml_file (str): Integrated test yaml file ignored (list): List of test name failures to ignore """ log = ConfigParser() log.read( os.path.expanduser( fname ) ) + if yaml_file: + yaml_file = os.path.expanduser( yaml_file ) + if os.path.isfile( yaml_file ): + ignored.extend( check_yaml( yaml_file ) ) + Nignore = 0 ignore_names = [] Nfail = 0 @@ -70,6 +101,7 @@ def log_check( fname: str, ignored: Iterable[ str ] ) -> None: def main(): parser = argparse.ArgumentParser( description="GEOS ATS Test Log Check" ) parser.add_argument( "log_file", type=str, help="Path to the log file" ) + parser.add_argument( "-y", "--yaml-file", type=str, help="Integrated test yaml file", default='' ) parser.add_argument( "-i", "--ignore-fail", nargs='+', @@ -77,7 +109,7 @@ def main(): action="extend", help='Ignore specific tests when evaluating success' ) args = parser.parse_args() - log_check( args.log_file, args.ignore_check ) + log_check( args.log_file, args.yaml_file, args.ignore_fail ) if __name__ == '__main__': From a4b40a710b054df35c9a959e40bf840748a85870 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Mon, 15 Apr 2024 14:12:01 -0700 Subject: [PATCH 31/46] Using relative file paths for geos_ats html logs --- geos_ats_package/geos_ats/reporting.py | 34 ++++++++++++++++++++------ 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/geos_ats_package/geos_ats/reporting.py b/geos_ats_package/geos_ats/reporting.py index 64bf328..28b8527 100644 --- a/geos_ats_package/geos_ats/reporting.py +++ b/geos_ats_package/geos_ats/reporting.py @@ -6,6 +6,7 @@ from tabulate import tabulate import glob import logging +import shutil from collections.abc import Mapping from dataclasses import dataclass from ats import atsut @@ -157,6 +158,10 @@ class ReportHTML( ReportBase ): """HTML Reporting""" def report( self, refresh=0 ): + self.html_dir = os.path.dirname( self.html_filename ) + self.html_assets = os.path.join( self.html_dir, 'html_assets' ) + os.makedirs( self.html_assets, exist_ok=True ) + sp = open( self.html_filename, 'w' ) self.writeHeader( sp, refresh ) self.writeSummary( sp ) @@ -279,18 +284,33 @@ def writeTable( self, sp ): status_formatted = color_pattern.format( COLORS[ status_str ], k, status_str ) step_shortname = v.current_step elapsed_formatted = hms( v.elapsed ) + + # Collect file to link output_files = [] for s in v.steps.values(): - if os.path.isfile( s.log ): - output_files.append( file_pattern.format( s.log, os.path.basename( s.log ) ) ) - if os.path.isfile( s.log + '.err' ): - output_files.append( file_pattern.format( s.log + '.err', os.path.basename( s.log + '.err' ) ) ) + for f in [ s.log, s.log + '.err' ]: + if os.path.isfile( f ): + output_files.append( f ) for pattern in s.output: for f in sorted( glob.glob( pattern ) ): if ( ( 'restart' not in f ) or ( '.restartcheck' in f ) ) and os.path.isfile( f ): - output_files.append( file_pattern.format( f, os.path.basename( f ) ) ) - - row = [ status_formatted, k, step_shortname, elapsed_formatted, v.resources, ', '.join( output_files ) ] + output_files.append( f ) + + # Check to make sure files are in the log directory, and copy them if necessary + for ii in range( len( output_files ) ): + folder, fname = os.path.split( output_files[ ii ] ) + if folder.startswith( self.html_dir ): + output_files[ ii ] = os.path.relpath( self.html_dir, f ) + else: + copy_fname = os.path.join( self.html_assets, fname ) + shutil.copyfile( output_files[ ii ], copy_fname ) + output_files[ ii ] = copy_fname + + # Create the table entry + output_file_links = [ file_pattern.format( f, os.path.basename( f ) ) for f in output_files ] + row = [ + status_formatted, k, step_shortname, elapsed_formatted, v.resources, ', '.join( output_file_links ) + ] if status_str == 'FILTERED': table_filt.append( row ) else: From 63d9624fd460f56533786e86362f4b89ac098c49 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 16 Apr 2024 15:17:16 -0700 Subject: [PATCH 32/46] Updating ats html table format --- .../geos_ats/environment_setup.py | 2 +- geos_ats_package/geos_ats/main.py | 8 +++ geos_ats_package/geos_ats/reporting.py | 50 ++++++++++++------- geos_ats_package/geos_ats/test_case.py | 2 +- 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/geos_ats_package/geos_ats/environment_setup.py b/geos_ats_package/geos_ats/environment_setup.py index c165ae1..21d6393 100644 --- a/geos_ats_package/geos_ats/environment_setup.py +++ b/geos_ats_package/geos_ats/environment_setup.py @@ -37,7 +37,7 @@ def setup_ats( src_path, build_path, baseline_dir, working_dir, ats_xargs, ats_m with open( run_script_fname, "w" ) as g: g.write( "#!/bin/bash\n" ) g.write( - f"{geos_ats_fname} {bin_dir} {ats_main_file} --yaml {yaml_file} --workingDir {working_dir} --baselineDir {baseline_dir} --logs {log_dir} {ats_args} \"$@\"\n" + f"{geos_ats_fname} {bin_dir} {ats_main_file} --yaml {yaml_file} --workingDir {working_dir} --baselineDir {baseline_dir} --ats keep --logs {log_dir} {ats_args} \"$@\"\n" ) # Make the script executable diff --git a/geos_ats_package/geos_ats/main.py b/geos_ats_package/geos_ats/main.py index 131dea6..700ab0d 100644 --- a/geos_ats_package/geos_ats/main.py +++ b/geos_ats_package/geos_ats/main.py @@ -5,6 +5,7 @@ import subprocess import time import logging +import glob from geos_ats import command_line_parsers, baseline_io test_actions = ( "run", "rerun", "check", "continue" ) @@ -404,6 +405,9 @@ def main(): for f in files: if os.path.exists( f ): os.remove( f ) + asset_dir = os.path.join( os.path.dirname( config.report_html_file ), 'html_assets' ) + if os.path.isdir( asset_dir ): + shutil.rmtree( asset_dir ) # clean the temporary logfile that is not needed for certain actions. if options.action not in test_actions: @@ -430,6 +434,10 @@ def main(): ats.manager.saveResults() ats.manager.finalBanner() + # Cleanup old log copies + for f in glob.glob( os.path.join( options.logs, '*.log*' ) ): + os.remove( f ) + # Remove unnecessary log dirs created with clean runs none_dir = os.path.join( options.workingDir, 'None' ) if os.path.exists( none_dir ): diff --git a/geos_ats_package/geos_ats/reporting.py b/geos_ats_package/geos_ats/reporting.py index 28b8527..cff2798 100644 --- a/geos_ats_package/geos_ats/reporting.py +++ b/geos_ats_package/geos_ats/reporting.py @@ -51,6 +51,7 @@ class TestCaseRecord: elapsed: float current_step: str resources: int + path: str @dataclass @@ -79,6 +80,7 @@ def __init__( self, test_steps ): test_name = step_name[ :step_name.rfind( '_' ) ] test_id = t.group.number group_name = test_name[ :test_name.rfind( '_' ) ] + group_path = os.path.join( '.', t.options[ 'path' ], test_name ) # Save data if test_name not in self.test_results: @@ -87,7 +89,8 @@ def __init__( self, test_steps ): test_number=test_id, elapsed=0.0, current_step=' ', - resources=t.np ) + resources=t.np, + path=group_path ) # Check elapsed time elapsed = 0.0 @@ -159,7 +162,8 @@ class ReportHTML( ReportBase ): def report( self, refresh=0 ): self.html_dir = os.path.dirname( self.html_filename ) - self.html_assets = os.path.join( self.html_dir, 'html_assets' ) + self.html_assets_name = 'test_data' + self.html_assets = os.path.join( self.html_dir, self.html_assets_name ) os.makedirs( self.html_assets, exist_ok=True ) sp = open( self.html_filename, 'w' ) @@ -276,16 +280,16 @@ def writeTable( self, sp ): table = [] table_filt = [] - file_pattern = "{}" + file_pattern = "{}" color_pattern = "

{}

" for k, v in self.test_results.items(): status_str = v.status.name status_formatted = color_pattern.format( COLORS[ status_str ], k, status_str ) - step_shortname = v.current_step + step_shortname = v.current_step[ v.current_step.rfind( '_' ) + 1:-1 ] elapsed_formatted = hms( v.elapsed ) - # Collect file to link + # Collect files to include in the table output_files = [] for s in v.steps.values(): for f in [ s.log, s.log + '.err' ]: @@ -293,23 +297,31 @@ def writeTable( self, sp ): output_files.append( f ) for pattern in s.output: for f in sorted( glob.glob( pattern ) ): - if ( ( 'restart' not in f ) or ( '.restartcheck' in f ) ) and os.path.isfile( f ): + if ( 'restart' not in f ): output_files.append( f ) - # Check to make sure files are in the log directory, and copy them if necessary - for ii in range( len( output_files ) ): - folder, fname = os.path.split( output_files[ ii ] ) - if folder.startswith( self.html_dir ): - output_files[ ii ] = os.path.relpath( self.html_dir, f ) - else: - copy_fname = os.path.join( self.html_assets, fname ) - shutil.copyfile( output_files[ ii ], copy_fname ) - output_files[ ii ] = copy_fname - - # Create the table entry - output_file_links = [ file_pattern.format( f, os.path.basename( f ) ) for f in output_files ] + # Copy files and build links + if output_files: + os.makedirs( os.path.join( self.html_assets, v.path ), exist_ok=True ) + + output_file_links = [] + for f in output_files: + base_fname = os.path.basename( f ) + copy_fname = os.path.join( self.html_assets, v.path, base_fname ) + link_fname = os.path.join( '.', self.html_assets_name, v.path, base_fname ) + log_fname = base_fname + if ( '.log' in log_fname ): + log_index = base_fname[ :base_fname.find( '.' ) ] + log_type = ''.join( base_fname.split( '_' )[ -2: ] ) + log_fname = f'{log_index}_{log_type}' + + shutil.copyfile( f, copy_fname ) + output_file_links.append( file_pattern.format( link_fname, log_fname ) ) + + # Write row row = [ - status_formatted, k, step_shortname, elapsed_formatted, v.resources, ', '.join( output_file_links ) + status_formatted, + k.replace( '_', ' ' ), step_shortname, elapsed_formatted, v.resources, ', '.join( output_file_links ) ] if status_str == 'FILTERED': table_filt.append( row ) diff --git a/geos_ats_package/geos_ats/test_case.py b/geos_ats_package/geos_ats/test_case.py index 9384013..8bbc1d5 100644 --- a/geos_ats_package/geos_ats/test_case.py +++ b/geos_ats_package/geos_ats/test_case.py @@ -320,7 +320,7 @@ def testCreate( self ): # Setup a new test group atsTest = None - ats.tests.AtsTest.newGroup( priority=priority ) + ats.tests.AtsTest.newGroup( priority=priority, path=self.path ) for stepnum, step in enumerate( self.steps ): np = getattr( step.p, "np", 1 ) ngpu = getattr( step.p, "ngpu", 0 ) From f154225da3eabbaf0a7534bff4f4eaca03bed8f2 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 16 Apr 2024 17:10:36 -0700 Subject: [PATCH 33/46] Updating html report style --- geos_ats_package/geos_ats/reporting.py | 66 +++++++++++++++++--------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/geos_ats_package/geos_ats/reporting.py b/geos_ats_package/geos_ats/reporting.py index cff2798..463e1c8 100644 --- a/geos_ats_package/geos_ats/reporting.py +++ b/geos_ats_package/geos_ats/reporting.py @@ -186,44 +186,62 @@ def writeHeader( self, sp, refresh ): header += f""" Test results - generated on {gentime} + +


+

Configuration

""" # Notations: @@ -254,7 +275,6 @@ def writeHeader( self, sp, refresh ): else: username = os.getenv( "USER" ) - header += "

GEOS ATS Report

\n

Configuration

\n" table = [ [ 'Test Results', gentime ], [ 'User', username ], [ 'Platform', platform ] ] header += tabulate( table, tablefmt='html' ) header += '\n' From 107bebc30f21786492f3de26122a3bfae3e32334 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Wed, 17 Apr 2024 08:21:38 -0700 Subject: [PATCH 34/46] Removing auto page refresh from geos ats report --- geos_ats_package/geos_ats/reporting.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/geos_ats_package/geos_ats/reporting.py b/geos_ats_package/geos_ats/reporting.py index 463e1c8..19bbc55 100644 --- a/geos_ats_package/geos_ats/reporting.py +++ b/geos_ats_package/geos_ats/reporting.py @@ -179,11 +179,7 @@ def writeHeader( self, sp, refresh ): """ - - if refresh: - header += f' ' - - header += f""" Test results - generated on {gentime} + header += f""" GEOS ATS Results + + @@ -289,10 +224,11 @@ def writeSummary( self, sp ): sp.write( "\n\n

Summary

\n\n" ) table_html = tabulate( table, headers=header, tablefmt='unsafehtml' ) + table_html.replace( '', f'
' ) sp.write( table_html ) def writeTable( self, sp ): - header = ( "Status", "Name", "TestStep", "Elapsed", "Resources", "Output" ) + header = ( "Status", "Name", "TestStep", "Elapsed", "Resources", "Logs", "Output" ) table = [] table_filt = [] @@ -318,26 +254,32 @@ def writeTable( self, sp ): # Copy files and build links if output_files: - os.makedirs( os.path.join( self.html_assets, v.path ), exist_ok=True ) + os.makedirs( os.path.join( self.html_data, v.path ), exist_ok=True ) - output_file_links = [] + log_links = [] + other_links = [] for f in output_files: base_fname = os.path.basename( f ) - copy_fname = os.path.join( self.html_assets, v.path, base_fname ) - link_fname = os.path.join( '.', self.html_assets_name, v.path, base_fname ) - log_fname = base_fname - if ( '.log' in log_fname ): + copy_fname = os.path.join( self.html_data, v.path, base_fname ) + link_fname = os.path.join( '.', self.html_data_name, v.path, base_fname ) + output_fname = base_fname + if ( '.log' in output_fname ): log_index = base_fname[ :base_fname.find( '.' ) ] log_type = ''.join( base_fname.split( '_' )[ -2: ] ) - log_fname = f'{log_index}_{log_type}' + output_fname = f'{log_index}_{log_type}' shutil.copyfile( f, copy_fname ) - output_file_links.append( file_pattern.format( link_fname, log_fname ) ) + if os.stat( output_fname ).st_size: + if '.log' in output_fname: + log_links.append( file_pattern.format( link_fname, output_fname ) ) + else: + other_links.append( file_pattern.format( link_fname, output_fname ) ) # Write row row = [ status_formatted, - k.replace( '_', ' ' ), step_shortname, elapsed_formatted, v.resources, ', '.join( output_file_links ) + k.replace( '_', ' ' ), step_shortname, elapsed_formatted, v.resources, ', '.join( log_links ), + ', '.join( other_links ) ] if status_str == 'FILTERED': table_filt.append( row ) @@ -347,11 +289,13 @@ def writeTable( self, sp ): if len( table ): sp.write( "\n\n

Active Tests

\n\n" ) table_html = tabulate( table, headers=header, tablefmt='unsafehtml' ) + table_html.replace( '
', f'
' ) sp.write( table_html ) if len( table_filt ): sp.write( "\n\n

Filtered Tests

\n\n" ) table_html = tabulate( table_filt, headers=header, tablefmt='unsafehtml' ) + table_html.replace( '
', f'
' ) sp.write( table_html ) def writeFooter( self, sp ): diff --git a/geos_ats_package/setup.cfg b/geos_ats_package/setup.cfg index 668b3a3..020cf30 100644 --- a/geos_ats_package/setup.cfg +++ b/geos_ats_package/setup.cfg @@ -24,6 +24,9 @@ install_requires = ats @ https://github.com/LLNL/ATS/archive/refs/tags/7.0.105.tar.gz python_requires = >=3.7 +[options.package_data] +* = *.png + [options.entry_points] console_scripts = run_geos_ats = geos_ats.main:main From 0f0e48ec78253357e40254e39f4e7b011f8b5b86 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 19 Apr 2024 15:00:31 -0700 Subject: [PATCH 36/46] Updating html report style --- geos_ats_package/setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geos_ats_package/setup.cfg b/geos_ats_package/setup.cfg index 020cf30..c3e51bf 100644 --- a/geos_ats_package/setup.cfg +++ b/geos_ats_package/setup.cfg @@ -25,7 +25,7 @@ install_requires = python_requires = >=3.7 [options.package_data] -* = *.png +* = *.js, *.css [options.entry_points] console_scripts = From 8669589ee518c228082a0287975cfe54b12960e9 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 19 Apr 2024 16:17:50 -0700 Subject: [PATCH 37/46] Adding additional assets to html report --- geos_ats_package/geos_ats/assets/__init__.py | 8 ++++++-- geos_ats_package/geos_ats/assets/lightbox.zip | Bin 0 -> 277909 bytes geos_ats_package/geos_ats/reporting.py | 10 ++++++++-- geos_ats_package/setup.cfg | 3 ++- 4 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 geos_ats_package/geos_ats/assets/lightbox.zip diff --git a/geos_ats_package/geos_ats/assets/__init__.py b/geos_ats_package/geos_ats/assets/__init__.py index 6d9cc41..7faedc4 100644 --- a/geos_ats_package/geos_ats/assets/__init__.py +++ b/geos_ats_package/geos_ats/assets/__init__.py @@ -5,6 +5,10 @@ def create_assets_folder( target_dir ): os.makedirs( target_dir, exist_ok=True ) - mod_path = os.path.abspath( Path( __file__ ).resolve() ) - for f in [ 'sortable.js', 'style.css' ]: + mod_path = os.path.dirname( os.path.abspath( Path( __file__ ).resolve() ) ) + for f in [ 'sorttable.js', 'style.css' ]: shutil.copyfile( os.path.join( mod_path, f ), os.path.join( target_dir, f ) ) + + shutil.unpack_archive( os.path.join( mod_path, 'lightbox.zip' ), + os.path.join( target_dir, 'lightbox' ), + format='zip' ) diff --git a/geos_ats_package/geos_ats/assets/lightbox.zip b/geos_ats_package/geos_ats/assets/lightbox.zip new file mode 100644 index 0000000000000000000000000000000000000000..651a928cad284f103888df3e26fa0975c6ffcb86 GIT binary patch literal 277909 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
  • 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�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 ATS Results + + @@ -233,6 +235,7 @@ def writeTable( self, sp ): table = [] table_filt = [] file_pattern = "{}" + image_pattern = "{}" color_pattern = "

    {}

    " for k, v in self.test_results.items(): @@ -269,9 +272,12 @@ def writeTable( self, sp ): output_fname = f'{log_index}_{log_type}' shutil.copyfile( f, copy_fname ) - if os.stat( output_fname ).st_size: + if os.stat( f ).st_size: if '.log' in output_fname: log_links.append( file_pattern.format( link_fname, output_fname ) ) + elif '.png' in output_fname: + image_name = output_fname[ :-4 ] + other_links.append( image_pattern.format( link_fname, output_fname, image_name, image_name ) ) else: other_links.append( file_pattern.format( link_fname, output_fname ) ) @@ -295,7 +301,7 @@ def writeTable( self, sp ): if len( table_filt ): sp.write( "\n\n

    Filtered Tests

    \n\n" ) table_html = tabulate( table_filt, headers=header, tablefmt='unsafehtml' ) - table_html.replace( '
  • ', f'
    ' ) + table_html = table_html.replace( '
    ', f'
    ' ) sp.write( table_html ) def writeFooter( self, sp ): diff --git a/geos_ats_package/setup.cfg b/geos_ats_package/setup.cfg index c3e51bf..28eca3a 100644 --- a/geos_ats_package/setup.cfg +++ b/geos_ats_package/setup.cfg @@ -9,6 +9,7 @@ license = LGPL-2.1 [options] packages = geos_ats + geos_ats.assets geos_ats.helpers geos_ats.machines install_requires = @@ -25,7 +26,7 @@ install_requires = python_requires = >=3.7 [options.package_data] -* = *.js, *.css +* = *.js, *.css, *.zip [options.entry_points] console_scripts = From 64a5f4c63a5b9e8cfbdcb987515d254337d2025d Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 19 Apr 2024 17:22:41 -0700 Subject: [PATCH 38/46] Fixing report label --- geos_ats_package/geos_ats/assets/__init__.py | 12 +++++++++++- geos_ats_package/geos_ats/reporting.py | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/geos_ats_package/geos_ats/assets/__init__.py b/geos_ats_package/geos_ats/assets/__init__.py index 7faedc4..3c271e6 100644 --- a/geos_ats_package/geos_ats/assets/__init__.py +++ b/geos_ats_package/geos_ats/assets/__init__.py @@ -4,7 +4,17 @@ def create_assets_folder( target_dir ): - os.makedirs( target_dir, exist_ok=True ) + """ + Create an asset directory for html reports + + Args: + target_dir (str): Path to asset directory + """ + target_dir = os.path.abspath( os.path.expanduser( target_dir ) ) + if os.path.isdir( target_dir ): + return + + os.makedirs( target_dir ) mod_path = os.path.dirname( os.path.abspath( Path( __file__ ).resolve() ) ) for f in [ 'sorttable.js', 'style.css' ]: shutil.copyfile( os.path.join( mod_path, f ), os.path.join( target_dir, f ) ) diff --git a/geos_ats_package/geos_ats/reporting.py b/geos_ats_package/geos_ats/reporting.py index da87b56..7368f93 100644 --- a/geos_ats_package/geos_ats/reporting.py +++ b/geos_ats_package/geos_ats/reporting.py @@ -277,7 +277,7 @@ def writeTable( self, sp ): log_links.append( file_pattern.format( link_fname, output_fname ) ) elif '.png' in output_fname: image_name = output_fname[ :-4 ] - other_links.append( image_pattern.format( link_fname, output_fname, image_name, image_name ) ) + other_links.append( image_pattern.format( link_fname, image_name, image_name, output_fname ) ) else: other_links.append( file_pattern.format( link_fname, output_fname ) ) From a33c9d588a7dc2da604abaf9ef16cd23bdac700c Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 19 Apr 2024 18:22:45 -0700 Subject: [PATCH 39/46] Fixing lightbox settings --- geos_ats_package/geos_ats/assets/style.css | 3 ++- geos_ats_package/geos_ats/reporting.py | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/geos_ats_package/geos_ats/assets/style.css b/geos_ats_package/geos_ats/assets/style.css index 72aace8..69798be 100644 --- a/geos_ats_package/geos_ats/assets/style.css +++ b/geos_ats_package/geos_ats/assets/style.css @@ -71,4 +71,5 @@ th { padding: 8px; } - +.lb-outerContainer { max-width:675px; max-height:525px; } +.lb-image{ width:600px!important; max-height:450px!important;} diff --git a/geos_ats_package/geos_ats/reporting.py b/geos_ats_package/geos_ats/reporting.py index 7368f93..00742ca 100644 --- a/geos_ats_package/geos_ats/reporting.py +++ b/geos_ats_package/geos_ats/reporting.py @@ -186,8 +186,8 @@ def writeHeader( self, sp, refresh ): header += f""" GEOS ATS Results - - + + @@ -226,7 +226,7 @@ def writeSummary( self, sp ): sp.write( "\n\n

    Summary

    \n\n" ) table_html = tabulate( table, headers=header, tablefmt='unsafehtml' ) - table_html.replace( '
    ', f'
    ' ) + table_html = table_html.replace( '
    ', f'
    ' ) sp.write( table_html ) def writeTable( self, sp ): @@ -295,13 +295,13 @@ def writeTable( self, sp ): if len( table ): sp.write( "\n\n

    Active Tests

    \n\n" ) table_html = tabulate( table, headers=header, tablefmt='unsafehtml' ) - table_html.replace( '
    ', f'
    ' ) + table_html = table_html.replace( '
    ', '
    ' ) sp.write( table_html ) if len( table_filt ): sp.write( "\n\n

    Filtered Tests

    \n\n" ) table_html = tabulate( table_filt, headers=header, tablefmt='unsafehtml' ) - table_html = table_html.replace( '
    ', f'
    ' ) + table_html = table_html.replace( '
    ', '
    ' ) sp.write( table_html ) def writeFooter( self, sp ): From a2d41940fb1d44e6f8dcc945be3a8cb8f858f9cb Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 19 Apr 2024 18:31:03 -0700 Subject: [PATCH 40/46] Grouping lightbox captions --- geos_ats_package/geos_ats/reporting.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/geos_ats_package/geos_ats/reporting.py b/geos_ats_package/geos_ats/reporting.py index 00742ca..d2faada 100644 --- a/geos_ats_package/geos_ats/reporting.py +++ b/geos_ats_package/geos_ats/reporting.py @@ -235,7 +235,7 @@ def writeTable( self, sp ): table = [] table_filt = [] file_pattern = "{}" - image_pattern = "{}" + image_pattern = "{}" color_pattern = "

    {}

    " for k, v in self.test_results.items(): @@ -276,8 +276,8 @@ def writeTable( self, sp ): if '.log' in output_fname: log_links.append( file_pattern.format( link_fname, output_fname ) ) elif '.png' in output_fname: - image_name = output_fname[ :-4 ] - other_links.append( image_pattern.format( link_fname, image_name, image_name, output_fname ) ) + image_caption = os.path.join(k, output_fname[ :-4 ]) + other_links.append( image_pattern.format( link_fname, image_caption, output_fname ) ) else: other_links.append( file_pattern.format( link_fname, output_fname ) ) From ab0bc6b80d445801c469e89627485fb75c157b21 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Mon, 22 Apr 2024 11:07:44 -0700 Subject: [PATCH 41/46] Adding baseline history file --- geos_ats_package/geos_ats/baseline_io.py | 4 +-- geos_ats_package/geos_ats/history.py | 40 ++++++++++++++++++++++++ geos_ats_package/geos_ats/main.py | 12 ++++--- geos_ats_package/geos_ats/reporting.py | 2 +- geos_ats_package/geos_ats/test_steps.py | 5 ++- geos_ats_package/setup.cfg | 1 + 6 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 geos_ats_package/geos_ats/history.py diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 598c8c6..aee561a 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -68,7 +68,6 @@ def collect_baselines( bucket_name: str, # Setup baseline_path = os.path.abspath( os.path.expanduser( baseline_path ) ) status_path = os.path.join( baseline_path, '.blob_name' ) - cache_directory = os.path.abspath( os.path.expanduser( cache_directory ) ) short_blob_name = os.path.basename( blob_name ) # Check to see if the baselines are already downloaded @@ -112,7 +111,8 @@ def collect_baselines( bucket_name: str, blob_tar = f'{blob_name}.tar.gz' short_blob_tar = f'{short_blob_name}.tar.gz' if cache_directory and not force_redownload: - logger.info( 'Checking cache directory for existing baseline...' ) + cache_directory = os.path.abspath( os.path.expanduser( cache_directory ) ) + logger.info( f'Checking cache directory ({cache_directory}) for existing baseline...' ) f = os.path.join( cache_directory, short_blob_tar ) if os.path.isfile( f ): logger.info( 'Baseline found!' ) diff --git a/geos_ats_package/geos_ats/history.py b/geos_ats_package/geos_ats/history.py new file mode 100644 index 0000000..04eef15 --- /dev/null +++ b/geos_ats_package/geos_ats/history.py @@ -0,0 +1,40 @@ +from dataclasses import dataclass +from pathlib import Path +from git import Repo +import logging +import datetime +from configparser import ConfigParser + + +@dataclass +class GitHistory: + commit: str + author: str + email: str + + +git_history = GitHistory( '', '', '' ) +logger = logging.getLogger( 'geos_ats' ) + + +def check_git_history( bin_dir ): + git_dir = Path( bin_dir ).resolve().parents[ 1 ] + try: + r = Repo( git_dir ) + c = r.head.commit + git_history.commit = c.hexsha + git_history.author = c.author.name + git_history.email = c.author.email + except Exception as e: + logger.error( repr( e ) ) + logger.error( 'Failed to parse GEOS git history' ) + + +def write_baseline_log( fname ): + configParser = ConfigParser() + configParser.add_section( "baseline" ) + configParser.set( "baseline", "commit", git_history.commit ) + configParser.set( "baseline", "author", git_history.author ) + configParser.set( "baseline", "email", git_history.email ) + configParser.set( "baseline", "date", datetime.now().strftime( "%m/%d/%Y" ) ) + configParser.write( fname ) diff --git a/geos_ats_package/geos_ats/main.py b/geos_ats_package/geos_ats/main.py index 700ab0d..eaf0f3b 100644 --- a/geos_ats_package/geos_ats/main.py +++ b/geos_ats_package/geos_ats/main.py @@ -6,7 +6,7 @@ import time import logging import glob -from geos_ats import command_line_parsers, baseline_io +from geos_ats import command_line_parsers, baseline_io, history test_actions = ( "run", "rerun", "check", "continue" ) report_actions = ( "run", "rerun", "report", "continue" ) @@ -316,6 +316,9 @@ def main(): elif 'exclude' in r: config.restart_exclude_pattern.append( r[ -1 ] ) + # Check GEOS history + history.check_git_history( options.geos_bin_dir ) + # Check the report location if options.logs: config.report_html_file = os.path.join( options.logs, 'test_results.html' ) @@ -405,9 +408,10 @@ def main(): for f in files: if os.path.exists( f ): os.remove( f ) - asset_dir = os.path.join( os.path.dirname( config.report_html_file ), 'html_assets' ) - if os.path.isdir( asset_dir ): - shutil.rmtree( asset_dir ) + for d in [ 'html_assets', 'test_data' ]: + asset_dir = os.path.join( os.path.dirname( config.report_html_file ), d ) + if os.path.isdir( asset_dir ): + shutil.rmtree( asset_dir ) # clean the temporary logfile that is not needed for certain actions. if options.action not in test_actions: diff --git a/geos_ats_package/geos_ats/reporting.py b/geos_ats_package/geos_ats/reporting.py index d2faada..881351e 100644 --- a/geos_ats_package/geos_ats/reporting.py +++ b/geos_ats_package/geos_ats/reporting.py @@ -276,7 +276,7 @@ def writeTable( self, sp ): if '.log' in output_fname: log_links.append( file_pattern.format( link_fname, output_fname ) ) elif '.png' in output_fname: - image_caption = os.path.join(k, output_fname[ :-4 ]) + image_caption = os.path.join( k, output_fname[ :-4 ] ) other_links.append( image_pattern.format( link_fname, image_caption, output_fname ) ) else: other_links.append( file_pattern.format( link_fname, output_fname ) ) diff --git a/geos_ats_package/geos_ats/test_steps.py b/geos_ats_package/geos_ats/test_steps.py index 54f7a2f..18e807b 100644 --- a/geos_ats_package/geos_ats/test_steps.py +++ b/geos_ats_package/geos_ats/test_steps.py @@ -7,7 +7,7 @@ import subprocess import re import logging -from geos_ats import common_utilities +from geos_ats import common_utilities, history from geos_ats.common_utilities import Error, Log from geos_ats.configuration_record import config @@ -509,6 +509,9 @@ def resultPaths( self ): def clean( self ): self._clean( self.resultPaths() ) + def rebaseline( self ): + history.write_baseline_log( os.path.join( self.baseline_directory, '.baseline_history' ) ) + ################################################################################ # restartcheck diff --git a/geos_ats_package/setup.cfg b/geos_ats_package/setup.cfg index 28eca3a..0627ccc 100644 --- a/geos_ats_package/setup.cfg +++ b/geos_ats_package/setup.cfg @@ -21,6 +21,7 @@ install_requires = pyyaml tqdm requests + GitPython google-cloud-storage ats @ https://github.com/LLNL/ATS/archive/refs/tags/7.0.105.tar.gz python_requires = >=3.7 From 97f7d418e62d7704db8a6aafd59cc74cd18f9ef3 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Mon, 22 Apr 2024 11:43:35 -0700 Subject: [PATCH 42/46] Fixing the baseline log path --- geos_ats_package/geos_ats/history.py | 8 ++++++-- geos_ats_package/geos_ats/test_steps.py | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/geos_ats_package/geos_ats/history.py b/geos_ats_package/geos_ats/history.py index 04eef15..686cd3a 100644 --- a/geos_ats_package/geos_ats/history.py +++ b/geos_ats_package/geos_ats/history.py @@ -2,7 +2,8 @@ from pathlib import Path from git import Repo import logging -import datetime +import os +from datetime import datetime from configparser import ConfigParser @@ -37,4 +38,7 @@ def write_baseline_log( fname ): configParser.set( "baseline", "author", git_history.author ) configParser.set( "baseline", "email", git_history.email ) configParser.set( "baseline", "date", datetime.now().strftime( "%m/%d/%Y" ) ) - configParser.write( fname ) + + os.makedirs( os.path.dirname( fname ), exist_ok=True ) + with open( fname, 'w' ) as f: + configParser.write( f ) diff --git a/geos_ats_package/geos_ats/test_steps.py b/geos_ats_package/geos_ats/test_steps.py index 18e807b..7eef286 100644 --- a/geos_ats_package/geos_ats/test_steps.py +++ b/geos_ats_package/geos_ats/test_steps.py @@ -510,7 +510,7 @@ def clean( self ): self._clean( self.resultPaths() ) def rebaseline( self ): - history.write_baseline_log( os.path.join( self.baseline_directory, '.baseline_history' ) ) + history.write_baseline_log( os.path.join( self.p.baseline_directory, '.baseline_info' ) ) ################################################################################ From 8d7c3dc43fad254017d5b6450153540d545068ed Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Mon, 29 Apr 2024 09:27:50 -0700 Subject: [PATCH 43/46] Separating logs from archives by default --- geos_ats_package/geos_ats/baseline_io.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index aee561a..389ab73 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -184,8 +184,8 @@ def pack_baselines( archive_name: str, baseline_path: str, log_path: str = '' ): f.write( os.path.basename( archive_name ) ) # Copy the log directory - logger.info( 'Copying the logs...' ) if log_path: + logger.info( 'Copying the logs...' ) log_path = os.path.abspath( os.path.expanduser( log_path ) ) log_target = os.path.join( baseline_path, 'logs' ) try: @@ -270,7 +270,7 @@ def manage_baselines( options ): dirname = os.path.dirname( upload_name ) os.makedirs( dirname, exist_ok=True ) - pack_baselines( upload_name, options.baselineDir, log_path=options.logs ) + pack_baselines( upload_name, options.baselineDir ) if options.action == 'pack_baselines': quit() From cad1f59c3c9ed1aefe170d3d1c9e5ceadcec850b Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 30 Apr 2024 09:37:55 -0700 Subject: [PATCH 44/46] Fixing parsing of geos ats options --- geos_ats_package/geos_ats/baseline_io.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index 389ab73..a8bffdb 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -91,6 +91,7 @@ def collect_baselines( bucket_name: str, user_input = user_input.strip().lower() if user_input in [ "y", "yes" ]: logger.debug( 'User chose to delete old baselines' ) + ok_delete_old_baselines = True break elif user_input in [ "n", "no" ]: logger.debug( 'User chose to keep old baselines' ) @@ -98,7 +99,9 @@ def collect_baselines( bucket_name: str, return else: print( f'Unrecognized option: {user_input}' ) - raise Exception( 'Failed to parse user options for old baselines' ) + + if not ok_delete_old_baselines: + raise Exception( 'Failed to parse user options for old baselines' ) logger.info( 'Deleting old baselines...' ) shutil.rmtree( baseline_path ) From 218af638a289fdbef8bcb0577f039f18e21a3cc9 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 30 Apr 2024 10:05:31 -0700 Subject: [PATCH 45/46] Skipping baseline management for some test actions --- geos_ats_package/geos_ats/baseline_io.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/geos_ats_package/geos_ats/baseline_io.py b/geos_ats_package/geos_ats/baseline_io.py index a8bffdb..26b1920 100644 --- a/geos_ats_package/geos_ats/baseline_io.py +++ b/geos_ats_package/geos_ats/baseline_io.py @@ -238,6 +238,9 @@ def manage_baselines( options ): """ Manage the integrated test baselines """ + if options.action not in [ 'run', 'rerun', 'continue', 'pack_baselines', 'upload_baselines', 'download_baselines' ]: + return + # Check for integrated test yaml file test_yaml = '' if options.yaml: From b82a75705c8c08148237c1aa822cd9204be13553 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 30 Apr 2024 17:06:01 -0700 Subject: [PATCH 46/46] Adding an additional prerequisite to geos_ats --- geos_ats_package/setup.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/geos_ats_package/setup.cfg b/geos_ats_package/setup.cfg index 0627ccc..6ee5dde 100644 --- a/geos_ats_package/setup.cfg +++ b/geos_ats_package/setup.cfg @@ -23,6 +23,7 @@ install_requires = requests GitPython google-cloud-storage + pip-system-certs ats @ https://github.com/LLNL/ATS/archive/refs/tags/7.0.105.tar.gz python_requires = >=3.7