From a5f2d582cc7157888f6e63f68214a1c97775997a Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Aug 16 2019 21:19:57 +0000 Subject: [PATCH 1/2] rework update of reserved builds Fixes: https://pagure.io/koji/issue/1603 --- diff --git a/hub/kojihub.py b/hub/kojihub.py index 63acfa3..f2f85fb 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -5760,6 +5760,8 @@ class CG_Importer(object): raise koji.GenericError("Token doesn't match build ID %s" % build_id) if buildinfo['cg_id'] != cg_id: raise koji.GenericError('Build ID %s is not reserved by this CG' % build_id) + if buildinfo.get('task_id'): + raise koji.GenericError('Build is owned by task %(task_id)s' % buildinfo) if buildinfo['state'] != koji.BUILD_STATES['BUILDING']: raise koji.GenericError('Build ID %s is not in BUILDING state' % build_id) if buildinfo['name'] != metadata['build']['name'] or \ @@ -5820,24 +5822,15 @@ class CG_Importer(object): def get_build(self, token=None): - try: - binfo = dslice(self.buildinfo, ('name', 'version', 'release')) - buildinfo = get_build(binfo, strict=True) - build_token = get_reservation_token(buildinfo['build_id']) - if len(self.cgs) != 1: - raise koji.GenericError("Reserved builds can handle only single content generator.") - cg_id = list(self.cgs)[0] - if buildinfo.get('task_id') or \ - buildinfo['state'] != koji.BUILD_STATES['BUILDING'] or \ - not build_token or \ - buildinfo['cg_id'] != cg_id or \ - build_token['token'] != token: - raise koji.GenericError("Build is not reserved") - buildinfo['extra'] = self.buildinfo['extra'] + if token: + # token and reservation were already checked in prep_build + buildinfo = self.update_build() build_id = buildinfo['build_id'] - except Exception: + else: + # no reservation, we need create a new build entry build_id = new_build(self.buildinfo) buildinfo = get_build(build_id, strict=True) + # handle special build types for btype in self.typeinfo: tinfo = self.typeinfo[btype] @@ -5857,29 +5850,35 @@ class CG_Importer(object): if [o for o in self.prepped_outputs if o['type'] == 'rpm']: new_typed_build(buildinfo, 'rpm') - # update build state - if buildinfo.get('extra'): - extra = json.dumps(buildinfo['extra']) + self.buildinfo = buildinfo + return buildinfo + + + def update_build(self): + """Update a reserved build""" + # sanity checks performed by prep_build + build_id = self.buildinfo['build_id'] + old_info = get_build(build_id, strict=True) + if self.buildinfo.get('extra'): + extra = json.dumps(self.buildinfo['extra']) else: extra = None owner = self.buildinfo.get('owner', context.session.user_id) source = self.buildinfo.get('source') st_complete = koji.BUILD_STATES['COMPLETE'] - st_old = buildinfo['state'] - koji.plugin.run_callbacks('preBuildStateChange', attribute='state', old=st_old, new=st_complete, info=buildinfo) - update = UpdateProcessor('build', clauses=['id=%(id)s'], values=buildinfo) + st_old = old_info['state'] + koji.plugin.run_callbacks('preBuildStateChange', attribute='state', old=st_old, new=st_complete, info=self.buildinfo) + update = UpdateProcessor('build', clauses=['id=%(build_id)s'], values=self.buildinfo) update.set(state=st_complete, extra=extra, owner=owner, source=source) if self.buildinfo.get('volume_id'): # reserved builds have reapplied volume policy now update.set(volume_id=self.buildinfo['volume_id']) update.rawset(completion_time='NOW()') update.execute() - buildinfo = get_build(build_id, strict=True) clear_reservation(build_id) - koji.plugin.run_callbacks('postBuildStateChange', attribute='state', old=st_old, new=st_complete, info=buildinfo) + koji.plugin.run_callbacks('postBuildStateChange', attribute='state', old=st_old, new=st_complete, info=self.buildinfo) - self.buildinfo = buildinfo - return buildinfo + return get_build(build_id, strict=True) def import_metadata(self): From b67de2c26e7edb6699584b1491e337c8b7b9da37 Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Aug 19 2019 15:07:43 +0000 Subject: [PATCH 2/2] pass correct buildinfo to callbacks --- diff --git a/hub/kojihub.py b/hub/kojihub.py index f2f85fb..3e3a601 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -5867,7 +5867,7 @@ class CG_Importer(object): source = self.buildinfo.get('source') st_complete = koji.BUILD_STATES['COMPLETE'] st_old = old_info['state'] - koji.plugin.run_callbacks('preBuildStateChange', attribute='state', old=st_old, new=st_complete, info=self.buildinfo) + koji.plugin.run_callbacks('preBuildStateChange', attribute='state', old=st_old, new=st_complete, info=old_info) update = UpdateProcessor('build', clauses=['id=%(build_id)s'], values=self.buildinfo) update.set(state=st_complete, extra=extra, owner=owner, source=source) if self.buildinfo.get('volume_id'): @@ -5875,10 +5875,11 @@ class CG_Importer(object): update.set(volume_id=self.buildinfo['volume_id']) update.rawset(completion_time='NOW()') update.execute() + buildinfo = get_build(build_id, strict=True) clear_reservation(build_id) - koji.plugin.run_callbacks('postBuildStateChange', attribute='state', old=st_old, new=st_complete, info=self.buildinfo) + koji.plugin.run_callbacks('postBuildStateChange', attribute='state', old=st_old, new=st_complete, info=buildinfo) - return get_build(build_id, strict=True) + return buildinfo def import_metadata(self):