diff --git a/bazel/labgrid/strategy/BUILD.bazel b/bazel/labgrid/strategy/BUILD.bazel new file mode 100644 index 0000000000000000000000000000000000000000..61fa29fc5fd716c2f93a288bad067b3f0556ecbf --- /dev/null +++ b/bazel/labgrid/strategy/BUILD.bazel @@ -0,0 +1,19 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +py_library( + name = "strategy", + srcs = [ + "qemu/strategy.py", + "__init__.py", + ], + deps = [ + "//labgrid:pkg" + ], + visibility = ["//visibility:public"], +) + +py_test( + name = "test", + srcs = ["test.py"], + deps = [":strategy"], +) diff --git a/bazel/labgrid/strategy/__init__.py b/bazel/labgrid/strategy/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d1fc1fab3f5924024ccb4c10b027d91fe0743335 --- /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 new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/bazel/labgrid/strategy/qemu/strategy.py b/bazel/labgrid/strategy/qemu/strategy.py new file mode 100644 index 0000000000000000000000000000000000000000..ef4be44282e61a74e173520bfcd97b693fb5fe9b --- /dev/null +++ b/bazel/labgrid/strategy/qemu/strategy.py @@ -0,0 +1,55 @@ +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 + accessible = 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: + # Unknown is the starting state + raise StrategyError(f"can not transition to {status}") + elif status == self.status: + step.skip("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( + f"no transition found from {self.status} to {status}" + ) + self.status = status diff --git a/bazel/labgrid/strategy/test.py b/bazel/labgrid/strategy/test.py new file mode 100644 index 0000000000000000000000000000000000000000..68a3521aa4be0e2657f387f9586c53eb5864287e --- /dev/null +++ b/bazel/labgrid/strategy/test.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from unittest import TestCase, main + + +class QEMUStrategyTest(TestCase): + def test_imports(self): + """Test that strategy is imported correctly""" + from bazel.labgrid.strategy import QEMUStrategy + + +if __name__ == "__main__": + main()