github.com/weaveworks/common@v0.0.0-20230728070032-dd9e68f319d5/tools/dependencies/cross_versions.py (about) 1 #!/usr/bin/env python 2 3 # Generate the cross product of latest versions of Weave Net's dependencies: 4 # - Go 5 # - Docker 6 # - Kubernetes 7 # 8 # Dependencies: 9 # - python 10 # - git 11 # - list_versions.py 12 # 13 # Testing: 14 # $ python -m doctest -v cross_versions.py 15 16 from os import linesep 17 from sys import argv, exit, stdout, stderr 18 from getopt import getopt, GetoptError 19 from list_versions import DEPS, get_versions_from, filter_versions 20 from itertools import product 21 22 # See also: /usr/include/sysexits.h 23 _ERROR_RUNTIME = 1 24 _ERROR_ILLEGAL_ARGS = 64 25 26 27 def _usage(error_message=None): 28 if error_message: 29 stderr.write('ERROR: ' + error_message + linesep) 30 stdout.write( 31 linesep.join([ 32 'Usage:', ' cross_versions.py [OPTION]...', 'Examples:', 33 ' cross_versions.py', ' cross_versions.py -r', 34 ' cross_versions.py --rc', ' cross_versions.py -l', 35 ' cross_versions.py --latest', 'Options:', 36 '-l/--latest Include only the latest version of each major and' 37 ' minor versions sub-tree.', 38 '-r/--rc Include release candidate versions.', 39 '-h/--help Prints this!', '' 40 ])) 41 42 43 def _validate_input(argv): 44 try: 45 config = {'rc': False, 'latest': False} 46 opts, args = getopt(argv, 'hlr', ['help', 'latest', 'rc']) 47 for opt, value in opts: 48 if opt in ('-h', '--help'): 49 _usage() 50 exit() 51 if opt in ('-l', '--latest'): 52 config['latest'] = True 53 if opt in ('-r', '--rc'): 54 config['rc'] = True 55 if len(args) != 0: 56 raise ValueError('Unsupported argument(s): %s.' % args) 57 return config 58 except GetoptError as e: 59 _usage(str(e)) 60 exit(_ERROR_ILLEGAL_ARGS) 61 except ValueError as e: 62 _usage(str(e)) 63 exit(_ERROR_ILLEGAL_ARGS) 64 65 66 def _versions(dependency, config): 67 return map(str, 68 filter_versions( 69 get_versions_from(DEPS[dependency]['url'], 70 DEPS[dependency]['re']), 71 DEPS[dependency]['min'], **config)) 72 73 74 def cross_versions(config): 75 docker_versions = _versions('docker', config) 76 k8s_versions = _versions('kubernetes', config) 77 return product(docker_versions, k8s_versions) 78 79 80 def main(argv): 81 try: 82 config = _validate_input(argv) 83 print(linesep.join('\t'.join(triple) 84 for triple in cross_versions(config))) 85 except Exception as e: 86 print(str(e)) 87 exit(_ERROR_RUNTIME) 88 89 90 if __name__ == '__main__': 91 main(argv[1:])