Esempio n. 1
0
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
Esempio n. 2
0
    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)