GUI/vars: add endpoints for getting prompts and generating vars
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user