def test_group_id_allocation(self): group = Group() specs = [XSpec("popen"), XSpec("popen//id=hello")] group.allocate_id(specs[0]) group.allocate_id(specs[1]) gw = group.makegateway(specs[1]) assert gw.id == "hello" gw = group.makegateway(specs[0]) assert gw.id == "gw0" # py.test.raises(ValueError, # group.allocate_id, XSpec("popen//id=hello")) group.terminate()
def makegateway(self, spec=None): """create and configure a gateway to a Python interpreter. The ``spec`` string encodes the target gateway type and configuration information. The general format is:: key1=value1//key2=value2//... If you leave out the ``=value`` part a True value is assumed. Valid types: ``popen``, ``ssh=hostname``, ``socket=host:port``. Valid configuration:: id=<string> specifies the gateway id python=<path> specifies which python interpreter to execute chdir=<path> specifies to which directory to change nice=<path> specifies process priority of new process env:NAME=value specifies a remote environment variable setting. If no spec is given, self.defaultspec is used. """ if not spec: spec = self.defaultspec if not isinstance(spec, XSpec): spec = XSpec(spec) self.allocate_id(spec) if spec.via: assert not spec.socket master = self[spec.via] channel = master.remote_exec(gateway_io) channel.send(vars(spec)) io = gateway_io.RemoteIO(channel) gw = gateway_bootstrap.bootstrap(io, spec) elif spec.popen or spec.ssh: io = gateway_io.create_io(spec) gw = gateway_bootstrap.bootstrap(io, spec) elif spec.socket: from execnet import gateway_socket io = gateway_socket.create_io(spec, self) gw = gateway_bootstrap.bootstrap(io, spec) else: raise ValueError("no gateway type found for %r" % (spec._spec, )) gw.spec = spec self._register(gw) if spec.chdir or spec.nice or spec.env: channel = gw.remote_exec(""" import os path, nice, env = channel.receive() if path: if not os.path.exists(path): os.mkdir(path) os.chdir(path) if nice and hasattr(os, 'nice'): os.nice(nice) if env: for name, value in env.items(): os.environ[name] = value """) nice = spec.nice and int(spec.nice) or 0 channel.send((spec.chdir, nice, spec.env)) channel.waitclose() return gw
def makegateway(self, spec=None): """create and configure a gateway to a Python interpreter. The ``spec`` string encodes the target gateway type and configuration information. The general format is:: key1=value1//key2=value2//... If you leave out the ``=value`` part a True value is assumed. Valid types: ``popen``, ``ssh=hostname``, ``socket=host:port``. Valid configuration:: id=<string> specifies the gateway id python=<path> specifies which python interpreter to execute execmodel=model 'thread', 'eventlet', 'gevent' model for execution chdir=<path> specifies to which directory to change nice=<path> specifies process priority of new process env:NAME=value specifies a remote environment variable setting. If no spec is given, self.defaultspec is used. """ if not spec: spec = self.defaultspec if not isinstance(spec, XSpec): spec = XSpec(spec) self.allocate_id(spec) if spec.execmodel is None: spec.execmodel = self.remote_execmodel.backend if spec.via: assert not spec.socket master = self[spec.via] proxy_channel = master.remote_exec(gateway_io) proxy_channel.send(vars(spec)) proxy_io_master = gateway_io.ProxyIO(proxy_channel, self.execmodel) gw = gateway_bootstrap.bootstrap(proxy_io_master, spec) elif spec.popen or spec.ssh: io = gateway_io.create_io(spec, execmodel=self.execmodel) gw = gateway_bootstrap.bootstrap(io, spec) elif spec.socket: from execnet import gateway_socket io = gateway_socket.create_io(spec, self, execmodel=self.execmodel) gw = gateway_bootstrap.bootstrap(io, spec) else: raise ValueError("no gateway type found for %r" % (spec._spec,)) gw.spec = spec self._register(gw) if spec.chdir or spec.nice or spec.env: channel = gw.remote_exec(""" import os path, nice, env = channel.receive() if path: if not os.path.exists(path): os.mkdir(path) os.chdir(path) if nice and hasattr(os, 'nice'): os.nice(nice) if env: for name, value in env.items(): os.environ[name] = value """) nice = spec.nice and int(spec.nice) or 0 channel.send((spec.chdir, nice, spec.env)) channel.waitclose() return gw