This makes it clear that this should be used with care It is potentially more expensive to create the full object, therefore it should be discouraged by its longer name This listing is implemented based on the basic listing, where each item is turned into the bigger machine class
60 lines
1.7 KiB
Python
60 lines
1.7 KiB
Python
from dataclasses import dataclass
|
|
|
|
from clan_lib.api import API
|
|
from clan_lib.errors import ClanError
|
|
from clan_lib.flake.flake import Flake
|
|
from clan_lib.nix_models.clan import (
|
|
InventoryMachine,
|
|
)
|
|
from clan_lib.persist.inventory_store import InventoryStore
|
|
from clan_lib.persist.util import set_value_by_path
|
|
|
|
|
|
@API.register
|
|
def list_machines(flake: Flake) -> dict[str, InventoryMachine]:
|
|
"""
|
|
List machines in the inventory for the UI.
|
|
"""
|
|
inventory_store = InventoryStore(flake=flake)
|
|
inventory = inventory_store.read()
|
|
|
|
machines = inventory.get("machines", {})
|
|
return machines
|
|
|
|
|
|
@API.register
|
|
def get_machine(flake: Flake, name: str) -> InventoryMachine:
|
|
inventory_store = InventoryStore(flake=flake)
|
|
inventory = inventory_store.read()
|
|
|
|
machine_inv = inventory.get("machines", {}).get(name)
|
|
if machine_inv is None:
|
|
msg = f"Machine {name} not found in inventory"
|
|
raise ClanError(msg)
|
|
|
|
return InventoryMachine(**machine_inv)
|
|
|
|
|
|
# TODO: remove this machine, once the Machine class is refactored
|
|
# We added this now, to allow for dispatching actions. To require only 'name' and 'flake' of a machine.
|
|
@dataclass(frozen=True)
|
|
class MachineID:
|
|
name: str
|
|
flake: Flake
|
|
|
|
|
|
@API.register
|
|
def set_machine(machine: MachineID, update: InventoryMachine) -> None:
|
|
"""
|
|
Update the machine information in the inventory.
|
|
"""
|
|
assert machine.name == update.get("name", machine.name), "Machine name mismatch"
|
|
|
|
inventory_store = InventoryStore(flake=machine.flake)
|
|
inventory = inventory_store.read()
|
|
|
|
set_value_by_path(inventory, f"machines.{machine.name}", update)
|
|
inventory_store.write(
|
|
inventory, message=f"Update information about machine {machine.name}"
|
|
)
|