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:])