From 2685db33d7118a824113eeb1a00eba9d5d572688 Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Mon, 9 Jun 2025 13:40:46 +0200 Subject: [PATCH] Refactor(cli/list_machines): rename to list_full_machines 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 --- pkgs/clan-cli/clan_cli/clan/inspect.py | 4 ++-- pkgs/clan-cli/clan_cli/facts/generate.py | 4 ++-- pkgs/clan-cli/clan_cli/machines/create.py | 4 ++-- pkgs/clan-cli/clan_cli/machines/list.py | 20 +++++++++++--------- pkgs/clan-cli/clan_cli/machines/update.py | 4 ++-- pkgs/clan-cli/clan_cli/vars/generate.py | 4 ++-- pkgs/clan-cli/clan_lib/machines/actions.py | 4 ++-- 7 files changed, 23 insertions(+), 21 deletions(-) diff --git a/pkgs/clan-cli/clan_cli/clan/inspect.py b/pkgs/clan-cli/clan_cli/clan/inspect.py index 51ffffb19..89ffc13b3 100644 --- a/pkgs/clan-cli/clan_cli/clan/inspect.py +++ b/pkgs/clan-cli/clan_cli/clan/inspect.py @@ -16,7 +16,7 @@ from clan_lib.nix import ( nix_metadata, ) -from clan_cli.machines.list import list_machines +from clan_cli.machines.list import list_full_machines from clan_cli.vms.inspect import VmConfig, inspect_vm @@ -58,7 +58,7 @@ def inspect_flake(flake_url: str | Path, machine_name: str) -> FlakeConfig: system = config["system"] # Check if the machine exists - machines: dict[str, Machine] = list_machines(Flake(str(flake_url))) + machines: dict[str, Machine] = list_full_machines(Flake(str(flake_url))) if machine_name not in machines: msg = f"Machine {machine_name} not found in {flake_url}. Available machines: {', '.join(machines)}" raise ClanError(msg) diff --git a/pkgs/clan-cli/clan_cli/facts/generate.py b/pkgs/clan-cli/clan_cli/facts/generate.py index b1eb038d2..4751fe56a 100644 --- a/pkgs/clan-cli/clan_cli/facts/generate.py +++ b/pkgs/clan-cli/clan_cli/facts/generate.py @@ -18,7 +18,7 @@ from clan_cli.completions import ( complete_machines, complete_services_for_machine, ) -from clan_cli.machines.list import list_machines +from clan_cli.machines.list import list_full_machines from .check import check_secrets from .public_modules import FactStoreBase @@ -227,7 +227,7 @@ def generate_command(args: argparse.Namespace) -> None: msg = "Could not find clan flake toplevel directory" raise ClanError(msg) - machines: list[Machine] = list(list_machines(args.flake).values()) + machines: list[Machine] = list(list_full_machines(args.flake).values()) if len(args.machines) > 0: machines = list( filter( diff --git a/pkgs/clan-cli/clan_cli/machines/create.py b/pkgs/clan-cli/clan_cli/machines/create.py index 9aa8359f8..3155b2d6a 100644 --- a/pkgs/clan-cli/clan_cli/machines/create.py +++ b/pkgs/clan-cli/clan_cli/machines/create.py @@ -21,7 +21,7 @@ from clan_lib.templates import ( ) from clan_cli.completions import add_dynamic_completer, complete_tags -from clan_cli.machines.list import list_machines +from clan_cli.machines.list import list_full_machines log = logging.getLogger(__name__) @@ -71,7 +71,7 @@ def create_machine( log.info(f"Found template '{template.name}' in '{template.input_variant}'") machine_name = opts.machine.get("name") - if opts.template_name in list_machines( + if opts.template_name in list_full_machines( Flake(str(clan_dir)) ) and not opts.machine.get("name"): msg = f"{opts.template_name} is already defined in {clan_dir}" diff --git a/pkgs/clan-cli/clan_cli/machines/list.py b/pkgs/clan-cli/clan_cli/machines/list.py index 25952eaf4..582dd6f0d 100644 --- a/pkgs/clan-cli/clan_cli/machines/list.py +++ b/pkgs/clan-cli/clan_cli/machines/list.py @@ -9,10 +9,9 @@ from clan_lib.api.modules import parse_frontmatter from clan_lib.dirs import specific_machine_dir from clan_lib.errors import ClanError from clan_lib.flake import Flake -from clan_lib.machines.actions import get_machine +from clan_lib.machines.actions import get_machine, list_machines from clan_lib.machines.machines import Machine from clan_lib.nix_models.clan import InventoryMachine -from clan_lib.persist.inventory_store import InventoryStore from clan_cli.completions import add_dynamic_completer, complete_tags from clan_cli.machines.hardware import HardwareConfig @@ -20,17 +19,20 @@ from clan_cli.machines.hardware import HardwareConfig log = logging.getLogger(__name__) -def list_machines( +def list_full_machines( flake: Flake, nix_options: list[str] | None = None ) -> dict[str, Machine]: - inventory_store = InventoryStore(flake=flake) - inventory = inventory_store.read() - res = {} + """ + Like `list_machines`, but returns a full 'machine' instance for each machine. + """ + machines = list_machines(flake) + + res: dict[str, Machine] = {} if nix_options is None: nix_options = [] - for inv_machine in inventory.get("machines", {}).values(): + for inv_machine in machines.values(): name = inv_machine.get("name") # Technically, this should not happen, but we are defensive here. if name is None: @@ -53,7 +55,7 @@ def query_machines_by_tags(flake: Flake, tags: list[str]) -> dict[str, Machine]: then only machines that have those respective tags specified will be listed. It is an intersection of the tags and machines. """ - machines = list_machines(flake) + machines = list_full_machines(flake) filtered_machines = {} for machine in machines.values(): @@ -113,7 +115,7 @@ def list_command(args: argparse.Namespace) -> None: for name in query_machines_by_tags(flake, args.tags): print(name) else: - for name in list_machines(flake): + for name in list_full_machines(flake): print(name) diff --git a/pkgs/clan-cli/clan_cli/machines/update.py b/pkgs/clan-cli/clan_cli/machines/update.py index ee8071757..4e1dd8912 100644 --- a/pkgs/clan-cli/clan_cli/machines/update.py +++ b/pkgs/clan-cli/clan_cli/machines/update.py @@ -22,7 +22,7 @@ from clan_cli.completions import ( ) from clan_cli.facts.generate import generate_facts from clan_cli.facts.upload import upload_secrets -from clan_cli.machines.list import list_machines +from clan_cli.machines.list import list_full_machines from clan_cli.vars.generate import generate_vars from clan_cli.vars.upload import upload_secret_vars @@ -225,7 +225,7 @@ def update_command(args: argparse.Namespace) -> None: machines: list[Machine] = [] # if no machines are passed, we will update all machines selected_machines = ( - args.machines if args.machines else list_machines(args.flake).keys() + args.machines if args.machines else list_full_machines(args.flake).keys() ) if args.target_host is not None and len(args.machines) > 1: diff --git a/pkgs/clan-cli/clan_cli/vars/generate.py b/pkgs/clan-cli/clan_cli/vars/generate.py index 1356f42a7..efc2a59dc 100644 --- a/pkgs/clan-cli/clan_cli/vars/generate.py +++ b/pkgs/clan-cli/clan_cli/vars/generate.py @@ -14,7 +14,7 @@ from clan_cli.completions import ( complete_machines, complete_services_for_machine, ) -from clan_cli.machines.list import list_machines +from clan_cli.machines.list import list_full_machines from clan_cli.vars._types import StoreBase from clan_cli.vars.migration import check_can_migrate, migrate_files from clan_lib.api import API @@ -511,7 +511,7 @@ def generate_command(args: argparse.Namespace) -> None: msg = "Could not find clan flake toplevel directory" raise ClanError(msg) - machines: list[Machine] = list(list_machines(args.flake, args.option).values()) + machines: list[Machine] = list(list_full_machines(args.flake, args.option).values()) if len(args.machines) > 0: machines = list( diff --git a/pkgs/clan-cli/clan_lib/machines/actions.py b/pkgs/clan-cli/clan_lib/machines/actions.py index 2a42bb0e7..d9879dcfb 100644 --- a/pkgs/clan-cli/clan_lib/machines/actions.py +++ b/pkgs/clan-cli/clan_lib/machines/actions.py @@ -18,8 +18,8 @@ def list_machines(flake: Flake) -> dict[str, InventoryMachine]: inventory_store = InventoryStore(flake=flake) inventory = inventory_store.read() - machine = inventory.get("machines", {}) - return machine + machines = inventory.get("machines", {}) + return machines @API.register