def testGetClassForTroveType(self): assert(buildtrove.getClassForTroveType('build') == buildtrove.BuildTrove) assert(buildtrove.getClassForTroveType('image') == imagetrove.ImageTrove)
def getJobs(self, jobIdList, withTroves=False, withConfigs=False): if not jobIdList: return [] cu = self.db.cursor() jobIds = ','.join('%d' % x for x in jobIdList) results = cu.execute(""" SELECT jobId, uuid, owner, state, status, start, finish, failureReason, failureData, pid FROM Jobs WHERE jobId IN (%s) """ % (jobIds, )) jobsById = {} for (jobId, uuid, owner, state, status, start, finish, failureReason, failureData, pid) in results: if state is None: # quick catch check for missing jobs raise KeyError, jobId failureReason = thaw('FailureReason', (failureReason, cu.frombinary(failureData))) job = buildjob.BuildJob(jobId, status=status, state=state, start=float(start), finish=float(finish), failureReason=failureReason, uuid=uuid, pid=pid, owner=owner) jobsById[jobId] = job if withTroves: results = cu.execute(""" SELECT jobId, BuildTroves.troveId, troveName, version, flavor, context, state, status, failureReason, failureData, start, finish, logPath, pid, recipeType, buildType, troveType, Chroots.path, Chroots.nodeName FROM BuildTroves LEFT JOIN Chroots USING(chrootId) WHERE jobId IN (%s) """ % (jobIds, )) trovesById = {} for (jobId, troveId, name, version, flavor, context, state, status, failureReason, failureData, start, finish, logPath, pid, recipeType, buildType, troveType, chrootPath, chrootHost) in results: if chrootPath is None: chrootPath = '' chrootHost = '' version = versions.ThawVersion(version) flavor = ThawFlavor(flavor) failureReason = thaw( 'FailureReason', (failureReason, cu.frombinary(failureData))) troveClass = buildtrove.getClassForTroveType(troveType) buildTrove = troveClass(jobId, name, version, flavor, state=state, start=float(start), finish=float(finish), logPath=logPath, status=status, failureReason=failureReason, pid=pid, recipeType=recipeType, chrootPath=chrootPath, chrootHost=chrootHost, buildType=buildType, context=context) trovesById[troveId] = buildTrove jobsById[jobId].addTrove(name, version, flavor, context, buildTrove) results = cu.execute(""" SELECT BuildTroves.troveId, BinaryTroves.troveName, BinaryTroves.version, BinaryTroves.flavor FROM BuildTroves JOIN BinaryTroves USING(troveId) WHERE jobId IN (%s) """ % (jobIds, )) builtTroves = {} for troveId, name, version, flavor in results: builtTroves.setdefault(troveId, []).append( (name, ThawVersion(version), ThawFlavor(flavor))) for troveId, binTroves in builtTroves.iteritems(): trv = trovesById.get(troveId) if trv is not None: trv.setBuiltTroves(binTroves) cu.execute(""" SELECT troveId, key, value FROM TroveSettings WHERE jobId IN (%s) ORDER BY key, ord """ % (jobIds, )) troveSettings = {} for troveId, key, value in cu: d = troveSettings.setdefault(troveId, {}) d.setdefault(key, []).append(value) for troveId, settings in troveSettings.items(): settingsClass = settings.pop('_class')[0] trv = trovesById.get(troveId) if trv is not None: trv.settings = thaw('TroveSettings', (settingsClass, settings)) else: results = cu.execute(""" SELECT jobId, troveName, version, flavor, context FROM BuildTroves WHERE jobId IN (%s) """ % (jobIds, )) for (jobId, n, v, f, context) in results: jobsById[jobId].addTrove(n, versions.ThawVersion(v), ThawFlavor(f), context) if withConfigs: cu.execute(""" SELECT jobId, context, key, value FROM JobConfig WHERE jobId IN (%s) ORDER BY key, ord """ % (jobIds, )) jobConfigD = {} for jobId, context, key, value in cu: configD = jobConfigD.setdefault(jobId, {}) d = configD.setdefault(context, {}) d.setdefault(key, []).append(value) for jobId, configD in jobConfigD.items(): configD = dict((x[0], thaw('BuildConfiguration', x[1])) for x in configD.iteritems()) jobsById[jobId].setConfigs(configD) return [jobsById[jobId] for jobId in jobIdList]
def getJobs(self, jobIdList, withTroves=False, withConfigs=False): if not jobIdList: return [] cu = self.db.cursor() jobIds = ','.join('%d' % x for x in jobIdList) results = cu.execute(""" SELECT jobId, uuid, owner, state, status, start, finish, failureReason, failureData, pid FROM Jobs WHERE jobId IN (%s) """ % (jobIds,)) jobsById = {} for (jobId, uuid, owner, state, status, start, finish, failureReason, failureData, pid) in results: if state is None: # quick catch check for missing jobs raise KeyError, jobId failureReason = thaw('FailureReason', (failureReason, cu.frombinary(failureData))) job = buildjob.BuildJob(jobId, status=status, state=state, start=float(start), finish=float(finish), failureReason=failureReason, uuid=uuid, pid=pid, owner=owner) jobsById[jobId] = job if withTroves: results = cu.execute(""" SELECT jobId, BuildTroves.troveId, troveName, version, flavor, context, state, status, failureReason, failureData, start, finish, logPath, pid, recipeType, buildType, troveType, Chroots.path, Chroots.nodeName FROM BuildTroves LEFT JOIN Chroots USING(chrootId) WHERE jobId IN (%s) """ % (jobIds,)) trovesById = {} for (jobId, troveId, name, version, flavor, context, state, status, failureReason, failureData, start, finish, logPath, pid, recipeType, buildType, troveType, chrootPath, chrootHost) in results: if chrootPath is None: chrootPath = '' chrootHost = '' version = versions.ThawVersion(version) flavor = ThawFlavor(flavor) failureReason = thaw('FailureReason', (failureReason, cu.frombinary(failureData))) troveClass = buildtrove.getClassForTroveType(troveType) buildTrove = troveClass(jobId, name, version, flavor, state=state, start=float(start), finish=float(finish), logPath=logPath, status=status, failureReason=failureReason, pid=pid, recipeType=recipeType, chrootPath=chrootPath, chrootHost=chrootHost, buildType=buildType, context=context) trovesById[troveId] = buildTrove jobsById[jobId].addTrove(name, version, flavor, context, buildTrove) results = cu.execute(""" SELECT BuildTroves.troveId, BinaryTroves.troveName, BinaryTroves.version, BinaryTroves.flavor FROM BuildTroves JOIN BinaryTroves USING(troveId) WHERE jobId IN (%s) """ % (jobIds,)) builtTroves = {} for troveId, name, version, flavor in results: builtTroves.setdefault(troveId, []).append(( name, ThawVersion(version), ThawFlavor(flavor))) for troveId, binTroves in builtTroves.iteritems(): trv = trovesById.get(troveId) if trv is not None: trv.setBuiltTroves(binTroves) cu.execute(""" SELECT troveId, key, value FROM TroveSettings WHERE jobId IN (%s) ORDER BY key, ord """ % (jobIds,)) troveSettings = {} for troveId, key, value in cu: d = troveSettings.setdefault(troveId, {}) d.setdefault(key, []).append(value) for troveId, settings in troveSettings.items(): settingsClass = settings.pop('_class')[0] trv = trovesById.get(troveId) if trv is not None: trv.settings = thaw('TroveSettings', (settingsClass, settings)) else: results = cu.execute(""" SELECT jobId, troveName, version, flavor, context FROM BuildTroves WHERE jobId IN (%s) """ % (jobIds,)) for (jobId, n,v,f, context) in results: jobsById[jobId].addTrove(n, versions.ThawVersion(v), ThawFlavor(f), context) if withConfigs: cu.execute(""" SELECT jobId, context, key, value FROM JobConfig WHERE jobId IN (%s) ORDER BY key, ord """ % (jobIds,)) jobConfigD = {} for jobId, context, key, value in cu: configD = jobConfigD.setdefault(jobId, {}) d = configD.setdefault(context, {}) d.setdefault(key, []).append(value) for jobId, configD in jobConfigD.items(): configD = dict((x[0], thaw('BuildConfiguration', x[1])) for x in configD.iteritems()) jobsById[jobId].setConfigs(configD) return [jobsById[jobId] for jobId in jobIdList]
def getTroves(self, troveList): if not troveList: return [] cu = self.db.cursor() trovesById = {} trovesByNVF = {} for jobId, troveName, version, flavor, context in troveList: cu.execute( """ SELECT BuildTroves.troveId, pid, state, status, failureReason, failureData, start, finish, logPath, recipeType, Chroots.nodeName, Chroots.path, troveType FROM BuildTroves LEFT JOIN Chroots USING(chrootId) WHERE jobId = ? AND troveName = ? AND version = ? AND flavor = ? AND context = ? """, jobId, troveName, version.freeze(), flavor.freeze(), context) row = cu.fetchone() if not row: continue (troveId, pid, state, status, failureReason, failureData, start, finish, logPath, recipeType, chrootHost, chrootPath, troveType) = row if chrootPath is None: chrootPath = chrootHost = '' failureReason = thaw('FailureReason', (failureReason, cu.frombinary(failureData))) troveClass = buildtrove.getClassForTroveType(troveType) buildTrove = troveClass(jobId, troveName, version, flavor, context=context, pid=pid, state=state, start=float(start), finish=float(finish), logPath=logPath, status=status, failureReason=failureReason, recipeType=recipeType, chrootPath=chrootPath, chrootHost=chrootHost) trovesById[troveId] = buildTrove trovesByNVF[(jobId, troveName, version, flavor, context)] = buildTrove if not trovesByNVF: raise KeyError(troveList[0]) troveIds = ','.join('%d' % x for x in trovesById) cu.execute(""" SELECT troveId, troveName, version, flavor FROM BinaryTroves WHERE troveId IN (%s) """ % (troveIds, )) builtTroves = {} for troveId, troveName, version, flavor in cu: builtTroves.setdefault(troveId, []).append( (troveName, ThawVersion(version), ThawFlavor(flavor))) for troveId, binTroves in builtTroves.iteritems(): trovesById[troveId].setBuiltTroves(binTroves) cu.execute(""" SELECT troveId, key, value FROM TroveSettings WHERE troveId IN (%s) ORDER BY key, ord """ % (troveIds, )) troveSettings = {} for troveId, key, value in cu: d = troveSettings.setdefault(troveId, {}) d.setdefault(key, []).append(value) for troveId, settings in troveSettings.items(): settingsClass = settings.pop('_class')[0] trovesById[troveId].settings = thaw('TroveSettings', (settingsClass, settings)) out = [] for tup in troveList: if tup in trovesByNVF: out.append(trovesByNVF[tup]) else: raise KeyError(tup) return out
def getTroves(self, troveList): if not troveList: return [] cu = self.db.cursor() trovesById = {} trovesByNVF = {} for jobId, troveName, version, flavor, context in troveList: cu.execute(""" SELECT BuildTroves.troveId, pid, state, status, failureReason, failureData, start, finish, logPath, recipeType, Chroots.nodeName, Chroots.path, troveType FROM BuildTroves LEFT JOIN Chroots USING(chrootId) WHERE jobId = ? AND troveName = ? AND version = ? AND flavor = ? AND context = ? """, jobId, troveName, version.freeze(), flavor.freeze(), context) row = cu.fetchone() if not row: continue (troveId, pid, state, status, failureReason, failureData, start, finish, logPath, recipeType, chrootHost, chrootPath, troveType) = row if chrootPath is None: chrootPath = chrootHost = '' failureReason = thaw('FailureReason', (failureReason, cu.frombinary(failureData))) troveClass = buildtrove.getClassForTroveType(troveType) buildTrove = troveClass(jobId, troveName, version, flavor, context=context, pid=pid, state=state, start=float(start), finish=float(finish), logPath=logPath, status=status, failureReason=failureReason, recipeType=recipeType, chrootPath=chrootPath, chrootHost=chrootHost) trovesById[troveId] = buildTrove trovesByNVF[(jobId, troveName, version, flavor, context) ] = buildTrove if not trovesByNVF: raise KeyError(troveList[0]) troveIds = ','.join('%d' % x for x in trovesById) cu.execute(""" SELECT troveId, troveName, version, flavor FROM BinaryTroves WHERE troveId IN (%s) """ % (troveIds,)) builtTroves = {} for troveId, troveName, version, flavor in cu: builtTroves.setdefault(troveId, []).append(( troveName, ThawVersion(version), ThawFlavor(flavor))) for troveId, binTroves in builtTroves.iteritems(): trovesById[troveId].setBuiltTroves(binTroves) cu.execute(""" SELECT troveId, key, value FROM TroveSettings WHERE troveId IN (%s) ORDER BY key, ord """ % (troveIds,)) troveSettings = {} for troveId, key, value in cu: d = troveSettings.setdefault(troveId, {}) d.setdefault(key, []).append(value) for troveId, settings in troveSettings.items(): settingsClass = settings.pop('_class')[0] trovesById[troveId].settings = thaw('TroveSettings', (settingsClass, settings)) out = [] for tup in troveList: if tup in trovesByNVF: out.append(trovesByNVF[tup]) else: raise KeyError(tup) return out