From c172feb4e2eb7f2a07f1b3afbc16dadcad8914fa Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Aug 25 2017 12:08:53 +0000 Subject: When Docker image in Lightblue does not contain info about dockerfile, fallback to koji/brew to find out the source of the Docker image. --- diff --git a/freshmaker/kojiservice.py b/freshmaker/kojiservice.py index fcee9fe..ef60ead 100644 --- a/freshmaker/kojiservice.py +++ b/freshmaker/kojiservice.py @@ -103,6 +103,9 @@ class KojiService(object): return self.session.listRPMs(buildID=build_info['id'], arches=arches) + def get_build(self, build_nvr): + return self.session.getBuild(build_nvr) + @contextlib.contextmanager def koji_service(profile=None, logger=None): diff --git a/freshmaker/lightblue.py b/freshmaker/lightblue.py index 34c953a..c6b8843 100644 --- a/freshmaker/lightblue.py +++ b/freshmaker/lightblue.py @@ -29,7 +29,8 @@ import six from six.moves import http_client import concurrent.futures -from freshmaker import log +from freshmaker import log, conf +from freshmaker.kojiservice import koji_service class LightBlueError(Exception): @@ -100,6 +101,8 @@ class ContainerRepository(dict): class ContainerImage(dict): """Represent a container image""" + KOJI_BUILDS_CACHE = {} + @classmethod def create(cls, data): image = cls() @@ -140,6 +143,30 @@ class ContainerImage(dict): dockerfile, _, commit = dockerfile_url.partition("?id=") _, _, reponame = dockerfile.partition("/cgit/") reponame = reponame.replace("/plain/Dockerfile", "") + + # If we cannot find reponame and commit in the Lightblue data, + # fallback to Koji to get a Koji build based on the ["brew"]["build"]. + if not reponame or not commit: + nvr = self["brew"]["build"] + if nvr in ContainerImage.KOJI_BUILDS_CACHE: + reponame, commit = ContainerImage.KOJI_BUILDS_CACHE[nvr] + else: + with koji_service(conf.koji_profile, log) as session: + build = session.get_build(nvr) + if build: + source = build["source"] + if source is None: + brew_task = session.getTaskRequest( + build['task_id']) + source = brew_task[0] + + m = re.match(r".*/(?P.*)/(?P.*)#(?P.*)", source) + namespace = m.group("namespace") + container = m.group("container") + reponame = namespace + "/" + container + commit = m.group("commit") + ContainerImage.KOJI_BUILDS_CACHE[nvr] = (reponame, commit) + data = {"repository": reponame, "commit": commit, "srpm_nevra": srpm_nevra} self.update(data) diff --git a/tests/test_lightblue.py b/tests/test_lightblue.py index c64d077..a7a3d57 100644 --- a/tests/test_lightblue.py +++ b/tests/test_lightblue.py @@ -132,6 +132,71 @@ class TestContainerImageObject(unittest.TestCase): self.assertEqual('1233829', image['_id']) self.assertEqual('20151210T10:09:35.000-0500', image['brew']['completion_date']) + def test_resolve_commit(self): + image = ContainerImage.create({ + '_id': '1233829', + 'brew': { + 'completion_date': u'20170421T04:27:51.000-0400', + 'build': 'package-name-1-4-12.10', + 'package': 'package-name-1' + }, + 'parsed_data': { + 'files': [ + { + 'key': 'buildfile', + 'content_url': 'http://git.repo.com/cgit/rpms/repo-1/plain/Dockerfile?id=commit_hash1', + 'filename': u'Dockerfile' + } + ], + 'rpm_manifest': [ + { + "srpm_name": "openssl", + "srpm_nevra": "openssl-0:1.2.3-1.src" + }, + { + "srpm_name": "tespackage", + "srpm_nevra": "testpackage-10:1.2.3-1.src" + } + ] + } + }) + + image.resolve_commit("openssl") + self.assertEqual(image["repository"], "rpms/repo-1") + self.assertEqual(image["commit"], "commit_hash1") + self.assertEqual(image["srpm_nevra"], "openssl-0:1.2.3-1.src") + + @patch('freshmaker.kojiservice.KojiService.get_build') + def test_resolve_commit_koji_fallback(self, get_build): + image = ContainerImage.create({ + '_id': '1233829', + 'brew': { + 'completion_date': u'20170421T04:27:51.000-0400', + 'build': 'package-name-1-4-12.10', + 'package': 'package-name-1' + }, + 'parsed_data': { + 'rpm_manifest': [ + { + "srpm_name": "openssl", + "srpm_nevra": "openssl-0:1.2.3-1.src" + }, + { + "srpm_name": "tespackage", + "srpm_nevra": "testpackage-10:1.2.3-1.src" + } + ] + } + }) + + get_build.return_value = { + "source": "git://example.com/rpms/repo-1#commit_hash1"} + + image.resolve_commit("openssl") + self.assertEqual(image["repository"], "rpms/repo-1") + self.assertEqual(image["commit"], "commit_hash1") + self.assertEqual(image["srpm_nevra"], "openssl-0:1.2.3-1.src") + class TestContainerRepository(unittest.TestCase):