def payloadToDict(self): buildCfg = freeze('BuildConfiguration', self.payload.buildCfg) trove = freeze('BuildTrove', self.payload.trove) d = dict(buildCfg=buildCfg, trove=trove, logData=self.payload.logData) if self.payload.logData is None: d['logData'] = '' return d
def testResolveResult(self): trv = self.addComponent('foo:runtime', '1.0', 'ssl') tup = trv.getNameVersionFlavor() job = (tup[0], (None, None), (tup[1], tup[2]), False) r = resolver.ResolveResult() r.troveResolved([job], [], []) r2 = thaw('ResolveResult', freeze('ResolveResult', r)) assert(r2.getBuildReqs() == [ job ]) assert(r2.success) assert(not r2.inCycle) r = resolver.ResolveResult(inCycle=True) r.troveMissingBuildReqs(True, [('foo', None, parseFlavor('ssl'))]) r2 = thaw('ResolveResult', freeze('ResolveResult', r)) assert(not r2.hasMissingDeps()) assert(r2.hasMissingBuildReqs()) assert(r2.getMissingBuildReqs() == [(True, ('foo', '', parseFlavor('ssl')))]) assert(not r2.success) assert(r2.inCycle) r = resolver.ResolveResult(inCycle=True) r.troveMissingDependencies(True, [(trv.getNameVersionFlavor(), parseDep('trove: foo trove: bar'))]) r2 = thaw('ResolveResult', freeze('ResolveResult', r)) assert(r.getMissingDeps() == r2.getMissingDeps()) assert(r2.hasMissingDeps()) assert(not r2.success) assert(r2.inCycle)
def __freeze__(self): return { 'session_id': self.session_id, 'jobs': freeze('ImageJobs', self.jobs), 'slots': self.slots, 'machine_info': freeze('MachineInformation', self.machine_info), }
def __freeze__(self): d = dict(trove=freeze('BuildTrove', self.trove), buildCfg=freeze('BuildConfiguration', self.buildCfg), builtTroves=freeze('troveTupleList', self.builtTroves), crossTroves=freeze('troveTupleList', self.crossTroves), inCycle=self.inCycle) return d
def __freeze__(self): return dict(hostname=self.hostname, flavors=[freeze('flavor', x) for x in self.flavors], name=self.name, active=self.active, slots=self.slots, chroots=[freeze('Chroot', x) for x in self.chroots])
def freeze_JOB_LOADED(class_, apiVer, data): return [ data[0], [(freeze('troveContextTuple', trove), freeze('LoadTroveResult', result)) for (trove, result) in data[1].iteritems()] ]
def __freeze__(self): d = self.__dict__.copy() d.update(missingBuildReqs=[(x[0], freeze("troveSpec", x[1])) for x in self.missingBuildReqs]) d.update(buildReqs=freeze("installJobList", self.buildReqs)) d.update(crossReqs=freeze("installJobList", self.crossReqs)) d.update(bootstrapReqs=freeze("installJobList", self.bootstrapReqs)) d.update(missingDeps=freeze("dependencyMissingList", self.missingDeps)) return d
def payloadToDict(self): job = freeze('BuildJob', self.payload.job) loadTroves = [ freeze('troveContextTuple', x) for x in self.payload.loadTroves ] return dict(job=job, loadTroves=loadTroves, reposName=self.payload.reposName)
def __freeze__(self): d = self.__dict__.copy() d.update(missingBuildReqs=[(x[0], freeze('troveSpec', x[1])) for x in self.missingBuildReqs]) d.update(buildReqs=freeze('installJobList', self.buildReqs)) d.update(crossReqs=freeze('installJobList', self.crossReqs)) d.update(bootstrapReqs=freeze('installJobList', self.bootstrapReqs)) d.update(missingDeps=freeze('dependencyMissingList', self.missingDeps)) return d
def __freeze__(self): d = self.__dict__.copy() d['pid'] = self.pid d['version'] = str(self.version) d['flavorList'] = [ x.freeze() for x in self.flavorList ] d['failureReason'] = freeze('FailureReason', self.failureReason) return d
def __freeze__(self): d = self.__dict__.copy() if self.troveTuple: d['troveTuple'] = freeze('troveTuple', self.troveTuple) else: d['troveTuple'] = '' return d
def testFreeze(self): cfg = buildcfg.BuildConfiguration(readConfigFiles=False) os.environ['HOME'] = self.workDir cfg.configLine('policyDirs ~/policy') newCfg = apiutils.thaw('BuildConfiguration', apiutils.freeze('BuildConfiguration', cfg)) assert(newCfg.policyDirs[0]._getUnexpanded() == self.workDir + '/policy')
def addJob(self, job): cu = self.db.cursor() cu.execute( "INSERT INTO Jobs (uuid, state, owner) " "VALUES ( ?, ?, ? )", job.uuid, job.state, job.owner) jobId = int(cu.lastrowid) for trove in job.iterTroves(): trove.jobId = jobId (troveName, version, flavor, context) = trove.getNameVersionFlavor(True) cu.execute( """INSERT INTO BuildTroves (jobId, troveName, version, flavor, state, context, buildType, troveType) VALUES (?, ?, ?, ?, ?, ?, ?, ?)""", (jobId, troveName, version.freeze(), flavor.freeze(), TROVE_STATE_INIT, context, trove.buildType, trove.troveType)) troveId = cu.lastrowid className, settings = freeze('TroveSettings', trove.settings) settings['_class'] = [className] for key, values in settings.iteritems(): for idx, value in enumerate(values): cu.execute( '''INSERT INTO TroveSettings (jobId, troveId, key, ord, value) VALUES (?, ?, ?, ?, ?)''', jobId, troveId, key, idx, value) for context, jobConfig in job.getConfigDict().items(): self.addJobConfig(jobId, context, jobConfig) self.db.commit() job.jobId = jobId return jobId
def testJob(self): db = self.openRmakeDatabase() trv = self.addComponent('foo:source', '1.0', '!flavor') job = buildjob.NewBuildJob(db, [trv.getNameVersionFlavor()]) job2 = apiutils.thaw('BuildJob', apiutils.freeze('BuildJob', job)) assert(job2.jobId == job.jobId) assert(list(job2.iterTroveList()) == list(job.iterTroveList()))
def testJob(self): db = self.openRmakeDatabase() trv = self.addComponent('foo:source', '1.0', '!flavor') job = buildjob.NewBuildJob(db, [trv.getNameVersionFlavor()]) job2 = apiutils.thaw('BuildJob', apiutils.freeze('BuildJob', job)) assert (job2.jobId == job.jobId) assert (list(job2.iterTroveList()) == list(job.iterTroveList()))
def listTrovesByState(self, callData, jobId, state): jobId = self.db.convertToJobId(jobId) if state == '': state = None data = self.db.listTrovesByState(jobId, state) return [(x[0], freeze('troveContextTupleList', x[1])) for x in data.iteritems()]
def __freeze__(self): d = self.__dict__.copy() d['pid'] = self.pid d['version'] = str(self.version) d['flavorList'] = [x.freeze() for x in self.flavorList] d['failureReason'] = freeze('FailureReason', self.failureReason) return d
def addJob(self, job): cu = self.db.cursor() cu.execute("INSERT INTO Jobs (uuid, state, owner) " "VALUES ( ?, ?, ? )", job.uuid, job.state, job.owner) jobId = int(cu.lastrowid) for trove in job.iterTroves(): trove.jobId = jobId (troveName, version, flavor, context) = trove.getNameVersionFlavor(True) cu.execute("""INSERT INTO BuildTroves (jobId, troveName, version, flavor, state, context, buildType, troveType) VALUES (?, ?, ?, ?, ?, ?, ?, ?)""", ( jobId, troveName, version.freeze(), flavor.freeze(), TROVE_STATE_INIT, context, trove.buildType, trove.troveType)) troveId = cu.lastrowid className, settings = freeze('TroveSettings', trove.settings) settings['_class'] = [className] for key, values in settings.iteritems(): for idx, value in enumerate(values): cu.execute('''INSERT INTO TroveSettings (jobId, troveId, key, ord, value) VALUES (?, ?, ?, ?, ?)''', jobId, troveId, key, idx, value) for context, jobConfig in job.getConfigDict().items(): self.addJobConfig(jobId, context, jobConfig) self.db.commit() job.jobId = jobId return jobId
def put(self, result): if not result.jobHash: return path = os.path.join(self.path, result.jobHash) result = freeze('ResolveResult', result) fobj = util.AtomicFile(path, chmod=0644) fobj.write(xmlrpclib.dumps((result,))) fobj.commit()
def updateTrove(self, trove): cu = self.db.cursor() if trove.getChrootHost(): chrootId = self.db._getChrootIdForTrove(trove) else: chrootId = 0 failureTup = freeze('FailureReason', trove.getFailureReason()) if failureTup[0] == '': failureTup = None, None kw = dict(pid=trove.pid, start=trove.start, finish=trove.finish, logPath=trove.logPath, status=trove.status, state=trove.state, failureReason=failureTup[0], failureData=cu.binary(failureTup[1]), recipeType=trove.recipeType, buildType=trove.buildType, chrootId=chrootId) fieldList = '=?, '.join(kw) + '=?' valueList = kw.values() valueList += (trove.jobId, trove.getName(), trove.getVersion().freeze(), trove.getFlavor().freeze(), trove.getContext()) cu.execute( """UPDATE BuildTroves SET %s WHERE jobId=? AND troveName=? AND version=? AND flavor=? AND context=? """ % fieldList, valueList) troveId = self._getTroveId(cu, trove.jobId, *trove.getNameVersionFlavor(True)) className, settings = freeze('TroveSettings', trove.settings) settings['_class'] = [className] cu.execute('DELETE FROM TroveSettings WHERE troveId=?', troveId) for key, values in settings.iteritems(): for idx, value in enumerate(values): cu.execute( '''INSERT INTO TroveSettings (jobId, troveId, key, ord, value) VALUES (?, ?, ?, ?, ?)''', trove.jobId, troveId, key, idx, value)
def testFreeze(self): cfg = buildcfg.BuildConfiguration(readConfigFiles=False) os.environ['HOME'] = self.workDir cfg.configLine('policyDirs ~/policy') newCfg = apiutils.thaw('BuildConfiguration', apiutils.freeze('BuildConfiguration', cfg)) assert (newCfg.policyDirs[0]._getUnexpanded() == self.workDir + '/policy')
def __freeze__(self, sanitize=False): d = {} for attr, attrType in self.attrTypes.iteritems(): d[attr] = freeze(attrType, getattr(self, attr)) if self.jobId is None: d['jobId'] = '' d['troves'] = [(freeze('troveContextTuple', x[0]), x[1] and freeze('BuildTrove', x[1]) or '') for x in self.troves.iteritems()] if sanitize: freezeClass = 'SanitizedBuildConfiguration' else: freezeClass = 'BuildConfiguration' d['configs'] = [(x[0], freeze(freezeClass, x[1])) for x in self.configs.items()] return d
def __freeze__(self): d = {} for attr, attrType in self.attrTypes.iteritems(): d[attr] = freeze(attrType, getattr(self, attr)) d['packages'] = list(d['packages']) if self.jobId is None: d['jobId'] = '' return d
def __freeze__(self, sanitize=False): d = {} for attr, attrType in self.attrTypes.iteritems(): d[attr] = freeze(attrType, getattr(self, attr)) if self.jobId is None: d['jobId'] = '' d['troves'] = [ (freeze('troveContextTuple', x[0]), x[1] and freeze('BuildTrove', x[1]) or '') for x in self.troves.iteritems() ] if sanitize: freezeClass = 'SanitizedBuildConfiguration' else: freezeClass = 'BuildConfiguration' d['configs'] = [ (x[0], freeze(freezeClass, x[1])) for x in self.configs.items() ] return d
def _freezeException(err): try: frzMethod = None errorClass = err.__class__ if apiutils.canHandle(str(errorClass), err): frzMethod = str(errorClass) elif apiutils.canHandle(errorClass.__name__, err): frzMethod = errorClass.__name__ else: frzMethod = 'Exception' return frzMethod, apiutils.freeze(frzMethod, err) except Exception, err2: if frzMethod == 'Exception': raise err = err2 frzMethod = 'Exception' return frzMethod, apiutils.freeze(frzMethod, err)
def testTroveSettings(self): class MyTroveSettings(trovesettings.TroveSettings): cfgOption = cfgtypes.CfgString xx = MyTroveSettings() xx.cfgOption = 'foobar' yy = apiutils.thaw('TroveSettings', apiutils.freeze('TroveSettings', xx)) assert(yy.cfgOption == 'foobar')
def __freeze__(self): d = {} for attr, attrType in self.attrTypes.iteritems(): d[attr] = freeze(attrType, getattr(self, attr)) d["packages"] = list(d["packages"]) if self.jobId is None: d["jobId"] = "" return d
def _buildFailed(failureFd, errMsg, traceBack=''): log.error(errMsg) frz = '\002'.join(str(x) for x in freeze('FailureReason', BuildFailed(errMsg, traceBack))) if failureFd is not None: os.write(failureFd, frz) os.close(failureFd) os._exit(1)
def updateTrove(self, trove): cu = self.db.cursor() if trove.getChrootHost(): chrootId = self.db._getChrootIdForTrove(trove) else: chrootId = 0 failureTup = freeze('FailureReason', trove.getFailureReason()) if failureTup[0] == '': failureTup = None, None kw = dict(pid=trove.pid, start=trove.start, finish=trove.finish, logPath=trove.logPath, status=trove.status, state=trove.state, failureReason=failureTup[0], failureData=cu.binary(failureTup[1]), recipeType=trove.recipeType, buildType=trove.buildType, chrootId=chrootId) fieldList = '=?, '.join(kw) + '=?' valueList = kw.values() valueList += (trove.jobId, trove.getName(), trove.getVersion().freeze(), trove.getFlavor().freeze(), trove.getContext()) cu.execute("""UPDATE BuildTroves SET %s WHERE jobId=? AND troveName=? AND version=? AND flavor=? AND context=? """ % fieldList, valueList) troveId = self._getTroveId(cu, trove.jobId, *trove.getNameVersionFlavor(True)) className, settings = freeze('TroveSettings', trove.settings) settings['_class'] = [className] cu.execute('DELETE FROM TroveSettings WHERE troveId=?', troveId) for key, values in settings.iteritems(): for idx, value in enumerate(values): cu.execute('''INSERT INTO TroveSettings (jobId, troveId, key, ord, value) VALUES (?, ?, ?, ?, ?)''', trove.jobId, troveId, key, idx, value)
def _buildFailed(failureFd, errMsg, traceBack=''): log.error(errMsg) frz = '\002'.join( str(x) for x in freeze('FailureReason', BuildFailed(errMsg, traceBack))) if failureFd is not None: os.write(failureFd, frz) os.close(failureFd) os._exit(1)
def payloadToDict(self): buildCfg = freeze('BuildConfiguration', self.payload.buildCfg) trove = freeze('BuildTrove', self.payload.trove) targetLabel = freeze('label', self.payload.targetLabel) builtTroves = freeze('troveTupleList', self.payload.builtTroves) d = dict(buildCfg=buildCfg, trove=trove, targetLabel=targetLabel, builtTroves=builtTroves, logData=self.payload.logData) for name in ('buildReqs', 'crossReqs', 'bootstrapReqs'): tuples = [((x[0],) + x[2]) for x in getattr(self.payload, name)] d[name] = freeze('troveTupleList', tuples) if self.payload.logData is None: d['logData'] = '' return d
def payloadToDict(self): buildCfg = freeze('BuildConfiguration', self.payload.buildCfg) trove = freeze('BuildTrove', self.payload.trove) targetLabel = freeze('label', self.payload.targetLabel) builtTroves = freeze('troveTupleList', self.payload.builtTroves) d = dict(buildCfg=buildCfg, trove=trove, targetLabel=targetLabel, builtTroves=builtTroves, logData=self.payload.logData) for name in ('buildReqs', 'crossReqs', 'bootstrapReqs'): tuples = [((x[0], ) + x[2]) for x in getattr(self.payload, name)] d[name] = freeze('troveTupleList', tuples) if self.payload.logData is None: d['logData'] = '' return d
def testTroveSettings(self): class MyTroveSettings(trovesettings.TroveSettings): cfgOption = cfgtypes.CfgString xx = MyTroveSettings() xx.cfgOption = 'foobar' yy = apiutils.thaw('TroveSettings', apiutils.freeze('TroveSettings', xx)) assert (yy.cfgOption == 'foobar')
def commitSucceeded(self, commitMap): """ Notify server that a job successfully committed. @param commitMap: jobId -> troveTuple -> binaries Mapping from jobId -> build trove -> list of binaries created by that build trove. @type troveTupleList: {int : {troveTuple : [troveTuple]}} dict. @raises: JobNotFound if job does not exist. """ jobIds = [] finalMap = [] for jobId, troveMap in commitMap.items(): troveMap = [ (freeze('troveContextTuple', x[0]), freeze('troveTupleList', x[1])) for x in troveMap.items() ] finalMap.append(troveMap) jobIds.append(jobId) self.proxy.commitSucceeded(jobIds, finalMap)
def commitSucceeded(self, commitMap): """ Notify server that a job successfully committed. @param commitMap: jobId -> troveTuple -> binaries Mapping from jobId -> build trove -> list of binaries created by that build trove. @type troveTupleList: {int : {troveTuple : [troveTuple]}} dict. @raises: JobNotFound if job does not exist. """ jobIds = [] finalMap = [] for jobId, troveMap in commitMap.items(): troveMap = [(freeze('troveContextTuple', x[0]), freeze('troveTupleList', x[1])) for x in troveMap.items()] finalMap.append(troveMap) jobIds.append(jobId) self.proxy.commitSucceeded(jobIds, finalMap)
def addTrove(self, trove): cu = self.db.cursor() if not trove.logPath: trove.logPath = self.db.logStore.hashTrove(trove) failureTup = freeze('FailureReason', trove.getFailureReason()) if failureTup[0] == '': failureTup = None, None kw = dict(jobId=trove.jobId, troveName=trove.getName(), version=trove.getVersion().freeze(), flavor=trove.getFlavor().freeze(), pid=trove.pid, start=trove.start, finish=trove.finish, logPath=trove.logPath, recipeType=trove.recipeType, status=trove.status, state=trove.state, failureReason=failureTup[0], failureData=cu.binary(failureTup[1]), buildType=trove.buildType, troveType=trove.troveType, context=trove.getContext()) fieldList = ', '.join(kw.keys()) valueList = kw.values() qList = ','.join('?' for x in xrange(len(kw.keys()))) cu.execute( """INSERT INTO BuildTroves (%s) VALUES (%s) """ % (fieldList, qList), valueList) troveId = cu.lastrowid className, settings = freeze('TroveSettings', trove.settings) settings['_class'] = [className] for key, values in settings.iteritems(): for idx, value in enumerate(values): cu.execute( '''INSERT INTO TroveSettings (jobId, troveId, key, ord, value) VALUES (?, ?, ?, ?, ?)''', trove.jobId, troveId, key, idx, value)
def testRegisterFreezableClassmap(self): class Freezable(object): def __freeze__(self): return {} @classmethod def __thaw__(class_, d): return class_() class Foo(Freezable): pass class Bar(Freezable): pass apiutils.register_freezable_classmap("mytype", Foo) apiutils.register_freezable_classmap("mytype", Bar) assert apiutils.thaw("mytype", apiutils.freeze("mytype", Foo())).__class__ == Foo assert apiutils.thaw("mytype", apiutils.freeze("mytype", Bar())).__class__ == Bar
def startChrootSession(self, chrootPath, command, superUser=False, buildTrove=None): """ Starts a chroot session on the given node. """ if buildTrove is None: buildTrove = '' else: buildTrove = freeze('BuildTrove', buildTrove) return self.proxy.startChrootSession(chrootPath, command, superUser, buildTrove)
def listChroots(self, callData): chroots = self.db.listChroots() chrootNames = self.worker.listChrootsWithHost() finalChroots = [] for chroot in chroots: if (chroot.host, chroot.path) not in chrootNames: # this has been removed from the file system self.db.removeChroot(chroot.host, chroot.path) else: finalChroots.append(chroot) return [ freeze('Chroot', x) for x in finalChroots ]
def addJobConfig(self, jobId, context, jobConfig): cu = self.db.cursor() cu.execute('DELETE FROM JobConfig where jobId=? and context=?', jobId, context) d = freeze('BuildConfiguration', jobConfig) for key, values in d.iteritems(): for idx, value in enumerate(values): cu.execute('''INSERT INTO JobConfig (jobId, context, key, ord, value) VALUES (?, ?, ?, ?, ?)''', jobId, context, key, idx, value)
def testBuildTrove(self): trv = self.addComponent('blah:source', '1.0') bt = buildtrove.BuildTrove(1, trv.getName(), trv.getVersion(), trv.getFlavor()) f = failure.MissingDependencies([(trv.getNameVersionFlavor(), deps.parseDep('trove: blam trove:foo'))]) bt.setFailureReason(f) frz = apiutils.freeze('BuildTrove', bt) bt2 = apiutils.thaw('BuildTrove', frz) assert(bt2.getFailureReason() == bt.getFailureReason()) assert(bt2.getFlavor() == bt.getFlavor())
def __freeze__(loadSpecs): d = {} stack = [(loadSpecs, d)] while stack: loadDict, frozenDict = stack.pop() for spec, (troveTup, subLoadDict) in loadDict.iteritems(): newFrzDict = {} frozenDict[spec] = (freeze("troveTuple", troveTup), newFrzDict) if subLoadDict: stack.append((subLoadDict, newFrzDict)) return d
def __freeze__(loadSpecs): d = {} stack = [(loadSpecs, d)] while stack: loadDict, frozenDict = stack.pop() for spec, (troveTup, subLoadDict) in loadDict.iteritems(): newFrzDict = {} frozenDict[spec] = (freeze('troveTuple', troveTup), newFrzDict) if subLoadDict: stack.append((subLoadDict, newFrzDict)) return d
def updateJob(self, job): cu = self.db.cursor() failureTup = freeze('FailureReason', job.getFailureReason()) if failureTup[0] == '': failureTup = None, None cu.execute("""UPDATE Jobs set pid = ?, state = ?, status = ?, start = ?, finish = ?, failureReason = ?, failureData = ? WHERE jobId = ?""", (job.pid, job.state, job.status, job.start, job.finish, failureTup[0], cu.binary(failureTup[1]), job.jobId))
def listChroots(self, callData): chroots = self.db.listChroots() chrootNames = self.worker.listChrootsWithHost() finalChroots = [] for chroot in chroots: if (chroot.host, chroot.path) not in chrootNames: # this has been removed from the file system self.db.removeChroot(chroot.host, chroot.path) else: finalChroots.append(chroot) return [freeze('Chroot', x) for x in finalChroots]
def __freeze__(class_, eventList): apiVer, eventList = eventList newEventList = [] for ((event, subevent), data) in eventList: if not isinstance(data[0], int): data = [(data[0][0], freeze('troveContextTuple', data[0][1]))] + data[1:] fn = getattr(class_, 'freeze_' + event, None) if fn is not None: data = fn(apiVer, data) newEventList.append(((event, subevent), data)) return apiVer, newEventList
def addTrove(self, trove): cu = self.db.cursor() if not trove.logPath: trove.logPath = self.db.logStore.hashTrove(trove) failureTup = freeze('FailureReason', trove.getFailureReason()) if failureTup[0] == '': failureTup = None, None kw = dict(jobId=trove.jobId, troveName=trove.getName(), version=trove.getVersion().freeze(), flavor=trove.getFlavor().freeze(), pid=trove.pid, start=trove.start, finish=trove.finish, logPath=trove.logPath, recipeType=trove.recipeType, status=trove.status, state=trove.state, failureReason=failureTup[0], failureData=cu.binary(failureTup[1]), buildType=trove.buildType, troveType=trove.troveType, context=trove.getContext()) fieldList = ', '.join(kw.keys()) valueList = kw.values() qList = ','.join('?' for x in xrange(len(kw.keys()))) cu.execute("""INSERT INTO BuildTroves (%s) VALUES (%s) """ % (fieldList, qList), valueList) troveId = cu.lastrowid className, settings = freeze('TroveSettings', trove.settings) settings['_class'] = [className] for key, values in settings.iteritems(): for idx, value in enumerate(values): cu.execute('''INSERT INTO TroveSettings (jobId, troveId, key, ord, value) VALUES (?, ?, ?, ?, ?)''', trove.jobId, troveId, key, idx, value)
def testBuildTrove(self): trv = self.addComponent('blah:source', '1.0') bt = buildtrove.BuildTrove(1, trv.getName(), trv.getVersion(), trv.getFlavor()) f = failure.MissingDependencies([ (trv.getNameVersionFlavor(), deps.parseDep('trove: blam trove:foo')) ]) bt.setFailureReason(f) frz = apiutils.freeze('BuildTrove', bt) bt2 = apiutils.thaw('BuildTrove', frz) assert (bt2.getFailureReason() == bt.getFailureReason()) assert (bt2.getFlavor() == bt.getFlavor())
def checkResults(self, callData, name, version, flavorList, wait): flavorList = tuple(flavorList) if (name, version, flavorList) in self._results: results = self._results[name, version, flavorList] else: timeSpent = 0 buildInfo = self._buildInfo[name, version, flavorList] while True: results = cook.getResults(*buildInfo) if results: break elif wait and timeSpent < wait: time.sleep(.1) timeSpent += .1 else: return '' del self._buildInfo[name, version, flavorList] return freeze(cook.CookResults, results)