def save_db(): ## Save each release and it's metrics releases = [] for release in Release.select(): rel = {} for attr in ('name', 'long_name', 'id_prefix', 'dist_tag', 'locked', 'metrics'): rel[attr] = getattr(release, attr) releases.append(rel) updates = [] all_updates = PackageUpdate.select() progress = ProgressBar(maxValue=all_updates.count()) for update in all_updates: data = {} data['title'] = update.title data['builds'] = [(build.package.name, build.nvr) for build in update.builds] data['date_submitted'] = update.date_submitted data['date_pushed'] = update.date_pushed data['date_modified'] = update.date_modified data['release'] = [update.release.name, update.release.long_name, update.release.id_prefix, update.release.dist_tag] data['submitter'] = update.submitter data['update_id'] = hasattr(update, 'update_id') and update.update_id or update.updateid data['type'] = update.type data['karma'] = update.karma data['cves'] = [cve.cve_id for cve in update.cves] data['bugs'] = [] for bug in update.bugs: data['bugs'].append([bug.bz_id, bug.title, bug.security]) if hasattr(bug, 'parent'): data['bugs'][-1].append(bug.parent) else: data['bugs'][-1].append(False) data['status'] = update.status data['pushed'] = update.pushed data['notes'] = update.notes data['request'] = update.request data['comments'] = [(c.timestamp, c.author, c.text, c.karma, c.anonymous) for c in update.comments] if hasattr(update, 'approved'): data['approved'] = update.approved else: data['approved'] = None updates.append(data) progress() # Save all buildroot overrides overrides = [] for override in BuildRootOverride.select(): try: overrides.append(override.__json__()) except: print("Removing stray override: %s" % override) override.destroySelf() dump = file('bodhi-pickledb-%s' % time.strftime("%y%m%d.%H%M"), 'w') pickle.dump({'updates': updates, 'releases': releases, 'overrides': overrides}, dump) dump.close()
def save_edit(self, builds, notes, expiration=None, **kw): log.debug(repr(locals())) if len(builds) > 1: flash('Unable to add builds to an existing override') raise redirect('/override') builds = builds[0] if expiration: if datetime.utcnow() > expiration: flash('Cannot set an expiration in the past') if request_format() == 'json': return dict() raise redirect('/override/edit?build=' + builds) try: override = BuildRootOverride.byBuild(builds) except SQLObjectNotFound: flash('Cannot find override to edit %r' % builds) raise redirect('/override') override.notes = notes override.expiration = expiration if override.date_expired: log.debug('Retagging expired override: %s' % override.build) override.date_expired = None override.tag() flash('%s successfully edited' % builds) if request_format() == 'json': return override.__json__() raise redirect('/override')
def list(self, build=None, tg_errors=None, mine=False, release=None, show_expired=False, **kw): query = [] title = '%d Buildroot Overrides' if mine: show_expired = True query.append( BuildRootOverride.q.submitter == identity.current.user_name) title += ' submitted by %s' % identity.current.user_name if release: rel = Release.byName(release) query.append( BuildRootOverride.q.releaseID == rel.id) title += ' for %s' % rel.long_name if not show_expired: query.append( BuildRootOverride.q.date_expired == None) overrides = BuildRootOverride.select(AND(*query)) if request_format() == 'json': overrides = [o.__json__() for o in overrides] num_items = len(overrides) else: num_items = overrides.count() return dict(overrides=overrides, title=title % num_items, num_items=num_items, show_expired=show_expired, mine=mine)
def expire_buildroot_overrides(): """ Iterate over all of the buildroot overrides, expiring appropriately """ log.info('Running expire_buildroot_overrides job') now = datetime.utcnow() for override in BuildRootOverride.select( BuildRootOverride.q.date_expired == None): if override.expiration and now > override.expiration: log.info('Automatically expiring buildroot override: %s' % override.build) # Hack around overrides w/o a release. if not override.release: try: build = PackageBuild.byNvr(override.build) if len(build.updates): override.release = build.updates[0].release print "Fixing release for %s: %s" % ( override.build, override.release.name) override.untag() override.date_expired = now else: log.error("Cannot determine release for override: %s" % override) except SQLObjectNotFound: log.error("Cannot find build for override: %s" % override) else: override.untag() override.date_expired = now log.info('expire_buildroot_overrides job complete!')
def save_edit(self, builds, notes, expiration=None, **kw): log.debug(repr(locals())) if len(builds) > 1: flash("Unable to add builds to an existing override") raise redirect("/override") builds = builds[0] if expiration: if datetime.utcnow() > expiration: flash("Cannot set an expiration in the past") if request_format() == "json": return dict() raise redirect("/override/edit?build=" + builds) try: override = BuildRootOverride.byBuild(builds) except SQLObjectNotFound: flash("Cannot find override to edit %r" % builds) raise redirect("/override") override.notes = notes override.expiration = expiration if override.date_expired: log.debug("Retagging expired override: %s" % override.build) override.date_expired = None override.tag() flash("%s successfully edited" % builds) if request_format() == "json": return override.__json__() raise redirect("/override")
def list(self, build=None, tg_errors=None, mine=False, release=None, show_expired=False, **kw): query = [] title = '%d Buildroot Overrides' if mine: query.append( BuildRootOverride.q.submitter == identity.current.user_name) title += ' submitted by %s' % identity.current.user_name if release: rel = Release.byName(release) query.append(BuildRootOverride.q.releaseID == rel.id) title += ' for %s' % rel.long_name if not show_expired: query.append(BuildRootOverride.q.date_expired == None) overrides = BuildRootOverride.select(AND(*query)) if request_format() == 'json': overrides = [o.__json__() for o in overrides] num_items = len(overrides) else: num_items = overrides.count() return dict(overrides=overrides, title=title % num_items, num_items=num_items, show_expired=show_expired, mine=mine)
def expire_buildroot_overrides(): """ Iterate over all of the buildroot overrides, expiring appropriately """ log.info('Running expire_buildroot_overrides job') now = datetime.utcnow() for override in BuildRootOverride.select(BuildRootOverride.q.date_expired == None): if override.expiration and now > override.expiration: log.info('Automatically expiring buildroot override: %s' % override.build) # Hack around overrides w/o a release. if not override.release: try: build = PackageBuild.byNvr(override.build) if len(build.updates): override.release = build.updates[0].release print "Fixing release for %s: %s" % (override.build, override.release.name) override.untag() override.date_expired = now else: log.error("Cannot determine release for override: %s" % override) except SQLObjectNotFound: log.error("Cannot find build for override: %s" % override) else: override.untag() override.date_expired = now log.info('expire_buildroot_overrides job complete!')
def expire_buildroot_overrides(): """ Iterate over all of the buildroot overrides, expiring appropriately """ log.info('Running expire_buildroot_overrides job') now = datetime.utcnow() for override in BuildRootOverride.select(BuildRootOverride.date_expired == None): if now > override.expiration: log.info('Automatically expiring buildroot override: %s' % override.build) override.untag() override.date_expired = now log.info('expire_buildroot_overrides job complete!')
def expire_buildroot_overrides(): """ Iterate over all of the buildroot overrides, expiring appropriately """ log.info('Running expire_buildroot_overrides job') now = datetime.utcnow() for override in BuildRootOverride.select( BuildRootOverride.date_expired == None): if now > override.expiration: log.info('Automatically expiring buildroot override: %s' % override.build) override.untag() override.date_expired = now log.info('expire_buildroot_overrides job complete!')
def clean_tables(): from bodhi.model import (Release, Package, PackageBuild, PackageUpdate, Comment, CVE, Bugzilla, BuildRootOverride) from bodhi.identity.tables import (Visit, VisitIdentity, Group, User, Permission) print "Cleaning out tables" Release.dropTable(ifExists=True, cascade=True) Package.dropTable(ifExists=True, cascade=True) PackageBuild.dropTable(ifExists=True, cascade=True) PackageUpdate.dropTable(ifExists=True, cascade=True) Comment.dropTable(ifExists=True, cascade=True) CVE.dropTable(ifExists=True, cascade=True) Bugzilla.dropTable(ifExists=True, cascade=True) BuildRootOverride.dropTable(ifExists=True, cascade=True) Visit.dropTable(ifExists=True, cascade=True) VisitIdentity.dropTable(ifExists=True, cascade=True) Group.dropTable(ifExists=True, cascade=True) User.dropTable(ifExists=True, cascade=True) Permission.dropTable(ifExists=True, cascade=True) hub.commit() Release.createTable(ifNotExists=True) Package.createTable(ifNotExists=True) PackageBuild.createTable(ifNotExists=True) PackageUpdate.createTable(ifNotExists=True) Comment.createTable(ifNotExists=True) CVE.createTable(ifNotExists=True) Bugzilla.createTable(ifNotExists=True) BuildRootOverride.createTable(ifNotExists=True) Visit.createTable(ifNotExists=True) VisitIdentity.createTable(ifNotExists=True) Group.createTable(ifNotExists=True) User.createTable(ifNotExists=True) Permission.createTable(ifNotExists=True)
def expire(self, build, *args, **kw): """ Expire a given override """ override = BuildRootOverride.byBuild(build) if override.date_expired: flash('Override %s already expired!' % build) if request_format() == 'json': return dict() raise redirect('/override') override.date_expired = datetime.utcnow() try: override.untag() except Exception, e: log.error(str(e)) flash(str(e)) raise redirect('/override')
def edit(self, build): """ Edit an override """ try: override = BuildRootOverride.byBuild(build) except SQLObjectNotFound: flash("Cannot find override %r" % build) raise redirect("/override") values = { "builds": {"text": override.build, "hidden": override.build}, "expiration": override.expiration, "notes": override.notes, "edited": override.build, } if override.date_expired: flash("This override is EXPIRED. Editing it will re-enable it") return dict( form=override_form, values=values, action=url("/override/save_edit"), title="Edit Buildroot Override" )
def edit(self, build): """ Edit an override """ try: override = BuildRootOverride.byBuild(build) except SQLObjectNotFound: flash('Cannot find override %r' % build) raise redirect('/override') values = { 'builds': {'text': override.build, 'hidden': override.build}, 'expiration': override.expiration, 'notes': override.notes, 'edited': override.build, } if override.date_expired: flash('This override is EXPIRED. Editing it will re-enable it') return dict(form=override_form, values=values, action=url("/override/save_edit"), title='Edit Buildroot Override')
def expire(self, build, *args, **kw): """ Expire a given override """ override = BuildRootOverride.byBuild(build) if identity.current.user_name != override.submitter and "releng" not in identity.current.groups: flash("Only the submitter or a releng memeber can " + "expire this buildroot override") if request_format() == "json": return dict() raise redirect("/override") if override.date_expired: flash("Override %s already expired!" % build) if request_format() == "json": return dict() raise redirect("/override") override.date_expired = datetime.utcnow() try: override.untag() except Exception, e: log.error(str(e)) flash(str(e)) raise redirect("/override")
def expire(self, build, *args, **kw): """ Expire a given override """ override = BuildRootOverride.byBuild(build) if identity.current.user_name != override.submitter and \ 'releng' not in identity.current.groups: flash('Only the submitter or a releng memeber can ' + 'expire this buildroot override') if request_format() == 'json': return dict() raise redirect('/override') if override.date_expired: flash('Override %s already expired!' % build) if request_format() == 'json': return dict() raise redirect('/override') override.date_expired = datetime.utcnow() try: override.untag() except Exception, e: log.error(str(e)) flash(str(e)) raise redirect('/override')
def save_edit_cli(self, builds, notes, expiration=None, **kw): log.debug(repr(locals())) if expiration: if datetime.utcnow() > expiration: flash('Cannot set an expiration in the past') if request_format() == 'json': return dict() raise redirect('/override/edit?build=' + builds) try: override = BuildRootOverride.byBuild(builds) except SQLObjectNotFound: flash('Cannot find override to edit %r' % builds) raise redirect('/override') override.notes = notes override.expiration = expiration if override.date_expired: log.debug('Retagging expired override: %s' % override.build) override.date_expired = None override.tag() flash('%s successfully edited' % builds) if request_format() == 'json': return override.__json__() raise redirect('/override')
def main(): load_config() __connection__ = hub = PackageHub("bodhi") if len(sys.argv) != 2: print "Usage: %s <release>" % sys.argv[0] sys.exit(1) try: release = Release.byName(sys.argv[1].upper()) except SQLObjectNotFound: print "Cannot find Release '%s'" % sys.argv[1] sys.exit(1) updates = PackageUpdate.select(PackageUpdate.q.releaseID == release.id) progress = ProgressBar(maxValue=updates.count()) print "Destroying all updates, comments, and bugs associated with %s" % release.name for update in updates: for comment in update.comments: comment.destroySelf() for build in update.builds: build.destroySelf() for bug in update.bugs: if len(bug.updates) == 1: bug.destroySelf() update.destroySelf() progress() overrides = BuildRootOverride.select( BuildRootOverride.releaseID == release.id) num_overrides = overrides.count() if num_overrides: progress = ProgressBar(maxValue=num_overrides) print "Destroying all buildroot overrides associated with %s" % release.name for override in overrides: override.destroySelf() progress() release.destroySelf() hub.commit() print
def main(): load_config() __connection__ = hub = PackageHub("bodhi") if len(sys.argv) != 2: print "Usage: %s <release>" % sys.argv[0] sys.exit(1) try: release = Release.byName(sys.argv[1].upper()) except SQLObjectNotFound: print "Cannot find Release '%s'" % sys.argv[1] sys.exit(1) updates = PackageUpdate.select(PackageUpdate.q.releaseID == release.id) progress = ProgressBar(maxValue=updates.count()) print "Destroying all updates, comments, and bugs associated with %s" % release.name for update in updates: for comment in update.comments: comment.destroySelf() for build in update.builds: build.destroySelf() for bug in update.bugs: if len(bug.updates) == 1: bug.destroySelf() update.destroySelf() progress() overrides = BuildRootOverride.select(BuildRootOverride.releaseID==release.id) num_overrides = overrides.count() if num_overrides: progress = ProgressBar(maxValue=num_overrides) print "Destroying all buildroot overrides associated with %s" % release.name for override in overrides: override.destroySelf() progress() release.destroySelf() hub.commit() print
def edit(self, build): """ Edit an override """ try: override = BuildRootOverride.byBuild(build) except SQLObjectNotFound: flash('Cannot find override %r' % build) raise redirect('/override') values = { 'builds': { 'text': override.build, 'hidden': override.build }, 'expiration': override.expiration, 'notes': override.notes, 'edited': override.build, } if override.date_expired: flash('This override is EXPIRED. Editing it will re-enable it') return dict(form=override_form, values=values, action=url("/override/save_edit"), title='Edit Buildroot Override')
def load_db(): print "\nLoading pickled database %s" % sys.argv[2] db = file(sys.argv[2], 'r') data = pickle.load(db) # Load up all of the overrides for override in data.get('overrides', []): try: BuildRootOverride.byBuild(override['build']) except SQLObjectNotFound: BuildRootOverride(**override) # Legacy format was just a list of update dictionaries # Now we'll pull things out into an organized dictionary: # {'updates': [], 'releases': []} if isinstance(data, dict): for release in data['releases']: try: Release.byName(release['name']) except SQLObjectNotFound: Release(**release) data = data['updates'] progress = ProgressBar(maxValue=len(data)) for u in data: try: release = Release.byName(u['release'][0]) except SQLObjectNotFound: release = Release(name=u['release'][0], long_name=u['release'][1], id_prefix=u['release'][2], dist_tag=u['release'][3]) ## Backwards compatbility request = u['request'] if u['request'] == 'move': request = 'stable' elif u['request'] == 'push': request = 'testing' elif u['request'] == 'unpush': request = 'obsolete' if u['approved'] in (True, False): u['approved'] = None if 'update_id' in u: u['updateid'] = u['update_id'] if not 'date_modified' in u: u['date_modified'] = None try: update = PackageUpdate.byTitle(u['title']) except SQLObjectNotFound: update = PackageUpdate(title=u['title'], date_submitted=u['date_submitted'], date_pushed=u['date_pushed'], date_modified=u['date_modified'], release=release, submitter=u['submitter'], updateid=u['updateid'], type=u['type'], status=u['status'], pushed=u['pushed'], notes=u['notes'], karma=u['karma'], request=request, approved=u['approved']) ## Create Package and PackageBuild objects for pkg, nvr in u['builds']: try: package = Package.byName(pkg) except SQLObjectNotFound: package = Package(name=pkg) try: build = PackageBuild.byNvr(nvr) except SQLObjectNotFound: build = PackageBuild(nvr=nvr, package=package) update.addPackageBuild(build) ## Create all Bugzilla objects for this update for bug_num, bug_title, security, parent in u['bugs']: try: bug = Bugzilla.byBz_id(bug_num) except SQLObjectNotFound: bug = Bugzilla(bz_id=bug_num, security=security, parent=parent) bug.title = bug_title update.addBugzilla(bug) ## Create all CVE objects for this update for cve_id in u['cves']: try: cve = CVE.byCve_id(cve_id) except SQLObjectNotFound: cve = CVE(cve_id=cve_id) update.addCVE(cve) for timestamp, author, text, karma, anonymous in u['comments']: comment = Comment(timestamp=timestamp, author=author, text=text, karma=karma, update=update, anonymous=anonymous) progress()
return dict() raise redirect("/override/new") if identity.current.user_name not in people[0]: if "provenpackager" not in identity.current.groups: flash("Error: You do not have commit privileges to %s" % n) if request_format() == "json": return dict() raise redirect("/override/new") # Create a new overrides object try: override = BuildRootOverride( build=build, notes=notes, submitter=identity.current.user_name, expiration=expiration, releaseID=release.id, ) except (DuplicateEntryError, PostgresIntegrityError): flash("Error: buildroot override for %s already exists" % build) if request_format() == "json": return dict() raise redirect("/override/new") # Tag the build override.tag() flash( "Your buildroot override has been successfully tagged. " "It may take up to 20 minutes for the buildroot to regenerate. "
try: people, groups = get_pkg_pushers(n, **pkgdb_args) except Exception, e: flash(str(e)) if request_format() == 'json': return dict() raise redirect('/override/new') if identity.current.user_name not in people[0]: flash("Error: You do not have commit privileges to %s" % n) if request_format() == 'json': return dict() raise redirect('/override/new') # Create a new overrides object try: override = BuildRootOverride( build=build, notes=notes, submitter=identity.current.user_name, expiration=expiration, releaseID=release.id) except (DuplicateEntryError, PostgresIntegrityError): flash('Error: buildroot override for %r already exists' % build) if request_format() == 'json': return dict() raise redirect('/override/new') # Tag the build override.tag() flash('Your buildroot override has been successfully tagged. ' 'It may take up to 20 minutes for the buildroot to regenerate. ' 'You can wait for the new buildroot by running ' '`koji wait-repo %s-build`' % last_release.dist_tag)
people, groups = get_pkg_pushers(n, **pkgdb_args) except Exception, e: flash(str(e)) if request_format() == 'json': return dict() raise redirect('/override/new') if identity.current.user_name not in people[0]: if 'provenpackager' not in identity.current.groups: flash("Error: You do not have commit privileges to %s" % n) if request_format() == 'json': return dict() raise redirect('/override/new') # Create a new overrides object try: override = BuildRootOverride(build=build, notes=notes, submitter=identity.current.user_name, expiration=expiration, releaseID=release.id) except (DuplicateEntryError, PostgresIntegrityError): flash('Error: buildroot override for %s already exists' % build) if request_format() == 'json': return dict() raise redirect('/override/new') # Tag the build override.tag() flash('Your buildroot override has been successfully tagged. ' 'It may take up to 20 minutes for the buildroot to regenerate. ' 'You can wait for the new buildroot by running ' '`koji wait-repo %s-build --build=%s`' % (last_release.dist_tag, build))
def save_db(): ## Save each release and it's metrics releases = [] for release in Release.select(): rel = {} for attr in ('name', 'long_name', 'id_prefix', 'dist_tag', 'locked', 'metrics'): rel[attr] = getattr(release, attr) releases.append(rel) updates = [] all_updates = PackageUpdate.select() progress = ProgressBar(maxValue=all_updates.count()) for update in all_updates: data = {} data['title'] = update.title data['builds'] = [(build.package.name, build.nvr) for build in update.builds] data['date_submitted'] = update.date_submitted data['date_pushed'] = update.date_pushed data['date_modified'] = update.date_modified data['release'] = [ update.release.name, update.release.long_name, update.release.id_prefix, update.release.dist_tag ] data['submitter'] = update.submitter data['update_id'] = hasattr( update, 'update_id') and update.update_id or update.updateid data['type'] = update.type data['karma'] = update.karma data['cves'] = [cve.cve_id for cve in update.cves] data['bugs'] = [] for bug in update.bugs: data['bugs'].append([bug.bz_id, bug.title, bug.security]) if hasattr(bug, 'parent'): data['bugs'][-1].append(bug.parent) else: data['bugs'][-1].append(False) data['status'] = update.status data['pushed'] = update.pushed data['notes'] = update.notes data['request'] = update.request data['comments'] = [(c.timestamp, c.author, c.text, c.karma, c.anonymous) for c in update.comments] if hasattr(update, 'approved'): data['approved'] = update.approved else: data['approved'] = None updates.append(data) progress() # Save all buildroot overrides overrides = [] for override in BuildRootOverride.select(): try: overrides.append(override.__json__()) except: print("Removing stray override: %s" % override) override.destroySelf() dump = file('bodhi-pickledb-%s' % time.strftime("%y%m%d.%H%M"), 'w') pickle.dump( { 'updates': updates, 'releases': releases, 'overrides': overrides }, dump) dump.close()