From 0ac637e7b3f5f1617d47f37de2cc30e3db01ce21 Mon Sep 17 00:00:00 2001 From: Luke Hackwell Date: Fri, 27 Sep 2024 16:12:27 +0100 Subject: [PATCH 1/5] feat: Add QEMU Strategy Adds QEMUStrategy class that can power a QEMU instance on and wait until booted. --- bazel/labgrid/strategies/qemu/BUILD.bazel | 15 +++++++ bazel/labgrid/strategies/qemu/strategy.py | 49 +++++++++++++++++++++++ bazel/labgrid/strategies/qemu/test.py | 12 ++++++ 3 files changed, 76 insertions(+) create mode 100644 bazel/labgrid/strategies/qemu/BUILD.bazel create mode 100644 bazel/labgrid/strategies/qemu/strategy.py create mode 100644 bazel/labgrid/strategies/qemu/test.py diff --git a/bazel/labgrid/strategies/qemu/BUILD.bazel b/bazel/labgrid/strategies/qemu/BUILD.bazel new file mode 100644 index 00000000..50927362 --- /dev/null +++ b/bazel/labgrid/strategies/qemu/BUILD.bazel @@ -0,0 +1,15 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +py_library( + name = "strategy", + srcs = ["strategy.py"], + deps = [ + "//labgrid:pkg" + ], +) + +py_test( + name = "test", + srcs = ["test.py"], + deps = [":strategy"], +) diff --git a/bazel/labgrid/strategies/qemu/strategy.py b/bazel/labgrid/strategies/qemu/strategy.py new file mode 100644 index 00000000..5fa4faa3 --- /dev/null +++ b/bazel/labgrid/strategies/qemu/strategy.py @@ -0,0 +1,49 @@ +import enum + +import attr + +from labgrid.step import step +from labgrid.strategy import Strategy, StrategyError +from labgrid.driver.qemudriver import QEMUDriver +from labgrid.driver.shelldriver import ShellDriver +from labgrid.factory import target_factory + + +class Status(enum.Enum): + unknown = 0 + off = 1 + available = 2 + + +@target_factory.reg_driver +class QEMUStrategy(Strategy): + bindings = { + "qemu": QEMUDriver, + "shell": ShellDriver + } + + status = attr.ib(default=Status.unknown) + + @step() + def transition(self, status, *, step): + if not isinstance(status, Status): + status = Status[status] + if status == Status.unknown: + raise StrategyError(f"can not transition to {status}") + elif status == self.status: + step.skip("nothing to do") + return # nothing to do + elif status == Status.off: + self.target.deactivate(self.shell) + self.target.activate(self.qemu) + self.qemu.off() + elif status == Status.available: + self.target.deactivate(self.shell) + self.target.activate(self.qemu) + self.qemu.on() + self.target.activate(self.shell) + else: + raise StrategyError( + f"no transition found from {self.status} to {status}" + ) + self.status = status diff --git a/bazel/labgrid/strategies/qemu/test.py b/bazel/labgrid/strategies/qemu/test.py new file mode 100644 index 00000000..9fa36127 --- /dev/null +++ b/bazel/labgrid/strategies/qemu/test.py @@ -0,0 +1,12 @@ +from __future__ import annotations + +from unittest import TestCase, main + + +class ModuleTestCase(TestCase): + def test_imports(self): + from bazel.labgrid.strategies.qemu.strategy import QEMUStrategy + + +if __name__ == "__main__": + main() -- GitLab From e7d93bf1747b2da2bc0393f8912acfd1e6ada06a Mon Sep 17 00:00:00 2001 From: Luke Hackwell Date: Mon, 30 Sep 2024 11:49:56 +0100 Subject: [PATCH 2/5] chore: rename "available" state to "accessible" --- bazel/labgrid/strategies/qemu/strategy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bazel/labgrid/strategies/qemu/strategy.py b/bazel/labgrid/strategies/qemu/strategy.py index 5fa4faa3..92da8e8f 100644 --- a/bazel/labgrid/strategies/qemu/strategy.py +++ b/bazel/labgrid/strategies/qemu/strategy.py @@ -12,7 +12,7 @@ from labgrid.factory import target_factory class Status(enum.Enum): unknown = 0 off = 1 - available = 2 + accessible = 2 @target_factory.reg_driver @@ -37,7 +37,7 @@ class QEMUStrategy(Strategy): self.target.deactivate(self.shell) self.target.activate(self.qemu) self.qemu.off() - elif status == Status.available: + elif status == Status.accessible: self.target.deactivate(self.shell) self.target.activate(self.qemu) self.qemu.on() -- GitLab From a56c31bcb2228510752952b1e76c99f8ea025873 Mon Sep 17 00:00:00 2001 From: Luke Hackwell Date: Tue, 1 Oct 2024 15:31:04 +0100 Subject: [PATCH 3/5] chore: MR comments --- .../labgrid/{strategies => strategy}/qemu/BUILD.bazel | 10 +++++++--- bazel/labgrid/strategy/qemu/__init__.py | 1 + .../labgrid/{strategies => strategy}/qemu/strategy.py | 8 +++++++- bazel/labgrid/{strategies => strategy}/qemu/test.py | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) rename bazel/labgrid/{strategies => strategy}/qemu/BUILD.bazel (54%) create mode 100644 bazel/labgrid/strategy/qemu/__init__.py rename bazel/labgrid/{strategies => strategy}/qemu/strategy.py (84%) rename bazel/labgrid/{strategies => strategy}/qemu/test.py (70%) diff --git a/bazel/labgrid/strategies/qemu/BUILD.bazel b/bazel/labgrid/strategy/qemu/BUILD.bazel similarity index 54% rename from bazel/labgrid/strategies/qemu/BUILD.bazel rename to bazel/labgrid/strategy/qemu/BUILD.bazel index 50927362..6c8a0e08 100644 --- a/bazel/labgrid/strategies/qemu/BUILD.bazel +++ b/bazel/labgrid/strategy/qemu/BUILD.bazel @@ -1,15 +1,19 @@ load("@rules_python//python:defs.bzl", "py_library", "py_test") py_library( - name = "strategy", - srcs = ["strategy.py"], + name = "qemu", + srcs = [ + "strategy.py", + "__init__.py", + ], deps = [ "//labgrid:pkg" ], + visibility = ["//visibility:public"], ) py_test( name = "test", srcs = ["test.py"], - deps = [":strategy"], + deps = [":qemu"], ) diff --git a/bazel/labgrid/strategy/qemu/__init__.py b/bazel/labgrid/strategy/qemu/__init__.py new file mode 100644 index 00000000..f6e8f904 --- /dev/null +++ b/bazel/labgrid/strategy/qemu/__init__.py @@ -0,0 +1 @@ +from .strategy import QEMUStrategy diff --git a/bazel/labgrid/strategies/qemu/strategy.py b/bazel/labgrid/strategy/qemu/strategy.py similarity index 84% rename from bazel/labgrid/strategies/qemu/strategy.py rename to bazel/labgrid/strategy/qemu/strategy.py index 92da8e8f..ef4be442 100644 --- a/bazel/labgrid/strategies/qemu/strategy.py +++ b/bazel/labgrid/strategy/qemu/strategy.py @@ -29,18 +29,24 @@ class QEMUStrategy(Strategy): if not isinstance(status, Status): status = Status[status] if status == Status.unknown: + # Unknown is the starting state raise StrategyError(f"can not transition to {status}") elif status == self.status: step.skip("nothing to do") - return # nothing to do + return elif status == Status.off: + # Resets shell drivers status self.target.deactivate(self.shell) self.target.activate(self.qemu) + # Stop the QEMU instance self.qemu.off() elif status == Status.accessible: + # Resets shell drivers status self.target.deactivate(self.shell) self.target.activate(self.qemu) + # Instantiate QEMU instance self.qemu.on() + # Wait until booted self.target.activate(self.shell) else: raise StrategyError( diff --git a/bazel/labgrid/strategies/qemu/test.py b/bazel/labgrid/strategy/qemu/test.py similarity index 70% rename from bazel/labgrid/strategies/qemu/test.py rename to bazel/labgrid/strategy/qemu/test.py index 9fa36127..2291383c 100644 --- a/bazel/labgrid/strategies/qemu/test.py +++ b/bazel/labgrid/strategy/qemu/test.py @@ -5,7 +5,7 @@ from unittest import TestCase, main class ModuleTestCase(TestCase): def test_imports(self): - from bazel.labgrid.strategies.qemu.strategy import QEMUStrategy + from bazel.labgrid.strategy.qemu import QEMUStrategy if __name__ == "__main__": -- GitLab From fb3720dd2c9c6398b504a0ea55247069cb039c8a Mon Sep 17 00:00:00 2001 From: Luke Hackwell Date: Tue, 1 Oct 2024 16:04:37 +0100 Subject: [PATCH 4/5] chore: Change dir structure --- bazel/labgrid/strategy/{qemu => }/BUILD.bazel | 11 ++++++----- bazel/labgrid/strategy/__init__.py | 1 + bazel/labgrid/strategy/qemu/__init__.py | 1 - bazel/labgrid/strategy/qemu/test.py | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) rename bazel/labgrid/strategy/{qemu => }/BUILD.bazel (58%) create mode 100644 bazel/labgrid/strategy/__init__.py delete mode 100644 bazel/labgrid/strategy/qemu/__init__.py diff --git a/bazel/labgrid/strategy/qemu/BUILD.bazel b/bazel/labgrid/strategy/BUILD.bazel similarity index 58% rename from bazel/labgrid/strategy/qemu/BUILD.bazel rename to bazel/labgrid/strategy/BUILD.bazel index 6c8a0e08..622a4494 100644 --- a/bazel/labgrid/strategy/qemu/BUILD.bazel +++ b/bazel/labgrid/strategy/BUILD.bazel @@ -1,9 +1,9 @@ load("@rules_python//python:defs.bzl", "py_library", "py_test") py_library( - name = "qemu", + name = "strategy", srcs = [ - "strategy.py", + "qemu/strategy.py", "__init__.py", ], deps = [ @@ -13,7 +13,8 @@ py_library( ) py_test( - name = "test", - srcs = ["test.py"], - deps = [":qemu"], + name = "test_qemu", + srcs = ["qemu/test.py"], + deps = [":strategy"], + main = "qemu/test.py", ) diff --git a/bazel/labgrid/strategy/__init__.py b/bazel/labgrid/strategy/__init__.py new file mode 100644 index 00000000..d1fc1fab --- /dev/null +++ b/bazel/labgrid/strategy/__init__.py @@ -0,0 +1 @@ +from .qemu.strategy import QEMUStrategy diff --git a/bazel/labgrid/strategy/qemu/__init__.py b/bazel/labgrid/strategy/qemu/__init__.py deleted file mode 100644 index f6e8f904..00000000 --- a/bazel/labgrid/strategy/qemu/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .strategy import QEMUStrategy diff --git a/bazel/labgrid/strategy/qemu/test.py b/bazel/labgrid/strategy/qemu/test.py index 2291383c..84ca8f52 100644 --- a/bazel/labgrid/strategy/qemu/test.py +++ b/bazel/labgrid/strategy/qemu/test.py @@ -5,7 +5,7 @@ from unittest import TestCase, main class ModuleTestCase(TestCase): def test_imports(self): - from bazel.labgrid.strategy.qemu import QEMUStrategy + from bazel.labgrid.strategy import QEMUStrategy if __name__ == "__main__": -- GitLab From 969ec1dc09d2b5b491613100f75bc385bb706e46 Mon Sep 17 00:00:00 2001 From: Luke Hackwell Date: Tue, 1 Oct 2024 16:12:57 +0100 Subject: [PATCH 5/5] chore: Move test --- bazel/labgrid/strategy/BUILD.bazel | 5 ++--- bazel/labgrid/strategy/qemu/__init__.py | 0 bazel/labgrid/strategy/{qemu => }/test.py | 3 ++- 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 bazel/labgrid/strategy/qemu/__init__.py rename bazel/labgrid/strategy/{qemu => }/test.py (68%) diff --git a/bazel/labgrid/strategy/BUILD.bazel b/bazel/labgrid/strategy/BUILD.bazel index 622a4494..61fa29fc 100644 --- a/bazel/labgrid/strategy/BUILD.bazel +++ b/bazel/labgrid/strategy/BUILD.bazel @@ -13,8 +13,7 @@ py_library( ) py_test( - name = "test_qemu", - srcs = ["qemu/test.py"], + name = "test", + srcs = ["test.py"], deps = [":strategy"], - main = "qemu/test.py", ) diff --git a/bazel/labgrid/strategy/qemu/__init__.py b/bazel/labgrid/strategy/qemu/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/bazel/labgrid/strategy/qemu/test.py b/bazel/labgrid/strategy/test.py similarity index 68% rename from bazel/labgrid/strategy/qemu/test.py rename to bazel/labgrid/strategy/test.py index 84ca8f52..68a3521a 100644 --- a/bazel/labgrid/strategy/qemu/test.py +++ b/bazel/labgrid/strategy/test.py @@ -3,8 +3,9 @@ from __future__ import annotations from unittest import TestCase, main -class ModuleTestCase(TestCase): +class QEMUStrategyTest(TestCase): def test_imports(self): + """Test that strategy is imported correctly""" from bazel.labgrid.strategy import QEMUStrategy -- GitLab