diff --git a/tripleo_repos/main.py b/tripleo_repos/main.py index 59dc2e7..7e48a51 100755 --- a/tripleo_repos/main.py +++ b/tripleo_repos/main.py @@ -36,9 +36,11 @@ DEFAULT_OUTPUT_PATH = '/etc/yum.repos.d' DEFAULT_RDO_MIRROR = 'https://trunk.rdoproject.org' RDO_RE = re.compile('baseurl=%s' % DEFAULT_RDO_MIRROR) +# RHEL is only provided to licensed cloud providers via RHUI DEFAULT_MIRROR_MAP = { 'fedora': 'https://mirrors.fedoraproject.org', - 'centos': 'http://mirror.centos.org' + 'centos': 'http://mirror.centos.org', + 'rhel': '', } CEPH_REPO_TEMPLATE = ''' [tripleo-centos-ceph-%(ceph_release)s] @@ -55,7 +57,12 @@ gpgcheck=0 enabled=1 ''' # unversioned fedora added for backwards compatibility -SUPPORTED_DISTROS = ['centos7', 'fedora28', 'fedora'] +SUPPORTED_DISTROS = [ + ('centos', '7'), + ('fedora', '28'), + ('fedora', ''), + ('rhel', '8') +] class InvalidArguments(Exception): @@ -66,22 +73,44 @@ class NoRepoTitle(Exception): pass -def _parse_args(): +def _get_distro(): - distro = subprocess.Popen( - 'source /etc/os-release && echo "$ID$VERSION_ID"', + output = subprocess.Popen( + 'source /etc/os-release && echo -e -n "$ID\n$VERSION_ID"', shell=True, stdout=subprocess.PIPE, stderr=open(os.devnull, 'w'), - universal_newlines=True).communicate()[0].rstrip() + executable='/bin/bash', + universal_newlines=True).communicate() - if distro not in SUPPORTED_DISTROS: + # distro_id and distro_version_id will always be at least an empty string + distro_id, distro_version_id = output[0].split('\n') + + # if distro_version_id is empty string the major version will be empty + # string too + distro_major_version_id = distro_version_id.split('.')[0] + + if (distro_id, distro_major_version_id) not in SUPPORTED_DISTROS: print( - "WARNING: Unsupported platform '%s' detected by tripleo-repos, " - "centos7 will be used unless you use CLI param to change it." % - distro, file=sys.stderr) - distro = 'centos7' - distro_key = re.sub(r'[0-9]+', '', distro) + "WARNING: Unsupported platform '{}{}' detected by tripleo-repos," + " centos7 will be used unless you use CLI param to change it." + "".format(distro_id, distro_major_version_id), file=sys.stderr) + distro_id = 'centos' + distro_major_version_id = '7' + + return distro_id, distro_major_version_id + + +def _parse_args(): + + distro_id, distro_major_version_id = _get_distro() + + distro = "{}{}".format(distro_id, distro_major_version_id) + + # Calculating arguments default from constants + default_mirror = DEFAULT_MIRROR_MAP[distro_id] + distro_choices = ["".join(distro_pair) + for distro_pair in SUPPORTED_DISTROS] parser = argparse.ArgumentParser( description='Download and install repos necessary for TripleO. Note ' @@ -103,7 +132,7 @@ def _parse_args(): 'from the appropriate location.') parser.add_argument('-d', '--distro', default=distro, - choices=SUPPORTED_DISTROS, + choices=distro_choices, nargs='?', help='Target distro with default detected at runtime. ' ) @@ -115,11 +144,11 @@ def _parse_args(): default=DEFAULT_OUTPUT_PATH, help='Directory in which to save the selected repos.') parser.add_argument('--mirror', - default=DEFAULT_MIRROR_MAP[distro_key], + default=default_mirror, help='Server from which to install base OS packages. ' 'Default value is based on distro param.') parser.add_argument('--centos-mirror', - default=DEFAULT_MIRROR_MAP[distro_key], + default=default_mirror, help='[deprecated] Server from which to install base ' 'CentOS packages. If mentioned it will be used ' 'as --mirror for backwards compatibility.') @@ -133,8 +162,7 @@ def _parse_args(): file=sys.stderr) args.mirror = args.centos_mirror - distro_key = re.sub(r'[0-9]+', '', args.distro) - args.old_mirror = DEFAULT_MIRROR_MAP[distro_key] + args.old_mirror = default_mirror return args @@ -169,6 +197,9 @@ def _validate_distro_repos(args): elif args.distro in ['centos7']: valid_repos = ['ceph', 'current', 'current-tripleo', 'current-tripleo-dev', 'deps', 'tripleo-ci-testing'] + elif args.distro in ['rhel8']: + valid_repos = ['ceph', 'current', 'current-tripleo', + 'current-tripleo-dev', 'deps', 'tripleo-ci-testing'] invalid_repos = [x for x in args.repos if x not in valid_repos] if len(invalid_repos) > 0: raise InvalidArguments('{} repo(s) are not valid for {}. Valid repos ' @@ -227,13 +258,18 @@ def _remove_existing(args): def _get_base_path(args): - if args.branch != 'master': - if args.distro in ['fedora28'] and args.branch != 'stein': - raise InvalidArguments('Only stable/stein branch is suppported ' - 'with fedora28.') - distro_branch = '%s-%s' % (args.distro, args.branch) - else: - distro_branch = args.distro + if args.distro == 'fedora28' and \ + args.branch not in ['stein', 'master']: + raise InvalidArguments('Only stable/stein and master branches' + 'are supported with fedora28.') + + # The mirror url with /$DISTRO$VERSION path for master branch is + # deprecated. + # The default for rdo mirrors is $DISTRO$VERSION-$BRANCH + # it should work for every (distro, branch) pair that + # makes sense + # Any exception should be corrected at source, not here. + distro_branch = '%s-%s' % (args.distro, args.branch) return '%s/%s/' % (args.rdo_mirror, distro_branch) diff --git a/tripleo_repos/tests/test_main.py b/tripleo_repos/tests/test_main.py index 33a849e..3b5a8bf 100644 --- a/tripleo_repos/tests/test_main.py +++ b/tripleo_repos/tests/test_main.py @@ -108,21 +108,15 @@ class TestTripleORepos(testtools.TestCase): self.assertNotIn(mock.call('/etc/yum.repos.d/foo.repo'), mock_remove.mock_calls) + # There is no $DISTRO single path anymore, every path has branch + # specification, even master def test_get_base_path(self): args = mock.Mock() args.branch = 'master' args.distro = 'centos7' args.rdo_mirror = 'http://trunk.rdoproject.org' path = main._get_base_path(args) - self.assertEqual('http://trunk.rdoproject.org/centos7/', path) - - def test_get_base_path_branch(self): - args = mock.Mock() - args.branch = 'liberty' - args.distro = 'centos7' - args.rdo_mirror = 'http://trunk.rdoproject.org' - path = main._get_base_path(args) - self.assertEqual('http://trunk.rdoproject.org/centos7-liberty/', path) + self.assertEqual('http://trunk.rdoproject.org/centos7-master/', path) def test_get_base_path_fedora(self): args = mock.Mock() @@ -130,7 +124,7 @@ class TestTripleORepos(testtools.TestCase): args.distro = 'fedora' args.rdo_mirror = 'http://trunk.rdoproject.org' path = main._get_base_path(args) - self.assertEqual('http://trunk.rdoproject.org/fedora/', path) + self.assertEqual('http://trunk.rdoproject.org/fedora-master/', path) def test_get_base_path_fedora_unsup_branch(self): args = mock.Mock()