From f63940e2ba0924d4280aeaf5f2e7935d86edbcfc Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Tue, 20 Aug 2024 12:05:22 +0200 Subject: [PATCH] init: Set/get single disk --- pkgs/clan-cli/clan_cli/__init__.py | 4 +- pkgs/clan-cli/clan_cli/api/disk.py | 65 +++++++++++++++++++ pkgs/clan-cli/clan_cli/inventory/__init__.py | 10 +++ .../app/src/routes/machines/[name]/view.tsx | 21 +++++- 4 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 pkgs/clan-cli/clan_cli/api/disk.py diff --git a/pkgs/clan-cli/clan_cli/__init__.py b/pkgs/clan-cli/clan_cli/__init__.py index 111a6c64a..7fac1fd93 100644 --- a/pkgs/clan-cli/clan_cli/__init__.py +++ b/pkgs/clan-cli/clan_cli/__init__.py @@ -5,12 +5,12 @@ from pathlib import Path from types import ModuleType # These imports are unused, but necessary for @API.register to run once. -from clan_cli.api import directory, mdns_discovery, modules +from clan_cli.api import directory, disk, mdns_discovery, modules from clan_cli.arg_actions import AppendOptionAction from clan_cli.clan import show, update # API endpoints that are not used in the cli. -__all__ = ["directory", "mdns_discovery", "modules", "update"] +__all__ = ["directory", "mdns_discovery", "modules", "update", "disk"] from . import ( backups, diff --git a/pkgs/clan-cli/clan_cli/api/disk.py b/pkgs/clan-cli/clan_cli/api/disk.py new file mode 100644 index 000000000..63b50f846 --- /dev/null +++ b/pkgs/clan-cli/clan_cli/api/disk.py @@ -0,0 +1,65 @@ +from clan_cli.api import API +from clan_cli.inventory import ( + ServiceMeta, + ServiceSingleDisk, + ServiceSingleDiskRole, + ServiceSingleDiskRoleDefault, + SingleDiskConfig, + load_inventory_eval, + load_inventory_json, + save_inventory, +) + + +def get_instance_name(machine_name: str) -> str: + return f"{machine_name}-single-disk" + + +@API.register +def set_single_disk_uuid( + base_path: str, + machine_name: str, + disk_uuid: str, +) -> None: + """ + Set the disk UUID of single disk machine + """ + inventory = load_inventory_json(base_path) + + instance_name = get_instance_name(machine_name) + + single_disk_config: ServiceSingleDisk = ServiceSingleDisk( + meta=ServiceMeta(name=instance_name), + roles=ServiceSingleDiskRole( + default=ServiceSingleDiskRoleDefault( + config=SingleDiskConfig(device=disk_uuid) + ) + ), + ) + + inventory.services.single_disk[instance_name] = single_disk_config + + save_inventory( + inventory, + base_path, + f"Set disk UUID: '{disk_uuid}' on machine: '{machine_name}'", + ) + + +@API.register +def get_single_disk_uuid( + base_path: str, + machine_name: str, +) -> str | None: + """ + Get the disk UUID of single disk machine + """ + inventory = load_inventory_eval(base_path) + + instance_name = get_instance_name(machine_name) + + single_disk_config: ServiceSingleDisk = inventory.services.single_disk[ + instance_name + ] + + return single_disk_config.roles.default.config.device diff --git a/pkgs/clan-cli/clan_cli/inventory/__init__.py b/pkgs/clan-cli/clan_cli/inventory/__init__.py index acf680b75..3aabe6686 100644 --- a/pkgs/clan-cli/clan_cli/inventory/__init__.py +++ b/pkgs/clan-cli/clan_cli/inventory/__init__.py @@ -32,6 +32,10 @@ from .classes import ( ServiceBorgbackupRoleClient, ServiceBorgbackupRoleServer, ServiceMeta, + ServiceSingleDisk, + ServiceSingleDiskRole, + ServiceSingleDiskRoleDefault, + SingleDiskConfig, ) # Re export classes here @@ -49,6 +53,11 @@ __all__ = [ "ServiceBorgbackupRole", "ServiceBorgbackupRoleClient", "ServiceBorgbackupRoleServer", + # Single Disk service + "ServiceSingleDisk", + "ServiceSingleDiskRole", + "ServiceSingleDiskRoleDefault", + "SingleDiskConfig", ] @@ -82,6 +91,7 @@ def load_inventory_eval(flake_dir: str | Path) -> Inventory: "--json", ] ) + proc = run_no_stdout(cmd) try: diff --git a/pkgs/webview-ui/app/src/routes/machines/[name]/view.tsx b/pkgs/webview-ui/app/src/routes/machines/[name]/view.tsx index 7e7564c10..320a2756f 100644 --- a/pkgs/webview-ui/app/src/routes/machines/[name]/view.tsx +++ b/pkgs/webview-ui/app/src/routes/machines/[name]/view.tsx @@ -38,6 +38,18 @@ export const MachineDetails = () => { const [formStore, { Form, Field }] = createForm({}); const handleSubmit = async (values: InstallForm) => { + const curr_uri = activeURI(); + if (!curr_uri) { + return; + } + + console.log("Setting disk", values.disk); + const r = await callApi("set_single_disk_uuid", { + base_path: curr_uri, + machine_name: params.id, + disk_uuid: values.disk, + }); + return null; }; @@ -151,7 +163,7 @@ export const MachineDetails = () => { machine_name: params.id, clan_dir: curr_uri, hostname: query.data.machine.deploy.targetHost, - } + }, ); toast.dismiss(lt); @@ -160,7 +172,7 @@ export const MachineDetails = () => { } if (response.status === "error") { toast.error( - "Failed to generate. " + response.errors[0].message + "Failed to generate. " + response.errors[0].message, ); } query.refetch(); @@ -201,7 +213,7 @@ export const MachineDetails = () => { {"bytes @"} { query.data?.machine.deploy.targetHost?.split( - "@" + "@", )?.[1] } @@ -214,6 +226,9 @@ export const MachineDetails = () => { /> )} + )}