From 81e070082651aa873bc1b374f3111cf715dcc9b3 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Sun, 26 May 2024 22:55:48 +0200 Subject: [PATCH] clan: `facts generate` allow regeneration of facts Add `--regenerate` flag to `clan facts generate` which allows forcing the generation of facts, regardless of their current existence. Examples: ``` clan facts generate [MACHINE] --regenerate ``` or ``` clan facts generate [MACHINE] --service [SERVICE] --regenerate ``` --- pkgs/clan-cli/clan_cli/facts/generate.py | 17 ++++++++++++++--- pkgs/clan-cli/clan_cli/machines/install.py | 2 +- pkgs/clan-cli/clan_cli/machines/update.py | 2 +- pkgs/clan-cli/clan_cli/vms/run.py | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/pkgs/clan-cli/clan_cli/facts/generate.py b/pkgs/clan-cli/clan_cli/facts/generate.py index 2dee7282..bc62de80 100644 --- a/pkgs/clan-cli/clan_cli/facts/generate.py +++ b/pkgs/clan-cli/clan_cli/facts/generate.py @@ -33,6 +33,7 @@ def read_multiline_input(prompt: str = "Finish with Ctrl-D") -> str: def generate_service_facts( machine: Machine, service: str, + regenerate: bool, secret_facts_store: SecretStoreBase, public_facts_store: FactStoreBase, tmpdir: Path, @@ -42,7 +43,7 @@ def generate_service_facts( # check if all secrets exist and generate them if at least one is missing needs_regeneration = not check_secrets(machine, service=service) log.debug(f"{service} needs_regeneration: {needs_regeneration}") - if not needs_regeneration: + if not (needs_regeneration or regenerate): return False if not isinstance(machine.flake, Path): msg = f"flake is not a Path: {machine.flake}" @@ -136,6 +137,7 @@ def prompt_func(text: str) -> str: def _generate_facts_for_machine( machine: Machine, service: str | None, + regenerate: bool, tmpdir: Path, prompt: Callable[[str], str] = prompt_func, ) -> bool: @@ -164,6 +166,7 @@ def _generate_facts_for_machine( machine_updated |= generate_service_facts( machine=machine, service=service, + regenerate=regenerate, secret_facts_store=secret_facts_store, public_facts_store=public_facts_store, tmpdir=local_temp, @@ -178,6 +181,7 @@ def _generate_facts_for_machine( def generate_facts( machines: list[Machine], service: str | None, + regenerate: bool, prompt: Callable[[str], str] = prompt_func, ) -> bool: was_regenerated = False @@ -188,7 +192,7 @@ def generate_facts( errors = 0 try: was_regenerated |= _generate_facts_for_machine( - machine, service, tmpdir, prompt + machine, service, regenerate, tmpdir, prompt ) except Exception as exc: log.error(f"Failed to generate facts for {machine.name}: {exc}") @@ -208,7 +212,7 @@ def generate_command(args: argparse.Namespace) -> None: machines = get_all_machines(args.flake) else: machines = get_selected_machines(args.flake, args.machines) - generate_facts(machines, args.service) + generate_facts(machines, args.service, args.regenerate) def register_generate_parser(parser: argparse.ArgumentParser) -> None: @@ -225,4 +229,11 @@ def register_generate_parser(parser: argparse.ArgumentParser) -> None: help="service to generate facts for, if empty, generate facts for every service", default=None, ) + parser.add_argument( + "--regenerate", + type=bool, + action=argparse.BooleanOptionalAction, + help="whether to regenerate facts for the specified machine", + default=None, + ) parser.set_defaults(func=generate_command) diff --git a/pkgs/clan-cli/clan_cli/machines/install.py b/pkgs/clan-cli/clan_cli/machines/install.py index cdea55c8..3465a254 100644 --- a/pkgs/clan-cli/clan_cli/machines/install.py +++ b/pkgs/clan-cli/clan_cli/machines/install.py @@ -35,7 +35,7 @@ def install_nixos( target_host = f"{h.user or 'root'}@{h.host}" log.info(f"target host: {target_host}") - generate_facts([machine], None) + generate_facts([machine], None, False) with TemporaryDirectory() as tmpdir_: tmpdir = Path(tmpdir_) diff --git a/pkgs/clan-cli/clan_cli/machines/update.py b/pkgs/clan-cli/clan_cli/machines/update.py index 177c6a2d..5c97d993 100644 --- a/pkgs/clan-cli/clan_cli/machines/update.py +++ b/pkgs/clan-cli/clan_cli/machines/update.py @@ -98,7 +98,7 @@ def deploy_nixos(machines: MachineGroup) -> None: env = os.environ.copy() env["NIX_SSHOPTS"] = ssh_arg - generate_facts([machine], None) + generate_facts([machine], None, False) upload_secrets(machine) path = upload_sources(".", target) diff --git a/pkgs/clan-cli/clan_cli/vms/run.py b/pkgs/clan-cli/clan_cli/vms/run.py index 69520763..db4f10df 100644 --- a/pkgs/clan-cli/clan_cli/vms/run.py +++ b/pkgs/clan-cli/clan_cli/vms/run.py @@ -69,7 +69,7 @@ def get_secrets( secret_facts_module = importlib.import_module(machine.secret_facts_module) secret_facts_store = secret_facts_module.SecretStore(machine=machine) - generate_facts([machine], None) + generate_facts([machine], None, False) secret_facts_store.upload(secrets_dir) return secrets_dir