|
@@ -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()
|