Пример #1
0
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()
Пример #2
0
 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')
Пример #3
0
    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)
Пример #4
0
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!')
Пример #5
0
 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")
Пример #6
0
    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)
Пример #7
0
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!')
Пример #8
0
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!')
Пример #9
0
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!')
Пример #10
0
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)
Пример #11
0
 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')
Пример #12
0
 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')
Пример #13
0
 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"
     )
Пример #14
0
 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')
Пример #15
0
 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")
Пример #16
0
 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')
Пример #17
0
 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')
Пример #18
0
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
Пример #19
0
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
Пример #20
0
 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')
Пример #21
0
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()
Пример #22
0
                    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. "
Пример #23
0
            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)
Пример #24
0
                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))
Пример #25
0
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()
Пример #26
0
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()