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
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
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))
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")