示例#1
0
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()
示例#2
0
文件: latent.py 项目: Cray/buildbot
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)
示例#3
0
文件: latent.py 项目: wallrj/buildbot
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 diconnection via detached
        conn.notifyDisconnected()
        return self.remote_worker.disownServiceParent()

    def patchBot(self, case, remoteMethod, patch):
        case.patch(BotBase, remoteMethod, patch)
示例#4
0
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
示例#5
0
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)