summaryrefslogtreecommitdiffstats
path: root/qabox
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2010-05-13 12:22:03 -0400
committerColin Walters <walters@verbum.org>2010-05-13 12:22:03 -0400
commitf6f47a6ace273194299d5f8d8139b36cc1234117 (patch)
treea589bbc6dd667e70f07892368e281a70e7e9ad58 /qabox
parente22978510a5abdfde040f741486b0f5a69df3db7 (diff)
downloadfedpkg-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-xqabox/fedpkg-autobuilder170
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: