about summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorSomeone Serge <sergei.kozlukov@aalto.fi>2023-11-16 17:47:58 +0000
committerSomeone Serge <sergei.kozlukov@aalto.fi>2023-11-16 18:25:42 +0000
commit392fbc90a86a696810a853e9eedf2fd7e2dafcdf (patch)
tree99647b5f2117dca44ea90ee1f76cb5ee162e248f /nixos
parent498c76e2b271632f9cfbac8fcf6a85b319042453 (diff)
downloadnixlib-392fbc90a86a696810a853e9eedf2fd7e2dafcdf.tar
nixlib-392fbc90a86a696810a853e9eedf2fd7e2dafcdf.tar.gz
nixlib-392fbc90a86a696810a853e9eedf2fd7e2dafcdf.tar.bz2
nixlib-392fbc90a86a696810a853e9eedf2fd7e2dafcdf.tar.lz
nixlib-392fbc90a86a696810a853e9eedf2fd7e2dafcdf.tar.xz
nixlib-392fbc90a86a696810a853e9eedf2fd7e2dafcdf.tar.zst
nixlib-392fbc90a86a696810a853e9eedf2fd7e2dafcdf.zip
nixos/lib/test-driver: make wait_for_unit ask for ActiveState only
This is a hotfix for https://github.com/NixOS/nixpkgs/issues/266690,
where `systemctl show $unit` sometimes randomly leaves ActiveState out
Diffstat (limited to 'nixos')
-rw-r--r--nixos/lib/test-driver/test_driver/machine.py32
1 files changed, 30 insertions, 2 deletions
diff --git a/nixos/lib/test-driver/test_driver/machine.py b/nixos/lib/test-driver/test_driver/machine.py
index f430321bb607..da60b669fa27 100644
--- a/nixos/lib/test-driver/test_driver/machine.py
+++ b/nixos/lib/test-driver/test_driver/machine.py
@@ -447,8 +447,7 @@ class Machine:
         """
 
         def check_active(_: Any) -> bool:
-            info = self.get_unit_info(unit, user)
-            state = info["ActiveState"]
+            state = self.get_unit_property(unit, "ActiveState", user)
             if state == "failed":
                 raise Exception(f'unit "{unit}" reached state "{state}"')
 
@@ -491,6 +490,35 @@ class Machine:
             if line_pattern.match(line)
         )
 
+    def get_unit_property(
+        self,
+        unit: str,
+        property: str,
+        user: Optional[str] = None,
+    ) -> str:
+        status, lines = self.systemctl(
+            f'--no-pager show "{unit}" --property="{property}"',
+            user,
+        )
+        if status != 0:
+            raise Exception(
+                f'retrieving systemctl property "{property}" for unit "{unit}"'
+                + ("" if user is None else f' under user "{user}"')
+                + f" failed with exit code {status}"
+            )
+
+        invalid_output_message = (
+            f'systemctl show --property "{property}" "{unit}"'
+            f"produced invalid output: {lines}"
+        )
+
+        line_pattern = re.compile(r"^([^=]+)=(.*)$")
+        match = line_pattern.match(lines)
+        assert match is not None, invalid_output_message
+
+        assert match[1] == property, invalid_output_message
+        return match[2]
+
     def systemctl(self, q: str, user: Optional[str] = None) -> Tuple[int, str]:
         """
         Runs `systemctl` commands with optional support for