← Back to team overview

sts-sponsors team mailing list archive

[Merge] ~adam-collard/maas-ci/+git/system-tests:lxd-status-specific into ~maas-committers/maas-ci/+git/system-tests:master

 

Adam Collard has proposed merging ~adam-collard/maas-ci/+git/system-tests:lxd-status-specific into ~maas-committers/maas-ci/+git/system-tests:master.

Commit message:
Add lxd.instance_status(name) prefer over broad lxd.list_instances()



Requested reviews:
  MAAS Committers (maas-committers)

For more details, see:
https://code.launchpad.net/~adam-collard/maas-ci/+git/system-tests/+merge/435527
-- 
Your team MAAS Committers is requested to review the proposed merge of ~adam-collard/maas-ci/+git/system-tests:lxd-status-specific into ~maas-committers/maas-ci/+git/system-tests:master.
diff --git a/systemtests/env_builder/test_basic.py b/systemtests/env_builder/test_basic.py
index f346095..7a25fab 100644
--- a/systemtests/env_builder/test_basic.py
+++ b/systemtests/env_builder/test_basic.py
@@ -117,10 +117,13 @@ class TestSetup:
     ) -> None:
         """Ensure that we have a Ready VM at the end."""
         lxd = get_lxd(logger=testlog)
-        instances = lxd.list_instances()
         vm_name = instance_config.name
-        # Force delete the VM so we know we're starting clean
-        if vm_name in instances:
+        try:
+            lxd.instance_status(vm_name)
+        except ValueError:
+            pass
+        else:
+            # Force delete the VM so we know we're starting clean
             lxd.delete(vm_name)
 
         # Need to create a network device with a hwaddr
@@ -143,21 +146,27 @@ class TestSetup:
             # Machine not registered, let's boot it up
             @retry(tries=5, delay=5, backoff=1.2, logger=testlog)
             def _boot_vm(vm_name: str) -> None:
-                vm_details = lxd.list_instances()[vm_name]
-                if vm_details["status"] == "Running":
+                status = lxd.instance_status(vm_name)
+                if status == "Running":
+                    testlog.debug(f"{vm_name} is already running, restarting")
                     lxd.restart(vm_name)
-                elif vm_details["status"] == "Stopped":
+                elif status == "Stopped":
+                    testlog.debug(f"{vm_name} is stopped, starting")
                     try:
                         lxd.start(vm_name)
                     except CalledProcessError:
                         lxd._run(["lxc", "info", "--show-log", vm_name])
                         raise
                 else:
-                    assert (
-                        False
-                    ), f"Don't know how to handle lxd_vm status: {vm_details['status']}"
+                    assert False, f"Don't know how to handle lxd_vm status: {status}"
 
             _boot_vm(vm_name)
+            try:
+                vm_status = lxd.instance_status(vm_name)
+            except ValueError:
+                vm_status = "not available"
+            testlog.debug(f"{vm_name} is {vm_status}")
+
             machine = wait_for_new_machine(maas_api_client, mac_address, vm_name)
 
         # Make sure we have power parameters set
diff --git a/systemtests/lxd.py b/systemtests/lxd.py
index 736c1f6..03a5f1d 100644
--- a/systemtests/lxd.py
+++ b/systemtests/lxd.py
@@ -408,13 +408,22 @@ class CLILXD:
             argv.append("--force")
         return self._run(argv)
 
-    def is_running(self, instance_name: str) -> bool:
+    def instance_status(self, instance_name: str) -> str:
         result = self._run(["lxc", "info", instance_name])
         for line in result.stdout.splitlines():
             key, value = line.split(": ", 1)
             if key == "Status":
-                return value == "RUNNING"
-        return False
+                return value
+        else:
+            raise ValueError(f"Unable to find Status of {instance_name}")
+
+    def is_running(self, instance_name: str) -> bool:
+        try:
+            status = self.instance_status(instance_name)
+        except ValueError:
+            return False
+        else:
+            return status == "RUNNING"
 
     def restart(
         self, instance_name: str, force: bool = False
diff --git a/systemtests/utils.py b/systemtests/utils.py
index c120dbe..d3858bd 100644
--- a/systemtests/utils.py
+++ b/systemtests/utils.py
@@ -201,7 +201,7 @@ def wait_for_new_machine(
     maybe_machines = quiet_client.list_machines(mac_address=mac_address)
     debug_outputs.append(repr(maybe_machines))
     if "lxd" in [m["power_type"] for m in machines]:
-        debug_outputs.append(repr(api_client.lxd.list_instances()))
+        debug_outputs.append(repr(api_client.lxd.list_instances().get(machine_name)))
 
     raise UnexpectedMachineStatus(
         machine_name, "New", retry_info.elapsed, debug_outputs

Follow ups