diff --git a/update_dependencies b/update_dependencies new file mode 100755 index 0000000000..7900462013 --- /dev/null +++ b/update_dependencies @@ -0,0 +1,77 @@ +#!/usr/bin/env python +import argparse +import errno +import os +import subprocess + + +class ValidationException(Exception): + def __init__(self, error_msg, error_no=errno.EFAULT): + self.errmsg = error_msg + self.errno = error_no + + def get_error_name(self): + return errno.errorcode.get(self.errno) or 'EUNKNOWN' + + def __str__(self): + return f'[{self.get_error_name()}] {self.errmsg}' + + +class NotFoundException(ValidationException): + def __init__(self, error): + super().__init__(error, errno.ENOENT) + + +class TrainNotFoundException(NotFoundException): + def __init__(self): + super(TrainNotFoundException, self).__init__('Failed to find train') + + +class CatalogItemNotFoundException(NotFoundException): + def __init__(self, path): + super(CatalogItemNotFoundException, self).__init__(f'Failed to find {path!r} catalog item') + + +def update_train_charts(train_path): + # We will gather all charts in the train and then for each chart all it's versions will be updated + if not os.path.exists(train_path): + raise TrainNotFoundException() + + for item in os.listdir(train_path): + process_catalog_item(os.path.join(train_path, item)) + + +def process_catalog_item(item_path): + if not os.path.exists(item_path): + raise CatalogItemNotFoundException(item_path) + + for item_version in os.listdir(item_path): + update_item_version(os.path.join(item_path, item_version)) + + +def update_item_version(version_path): + cp = subprocess.Popen( + ['helm', 'dependency', 'update', version_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + stdout, stderr = cp.communicate() + if cp.returncode: + # TODO: Let's keep a log of success and failure scenarios + pass + + +def main(): + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(help='sub-command help', dest='action') + + parser_setup = subparsers.add_parser('update', help='Update dependencies for specified train') + parser_setup.add_argument('--train', help='Specify train path to update dependencies', required=True) + + args = parser.parse_args() + if args.action == 'update': + update_train_charts(args.train) + else: + parser.print_help() + + +if __name__ == '__main__': + main()