Beispiel #1
0
 def all_ports_alive(self, msgid=10001):
     alive = True
     if self.ip:
         alive &= utils.try_ping_alive(self.ip_tls_socket(), close=True, msgid=msgid)
         alive &= utils.try_ping_alive(self.ip_tcp_socket(), close=True, msgid=msgid + 1)
     if self.ip6:
         alive &= utils.try_ping_alive(self.ip6_tls_socket(), close=True, msgid=msgid + 2)
         alive &= utils.try_ping_alive(self.ip6_tcp_socket(), close=True, msgid=msgid + 3)
     return alive
Beispiel #2
0
    def __enter__(self):
        if self.port is not None:
            take_port(self.port, self.ip, self.ip6, timeout=120)
        else:
            self.port = make_port(self.ip, self.ip6)
        if self.tls_port is not None:
            take_port(self.tls_port, self.ip, self.ip6, timeout=120)
        else:
            self.tls_port = make_port(self.ip, self.ip6)

        create_file_from_template(KRESD_CONF_TEMPLATE, self.config_path, {'kresd': self})
        self.logfile = open(self.logfile_path, 'w')
        self.process = subprocess.Popen(
            ['kresd', '-c', self.config_path, '-f', '1', self.workdir],
            stdout=self.logfile, env=os.environ.copy())

        try:
            self._wait_for_tcp_port()  # wait for ports to be up and responding
            if not self.all_ports_alive(msgid=10001):
                raise RuntimeError("Kresd not listening on all ports")

            # issue special msgid to mark start of test log
            sock = self.ip_tcp_socket() if self.ip else self.ip6_tcp_socket()
            assert utils.try_ping_alive(sock, close=True, msgid=KRESD_STARTUP_MSGID)

            # sanity check - kresd didn't crash
            self.process.poll()
            if self.process.returncode is not None:
                raise RuntimeError("Kresd crashed with returncode: {}".format(
                    self.process.returncode))
        except (RuntimeError, ConnectionError):  # pylint: disable=try-except-raise
            raise

        return self
Beispiel #3
0
    def _wait_for_tcp_port(self, max_delay=10, delay_step=0.2):
        family = socket.AF_INET if self.ip else socket.AF_INET6
        i = 0
        end_time = time.time() + max_delay

        while time.time() < end_time:
            i += 1

            # use exponential backoff algorhitm to choose next delay
            rand_delay = random.randrange(0, i)
            time.sleep(rand_delay * delay_step)

            try:
                sock, dest = self.stream_socket(family, timeout=5)
                sock.connect(dest)
            except ConnectionRefusedError:
                continue
            else:
                try:
                    return utils.try_ping_alive(sock, close=True, msgid=10000)
                except socket.timeout:
                    continue
            finally:
                sock.close()
        raise RuntimeError("Kresd didn't start in time {}".format(dest))
Beispiel #4
0
 def _wait_for_tcp_port(self, delay=0.1, max_attempts=20):
     family = socket.AF_INET if self.ip else socket.AF_INET6
     for _ in range(max_attempts):
         try:
             sock, dest = self.stream_socket(family, timeout=3)
             sock.connect(dest)
         except ConnectionRefusedError:
             time.sleep(delay)
             continue
         else:
             return utils.try_ping_alive(sock, close=True, msgid=10000)
         finally:
             sock.close()
     raise RuntimeError("Kresd didn't start in time")