vars migration: raise error on incomplete migration, commit migrated files

This commit is contained in:
lassulus
2024-12-06 11:24:41 +01:00
parent 1c1f52f19b
commit ceaeb2f1f6

View File

@@ -302,7 +302,7 @@ def _migrate_file(
var_name: str, var_name: str,
service_name: str, service_name: str,
fact_name: str, fact_name: str,
) -> None: ) -> list[Path]:
for file in generator.files: for file in generator.files:
if file.name == var_name: if file.name == var_name:
break break
@@ -310,12 +310,24 @@ def _migrate_file(
msg = f"Could not find file {fact_name} in generator {generator.name}" msg = f"Could not find file {fact_name} in generator {generator.name}"
raise ClanError(msg) raise ClanError(msg)
paths = []
if file.secret: if file.secret:
old_value = machine.secret_facts_store.get(service_name, fact_name) old_value = machine.secret_facts_store.get(service_name, fact_name)
machine.secret_vars_store.set(generator, file, old_value, is_migration=True) maybe_path = machine.secret_vars_store.set(
generator, file, old_value, is_migration=True
)
if maybe_path:
paths.append(maybe_path)
else: else:
old_value = machine.public_facts_store.get(service_name, fact_name) old_value = machine.public_facts_store.get(service_name, fact_name)
machine.public_vars_store.set(generator, file, old_value, is_migration=True) maybe_path = machine.public_vars_store.set(
generator, file, old_value, is_migration=True
)
if maybe_path:
paths.append(maybe_path)
return paths
def _migrate_files( def _migrate_files(
@@ -323,10 +335,11 @@ def _migrate_files(
generator: Generator, generator: Generator,
) -> None: ) -> None:
not_found = [] not_found = []
files_to_commit = []
for file in generator.files: for file in generator.files:
if _migration_file_exists(machine, generator, file.name): if _migration_file_exists(machine, generator, file.name):
assert generator.migrate_fact is not None assert generator.migrate_fact is not None
_migrate_file( files_to_commit += _migrate_file(
machine, generator, file.name, generator.migrate_fact, file.name machine, generator, file.name, generator.migrate_fact, file.name
) )
else: else:
@@ -334,6 +347,11 @@ def _migrate_files(
if len(not_found) > 0: if len(not_found) > 0:
msg = f"Could not migrate the following files for generator {generator.name}, as no fact or secret exists with the same name: {not_found}" msg = f"Could not migrate the following files for generator {generator.name}, as no fact or secret exists with the same name: {not_found}"
raise ClanError(msg) raise ClanError(msg)
commit_files(
files_to_commit,
machine.flake_dir,
f"migrated facts to vars for generator {generator.name} for machine {machine.name}",
)
def _check_can_migrate( def _check_can_migrate(
@@ -344,17 +362,27 @@ def _check_can_migrate(
if not service_name: if not service_name:
return False return False
# ensure that none of the generated vars already exist in the store # ensure that none of the generated vars already exist in the store
all_files_missing = True
all_files_present = True
for file in generator.files: for file in generator.files:
if file.secret: if file.secret:
if machine.secret_vars_store.exists(generator, file.name): if machine.secret_vars_store.exists(generator, file.name):
if file.deploy: all_files_missing = False
machine.secret_vars_store.ensure_machine_has_access( else:
generator, file.name all_files_present = False
)
return False
else: else:
if machine.public_vars_store.exists(generator, file.name): if machine.public_vars_store.exists(generator, file.name):
return False all_files_missing = False
else:
all_files_present = False
if not all_files_present and not all_files_missing:
msg = f"Cannot migrate facts for generator {generator.name} as some files already exist in the store"
raise ClanError(msg)
if all_files_present:
# all filles already migrated, no need to run migration again
return False
# ensure that all files can be migrated (exists in the corresponding fact store) # ensure that all files can be migrated (exists in the corresponding fact store)
return bool( return bool(
all( all(