def as_literal_address(address): """Returns address in form suitable for embedding in URL or similar. In practice, this just puts square brackets round IPv6 addresses which avoids conflict with port seperators and other uses of colons. """ if is_ipv6_address(address): return address.join("[]") return address
def test_ipv6_missing_support(self): socket_error = jujupy.utility.socket.error with patch('jujupy.utility.socket', wraps=socket) as wrapped_socket: # Must not convert socket.error into a Mock, because Mocks don't # descend from BaseException wrapped_socket.error = socket_error del wrapped_socket.inet_pton result = is_ipv6_address("2001:db8::4") # Would use expectedFailure here, but instead just assert wrong result. self.assertIs(False, result)
def wait_for_port(host, port, closed=False, timeout=30): family = socket.AF_INET6 if is_ipv6_address(host) else socket.AF_INET for remaining in until_timeout(timeout): try: addrinfo = socket.getaddrinfo(host, port, family, socket.SOCK_STREAM) except socket.error as e: if e.errno not in (socket.EAI_NODATA, WSANO_DATA): raise if closed: return else: continue sockaddr = addrinfo[0][4] # Treat Azure messed-up address lookup as a closed port. if sockaddr[0] == '0.0.0.0': if closed: return else: continue conn = socket.socket(*addrinfo[0][:3]) conn.settimeout(max(remaining or 0, 5)) try: conn.connect(sockaddr) except socket.timeout: if closed: return except socket.error as e: if e.errno not in (errno.ECONNREFUSED, errno.ENETUNREACH, errno.ETIMEDOUT, errno.EHOSTUNREACH): raise if closed: return except socket.gaierror as e: print_now(str(e)) except Exception as e: print_now('Unexpected {!r}: {}'.format((type(e), e))) raise else: conn.close() if not closed: return sleep(1) raise PortTimeoutError('Timed out waiting for port.')
def test_ipv6(self): self.assertIs(True, is_ipv6_address("2001:db8::4"))
def test_ipv4(self): self.assertIs(False, is_ipv6_address("127.0.0.2"))
def test_hostname(self): self.assertIs(False, is_ipv6_address("name.testing"))