def _open_channel(self, run): assert self.connection if not self._is_run_id_tracked(run): log.warning("Run %s no longer tracked (_open_channel)", run.id) return assert self.run_states[run.id].state < RUN_STATE_RUNNING self.run_states[run.id].state = RUN_STATE_STARTING chan = ssh.ExecChannel(conn=self.connection) chan.addOutputCallback(run.write_stdout) chan.addErrorCallback(run.write_stderr) chan.addEndCallback(run.done) chan.command = run.command chan.start_defer = defer.Deferred() chan.start_defer.addCallback(self._run_started, run) chan.start_defer.addErrback(self._run_start_error, run) chan.exit_defer = defer.Deferred() chan.exit_defer.addCallback(self._channel_complete, run) chan.exit_defer.addErrback(self._channel_complete_unknown, run) twistedutils.defer_timeout(chan.start_defer, RUN_START_TIMEOUT) self.run_states[run.id].channel = chan # TODO: I believe this needs to be checking the health of the connection # before trying to open a new channel. If the connection is gone it # needs to re-establish, or if the connection is not responding # we shouldn't create this new channel self.connection.openChannel(chan)
def _open_channel(self, run): assert self.connection assert self.run_states[run.id].state < RUN_STATE_RUNNING self.run_states[run.id].state = RUN_STATE_STARTING chan = ssh.ExecChannel(conn=self.connection) chan.addOutputCallback(self._get_output_callback(run)) chan.addErrorCallback(self._get_error_callback(run)) chan.addEndCallback(self._get_end_callback(run)) chan.command = run.command chan.start_defer = defer.Deferred() chan.start_defer.addCallback(self._run_started, run) chan.start_defer.addErrback(self._run_start_error, run) chan.exit_defer = defer.Deferred() chan.exit_defer.addCallback(self._channel_complete, run) chan.exit_defer.addErrback(self._channel_complete_unknown, run) chan.start_defer.setTimeout(RUN_START_TIMEOUT) self.run_states[run.id].channel = chan self.connection.openChannel(chan)