GUI/vars: add endpoints for getting prompts and generating vars

This commit is contained in:
DavHau
2025-05-03 14:44:34 +07:00
parent ca594bbe95
commit 9186961ccb
3 changed files with 84 additions and 29 deletions

View File

@@ -12,7 +12,7 @@ from clan_cli.tests.age_keys import SopsSetup
from clan_cli.tests.fixtures_flakes import ClanFlake from clan_cli.tests.fixtures_flakes import ClanFlake
from clan_cli.tests.helpers import cli from clan_cli.tests.helpers import cli
from clan_cli.vars.check import check_vars from clan_cli.vars.check import check_vars
from clan_cli.vars.generate import Generator, generate_vars_for_machine from clan_cli.vars.generate import Generator, generate_vars_for_machine_interactive
from clan_cli.vars.get import get_var from clan_cli.vars.get import get_var
from clan_cli.vars.graph import all_missing_closure, requested_closure from clan_cli.vars.graph import all_missing_closure, requested_closure
from clan_cli.vars.list import stringify_all_vars from clan_cli.vars.list import stringify_all_vars
@@ -706,11 +706,11 @@ def test_stdout_of_generate(
flake_.refresh() flake_.refresh()
monkeypatch.chdir(flake_.path) monkeypatch.chdir(flake_.path)
flake = Flake(str(flake_.path)) flake = Flake(str(flake_.path))
from clan_cli.vars.generate import generate_vars_for_machine from clan_cli.vars.generate import generate_vars_for_machine_interactive
# with capture_output as output: # with capture_output as output:
with caplog.at_level(logging.INFO): with caplog.at_level(logging.INFO):
generate_vars_for_machine( generate_vars_for_machine_interactive(
Machine(name="my_machine", flake=flake), Machine(name="my_machine", flake=flake),
"my_generator", "my_generator",
regenerate=False, regenerate=False,
@@ -723,7 +723,7 @@ def test_stdout_of_generate(
set_var("my_machine", "my_generator/my_value", b"world", flake) set_var("my_machine", "my_generator/my_value", b"world", flake)
with caplog.at_level(logging.INFO): with caplog.at_level(logging.INFO):
generate_vars_for_machine( generate_vars_for_machine_interactive(
Machine(name="my_machine", flake=flake), Machine(name="my_machine", flake=flake),
"my_generator", "my_generator",
regenerate=True, regenerate=True,
@@ -734,7 +734,7 @@ def test_stdout_of_generate(
caplog.clear() caplog.clear()
# check the output when nothing gets regenerated # check the output when nothing gets regenerated
with caplog.at_level(logging.INFO): with caplog.at_level(logging.INFO):
generate_vars_for_machine( generate_vars_for_machine_interactive(
Machine(name="my_machine", flake=flake), Machine(name="my_machine", flake=flake),
"my_generator", "my_generator",
regenerate=True, regenerate=True,
@@ -743,7 +743,7 @@ def test_stdout_of_generate(
assert "hello" in caplog.text assert "hello" in caplog.text
caplog.clear() caplog.clear()
with caplog.at_level(logging.INFO): with caplog.at_level(logging.INFO):
generate_vars_for_machine( generate_vars_for_machine_interactive(
Machine(name="my_machine", flake=flake), Machine(name="my_machine", flake=flake),
"my_secret_generator", "my_secret_generator",
regenerate=False, regenerate=False,
@@ -758,7 +758,7 @@ def test_stdout_of_generate(
Flake(str(flake.path)), Flake(str(flake.path)),
) )
with caplog.at_level(logging.INFO): with caplog.at_level(logging.INFO):
generate_vars_for_machine( generate_vars_for_machine_interactive(
Machine(name="my_machine", flake=flake), Machine(name="my_machine", flake=flake),
"my_secret_generator", "my_secret_generator",
regenerate=True, regenerate=True,
@@ -848,7 +848,7 @@ def test_fails_when_files_are_left_from_other_backend(
flake.refresh() flake.refresh()
monkeypatch.chdir(flake.path) monkeypatch.chdir(flake.path)
for generator in ["my_secret_generator", "my_value_generator"]: for generator in ["my_secret_generator", "my_value_generator"]:
generate_vars_for_machine( generate_vars_for_machine_interactive(
Machine(name="my_machine", flake=Flake(str(flake.path))), Machine(name="my_machine", flake=Flake(str(flake.path))),
generator, generator,
regenerate=False, regenerate=False,
@@ -865,13 +865,13 @@ def test_fails_when_files_are_left_from_other_backend(
# This should raise an error # This should raise an error
if generator == "my_secret_generator": if generator == "my_secret_generator":
with pytest.raises(ClanError): with pytest.raises(ClanError):
generate_vars_for_machine( generate_vars_for_machine_interactive(
Machine(name="my_machine", flake=Flake(str(flake.path))), Machine(name="my_machine", flake=Flake(str(flake.path))),
generator, generator,
regenerate=False, regenerate=False,
) )
else: else:
generate_vars_for_machine( generate_vars_for_machine_interactive(
Machine(name="my_machine", flake=Flake(str(flake.path))), Machine(name="my_machine", flake=Flake(str(flake.path))),
generator, generator,
regenerate=False, regenerate=False,

View File

@@ -15,11 +15,13 @@ from clan_cli.completions import (
complete_services_for_machine, complete_services_for_machine,
) )
from clan_cli.errors import ClanError from clan_cli.errors import ClanError
from clan_cli.flake import Flake
from clan_cli.git import commit_files from clan_cli.git import commit_files
from clan_cli.machines.inventory import get_all_machines, get_selected_machines from clan_cli.machines.inventory import get_all_machines, get_selected_machines
from clan_cli.nix import nix_config, nix_shell, nix_test_store from clan_cli.nix import nix_config, nix_shell, nix_test_store
from clan_cli.vars._types import StoreBase from clan_cli.vars._types import StoreBase
from clan_cli.vars.migration import _check_can_migrate, _migrate_files from clan_cli.vars.migration import check_can_migrate, migrate_files
from clan_lib.api import API
from .check import check_vars from .check import check_vars
from .graph import ( from .graph import (
@@ -309,7 +311,64 @@ def get_closure(
return minimal_closure([generator_name], generators) return minimal_closure([generator_name], generators)
@API.register
def get_generators_closure(
machine_name: str,
base_dir: Path,
regenerate: bool = False,
) -> list[Generator]:
from clan_cli.machines.machines import Machine
return get_closure(
machine=Machine(name=machine_name, flake=Flake(str(base_dir))),
generator_name=None,
regenerate=regenerate,
)
def _generate_vars_for_machine(
machine: "Machine",
generators: list[Generator],
all_prompt_values: dict[str, dict],
no_sandbox: bool = False,
) -> bool:
for generator in generators:
if check_can_migrate(machine, generator):
migrate_files(machine, generator)
else:
execute_generator(
machine=machine,
generator=generator,
secret_vars_store=machine.secret_vars_store,
public_vars_store=machine.public_vars_store,
prompt_values=all_prompt_values[generator.name],
no_sandbox=no_sandbox,
)
return True
@API.register
def generate_vars_for_machine( def generate_vars_for_machine(
machine_name: str,
generators: list[Generator],
all_prompt_values: dict[str, dict[str, str]],
base_dir: Path,
no_sandbox: bool = False,
) -> bool:
from clan_cli.machines.machines import Machine
return _generate_vars_for_machine(
machine=Machine(
name=machine_name,
flake=Flake(str(base_dir)),
),
generators=generators,
all_prompt_values=all_prompt_values,
no_sandbox=no_sandbox,
)
def generate_vars_for_machine_interactive(
machine: "Machine", machine: "Machine",
generator_name: str | None, generator_name: str | None,
regenerate: bool, regenerate: bool,
@@ -333,22 +392,18 @@ def generate_vars_for_machine(
msg += f"Secret vars store: {sec_healtcheck_msg}" msg += f"Secret vars store: {sec_healtcheck_msg}"
raise ClanError(msg) raise ClanError(msg)
closure = get_closure(machine, generator_name, regenerate) generators = get_closure(machine, generator_name, regenerate)
if len(closure) == 0: if len(generators) == 0:
return False return False
for generator in closure: all_prompt_values = {}
if _check_can_migrate(machine, generator): for generator in generators:
_migrate_files(machine, generator) all_prompt_values[generator.name] = _ask_prompts(generator)
else: return _generate_vars_for_machine(
execute_generator( machine,
machine=machine, generators,
generator=generator, all_prompt_values,
secret_vars_store=machine.secret_vars_store, no_sandbox=no_sandbox,
public_vars_store=machine.public_vars_store, )
prompt_values=_ask_prompts(generator),
no_sandbox=no_sandbox,
)
return True
def generate_vars( def generate_vars(
@@ -361,7 +416,7 @@ def generate_vars(
for machine in machines: for machine in machines:
errors = [] errors = []
try: try:
was_regenerated |= generate_vars_for_machine( was_regenerated |= generate_vars_for_machine_interactive(
machine, generator_name, regenerate, no_sandbox=no_sandbox machine, generator_name, regenerate, no_sandbox=no_sandbox
) )
except Exception as exc: except Exception as exc:

View File

@@ -74,7 +74,7 @@ def _migrate_file(
return paths return paths
def _migrate_files( def migrate_files(
machine: "Machine", machine: "Machine",
generator: "Generator", generator: "Generator",
) -> None: ) -> None:
@@ -98,7 +98,7 @@ def _migrate_files(
) )
def _check_can_migrate( def check_can_migrate(
machine: "Machine", machine: "Machine",
generator: "Generator", generator: "Generator",
) -> bool: ) -> bool: