]> git.apps.os.sepia.ceph.com Git - teuthology.git/commitdiff
Add redhat internal task to setup repos
authorVasu Kulkarni <vasu@redhat.com>
Mon, 20 Mar 2017 16:48:10 +0000 (09:48 -0700)
committerVasu Kulkarni <vasu@redhat.com>
Mon, 20 Mar 2017 16:51:25 +0000 (09:51 -0700)
Signed-off-by: Vasu Kulkarni <vasu@redhat.com>
teuthology/task/internal/__init__.py
teuthology/task/internal/redhat.py [new file with mode: 0644]

index c492b4ec53e1073523857af500183bf05bae2048..2e16423adea2f3deee6b9968be322bd54733215d 100644 (file)
@@ -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 (file)
index 0000000..f79b9fb
--- /dev/null
@@ -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()