class LatentController(object): """ A controller for ``ControllableLatentWorker``. https://glyph.twistedmatrix.com/2015/05/separate-your-fakes-and-your-inspectors.html """ def __init__(self, name, **kwargs): self.worker = ControllableLatentWorker(name, self, **kwargs) self.started = False self.stopped = False def start_instance(self, result): assert self.started self.started = False d, self._start_deferred = self._start_deferred, None d.callback(result) def stop_instance(self, result): assert self.stopped self.stoped = False d, self._stop_deferred = self._stop_deferred, None d.callback(result) def connect_worker(self, workdir): if RemoteWorker is None: raise SkipTest("buildbot-worker package is not installed") self.remote_worker = RemoteWorker(self.worker.name, workdir.path, False) self.remote_worker.setServiceParent(self.worker) def disconnect_worker(self, workdir): return self.remote_worker.disownServiceParent()
class LatentController(object): """ A controller for ``ControllableLatentWorker``. https://glyph.twistedmatrix.com/2015/05/separate-your-fakes-and-your-inspectors.html """ def __init__(self, name, **kwargs): self.worker = ControllableLatentWorker(name, self, **kwargs) self.starting = False self.stopping = False self.auto_stop_flag = False def start_instance(self, result): assert self.starting self.starting = False d, self._start_deferred = self._start_deferred, None d.callback(result) def auto_stop(self, result): self.auto_stop_flag = result if self.auto_stop_flag and self.stopping: self.stop_instance(True) def stop_instance(self, result): assert self.stopping self.stopping = False d, self._stop_deferred = self._stop_deferred, None d.callback(result) def connect_worker(self, case): if RemoteWorker is None: raise SkipTest("buildbot-worker package is not installed") workdir = FilePath(case.mktemp()) workdir.createDirectory() self.remote_worker = RemoteWorker(self.worker.name, workdir.path, False) self.remote_worker.setServiceParent(self.worker) def disconnect_worker(self, workdir): self.worker.conn, conn = None, self.worker.conn # LocalWorker does actually disconnect, so we must force disconnection via detached conn.notifyDisconnected() return self.remote_worker.disownServiceParent() def patchBot(self, case, remoteMethod, patch): case.patch(BotBase, remoteMethod, patch)
class WorkerController(SeverWorkerConnectionMixin): """ A controller for a ``Worker``. https://glyph.twistedmatrix.com/2015/05/separate-your-fakes-and-your-inspectors.html """ def __init__(self, case, name, build_wait_timeout=600, worker_class=None, **kwargs): if worker_class is None: worker_class = Worker self.case = case self.build_wait_timeout = build_wait_timeout self.worker = worker_class(name, self, **kwargs) self.remote_worker = None def connect_worker(self): if self.remote_worker is not None: return if RemoteWorker is None: raise SkipTest("buildbot-worker package is not installed") workdir = FilePath(self.case.mktemp()) workdir.createDirectory() self.remote_worker = RemoteWorker(self.worker.name, workdir.path, False) self.remote_worker.setServiceParent(self.worker) def disconnect_worker(self): super().disconnect_worker() if self.remote_worker is None: return self.worker.conn, conn = None, self.worker.conn # LocalWorker does actually disconnect, so we must force disconnection # via detached conn.notifyDisconnected() ret = self.remote_worker.disownServiceParent() self.remote_worker = None return ret
class LatentController(SeverWorkerConnectionMixin): """ A controller for ``ControllableLatentWorker``. https://glyph.twistedmatrix.com/2015/05/separate-your-fakes-and-your-inspectors.html Note that by default workers will connect automatically if True is passed to start_instance(). Also by default workers will disconnect automatically just as stop_instance() is executed. """ def __init__(self, case, name, kind=None, build_wait_timeout=600, **kwargs): self.case = case self.build_wait_timeout = build_wait_timeout self.worker = ControllableLatentWorker(name, self, **kwargs) self.remote_worker = None self.state = States.STOPPED self.auto_stop_flag = False self.auto_start_flag = False self.auto_connect_worker = True self.auto_disconnect_worker = True self.kind = kind self._started_kind = None self._started_kind_deferred = None @property def starting(self): return self.state == States.STARTING @property def started(self): return self.state == States.STARTED @property def stopping(self): return self.state == States.STOPPING @property def stopped(self): return self.state == States.STOPPED def auto_start(self, result): self.auto_start_flag = result if self.auto_start_flag and self.state == States.STARTING: self.start_instance(True) def start_instance(self, result): self.do_start_instance(result) d, self._start_deferred = self._start_deferred, None d.callback(result) def do_start_instance(self, result): assert self.state == States.STARTING self.state = States.STARTED if self.auto_connect_worker and result is True: self.connect_worker() @defer.inlineCallbacks def auto_stop(self, result): self.auto_stop_flag = result if self.auto_stop_flag and self.state == States.STOPPING: yield self.stop_instance(True) @defer.inlineCallbacks def stop_instance(self, result): yield self.do_stop_instance() d, self._stop_deferred = self._stop_deferred, None d.callback(result) @defer.inlineCallbacks def do_stop_instance(self): assert self.state == States.STOPPING self.state = States.STOPPED self._started_kind = None if self.auto_disconnect_worker: yield self.disconnect_worker() def connect_worker(self): if self.remote_worker is not None: return if RemoteWorker is None: raise SkipTest("buildbot-worker package is not installed") workdir = FilePath(self.case.mktemp()) workdir.createDirectory() self.remote_worker = RemoteWorker(self.worker.name, workdir.path, False) self.remote_worker.setServiceParent(self.worker) def disconnect_worker(self): super().disconnect_worker() if self.remote_worker is None: return self.worker.conn, conn = None, self.worker.conn self.remote_worker, worker = None, self.remote_worker # LocalWorker does actually disconnect, so we must force disconnection # via detached. Note that the worker may have already detached if conn is not None: conn.loseConnection() return worker.disownServiceParent() def setup_kind(self, build): if build: self._started_kind_deferred = build.render(self.kind) else: self._started_kind_deferred = self.kind @defer.inlineCallbacks def get_started_kind(self): if self._started_kind_deferred: self._started_kind = yield self._started_kind_deferred self._started_kind_deferred = None return self._started_kind def patchBot(self, case, remoteMethod, patch): case.patch(BotBase, remoteMethod, patch)
class LatentController(object): """ A controller for ``ControllableLatentWorker``. https://glyph.twistedmatrix.com/2015/05/separate-your-fakes-and-your-inspectors.html """ def __init__(self, case, name, kind=None, build_wait_timeout=600, **kwargs): self.case = case self.build_wait_timeout = build_wait_timeout self.worker = ControllableLatentWorker(name, self, **kwargs) self.remote_worker = None self.starting = False self.started = False self.stopping = False self.auto_stop_flag = False self.auto_start_flag = False self.auto_connect_worker = False self.kind = kind self._started_kind = None self._started_kind_deferred = None def auto_start(self, result): self.auto_start_flag = result if self.auto_start_flag and self.starting: self.start_instance(True) def start_instance(self, result): self.do_start_instance() d, self._start_deferred = self._start_deferred, None d.callback(result) def do_start_instance(self): assert self.starting assert not self.started or not self.remote_worker self.starting = False self.started = True if self.auto_connect_worker: self.connect_worker() def auto_stop(self, result): self.auto_stop_flag = result if self.auto_stop_flag and self.stopping: self.stop_instance(True) def stop_instance(self, result): self.do_stop_instance() d, self._stop_deferred = self._stop_deferred, None d.callback(result) def do_stop_instance(self): assert self.stopping self.stopping = False self._started_kind = None self.disconnect_worker() def connect_worker(self): if self.remote_worker is not None: return if RemoteWorker is None: raise SkipTest("buildbot-worker package is not installed") workdir = FilePath(self.case.mktemp()) workdir.createDirectory() self.remote_worker = RemoteWorker(self.worker.name, workdir.path, False) self.remote_worker.setServiceParent(self.worker) def disconnect_worker(self): if self.remote_worker is None: return self.worker.conn, conn = None, self.worker.conn # LocalWorker does actually disconnect, so we must force disconnection via detached conn.notifyDisconnected() ret = self.remote_worker.disownServiceParent() self.remote_worker = None return ret def setup_kind(self, build): self._started_kind_deferred = build.render(self.kind) @defer.inlineCallbacks def get_started_kind(self): if self._started_kind_deferred: self._started_kind = yield self._started_kind_deferred self._started_kind_deferred = None defer.returnValue(self._started_kind) def patchBot(self, case, remoteMethod, patch): case.patch(BotBase, remoteMethod, patch)