diff --git a/nixos/doc/manual/development/writing-nixos-tests.section.md b/nixos/doc/manual/development/writing-nixos-tests.section.md
index 0d5bc76a2aa5..5bcdf6e58eb1 100644
--- a/nixos/doc/manual/development/writing-nixos-tests.section.md
+++ b/nixos/doc/manual/development/writing-nixos-tests.section.md
@@ -273,12 +273,13 @@ The following methods are available on machine objects:
`wait_for_open_port`
-: Wait until a process is listening on the given TCP port (on
- `localhost`, at least).
+: Wait until a process is listening on the given TCP port and IP address
+ (default `localhost`).
`wait_for_closed_port`
-: Wait until nobody is listening on the given TCP port.
+: Wait until nobody is listening on the given TCP port and IP address
+ (default `localhost`).
`wait_for_x`
diff --git a/nixos/doc/manual/from_md/development/writing-nixos-tests.section.xml b/nixos/doc/manual/from_md/development/writing-nixos-tests.section.xml
index dc921dad9749..308f7c6fb0f6 100644
--- a/nixos/doc/manual/from_md/development/writing-nixos-tests.section.xml
+++ b/nixos/doc/manual/from_md/development/writing-nixos-tests.section.xml
@@ -483,8 +483,8 @@ start_all()
- Wait until a process is listening on the given TCP port (on
- localhost, at least).
+ Wait until a process is listening on the given TCP port and
+ IP address (default localhost).
@@ -494,7 +494,8 @@ start_all()
- Wait until nobody is listening on the given TCP port.
+ Wait until nobody is listening on the given TCP port and IP
+ address (default localhost).
diff --git a/nixos/lib/test-driver/test_driver/machine.py b/nixos/lib/test-driver/test_driver/machine.py
index ffbc7c18e42b..c59ef3b17262 100644
--- a/nixos/lib/test-driver/test_driver/machine.py
+++ b/nixos/lib/test-driver/test_driver/machine.py
@@ -699,20 +699,22 @@ class Machine:
with self.nested("waiting for file ‘{}‘".format(filename)):
retry(check_file)
- def wait_for_open_port(self, port: int) -> None:
+ def wait_for_open_port(self, port: int, addr: str = "localhost") -> None:
def port_is_open(_: Any) -> bool:
- status, _ = self.execute("nc -z localhost {}".format(port))
+ status, _ = self.execute("nc -z {} {}".format(addr, port))
return status == 0
- with self.nested("waiting for TCP port {}".format(port)):
+ with self.nested("waiting for TCP port {} on {}".format(port, addr)):
retry(port_is_open)
- def wait_for_closed_port(self, port: int) -> None:
+ def wait_for_closed_port(self, port: int, addr: str = "localhost") -> None:
def port_is_closed(_: Any) -> bool:
- status, _ = self.execute("nc -z localhost {}".format(port))
+ status, _ = self.execute("nc -z {} {}".format(addr, port))
return status != 0
- with self.nested("waiting for TCP port {} to be closed".format(port)):
+ with self.nested(
+ "waiting for TCP port {} on {} to be closed".format(port, addr)
+ ):
retry(port_is_closed)
def start_job(self, jobname: str, user: Optional[str] = None) -> Tuple[int, str]: