def test_nanny_worker_port_range(loop): with popen(["dask-scheduler", "--port", "9359", "--no-dashboard"]) as sched: nprocs = 3 worker_port = "9684:9686" nanny_port = "9688:9690" with popen([ "dask-worker", "127.0.0.1:9359", "--nprocs", f"{nprocs}", "--host", "127.0.0.1", "--worker-port", worker_port, "--nanny-port", nanny_port, "--no-dashboard", ]) as worker: with Client("127.0.0.1:9359", loop=loop) as c: start = time() while len(c.scheduler_info()["workers"]) < nprocs: sleep(0.1) assert time() - start < 60 def get_port(dask_worker): return dask_worker.port expected_worker_ports = set(parse_ports(worker_port)) worker_ports = c.run(get_port) assert set(worker_ports.values()) == expected_worker_ports expected_nanny_ports = set(parse_ports(nanny_port)) nanny_ports = c.run(get_port, nanny=True) assert set(nanny_ports.values()) == expected_nanny_ports
async def test_nanny_port_range(cleanup): async with Scheduler() as s: async with Client(s.address, asynchronous=True) as client: nanny_port = "9867:9868" worker_port = "9869:9870" async with Nanny(s.address, port=nanny_port, worker_port=worker_port) as n1: assert n1.port == 9867 # Selects first port in range async with Nanny(s.address, port=nanny_port, worker_port=worker_port) as n2: assert n2.port == 9868 # Selects next port in range with pytest.raises(ValueError, match="Could not start Nanny" ): # No more ports left async with Nanny(s.address, port=nanny_port, worker_port=worker_port): pass # Ensure Worker ports are in worker_port range def get_worker_port(dask_worker): return dask_worker.port worker_ports = await client.run(get_worker_port) assert list( worker_ports.values()) == parse_ports(worker_port)
def test_parse_ports(): assert parse_ports(None) == [None] assert parse_ports(23) == [23] assert parse_ports("45") == [45] assert parse_ports("100:103") == [100, 101, 102, 103] with pytest.raises(ValueError, match="port_stop must be greater than port_start"): parse_ports("103:100")
async def start(self): """Start nanny, start local process, start watching""" await super().start() ports = parse_ports(self._start_port) for port in ports: start_address = address_from_user_args( host=self._start_host, port=port, interface=self._interface, protocol=self._protocol, security=self.security, ) try: await self.listen(start_address, **self.security.get_listen_args("worker")) except OSError as e: if len(ports) > 1 and e.errno == errno.EADDRINUSE: continue else: raise else: self._start_address = start_address break else: raise ValueError( f"Could not start Nanny on host {self._start_host}" f"with port {self._start_port}") self.ip = get_address_host(self.address) for preload in self.preloads: await preload.start() msg = await self.scheduler.register_nanny() for name, plugin in msg["nanny-plugins"].items(): await self.plugin_add(plugin=plugin, name=name) logger.info(" Start Nanny at: %r", self.address) response = await self.instantiate() if response == Status.running: assert self.worker_address self.status = Status.running else: await self.close() self.start_periodic_callbacks() return self