Source code for adi_lg_plugins.strategies.software_provisioning

import enum

import attr
from labgrid.factory import target_factory
from labgrid.step import step
from labgrid.strategy import Strategy, StrategyError


[docs] class Status(enum.Enum): """States for SoftwareProvisioningStrategy""" unknown = 0 connected = 1 software_installed = 2 repos_cloned = 3 built = 4 tested = 5
[docs] @target_factory.reg_driver @attr.s(eq=False) class SoftwareProvisioningStrategy(Strategy): """ Strategy to provision software on a target using SoftwareInstallerDriver. This strategy automates the process of installing packages, cloning repositories, building software, and running tests. Attributes: packages (list): List of package names to install. repos (list): List of repositories to clone. Each item can be a dictionary {'url': ..., 'dest': ..., 'branch': ...} or a tuple (url, dest, [branch]). build_steps (list): List of build steps. Each item can be a dictionary {'cmd': ..., 'dir': ...} or a tuple (cmd, dir). test_steps (list): List of test steps. Each item can be a dictionary {'cmd': ..., 'dir': ...} or a tuple (cmd, dir). """ bindings = { "installer": "SoftwareInstallerDriver", } status = attr.ib(default=Status.unknown) packages = attr.ib(default=attr.Factory(list)) repos = attr.ib(default=attr.Factory(list)) build_steps = attr.ib(default=attr.Factory(list)) test_steps = attr.ib(default=attr.Factory(list)) def __attrs_post_init__(self): super().__attrs_post_init__()
[docs] @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}") if status == self.status: step.skip("nothing to do") return if status == Status.connected: self.target.activate(self.installer) elif status == Status.software_installed: self.transition(Status.connected) for pkg in self.packages: self.installer.install_package(pkg) elif status == Status.repos_cloned: self.transition(Status.software_installed) for repo in self.repos: if isinstance(repo, dict): self.installer.clone_repo(repo["url"], repo["dest"], repo.get("branch")) elif isinstance(repo, (list, tuple)): self.installer.clone_repo(*repo) else: raise ValueError(f"Invalid repo configuration: {repo}") elif status == Status.built: self.transition(Status.repos_cloned) for build in self.build_steps: if isinstance(build, dict): self.installer.run_build(build["cmd"], build["dir"]) elif isinstance(build, (list, tuple)): self.installer.run_build(*build) else: raise ValueError(f"Invalid build step configuration: {build}") elif status == Status.tested: self.transition(Status.built) for test in self.test_steps: if isinstance(test, dict): self.installer.run_test(test["cmd"], test.get("dir")) elif isinstance(test, (list, tuple)): self.installer.run_test(*test) else: raise ValueError(f"Invalid test step configuration: {test}") self.status = status