Table of Contents
- Adding a new Release
- Modifying an individual update
- Run post-request actions on updates
- Interact with bodhi's koji session
- Push updates through the Masher by hand
- Pickle bodhi's database
- Unlocking a Release
- Deleting a release, and everything associated with it
- Modifying the Masher State
- Importing builds from an existing koji tag
Adding a new Release
$ tg-admin --config=prod.cfg shell >>> rel = Release(name='f7', long_name='Fedora 7', id_prefix='FEDORA', dist_tag='dist_fc7')
Note: when adding a new release, you'll probably want to refresh the metrics right away.
>>> from bodhi.jobs import refresh_metrics >>> refresh_metrics()
Modifying an individual update
$ tg-admin --config=prod.cfg shell >>> update = PackageUpdate.byTitle('cairo-1.4.8-1.fc7') >>> print update ================================================================================ cairo-1.4.8-1.fc7 ================================================================================ Release: Fedora 7 Status: pending Type: enhancement Notes: Update to latest cairo release. Fixes various error-handlng paths : that are known to fix crashes. Submitter: behdad Submitted: 2007-06-09 12:15:04 >>> update.request = 'testing'
Run post-request actions on updates
The initial steps of the push process involve updating the tags on all of the builds, then mashing repositories based on those tags. Upon completion, the request_complete() method is called on every PackageUpdate, which assigns itself an update id, sends out the announcements, etc. In cases where something went wrong during the push process, and some updates need to be cleaned up by hand, you can do the following to recover.
- Somehow get a list of updates that need to be pushed. You can do this by copying parts of the bodhi logfile, such as:
[bodhi.masher] DEBUG 2007-07-09 14:54:25,902 Moving gimp-2.2.16-1.fc7 from dist-fc7-updates-candidate to dist-fc7-updates-testing [bodhi.masher] DEBUG 2007-07-09 14:54:26,494 Moving perl-Gearman-Server-1.09-1.fc7 from dist-fc7-updates-candidate to dist-fc7-updates-testing
...or you can get the package names by doing some PackageUpdate?.select(), or whatever.
import turbomail ; turbomail.start_extension() for line in file('update-list', 'r').readlines(): update = PackageUpdate.byTitle(line.split()).request_complete() print update.title update.request_complete()
Interact with bodhi's koji session
$ tg-admin --config=prod.cfg shell >>> from bodhi.buildsys import get_session >>> koji = get_session() >>> builds = koji.listTagged('dist-f7-updates', latest=True)
Push updates through the Masher by hand
$ tg-admin --config=prod.cfg shell >>> import turbomail ; turbomail.start_extension() >>> from bodhi import masher ; masher.start_extension() >>> masher.masher.queue(PackageUpdate.select(PackageUpdate.q.request != None))
Pickle bodhi's database
Bodhi's database can be saved and restored using the pickledb.py tool.
$ ./bodhi/tools/pickledb.py save
Unlocking a Release
$ tg-admin --config=prod.cfg shell >>> Release.byName('F8').locked = False
Deleting a release, and everything associated with it
$ ./bodhi/tools/rmrelease f7
Modifying the Masher State
When mashing updates, the Masher leaves behind a MASHING file, which contains the list of updates and a list of successfully composed repositories. If for some reason you need to modify this file, it's simply a serialized pickle, which can be modified like so:
>>> import pickle >>> state = pickle.load(file('/mnt/koji/mash/updates/MASHING')) >>> state['composed_repos'].remove('/mnt/koji/mash/updates/f9-updates-testing-090505.2026') >>> pickle.dump(state, file('/mnt/koji/mash/updates/MASHING', 'w'))
Importing builds from an existing koji tag
When bodhi started supporing EPEL packages, we had to import all of the existing testing builds as updates into the system. Doing this was fairly simple:
from bodhi.buildsys import get_session koji = get_session() el4 = Release.byName('EL-4') el4_builds = koji.listTagged('dist-4E-epel-testing') for build in el4_builds: try: b = PackageBuild.byNvr(build['nvr']) print "Skipping existing build: ", build['nvr'] continue except SQLObjectNotFound: pass try: p = Package.byName(build['package_name']) except SQLObjectNotFound: p = Package(name=build['package_name']) b = PackageBuild(nvr=build['nvr'], package=p) u = PackageUpdate(title=build['nvr'], release=el4, notes='', submitter=build['owner_name'], status='testing', type='bugfix') u.addPackageBuild(b) print "Created update: %s" % u.title