diff options
| author | Colin Walters <walters@verbum.org> | 2010-05-13 12:22:03 -0400 |
|---|---|---|
| committer | Colin Walters <walters@verbum.org> | 2010-05-13 12:22:03 -0400 |
| commit | f6f47a6ace273194299d5f8d8139b36cc1234117 (patch) | |
| tree | a589bbc6dd667e70f07892368e281a70e7e9ad58 /qabox | |
| parent | e22978510a5abdfde040f741486b0f5a69df3db7 (diff) | |
| download | fedpkg-make-pull-f6f47a6ace273194299d5f8d8139b36cc1234117.tar.gz fedpkg-make-pull-f6f47a6ace273194299d5f8d8139b36cc1234117.tar.xz fedpkg-make-pull-f6f47a6ace273194299d5f8d8139b36cc1234117.zip | |
Work on making fedpkg-autobuilder allow building multiple releases
Diffstat (limited to 'qabox')
| -rwxr-xr-x | qabox/fedpkg-autobuilder | 170 |
1 files changed, 81 insertions, 89 deletions
diff --git a/qabox/fedpkg-autobuilder b/qabox/fedpkg-autobuilder index f02f5b2..c6835c8 100755 --- a/qabox/fedpkg-autobuilder +++ b/qabox/fedpkg-autobuilder @@ -40,105 +40,49 @@ STATE_SUCCESS = 'success' STATUS_ACTIVE = 'active' STATUS_IDLE = 'idle' -class Autobuilder(dbus.service.Object): - def __init__(self, config): - dbus.service.Object.__init__(self, dbus.SessionBus(), '/org/fedoraproject/FedpkgAutoBuilder') +class ReleaseBuilder(gobject.GObject): + __gsignals__ = { + 'changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, []) + } + + def __init__(self, name, config): + gobject.GObject.__init__(self) + self.name = name + self._config = config + + self.status = STATUS_IDLE + self.statusdata = {} + + self._resultdir = config.get(name, 'resultdir') + self._release = config.get(name, 'release') - self._resultdir = config.get('build', 'resultdir') - self._release = config.get('build', 'release') + self._builder_bus_name = '%s.%s' % (PULLBUILD_SERVICE, self._release.replace('-', '_')) try: - self._architectures = config.get('build', 'architectures').split() + self._architectures = self._get_option('architectures').split() except ConfigParser.NoOptionError, e: self._architectures = None - - modules = config.get('build', 'modules') + + modules = self._get_option('modules') self._modules = modules.split() self._pullbuild_pid = None - + self._pullbuild_proxy = None + bus = dbus.SessionBus() self._bus_proxy = dbus.Interface(bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus'), 'org.freedesktop.DBus') self._bus_proxy.connect_to_signal('NameOwnerChanged', self.__on_name_owner_changed) - self._pullbuild_proxy = None - - self._status = STATUS_IDLE - self._statusdata = {} - - self._state = STATE_BURNING - self._statedata = {} - self._reread_state() - - @dbus.service.signal(dbus_interface='org.fedoraproject.FedpkgAutoBuilder', - signature='sa{sv}') - def StateChanged(self, state, statedata): - pass - - @dbus.service.signal(dbus_interface='org.fedoraproject.FedpkgAutoBuilder', - signature='sa{sv}') - def StatusChanged(self, status, statusdata): - pass - - @dbus.service.method(dbus_interface='org.fedoraproject.FedpkgAutoBuilder', - in_signature='', out_signature='sa{sv}') - def GetState(self): - return (self._state, self._statedata) - - @dbus.service.method(dbus_interface='org.fedoraproject.FedpkgAutoBuilder', - in_signature='', out_signature='sa{sv}') - def GetStatus(self): - return (self._status, self._statusdata) - - @dbus.service.method(dbus_interface='org.fedoraproject.FedpkgAutoBuilder', - in_signature='', out_signature='as') - def GetModules(self): - return self._modules - - def _reread_state(self): - self._state = STATE_SUCCESS - self._statedata = {} - for module in self._modules: - lastbuild_path = os.path.join('_build', module, 'lastbuild-status') - if not os.path.exists(lastbuild_path): - self._state = STATE_BURNING - self._statedata['failed'] = module - break - f = open(lastbuild_path) - status = f.read() - f.close() - if status != 'success': - self._state = STATE_BURNING - self._statedata['failed'] = odule - break - self.StateChanged(self._state, self._statedata) - - - @dbus.service.method(dbus_interface='org.fedoraproject.FedpkgAutoBuilder', - in_signature='b', out_signature='s') - def Build(self, force): - if self._pullbuild_pid is not None: - return ("Can't initiate build, one is in progress") - args = ['fedpkg-pull-build-chain', '--resultdir=' + self._resultdir, '--release=' + self._release] - if force: - args.append('--force') - if self._architectures is not None: - for arch in self._architectures: - args.append('--arch=' + arch) - - args.extend(self._modules) - - (self._pullbuild_pid, _, _, _) = glib.spawn_async(args, flags=glib.SPAWN_DO_NOT_REAP_CHILD|glib.SPAWN_SEARCH_PATH) - logging.info("started builder, pid=%d" % (self._pullbuild_pid, )) - self._status = STATUS_ACTIVE - self._statusdata = {} - self.StatusChanged(self._status, self._statusdata) - glib.child_watch_add(self._pullbuild_pid, self.__on_builder_exited) - return "Build started, pid=%d" % (self._pullbuild_pid, ) + def _get_option(self, key): + try: + return self._config.get(self.name, key) + except ConfigParser.NoOptionError, e: + return self._config.get('build', key) + def __on_name_owner_changed(self, name, prev_owner, new_owner): - if name != PULLBUILD_SERVICE: + if name != self._builder_bus_name: return if new_owner == '': del self._pullbuild_proxy @@ -152,15 +96,63 @@ class Autobuilder(dbus.service.Object): def __on_builder_state_changed(self, state, statedata): logging.info("builder state=%s statedata=%r" % (state, statedata)) - self._statusdata = dict(statedata) - self.StatusChanged(self._status, self._statusdata) + self.statusdata = dict(statedata) + self.emit('changed') def __on_builder_exited(self, pid, condition): logging.info("builder pid=%d exited, condition=%r", pid, condition) self._pullbuild_pid = None - self._status = STATUS_IDLE - self._statusdata = {} - self.StatusChanged(self._status, self._statusdata) + self.status = STATUS_IDLE + self.statusdata = {} + + def start(self, force): + if self._pullbuild_pid is not None: + return + args = ['fedpkg-pull-build-chain', '--resultdir=' + self._resultdir, '--release=' + self._release] + if force: + args.append('--force') + if self._architectures is not None: + for arch in self._architectures: + args.append('--arch=' + arch) + + args.extend(self._modules) + + (self._pullbuild_pid, _, _, _) = glib.spawn_async(args, flags=glib.SPAWN_DO_NOT_REAP_CHILD|glib.SPAWN_SEARCH_PATH) + logging.info("started builder, pid=%d" % (self._pullbuild_pid, )) + self.status = STATUS_ACTIVE + self.statusdata = {} + self.emit('changed') + glib.child_watch_add(self._pullbuild_pid, self.__on_builder_exited) + +class Autobuilder(dbus.service.Object): + def __init__(self, config): + dbus.service.Object.__init__(self, dbus.SessionBus(), '/org/fedoraproject/FedpkgAutoBuilder') + self._config = config + + self._releases = config.get('build', 'releases') + self._builders = [] + for release in self._releases: + builder = ReleaseBuilder(release, config) + self._builders.append(builder) + + @dbus.service.method(dbus_interface='org.fedoraproject.FedpkgAutoBuilder', + in_signature='', out_signature='a{sv}') + def GetState(self): + result = {} + for builder in self._builders: + if builder.status == STATUS_ACTIVE: + status_str = 'active' + else: + status_str = 'idle' + result[builder.name] = {'status': status_str } + return result + + @dbus.service.method(dbus_interface='org.fedoraproject.FedpkgAutoBuilder', + in_signature='b', out_signature='s') + def Build(self, force): + for builder in self._builders: + builder.start(force) + return repr(self.GetState()) def main(): try: |
