def test_in_use(): sock = socket.socket() sock.bind(('', 0)) sock.listen(1) port = sock.getsockname()[1] assert in_use(port) is True sock.close() assert in_use(port) is False
def _set_master_ports(self): """finds three random ports for master (pb, ssh and http)""" # assuming that if http port is set, ssh and pb base ports are set too http_port = self.get('master', 'http_port') if http_port: log.debug("http port is set, ssh and pb base ports are set too") return # ports are not set so we need to pick up a random ports # this is the algorithm # (usually) http port is in range 8000-8999 # ssh port == http_port - 1000 # pb_port == http_poer + 1000 port_range = int(self.get('port_ranges', 'range_size')) http_base_port = int(self.get('port_ranges', 'master_http')) ssh_base_port = int(self.get('port_ranges', 'master_ssh')) pb_base_port = int(self.get('port_ranges', 'master_pb')) _ports = ports.available_in_range(http_base_port, http_base_port + port_range) while True: if len(_ports) < 1: # no more ports to test break # sample returns a single element list http_port = random.sample(_ports, 1)[0] suffix = http_port - http_base_port # 8744 -> 744 (suffix) pb_port = pb_base_port + suffix ssh_port = ssh_base_port + suffix if not ports.in_use(pb_port) and not ports.in_use(ssh_port): # we have found 3 ports that fit into our algorithm! log.debug('master ports:') log.debug('http: {0}'.format(http_port)) log.debug('ssh: {0}'.format(ssh_port)) log.debug('pb: {0}'.format(pb_port)) self.set('master', 'ssh_port', str(ssh_port)) self.set('master', 'pb_port', str(pb_port)) self.set('master', 'http_port', str(http_port)) return # some of the ports was not free # discarding current port and picking up a new one _ports.discard(http_port) # giving up msg = "no available ports for your staging master. Giving up" raise ConfigError(msg)