diff --git a/pkgs/clan-cli/clan_cli/__init__.py b/pkgs/clan-cli/clan_cli/__init__.py index f728e40a..b985a84f 100644 --- a/pkgs/clan-cli/clan_cli/__init__.py +++ b/pkgs/clan-cli/clan_cli/__init__.py @@ -75,12 +75,6 @@ def add_common_flags(parser: argparse.ArgumentParser) -> None: default=[], ) - def flake_path(arg: str) -> str | Path: - flake_dir = Path(arg).resolve() - if flake_dir.exists() and flake_dir.is_dir(): - return flake_dir - return arg - parser.add_argument( "--flake", help="path to the flake where the clan resides in, can be a remote flake or local, can be set through the [CLAN_DIR] environment variable", diff --git a/pkgs/clan-cli/clan_cli/facts/generate.py b/pkgs/clan-cli/clan_cli/facts/generate.py index bc62de80..dd033e1a 100644 --- a/pkgs/clan-cli/clan_cli/facts/generate.py +++ b/pkgs/clan-cli/clan_cli/facts/generate.py @@ -209,9 +209,9 @@ def generate_facts( def generate_command(args: argparse.Namespace) -> None: if len(args.machines) == 0: - machines = get_all_machines(args.flake) + machines = get_all_machines(args.flake, args.option) else: - machines = get_selected_machines(args.flake, args.machines) + machines = get_selected_machines(args.flake, args.option, args.machines) generate_facts(machines, args.service, args.regenerate) diff --git a/pkgs/clan-cli/clan_cli/flash.py b/pkgs/clan-cli/clan_cli/flash.py index 18142582..5883c53d 100644 --- a/pkgs/clan-cli/clan_cli/flash.py +++ b/pkgs/clan-cli/clan_cli/flash.py @@ -86,6 +86,7 @@ def flash_machine( system_config: dict[str, Any], dry_run: bool, debug: bool, + extra_args: list[str] = [], ) -> None: secret_facts_module = importlib.import_module(machine.secret_facts_module) secret_facts_store: SecretStoreBase = secret_facts_module.SecretStore( @@ -128,6 +129,8 @@ def flash_machine( json.dumps(system_config), ] ) + disko_install.extend(["--option", "dry-run", "true"]) + disko_install.extend(extra_args) cmd = nix_shell( ["nixpkgs#disko"], @@ -148,6 +151,8 @@ class FlashOptions: mode: str language: str keymap: str + write_efi_boot_entries: bool + nix_options: list[str] class AppendDiskAction(argparse.Action): @@ -178,6 +183,7 @@ def flash_command(args: argparse.Namespace) -> None: mode=args.mode, language=args.lang, keymap=args.keymap, + nix_options=args.options, ) machine = Machine(opts.machine, flake=opts.flake) @@ -251,12 +257,14 @@ def register_parser(parser: argparse.ArgumentParser) -> None: help="device to flash to", default={}, ) - mode_help = textwrap.dedent("""\ + mode_help = textwrap.dedent( + """\ Specify the mode of operation. Valid modes are: format, mount." Format will format the disk before installing. Mount will mount the disk before installing. Mount is useful for updating an existing system without losing data. - """) + """ + ) parser.add_argument( "--mode", type=str, diff --git a/pkgs/clan-cli/clan_cli/machines/install.py b/pkgs/clan-cli/clan_cli/machines/install.py index 3465a254..daf72759 100644 --- a/pkgs/clan-cli/clan_cli/machines/install.py +++ b/pkgs/clan-cli/clan_cli/machines/install.py @@ -26,6 +26,7 @@ def install_nixos( debug: bool = False, password: str | None = None, no_reboot: bool = False, + extra_args: list[str] = [], ) -> None: secret_facts_module = importlib.import_module(machine.secret_facts_module) log.info(f"installing {machine.name}") @@ -56,6 +57,7 @@ def install_nixos( f"{machine.flake}#{machine.name}", "--extra-files", str(tmpdir), + *extra_args, ] if no_reboot: @@ -95,6 +97,7 @@ class InstallOptions: debug: bool no_reboot: bool json_ssh_deploy: dict[str, str] | None + nix_options: list[str] def install_command(args: argparse.Namespace) -> None: @@ -127,6 +130,7 @@ def install_command(args: argparse.Namespace) -> None: debug=args.debug, no_reboot=args.no_reboot, json_ssh_deploy=json_ssh_deploy, + nix_options=args.option, ) machine = Machine(opts.machine, flake=opts.flake) machine.target_host_address = opts.target_host @@ -142,6 +146,7 @@ def install_command(args: argparse.Namespace) -> None: debug=opts.debug, password=password, no_reboot=opts.no_reboot, + extra_args=opts.nix_options, ) diff --git a/pkgs/clan-cli/clan_cli/machines/inventory.py b/pkgs/clan-cli/clan_cli/machines/inventory.py index 5f900b75..84873aab 100644 --- a/pkgs/clan-cli/clan_cli/machines/inventory.py +++ b/pkgs/clan-cli/clan_cli/machines/inventory.py @@ -7,7 +7,7 @@ from .machines import Machine # function to speedup eval if we want to evauluate all machines -def get_all_machines(flake_dir: Path) -> list[Machine]: +def get_all_machines(flake_dir: Path, nix_options: list[str]) -> list[Machine]: config = nix_config() system = config["system"] json_path = run( @@ -19,13 +19,20 @@ def get_all_machines(flake_dir: Path) -> list[Machine]: machines = [] for name, machine_data in machines_json.items(): machines.append( - Machine(name=name, flake=flake_dir, deployment_info=machine_data) + Machine( + name=name, + flake=flake_dir, + deployment_info=machine_data, + nix_options=nix_options, + ) ) return machines -def get_selected_machines(flake_dir: Path, machine_names: list[str]) -> list[Machine]: +def get_selected_machines( + flake_dir: Path, nix_options: list[str], machine_names: list[str] +) -> list[Machine]: machines = [] for name in machine_names: - machines.append(Machine(name=name, flake=flake_dir)) + machines.append(Machine(name=name, flake=flake_dir, nix_options=nix_options)) return machines diff --git a/pkgs/clan-cli/clan_cli/machines/machines.py b/pkgs/clan-cli/clan_cli/machines/machines.py index 7907b01e..6d70a827 100644 --- a/pkgs/clan-cli/clan_cli/machines/machines.py +++ b/pkgs/clan-cli/clan_cli/machines/machines.py @@ -41,9 +41,10 @@ class QMPWrapper: class Machine: - flake: str | Path name: str + flake: str | Path data: MachineData + nix_options: list[str] eval_cache: dict[str, str] build_cache: dict[str, Path] _flake_path: Path | None @@ -55,6 +56,7 @@ class Machine: name: str, flake: Path | str, deployment_info: dict | None = None, + nix_options: list[str] = [], machine: MachineData | None = None, ) -> None: """ @@ -76,6 +78,7 @@ class Machine: self.build_cache: dict[str, Path] = {} self._flake_path: Path | None = None self._deployment_info: None | dict = deployment_info + self.nix_options = nix_options state_dir = vm_state_dir(flake_url=str(self.flake), vm_name=self.data.name) @@ -242,9 +245,9 @@ class Machine: flake = f"path:{self.flake_dir}" args += [ - f'{flake}#clanInternals.machines."{system}".{self.data.name}.{attr}', - *nix_options, + f'{flake}#clanInternals.machines."{system}".{self.data.name}.{attr}' ] + args += nix_options + self.nix_options if method == "eval": output = run_no_stdout(nix_eval(args)).stdout.strip() diff --git a/pkgs/clan-cli/clan_cli/machines/update.py b/pkgs/clan-cli/clan_cli/machines/update.py index 5c97d993..1da38904 100644 --- a/pkgs/clan-cli/clan_cli/machines/update.py +++ b/pkgs/clan-cli/clan_cli/machines/update.py @@ -110,11 +110,9 @@ def deploy_nixos(machines: MachineGroup) -> None: ssh_arg += " -i " + host.key if host.key else "" - extra_args = host.meta.get("extra_args", []) cmd = [ "nixos-rebuild", "switch", - *extra_args, "--fast", "--option", "keep-going", @@ -124,6 +122,7 @@ def deploy_nixos(machines: MachineGroup) -> None: "true", "--build-host", "", + *machine.nix_options, "--flake", f"{path}#{machine.name}", ] @@ -143,7 +142,9 @@ def update(args: argparse.Namespace) -> None: raise ClanError("Could not find clan flake toplevel directory") machines = [] if len(args.machines) == 1 and args.target_host is not None: - machine = Machine(name=args.machines[0], flake=args.flake) + machine = Machine( + name=args.machines[0], flake=args.flake, nix_options=args.option + ) machine.target_host_address = args.target_host machines.append(machine) @@ -153,7 +154,7 @@ def update(args: argparse.Namespace) -> None: else: if len(args.machines) == 0: ignored_machines = [] - for machine in get_all_machines(args.flake): + for machine in get_all_machines(args.flake, args.option): if machine.deployment_info.get("requireExplicitUpdate", False): continue try: @@ -173,7 +174,7 @@ def update(args: argparse.Namespace) -> None: print(machine, file=sys.stderr) else: - machines = get_selected_machines(args.flake, args.machines) + machines = get_selected_machines(args.flake, args.option, args.machines) deploy_nixos(MachineGroup(machines))