Colin Watson has proposed merging ~cjwatson/launchpad:rename-builder-slave into launchpad:master with ~cjwatson/launchpad:rename-slave-scanner as a prerequisite.
Commit message: Rename BuilderSlave to BuilderWorker Requested reviews: Launchpad code reviewers (launchpad-reviewers) For more details, see: https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/414031 -- Your team Launchpad code reviewers is requested to review the proposed merge of ~cjwatson/launchpad:rename-builder-slave into launchpad:master.
diff --git a/lib/lp/buildmaster/interactor.py b/lib/lp/buildmaster/interactor.py index 6b51df7..674e34f 100644 --- a/lib/lp/buildmaster/interactor.py +++ b/lib/lp/buildmaster/interactor.py @@ -123,8 +123,8 @@ def shut_down_default_process_pool(): _default_process_pool_shutdown = None -class BuilderSlave: - """Add in a few useful methods for the XMLRPC slave. +class BuilderWorker: + """Add in a few useful methods for the XMLRPC worker. :ivar url: The URL of the actual builder. The XML-RPC resource and the filecache live beneath this. @@ -137,7 +137,7 @@ class BuilderSlave: def __init__(self, proxy, builder_url, vm_host, timeout, reactor, pool=None, process_pool=None): - """Initialize a BuilderSlave. + """Initialize a BuilderWorker. :param proxy: An XML-RPC proxy, implementing 'callRemote'. It must support passing and returning None objects. @@ -160,13 +160,13 @@ class BuilderSlave: self.process_pool = process_pool @classmethod - def makeBuilderSlave(cls, builder_url, vm_host, timeout, reactor=None, - proxy=None, pool=None, process_pool=None): - """Create and return a `BuilderSlave`. + def makeBuilderWorker(cls, builder_url, vm_host, timeout, reactor=None, + proxy=None, pool=None, process_pool=None): + """Create and return a `BuilderWorker`. - :param builder_url: The URL of the slave buildd machine, + :param builder_url: The URL of the worker buildd machine, e.g. http://localhost:8221 - :param vm_host: If the slave is virtual, specify its host machine + :param vm_host: If the worker is virtual, specify its host machine here. :param reactor: Used by tests to override the Twisted reactor. :param proxy: Used By tests to override the xmlrpc.Proxy. @@ -193,7 +193,7 @@ class BuilderSlave: return self._with_timeout(self._server.callRemote('abort')) def clean(self): - """Clean up the waiting files and reset the slave's internal state.""" + """Clean up the waiting files and reset the worker's internal state.""" return self._with_timeout(self._server.callRemote('clean')) def echo(self, *args): @@ -294,8 +294,8 @@ class BuilderSlave: return d @defer.inlineCallbacks - def sendFileToSlave(self, sha1, url, username="", password="", - logger=None): + def sendFileToWorker(self, sha1, url, username="", password="", + logger=None): """Helper to send the file at 'url' with 'sha1' to this builder.""" if logger is not None: logger.info( @@ -306,7 +306,7 @@ class BuilderSlave: raise CannotFetchFile(url, info) def build(self, buildid, builder_type, chroot_sha1, filemap, args): - """Build a thing on this build slave. + """Build a thing on this build worker. :param buildid: A string identifying this build. :param builder_type: The type of builder needed. @@ -350,7 +350,7 @@ class BuilderInteractor: timeout = config.builddmaster.virtualized_socket_timeout else: timeout = config.builddmaster.socket_timeout - return BuilderSlave.makeBuilderSlave( + return BuilderWorker.makeBuilderWorker( vitals.url, vitals.vm_host, timeout) @staticmethod @@ -529,7 +529,7 @@ class BuilderInteractor: def extractBuildStatus(slave_status): """Read build status name. - :param slave_status: build status dict from BuilderSlave.status. + :param slave_status: build status dict from BuilderWorker.status. :return: the unqualified status name, e.g. "OK". """ status_string = slave_status['build_status'] @@ -542,7 +542,7 @@ class BuilderInteractor: def extractLogTail(slave_status): """Extract the log tail from a builder status response. - :param slave_status: build status dict from BuilderSlave.status. + :param slave_status: build status dict from BuilderWorker.status. :return: a text string representing the tail of the build log, or None if the log tail is unavailable and should be left unchanged. diff --git a/lib/lp/buildmaster/interfaces/buildfarmjobbehaviour.py b/lib/lp/buildmaster/interfaces/buildfarmjobbehaviour.py index 2b19a11..ea9de3a 100644 --- a/lib/lp/buildmaster/interfaces/buildfarmjobbehaviour.py +++ b/lib/lp/buildmaster/interfaces/buildfarmjobbehaviour.py @@ -69,7 +69,7 @@ class IBuildFarmJobBehaviour(Interface): :return: A tuple of ( "builder type", `DistroArchSeries` to build against, `PackagePublishingPocket` to build against, - {filename: `sendFileToSlave` arguments}, {extra build arguments}), + {filename: `sendFileToWorker` arguments}, {extra build arguments}), or a Deferred resulting in the same. """ @@ -93,5 +93,5 @@ class IBuildFarmJobBehaviour(Interface): :param bq: The `BuildQueue` currently being processed. :param status: The tail of the BuildStatus (eg. OK or PACKAGEFAIL). - :param slave_status: Slave status dict from `BuilderSlave.status`. + :param slave_status: Slave status dict from `BuilderWorker.status`. """ diff --git a/lib/lp/buildmaster/model/buildfarmjobbehaviour.py b/lib/lp/buildmaster/model/buildfarmjobbehaviour.py index 4b5253b..4c91cb8 100644 --- a/lib/lp/buildmaster/model/buildfarmjobbehaviour.py +++ b/lib/lp/buildmaster/model/buildfarmjobbehaviour.py @@ -139,11 +139,11 @@ class BuildFarmJobBehaviourBase: filename_to_sha1 = OrderedDict() dl = [] - dl.append(self._slave.sendFileToSlave( + dl.append(self._slave.sendFileToWorker( logger=logger, url=chroot.http_url, sha1=chroot.content.sha1)) for filename, params in files.items(): filename_to_sha1[filename] = params['sha1'] - dl.append(self._slave.sendFileToSlave(logger=logger, **params)) + dl.append(self._slave.sendFileToWorker(logger=logger, **params)) yield defer.gatherResults(dl) combined_args = { diff --git a/lib/lp/buildmaster/tests/mock_workers.py b/lib/lp/buildmaster/tests/mock_workers.py index 14de9b6..25d314a 100644 --- a/lib/lp/buildmaster/tests/mock_workers.py +++ b/lib/lp/buildmaster/tests/mock_workers.py @@ -32,7 +32,7 @@ from lp.buildmaster.enums import ( BuilderCleanStatus, BuilderResetProtocol, ) -from lp.buildmaster.interactor import BuilderSlave +from lp.buildmaster.interactor import BuilderWorker from lp.buildmaster.interfaces.builder import CannotFetchFile from lp.services.config import config from lp.services.daemons.tachandler import twistd_script @@ -80,7 +80,7 @@ class MockBuilder: # XXX: It would be *really* nice to run some set of tests against the real -# BuilderSlave and this one to prevent interface skew. +# BuilderWorker and this one to prevent interface skew. class OkWorker: """An idle mock worker that prints information about itself. @@ -132,8 +132,8 @@ class OkWorker: return defer.succeed(("", "", 0)) @defer.inlineCallbacks - def sendFileToSlave(self, sha1, url, username="", password="", - logger=None): + def sendFileToWorker(self, sha1, url, username="", password="", + logger=None): present, info = yield self.ensurepresent(sha1, url, username, password) if not present: raise CannotFetchFile(url, info) @@ -312,11 +312,11 @@ class WorkerTestHelpers(fixtures.Fixture): def getClientWorker(self, reactor=None, proxy=None, pool=None, process_pool=None): - """Return a `BuilderSlave` for use in testing. + """Return a `BuilderWorker` for use in testing. Points to a fixed URL that is also used by `BuilddSlaveTestSetup`. """ - return BuilderSlave.makeBuilderSlave( + return BuilderWorker.makeBuilderWorker( self.base_url, 'vmhost', config.builddmaster.socket_timeout, reactor=reactor, proxy=proxy, pool=pool, process_pool=process_pool) @@ -337,7 +337,7 @@ class WorkerTestHelpers(fixtures.Fixture): def triggerGoodBuild(self, worker, build_id=None): """Trigger a good build on 'worker'. - :param worker: A `BuilderSlave` instance to trigger the build on. + :param worker: A `BuilderWorker` instance to trigger the build on. :param build_id: The build identifier. If not specified, defaults to an arbitrary string. :type build_id: str @@ -359,6 +359,6 @@ class WorkerTestHelpers(fixtures.Fixture): return worker.build( build_id, 'binarypackage', chroot_file, # Although a single-element dict obviously has stable ordering, - # we use an OrderedDict anyway to test that BuilderSlave + # we use an OrderedDict anyway to test that BuilderWorker # serializes it correctly over XML-RPC. OrderedDict([('.dsc', dsc_file)]), extra_args) diff --git a/lib/lp/buildmaster/tests/test_interactor.py b/lib/lp/buildmaster/tests/test_interactor.py index 30e86ed..e446c47 100644 --- a/lib/lp/buildmaster/tests/test_interactor.py +++ b/lib/lp/buildmaster/tests/test_interactor.py @@ -36,7 +36,7 @@ from lp.buildmaster.enums import ( ) from lp.buildmaster.interactor import ( BuilderInteractor, - BuilderSlave, + BuilderWorker, extract_vitals_from_db, make_download_process_pool, shut_down_default_process_pool, @@ -173,7 +173,7 @@ class TestBuilderInteractor(TestCase): return assert_fails_with(d, CannotResumeHost) def test_makeSlaveFromVitals(self): - # Builder.slave is a BuilderSlave that points at the actual Builder. + # Builder.slave is a BuilderWorker that points at the actual Builder. # The Builder is only ever used in scripts that run outside of the # security context. builder = MockBuilder(virtualized=False) @@ -297,8 +297,8 @@ class TestBuilderInteractorCleanSlave(TestCase): self.fail("abort() should crash.") -class TestBuilderSlaveStatus(TestCase): - # Verify what BuilderSlave.status returns with slaves in different +class TestBuilderWorkerStatus(TestCase): + # Verify what BuilderWorker.status returns with workers in different # states. run_tests_with = AsynchronousDeferredRunTest @@ -379,7 +379,7 @@ class TestBuilderInteractorDB(TestCaseWithFactory): builder = self.factory.makeBuilder( processors=[processor], virtualized=True, vm_host="bladh") builder.setCleanStatus(BuilderCleanStatus.CLEAN) - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(OkWorker())) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(OkWorker())) distroseries = self.factory.makeDistroSeries() das = self.factory.makeDistroArchSeries( distroseries=distroseries, architecturetag="i386", @@ -498,7 +498,7 @@ class TestBuilderInteractorDB(TestCaseWithFactory): class TestWorker(TestCase): """ - Integration tests for BuilderSlave that verify how it works against a + Integration tests for BuilderWorker that verify how it works against a real worker server. """ @@ -603,18 +603,18 @@ class TestWorker(TestCase): response = yield worker.ensurepresent('blahblah', None, None, None) self.assertEqual([True, 'No URL'], response) - def test_sendFileToSlave_not_there(self): + def test_sendFileToWorker_not_there(self): self.worker_helper.getServerWorker() worker = self.worker_helper.getClientWorker() - d = worker.sendFileToSlave('blahblah', None, None, None) + d = worker.sendFileToWorker('blahblah', None, None, None) return assert_fails_with(d, CannotFetchFile) @defer.inlineCallbacks - def test_sendFileToSlave_actually_there(self): + def test_sendFileToWorker_actually_there(self): tachandler = self.worker_helper.getServerWorker() worker = self.worker_helper.getClientWorker() self.worker_helper.makeCacheFile(tachandler, 'blahblah') - yield worker.sendFileToSlave('blahblah', None, None, None) + yield worker.sendFileToWorker('blahblah', None, None, None) response = yield worker.ensurepresent('blahblah', None, None, None) self.assertEqual([True, 'No URL'], response) @@ -819,7 +819,7 @@ class TestWorkerWithLibrarian(TestCaseWithFactory): self.assertEqual(content, got_content) def test_getFiles(self): - # Test BuilderSlave.getFiles(). + # Test BuilderWorker.getFiles(). # It also implicitly tests getFile() - I don't want to test that # separately because it increases test run time and it's going # away at some point anyway, in favour of getFiles(). diff --git a/lib/lp/buildmaster/tests/test_manager.py b/lib/lp/buildmaster/tests/test_manager.py index 705389e..657193a 100644 --- a/lib/lp/buildmaster/tests/test_manager.py +++ b/lib/lp/buildmaster/tests/test_manager.py @@ -30,7 +30,7 @@ from lp.buildmaster.enums import ( ) from lp.buildmaster.interactor import ( BuilderInteractor, - BuilderSlave, + BuilderWorker, extract_vitals_from_db, shut_down_default_process_pool, ) @@ -164,7 +164,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): # Reset sampledata builder. builder = getUtility(IBuilderSet)[BOB_THE_BUILDER_NAME] self._resetBuilder(builder) - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(OkWorker())) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(OkWorker())) # Set this to 1 here so that _checkDispatch can make sure it's # reset to 0 after a successful dispatch. builder.failure_count = 1 @@ -204,7 +204,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): # Sampledata builder is enabled and is assigned to an active job. builder = getUtility(IBuilderSet)[BOB_THE_BUILDER_NAME] self.patch( - BuilderSlave, 'makeBuilderSlave', + BuilderWorker, 'makeBuilderWorker', FakeMethod(BuildingWorker(build_id='PACKAGEBUILD-8'))) self.assertTrue(builder.builderok) job = builder.currentjob @@ -243,7 +243,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): login('foo....@canonical.com') builder.builderok = True - self.patch(BuilderSlave, 'makeBuilderSlave', + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(BuildingWorker(build_id='PACKAGEBUILD-8'))) transaction.commit() login(ANONYMOUS) @@ -263,7 +263,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): factory = LaunchpadObjectFactory() builder = factory.makeBuilder() builder.setCleanStatus(BuilderCleanStatus.CLEAN) - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(OkWorker())) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(OkWorker())) transaction.commit() scanner = self._getScanner(builder_name=builder.name) yield scanner.scan() @@ -274,7 +274,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): # Reset sampledata builder. builder = getUtility(IBuilderSet)[BOB_THE_BUILDER_NAME] self._resetBuilder(builder) - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(OkWorker())) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(OkWorker())) builder.manual = True transaction.commit() scanner = self._getScanner() @@ -286,7 +286,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): # Reset sampledata builder. builder = getUtility(IBuilderSet)[BOB_THE_BUILDER_NAME] self._resetBuilder(builder) - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(OkWorker())) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(OkWorker())) builder.builderok = False transaction.commit() scanner = self._getScanner() @@ -295,11 +295,11 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): self.assertIsNone(builder.currentjob) @defer.inlineCallbacks - def test_scan_of_broken_slave(self): + def test_scan_of_broken_worker(self): builder = getUtility(IBuilderSet)[BOB_THE_BUILDER_NAME] self._resetBuilder(builder) self.patch( - BuilderSlave, 'makeBuilderSlave', FakeMethod(BrokenWorker())) + BuilderWorker, 'makeBuilderWorker', FakeMethod(BrokenWorker())) builder.failure_count = 0 transaction.commit() scanner = self._getScanner(builder_name=builder.name) @@ -321,7 +321,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): login('foo....@canonical.com') builder.builderok = True self.patch( - BuilderSlave, 'makeBuilderSlave', + BuilderWorker, 'makeBuilderWorker', FakeMethod(BrokenUTF8Worker(build_id='PACKAGEBUILD-8'))) transaction.commit() login(ANONYMOUS) @@ -350,7 +350,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): login('foo....@canonical.com') builder.builderok = True self.patch( - BuilderSlave, 'makeBuilderSlave', + BuilderWorker, 'makeBuilderWorker', FakeMethod(NULWorker(build_id='PACKAGEBUILD-8'))) transaction.commit() login(ANONYMOUS) @@ -434,7 +434,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): processors=[job.processor], vm_host="fake_vm_host") job.markAsBuilding(builder) worker = SnapBuildingWorker(build_id="SNAPBUILD-%d" % build.id) - self.patch(BuilderSlave, "makeBuilderSlave", FakeMethod(worker)) + self.patch(BuilderWorker, "makeBuilderWorker", FakeMethod(worker)) transaction.commit() scanner = self._getScanner(builder_name=builder.name) yield scanner.scan() @@ -553,7 +553,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): builder.setCleanStatus(BuilderCleanStatus.DIRTY) builder.virtualized = True self.assertEqual(0, builder.failure_count) - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(worker)) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(worker)) builder.vm_host = "fake_vm_host" transaction.commit() @@ -594,7 +594,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): builder = getUtility(IBuilderSet)[BOB_THE_BUILDER_NAME] builder.version = "99" self._resetBuilder(builder) - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(worker)) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(worker)) scanner = self._getScanner() yield scanner.scan() self.assertEqual("100", builder.version) @@ -627,7 +627,7 @@ class TestWorkerScannerScan(StatsMixin, TestCaseWithFactory): # For now, we can only cancel virtual builds. builder.virtualized = True builder.vm_host = "fake_vm_host" - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(worker)) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(worker)) transaction.commit() login(ANONYMOUS) buildqueue = builder.currentjob diff --git a/lib/lp/services/statsd/tests/test_numbercruncher.py b/lib/lp/services/statsd/tests/test_numbercruncher.py index 4fb881f..71463bf 100644 --- a/lib/lp/services/statsd/tests/test_numbercruncher.py +++ b/lib/lp/services/statsd/tests/test_numbercruncher.py @@ -23,7 +23,7 @@ from lp.buildmaster.enums import ( BuilderCleanStatus, BuildStatus, ) -from lp.buildmaster.interactor import BuilderSlave +from lp.buildmaster.interactor import BuilderWorker from lp.buildmaster.interfaces.builder import IBuilderSet from lp.buildmaster.interfaces.processor import IProcessorSet from lp.buildmaster.model.buildqueue import BuildQueue @@ -56,7 +56,7 @@ class TestNumberCruncher(StatsMixin, TestCaseWithFactory): def test_single_processor_counts(self): builder = self.factory.makeBuilder() builder.setCleanStatus(BuilderCleanStatus.CLEAN) - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(OkWorker())) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(OkWorker())) transaction.commit() clock = task.Clock() manager = NumberCruncher(clock=clock) @@ -89,7 +89,7 @@ class TestNumberCruncher(StatsMixin, TestCaseWithFactory): )] for builder in builders: builder.setCleanStatus(BuilderCleanStatus.CLEAN) - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(OkWorker())) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(OkWorker())) transaction.commit() clock = task.Clock() manager = NumberCruncher(clock=clock) @@ -141,7 +141,7 @@ class TestNumberCruncher(StatsMixin, TestCaseWithFactory): build.queueBuild() build.buildqueue_record.markAsBuilding(builder=building_builder) builds.append(build) - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(OkWorker())) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(OkWorker())) transaction.commit() clock = task.Clock() manager = NumberCruncher(clock=clock) @@ -201,7 +201,7 @@ class TestNumberCruncher(StatsMixin, TestCaseWithFactory): builder.setCleanStatus(BuilderCleanStatus.CLEANING) build = self.factory.makeSnapBuild() build.queueBuild() - self.patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(OkWorker())) + self.patch(BuilderWorker, 'makeBuilderWorker', FakeMethod(OkWorker())) transaction.commit() clock = task.Clock() manager = NumberCruncher(clock=clock) diff --git a/lib/lp/soyuz/tests/test_binarypackagebuildbehaviour.py b/lib/lp/soyuz/tests/test_binarypackagebuildbehaviour.py index 1425972..1c0d34d 100644 --- a/lib/lp/soyuz/tests/test_binarypackagebuildbehaviour.py +++ b/lib/lp/soyuz/tests/test_binarypackagebuildbehaviour.py @@ -84,7 +84,7 @@ class TestBinaryBuildPackageBehaviour(StatsMixin, TestCaseWithFactory): In particular, these tests are about how the BinaryPackageBuildBehaviour interacts with the build slave. We test this by using a test double that - implements the same interface as `BuilderSlave` but instead of actually + implements the same interface as `BuilderWorker` but instead of actually making XML-RPC calls, just records any method invocations along with interesting parameters. """ diff --git a/lib/lp/translations/stories/buildfarm/xx-build-summary.txt b/lib/lp/translations/stories/buildfarm/xx-build-summary.txt index 36c8e7b..5d488c1 100644 --- a/lib/lp/translations/stories/buildfarm/xx-build-summary.txt +++ b/lib/lp/translations/stories/buildfarm/xx-build-summary.txt @@ -13,7 +13,7 @@ Create a builder working on a TranslationTemplatesBuild for a branch. >>> from zope.component import getUtility >>> from lp.app.interfaces.launchpad import ILaunchpadCelebrities >>> from lp.app.enums import ServiceUsage - >>> from lp.buildmaster.interactor import BuilderSlave + >>> from lp.buildmaster.interactor import BuilderWorker >>> from lp.services.librarian.interfaces import ( ... ILibraryFileAliasSet) >>> from lp.testing.factory import ( @@ -22,10 +22,10 @@ Create a builder working on a TranslationTemplatesBuild for a branch. >>> from lp.translations.interfaces.translations import ( ... TranslationsBranchImportMode) - >>> class FakeSlave: + >>> class FakeWorker: ... resume = FakeMethod(result=('stdout', 'stderr', 0)) ... build = FakeMethod() - ... sendFileToSlave = FakeMethod() + ... sendFileToWorker = FakeMethod() >>> login(ANONYMOUS) >>> owner_email = factory.getUniqueString() + '@example.com' @@ -52,7 +52,8 @@ Create a builder working on a TranslationTemplatesBuild for a branch. ... fake_chroot) >>> builder = factory.makeBuilder(vm_host=factory.getUniqueUnicode()) - >>> _ = patch(BuilderSlave, 'makeBuilderSlave', FakeMethod(FakeSlave())) + >>> _ = patch( + ... BuilderWorker, 'makeBuilderWorker', FakeMethod(FakeWorker())) >>> buildqueue.markAsBuilding(builder) >>> builder_page = canonical_url(builder)
_______________________________________________ Mailing list: https://launchpad.net/~launchpad-reviewers Post to : launchpad-reviewers@lists.launchpad.net Unsubscribe : https://launchpad.net/~launchpad-reviewers More help : https://help.launchpad.net/ListHelp