Merge pull request 'vars: respect deploy flag for shared secrets' (#5572) from oneingan/clan-core:vars-no-deploy into main

Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5572
This commit is contained in:
Mic92
2025-10-20 15:37:03 +00:00
4 changed files with 25 additions and 3 deletions

View File

@@ -420,7 +420,11 @@ def test_generated_shared_secret_sops(
] ]
shared_generator["share"] = True shared_generator["share"] = True
shared_generator["files"]["my_shared_secret"]["secret"] = True shared_generator["files"]["my_shared_secret"]["secret"] = True
shared_generator["script"] = 'echo hello > "$out"/my_shared_secret' shared_generator["files"]["no_deploy_secret"]["secret"] = True
shared_generator["files"]["no_deploy_secret"]["deploy"] = False
shared_generator["script"] = (
'echo hello > "$out"/my_shared_secret; echo no_hello > "$out"/no_deploy_secret'
)
m2_config = flake.machines["machine2"] = create_test_machine_config() m2_config = flake.machines["machine2"] = create_test_machine_config()
m2_config["clan"]["core"]["vars"]["generators"]["my_shared_generator"] = ( m2_config["clan"]["core"]["vars"]["generators"]["my_shared_generator"] = (
shared_generator.copy() shared_generator.copy()
@@ -482,13 +486,21 @@ def test_generated_shared_secret_sops(
) )
assert m1_sops_store.exists(generator_m1, "my_shared_secret") assert m1_sops_store.exists(generator_m1, "my_shared_secret")
assert m1_sops_store.exists(generator_m1, "no_deploy_secret")
assert m2_sops_store.exists(generator_m2, "my_shared_secret") assert m2_sops_store.exists(generator_m2, "my_shared_secret")
assert m2_sops_store.exists(generator_m2, "no_deploy_secret")
assert m1_sops_store.machine_has_access( assert m1_sops_store.machine_has_access(
generator_m1, "my_shared_secret", "machine1" generator_m1, "my_shared_secret", "machine1"
) )
assert m2_sops_store.machine_has_access( assert m2_sops_store.machine_has_access(
generator_m2, "my_shared_secret", "machine2" generator_m2, "my_shared_secret", "machine2"
) )
assert not m1_sops_store.machine_has_access(
generator_m1, "no_deploy_secret", "machine1"
)
assert not m2_sops_store.machine_has_access(
generator_m2, "no_deploy_secret", "machine2"
)
@pytest.mark.with_core @pytest.mark.with_core

View File

@@ -90,6 +90,7 @@ def vars_status(
if ( if (
isinstance(machine.secret_vars_store, sops.SecretStore) isinstance(machine.secret_vars_store, sops.SecretStore)
and generator.share and generator.share
and file.deploy
and file.exists and file.exists
and not machine.secret_vars_store.machine_has_access( and not machine.secret_vars_store.machine_has_access(
generator=generator, generator=generator,

View File

@@ -354,7 +354,10 @@ class SecretStore(StoreBase):
ClanError: If the specified file_name is not found ClanError: If the specified file_name is not found
""" """
from clan_cli.secrets.secrets import update_keys # noqa: PLC0415 from clan_cli.secrets.secrets import ( # noqa: PLC0415
disallow_member,
update_keys,
)
if generators is None: if generators is None:
from clan_cli.vars.generator import Generator # noqa: PLC0415 from clan_cli.vars.generator import Generator # noqa: PLC0415
@@ -389,6 +392,12 @@ class SecretStore(StoreBase):
age_plugins=age_plugins, age_plugins=age_plugins,
) )
# Cleanup: if this is a shared var not marked for deployment
if generator.share and not file.deploy:
machine_link = secret_path / "machines" / machine
if machine_link.exists():
disallow_member(secret_path / "machines", machine, age_plugins)
update_keys( update_keys(
secret_path, secret_path,
collect_keys_for_path(secret_path), collect_keys_for_path(secret_path),

View File

@@ -187,7 +187,7 @@ def run_generators(
for generator in all_generators: for generator in all_generators:
if generator.share: if generator.share:
for file in generator.files: for file in generator.files:
if not file.secret or not file.exists: if not file.secret or not file.exists or not file.deploy:
continue continue
machine.secret_vars_store.ensure_machine_has_access( machine.secret_vars_store.ensure_machine_has_access(
generator, generator,