diff --git a/testinfra/test_zookeeper.py b/testinfra/test_zookeeper.py index efe1148610..4b638d2fdc 100644 --- a/testinfra/test_zookeeper.py +++ b/testinfra/test_zookeeper.py @@ -13,6 +13,7 @@ # under the License. import json +import util testinfra_hosts = ['zk04.opendev.org'] @@ -53,3 +54,23 @@ def test_zookeeper_statsd_running(host): out = json.loads(cmd.stdout) assert out[0]["State"]["Status"] == "running" assert out[0]["RestartCount"] == 0 + +def test_zk_2181_accessibility(host): + # Ask the host to report its own IP addresses. This will use our test + # local /etc/hosts values and not DNS. + zk = host.addr("zk04.opendev.org") + # Verify it is using our local /etc/hosts values + print(zk.ipv4_addresses) + print(zk.ipv6_addresses) + + for addr in zk.ipv4_addresses + zk.ipv6_addresses: + if addr.startswith("::ffff:"): + # This is an ipv4 address mapped to ipv6 and is covered by + # the ipv4_addresses list + continue + if addr.startswith("127.") or addr == "::1": + # We don't want to talk to localhost as we are connecting + # from our test bridge instance. + continue + util.check_unreachable(addr, 2181) + util.check_unreachable(addr, 2281) diff --git a/testinfra/util.py b/testinfra/util.py index 1bc81b0070..f5f5bb75bc 100644 --- a/testinfra/util.py +++ b/testinfra/util.py @@ -121,3 +121,16 @@ def verify_iptables(host): assert snmp in ip6rules return rules + + +def check_unreachable(addr, port, errno=113): + # errno 113 is no route to host + try: + s = socket.create_connection((addr, port), timeout=10) + except OSError as e: + # No route to host + assert e.errno == errno + else: + s.close() + # We should always error. + assert False