From 6121e6c6efcfe0d41559d181ab580bdf7144bbce Mon Sep 17 00:00:00 2001 From: Vasu Kulkarni Date: Mon, 20 Mar 2017 09:48:10 -0700 Subject: [PATCH] Add redhat internal task to setup repos Signed-off-by: Vasu Kulkarni --- teuthology/task/internal/__init__.py | 1 + teuthology/task/internal/redhat.py | 143 +++++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 teuthology/task/internal/redhat.py diff --git a/teuthology/task/internal/__init__.py b/teuthology/task/internal/__init__.py index c492b4ec53..2e16423ade 100644 --- a/teuthology/task/internal/__init__.py +++ b/teuthology/task/internal/__init__.py @@ -19,6 +19,7 @@ from teuthology.config import config as teuth_config from teuthology.exceptions import VersionNotFoundError from teuthology.job_status import get_status, set_status from teuthology.orchestra import cluster, remote, run +from .redhat import setup_cdn_repo, setup_base_repo, setup_additional_repo # noqa log = logging.getLogger(__name__) diff --git a/teuthology/task/internal/redhat.py b/teuthology/task/internal/redhat.py new file mode 100644 index 0000000000..f79b9fbce8 --- /dev/null +++ b/teuthology/task/internal/redhat.py @@ -0,0 +1,143 @@ +""" +Internal tasks for redhat downstream builds +""" +import contextlib +import logging +import requests +from tempfile import NamedTemporaryFile +from teuthology.parallel import parallel +from teuthology.orchestra import run +from teuthology.task.install.redhat import set_deb_repo + +log = logging.getLogger(__name__) + + +@contextlib.contextmanager +def setup_cdn_repo(ctx, config): + """ + setup repo if set_cdn_repo exists in config + redhat: + set_cdn_repo: + rhbuild: 2.0 or 1.3.2 or 1.3.3 + """ + # do import of tasks here since the qa task path should be set here + if ctx.config.get('redhat').get('set-cdn-repo', None): + from tasks.set_repo import set_cdn_repo + config = ctx.config.get('redhat').get('set-cdn-repo') + set_cdn_repo(ctx, config) + yield + + +@contextlib.contextmanager +def setup_additional_repo(ctx, config): + """ + set additional repo's for testing + redhat: + set-add-repo: 'http://example.com/internal.repo' + """ + if ctx.config.get('redhat').get('set-add-repo', None): + add_repo = ctx.config.get('redhat').get('set-add-repo') + for remote in ctx.cluster.remotes.iterkeys(): + if remote.os.package_type == 'rpm': + remote.run(args=['sudo', 'wget', '-O', '/etc/yum.repos.d/rh_add.repo', + add_repo]) + remote.run(args=['sudo', 'yum', 'update', 'metadata']) + + yield + + +@contextlib.contextmanager +def setup_base_repo(ctx, config): + """ + Setup repo based on redhat nodes + redhat: + base-repo-url: base url that provides Mon, OSD, Tools etc + installer-repo-url: Installer url that provides Agent, Installer + deb-repo-url: debian repo url + deb-gpg-key: gpg key used for signing the build + """ + rh_config = ctx.config.get('redhat') + if not rh_config.get('base-repo-url'): + # no repo defined + yield + if rh_config.get('set-cdn-repo'): + log.info("CDN repo already set, skipping rh repo") + yield + else: + _setup_latest_repo(ctx, rh_config) + try: + yield + finally: + log.info("Cleaning up repo's") + for remote in ctx.cluster.remotes.iterkeys(): + if remote.os.package_type == 'rpm': + remote.run(args=['sudo', 'rm', + run.Raw('/etc/yum.repos.d/rh*.repo'), + ], check_status=False) + + +def _setup_latest_repo(ctx, config): + """ + Setup repo based on redhat nodes + """ + with parallel(): + for remote in ctx.cluster.remotes.iterkeys(): + if remote.os.package_type == 'rpm': + remote.run(args=['sudo', 'subscription-manager', 'repos', + run.Raw('--disable=*ceph*')]) + base_url = config.get('base-repo-url', '') + installer_url = config.get('installer-repo-url', '') + repos = ['MON', 'OSD', 'Tools', 'Calamari', 'Installer'] + installer_repos = ['Agent', 'Main', 'Installer'] + if config.get('base-rh-repos'): + repos = ctx.config.get('base-rh-repos') + if config.get('installer-repos'): + installer_repos = ctx.config.get('installer-repos') + # create base repo + if base_url.startswith('http'): + repo_to_use = _get_repos_to_use(base_url, repos) + base_repo_file = NamedTemporaryFile(delete=False) + _create_temp_repo_file(repo_to_use, base_repo_file) + remote.put_file(base_repo_file.name, base_repo_file.name) + remote.run(args=['sudo', 'cp', base_repo_file.name, + '/etc/yum.repos.d/rh_ceph.repo']) + if installer_url.startswith('http'): + irepo_to_use = _get_repos_to_use( + installer_url, installer_repos) + installer_file = NamedTemporaryFile(delete=False) + _create_temp_repo_file(irepo_to_use, installer_file) + remote.put_file(installer_file.name, installer_file.name) + remote.run(args=['sudo', 'cp', installer_file.name, + '/etc/yum.repos.d/rh_inst.repo']) + else: + if config.get('deb-repo-url'): + deb_repo = config.get('deb-repo-url') + deb_gpg_key = config.get('deb-gpg-key', None) + set_deb_repo(remote, deb_repo, deb_gpg_key) + + +def _get_repos_to_use(base_url, repos): + repod = dict() + for repo in repos: + repo_to_use = base_url + "compose/" + repo + "/x86_64/os/" + r = requests.get(repo_to_use) + log.info("Checking %s", repo_to_use) + if r.status_code == 200: + log.info("Using %s", repo_to_use) + repod[repo] = repo_to_use + return repod + + +def _create_temp_repo_file(repos, repo_file): + for repo in repos.keys(): + header = "[ceph-" + repo + "]" + "\n" + name = "name=ceph-" + repo + "\n" + baseurl = "baseurl=" + repos[repo] + "\n" + gpgcheck = "gpgcheck=0\n" + enabled = "enabled=1\n\n" + repo_file.write(header) + repo_file.write(name) + repo_file.write(baseurl) + repo_file.write(gpgcheck) + repo_file.write(enabled) + repo_file.close() -- 2.39.5