API: migrate machines delete and list to inventory
Some checks failed
buildbot/nix-build .#checks.x86_64-linux.clan-dep-bash Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-app-no-breakpoints Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-e2fsprogs Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-git Build done.
buildbot/nix-build .#checks.x86_64-linux.check-for-breakpoints Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-age Build done.
buildbot/nix-build .#checks.x86_64-linux.borgbackup Build done.
buildbot/nix-build .#checks.x86_64-linux.package-default Build done.
buildbot/nix-build .#checks.x86_64-linux.package-clan-cli-docs Build done.
buildbot/nix-build .#checks.aarch64-darwin.nixos-test_install_machine Build done.
buildbot/nix-build .#checks.x86_64-linux.package-clan-cli Build done.
buildbot/nix-build .#checks.x86_64-linux.package-clan-ts-api Build done.
buildbot/nix-build .#checks.x86_64-linux.package-gui-installer-archlinux Build done.
buildbot/nix-build .#checks.x86_64-linux.package-gui-installer-apk Build done.
buildbot/nix-build .#checks.x86_64-linux.package-gui-installer-rpm Build done.
buildbot/nix-build .#checks.aarch64-darwin.nixos-flash-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-docs Build done.
buildbot/nix-build .#checks.x86_64-linux.package-gui-installer-deb Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-app-pytest Build done.
buildbot/nix-build .#checks.aarch64-darwin.nixos-iso-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-webview-ui Build done.
buildbot/nix-build .#checks.x86_64-linux.nixos-test-backup Build done.
buildbot/nix-build .#checks.aarch64-linux.nixos-test_install_machine Build done.
buildbot/nix-build .#checks.x86_64-linux.package-module-docs Build done.
buildbot/nix-build .#checks.aarch64-linux.nixos-iso-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.renderClanOptions Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-openssh Build done.
buildbot/nix-build .#checks.x86_64-linux."clan-dep-python3.11-qemu" Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-rsync Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-sops Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-sshpass Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-nix Build done.
buildbot/nix-build .#checks.x86_64-linux."clan-dep-python3.11-mypy" Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-tor Build done.
buildbot/nix-build .#checks.aarch64-linux.nixos-test-backup Build done.
buildbot/nix-build .#checks.aarch64-darwin.nixos-test-backup Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-zbar Build done.
buildbot/nix-build .#checks.aarch64-linux.nixos-flash-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-clan-cli Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-default Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-inventory-schema Build done.
buildbot/nix-build .#checks.x86_64-linux.lib-inventory-schema Build done.
buildbot/nix-build .#checks.x86_64-linux.lib-jsonschema-example-valid Build done.
buildbot/nix-build .#checks.x86_64-linux.container Build done.
buildbot/nix-build .#checks.x86_64-linux.deltachat Build done.
buildbot/nix-build .#checks.x86_64-linux.treefmt Build done.
buildbot/nix-build .#checks.x86_64-linux.package-deploy-docs Build done.
buildbot/nix-build .#checks.x86_64-linux.matrix-synapse Build done.
buildbot/nix-build .#checks.x86_64-linux.module-schema Build done.
buildbot/nix-build .#checks.x86_64-linux.lib-jsonschema-nix-unit-tests Build done.
buildbot/nix-build .#checks.x86_64-linux.nixos-test_install_machine Build done.
buildbot/nix-build .#checks.x86_64-linux.package-impure-checks Build done.
buildbot/nix-build .#checks.x86_64-linux.package-editor Build done.
buildbot/nix-build .#checks.x86_64-linux.package-merge-after-ci Build done.
buildbot/nix-build .#checks.x86_64-linux.package-docs Build done.
buildbot/nix-build .#checks.x86_64-linux.package-pending-reviews Build done.
buildbot/nix-build .#checks.x86_64-linux.package-tea-create-pr Build done.
buildbot/nix-build .#checks.x86_64-linux.package-zerotier-members Build done.
buildbot/nix-build .#checks.x86_64-linux.package-zerotierone Build done.
buildbot/nix-build .#checks.x86_64-linux.package-zt-tcp-relay Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-clan-app Build done.
buildbot/nix-build .#checks.x86_64-linux.nixos-minimal-inventory-machine Build done.
buildbot/nix-build .#checks.aarch64-darwin.nixos-minimal-inventory-machine Build done.
buildbot/nix-build .#checks.aarch64-linux.nixos-minimal-inventory-machine Build done.
buildbot/nix-build .#checks.x86_64-linux.nixos-iso-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.package-moonlight-sunshine-accept Build done.
buildbot/nix-build .#checks.x86_64-linux.nixos-flash-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.package-function-schema Build done.
buildbot/nix-build .#checks.x86_64-linux.secrets Build done.
buildbot/nix-build .#checks.x86_64-linux.postgresql Build done.
buildbot/nix-build .#checks.x86_64-linux.package-module-schema Build done.
buildbot/nix-build .#checks.x86_64-linux.template-minimal Build done.
buildbot/nix-build .#checks.x86_64-linux.wayland-proxy-virtwl Build done.
buildbot/nix-build .#checks.x86_64-linux.package-iso-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.zt-tcp-relay Build done.
buildbot/nix-build .#checks.x86_64-linux.syncthing Build done.
buildbot/nix-build .#checks.x86_64-linux.package-webview-ui Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-pytest-without-core Build done.
buildbot/nix-build .#checks.x86_64-linux.package-clan-app Build done.
buildbot/nix-build .#checks.x86_64-linux.lib-inventory-eval Build done.
buildbot/nix-build .#checks.x86_64-linux.module-clan-vars-eval Build done.
buildbot/nix-build .#checks.x86_64-linux.package-gui-install-test-ubuntu-22-04 Build done.
buildbot/nix-build .#checks.x86_64-linux.test-backups Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-pytest-with-core Build done.
checks / checks-impure (pull_request) Successful in 2m28s
buildbot/nix-build .#checks.x86_64-linux.flash Build done.
buildbot/nix-build .#checks.x86_64-linux.test-installation Build done.
buildbot/nix-eval Build done.
Some checks failed
buildbot/nix-build .#checks.x86_64-linux.clan-dep-bash Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-app-no-breakpoints Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-e2fsprogs Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-git Build done.
buildbot/nix-build .#checks.x86_64-linux.check-for-breakpoints Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-age Build done.
buildbot/nix-build .#checks.x86_64-linux.borgbackup Build done.
buildbot/nix-build .#checks.x86_64-linux.package-default Build done.
buildbot/nix-build .#checks.x86_64-linux.package-clan-cli-docs Build done.
buildbot/nix-build .#checks.aarch64-darwin.nixos-test_install_machine Build done.
buildbot/nix-build .#checks.x86_64-linux.package-clan-cli Build done.
buildbot/nix-build .#checks.x86_64-linux.package-clan-ts-api Build done.
buildbot/nix-build .#checks.x86_64-linux.package-gui-installer-archlinux Build done.
buildbot/nix-build .#checks.x86_64-linux.package-gui-installer-apk Build done.
buildbot/nix-build .#checks.x86_64-linux.package-gui-installer-rpm Build done.
buildbot/nix-build .#checks.aarch64-darwin.nixos-flash-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-docs Build done.
buildbot/nix-build .#checks.x86_64-linux.package-gui-installer-deb Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-app-pytest Build done.
buildbot/nix-build .#checks.aarch64-darwin.nixos-iso-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-webview-ui Build done.
buildbot/nix-build .#checks.x86_64-linux.nixos-test-backup Build done.
buildbot/nix-build .#checks.aarch64-linux.nixos-test_install_machine Build done.
buildbot/nix-build .#checks.x86_64-linux.package-module-docs Build done.
buildbot/nix-build .#checks.aarch64-linux.nixos-iso-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.renderClanOptions Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-openssh Build done.
buildbot/nix-build .#checks.x86_64-linux."clan-dep-python3.11-qemu" Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-rsync Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-sops Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-sshpass Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-nix Build done.
buildbot/nix-build .#checks.x86_64-linux."clan-dep-python3.11-mypy" Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-tor Build done.
buildbot/nix-build .#checks.aarch64-linux.nixos-test-backup Build done.
buildbot/nix-build .#checks.aarch64-darwin.nixos-test-backup Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-dep-zbar Build done.
buildbot/nix-build .#checks.aarch64-linux.nixos-flash-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-clan-cli Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-default Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-inventory-schema Build done.
buildbot/nix-build .#checks.x86_64-linux.lib-inventory-schema Build done.
buildbot/nix-build .#checks.x86_64-linux.lib-jsonschema-example-valid Build done.
buildbot/nix-build .#checks.x86_64-linux.container Build done.
buildbot/nix-build .#checks.x86_64-linux.deltachat Build done.
buildbot/nix-build .#checks.x86_64-linux.treefmt Build done.
buildbot/nix-build .#checks.x86_64-linux.package-deploy-docs Build done.
buildbot/nix-build .#checks.x86_64-linux.matrix-synapse Build done.
buildbot/nix-build .#checks.x86_64-linux.module-schema Build done.
buildbot/nix-build .#checks.x86_64-linux.lib-jsonschema-nix-unit-tests Build done.
buildbot/nix-build .#checks.x86_64-linux.nixos-test_install_machine Build done.
buildbot/nix-build .#checks.x86_64-linux.package-impure-checks Build done.
buildbot/nix-build .#checks.x86_64-linux.package-editor Build done.
buildbot/nix-build .#checks.x86_64-linux.package-merge-after-ci Build done.
buildbot/nix-build .#checks.x86_64-linux.package-docs Build done.
buildbot/nix-build .#checks.x86_64-linux.package-pending-reviews Build done.
buildbot/nix-build .#checks.x86_64-linux.package-tea-create-pr Build done.
buildbot/nix-build .#checks.x86_64-linux.package-zerotier-members Build done.
buildbot/nix-build .#checks.x86_64-linux.package-zerotierone Build done.
buildbot/nix-build .#checks.x86_64-linux.package-zt-tcp-relay Build done.
buildbot/nix-build .#checks.x86_64-linux.devShell-clan-app Build done.
buildbot/nix-build .#checks.x86_64-linux.nixos-minimal-inventory-machine Build done.
buildbot/nix-build .#checks.aarch64-darwin.nixos-minimal-inventory-machine Build done.
buildbot/nix-build .#checks.aarch64-linux.nixos-minimal-inventory-machine Build done.
buildbot/nix-build .#checks.x86_64-linux.nixos-iso-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.package-moonlight-sunshine-accept Build done.
buildbot/nix-build .#checks.x86_64-linux.nixos-flash-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.package-function-schema Build done.
buildbot/nix-build .#checks.x86_64-linux.secrets Build done.
buildbot/nix-build .#checks.x86_64-linux.postgresql Build done.
buildbot/nix-build .#checks.x86_64-linux.package-module-schema Build done.
buildbot/nix-build .#checks.x86_64-linux.template-minimal Build done.
buildbot/nix-build .#checks.x86_64-linux.wayland-proxy-virtwl Build done.
buildbot/nix-build .#checks.x86_64-linux.package-iso-installer Build done.
buildbot/nix-build .#checks.x86_64-linux.zt-tcp-relay Build done.
buildbot/nix-build .#checks.x86_64-linux.syncthing Build done.
buildbot/nix-build .#checks.x86_64-linux.package-webview-ui Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-pytest-without-core Build done.
buildbot/nix-build .#checks.x86_64-linux.package-clan-app Build done.
buildbot/nix-build .#checks.x86_64-linux.lib-inventory-eval Build done.
buildbot/nix-build .#checks.x86_64-linux.module-clan-vars-eval Build done.
buildbot/nix-build .#checks.x86_64-linux.package-gui-install-test-ubuntu-22-04 Build done.
buildbot/nix-build .#checks.x86_64-linux.test-backups Build done.
buildbot/nix-build .#checks.x86_64-linux.clan-pytest-with-core Build done.
checks / checks-impure (pull_request) Successful in 2m28s
buildbot/nix-build .#checks.x86_64-linux.flash Build done.
buildbot/nix-build .#checks.x86_64-linux.test-installation Build done.
buildbot/nix-eval Build done.
This commit is contained in:
parent
df934334a2
commit
9f484c1d39
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"machines": {
|
"machines": {
|
||||||
"minimal_inventory_machine": {
|
"minimal-inventory-machine": {
|
||||||
"name": "foo",
|
"name": "foo",
|
||||||
"system": "x86_64-linux",
|
"system": "x86_64-linux",
|
||||||
"description": "A nice thing",
|
"description": "A nice thing",
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import json
|
||||||
import re
|
import re
|
||||||
from dataclasses import asdict, dataclass, is_dataclass
|
from dataclasses import asdict, dataclass, is_dataclass
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
@ -136,3 +137,26 @@ class Inventory:
|
||||||
for name, services in d["services"].items()
|
for name, services in d["services"].items()
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_path(flake_dir: str | Path) -> Path:
|
||||||
|
return Path(flake_dir) / "inventory.json"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def load_file(flake_dir: str | Path) -> "Inventory":
|
||||||
|
inventory = Inventory(machines={}, services={})
|
||||||
|
inventory_file = Inventory.get_path(flake_dir)
|
||||||
|
if inventory_file.exists():
|
||||||
|
with open(inventory_file) as f:
|
||||||
|
try:
|
||||||
|
res = json.load(f)
|
||||||
|
inventory = Inventory.from_dict(res)
|
||||||
|
except json.JSONDecodeError as e:
|
||||||
|
raise ClanError(f"Error decoding inventory file: {e}")
|
||||||
|
|
||||||
|
return inventory
|
||||||
|
|
||||||
|
def persist(self, flake_dir: str | Path) -> None:
|
||||||
|
inventory_file = Inventory.get_path(flake_dir)
|
||||||
|
with open(inventory_file, "w") as f:
|
||||||
|
json.dump(dataclass_to_dict(self), f, indent=2)
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import argparse
|
import argparse
|
||||||
import json
|
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
@ -7,7 +6,7 @@ from pathlib import Path
|
||||||
from clan_cli.api import API
|
from clan_cli.api import API
|
||||||
from clan_cli.errors import ClanError
|
from clan_cli.errors import ClanError
|
||||||
from clan_cli.git import commit_file
|
from clan_cli.git import commit_file
|
||||||
from clan_cli.inventory import Inventory, Machine, dataclass_to_dict
|
from clan_cli.inventory import Inventory, Machine
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -18,26 +17,12 @@ def create_machine(flake_dir: str | Path, machine: Machine) -> None:
|
||||||
if not re.match(hostname_regex, machine.name):
|
if not re.match(hostname_regex, machine.name):
|
||||||
raise ClanError("Machine name must be a valid hostname")
|
raise ClanError("Machine name must be a valid hostname")
|
||||||
|
|
||||||
inventory = Inventory(machines={}, services={})
|
inventory = Inventory.load_file(flake_dir)
|
||||||
|
|
||||||
inventory_file = Path(flake_dir) / "inventory.json"
|
|
||||||
if inventory_file.exists():
|
|
||||||
with open(inventory_file) as f:
|
|
||||||
try:
|
|
||||||
res = json.load(f)
|
|
||||||
inventory = Inventory.from_dict(res)
|
|
||||||
|
|
||||||
except json.JSONDecodeError as e:
|
|
||||||
raise ClanError(f"Error decoding inventory file: {e}")
|
|
||||||
|
|
||||||
inventory.machines.update({machine.name: machine})
|
inventory.machines.update({machine.name: machine})
|
||||||
|
inventory.persist(flake_dir)
|
||||||
with open(inventory_file, "w") as g:
|
|
||||||
d = dataclass_to_dict(inventory)
|
|
||||||
json.dump(d, g, indent=2)
|
|
||||||
|
|
||||||
if flake_dir is not None:
|
if flake_dir is not None:
|
||||||
commit_file(inventory_file, Path(flake_dir))
|
commit_file(Inventory.get_path(flake_dir), Path(flake_dir))
|
||||||
|
|
||||||
|
|
||||||
def create_command(args: argparse.Namespace) -> None:
|
def create_command(args: argparse.Namespace) -> None:
|
||||||
|
|
|
@ -1,21 +1,36 @@
|
||||||
import argparse
|
import argparse
|
||||||
import shutil
|
import shutil
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from clan_cli.api import API
|
||||||
|
from clan_cli.inventory import Inventory
|
||||||
|
|
||||||
from ..completions import add_dynamic_completer, complete_machines
|
from ..completions import add_dynamic_completer, complete_machines
|
||||||
from ..dirs import specific_machine_dir
|
from ..dirs import specific_machine_dir
|
||||||
from ..errors import ClanError
|
from ..errors import ClanError
|
||||||
|
|
||||||
|
|
||||||
def delete_command(args: argparse.Namespace) -> None:
|
@API.register
|
||||||
folder = specific_machine_dir(args.flake, args.host)
|
def delete_machine(base_dir: str | Path, name: str) -> None:
|
||||||
|
inventory = Inventory.load_file(base_dir)
|
||||||
|
|
||||||
|
machine = inventory.machines.pop(name, None)
|
||||||
|
if machine is None:
|
||||||
|
raise ClanError(f"Machine {name} does not exist")
|
||||||
|
|
||||||
|
inventory.persist(base_dir)
|
||||||
|
|
||||||
|
folder = specific_machine_dir(Path(base_dir), name)
|
||||||
if folder.exists():
|
if folder.exists():
|
||||||
shutil.rmtree(folder)
|
shutil.rmtree(folder)
|
||||||
else:
|
|
||||||
raise ClanError(f"Machine {args.host} does not exist")
|
|
||||||
|
def delete_command(args: argparse.Namespace) -> None:
|
||||||
|
delete_machine(args.flake, args.name)
|
||||||
|
|
||||||
|
|
||||||
def register_delete_parser(parser: argparse.ArgumentParser) -> None:
|
def register_delete_parser(parser: argparse.ArgumentParser) -> None:
|
||||||
machines_parser = parser.add_argument("host", type=str)
|
machines_parser = parser.add_argument("name", type=str)
|
||||||
add_dynamic_completer(machines_parser, complete_machines)
|
add_dynamic_completer(machines_parser, complete_machines)
|
||||||
|
|
||||||
parser.set_defaults(func=delete_command)
|
parser.set_defaults(func=delete_command)
|
||||||
|
|
|
@ -4,22 +4,19 @@ import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from clan_cli.api import API
|
from clan_cli.api import API
|
||||||
|
from clan_cli.inventory import Machine
|
||||||
|
|
||||||
from ..cmd import run_no_stdout
|
from ..cmd import run_no_stdout
|
||||||
from ..nix import nix_config, nix_eval
|
from ..nix import nix_eval
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@API.register
|
@API.register
|
||||||
def list_machines(flake_url: str | Path, debug: bool = False) -> list[str]:
|
def list_machines(flake_url: str | Path, debug: bool = False) -> dict[str, Machine]:
|
||||||
config = nix_config()
|
|
||||||
system = config["system"]
|
|
||||||
cmd = nix_eval(
|
cmd = nix_eval(
|
||||||
[
|
[
|
||||||
f"{flake_url}#clanInternals.machines.{system}",
|
f"{flake_url}#clanInternals.inventory.machines",
|
||||||
"--apply",
|
|
||||||
"builtins.attrNames",
|
|
||||||
"--json",
|
"--json",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
@ -27,12 +24,13 @@ def list_machines(flake_url: str | Path, debug: bool = False) -> list[str]:
|
||||||
proc = run_no_stdout(cmd)
|
proc = run_no_stdout(cmd)
|
||||||
|
|
||||||
res = proc.stdout.strip()
|
res = proc.stdout.strip()
|
||||||
return json.loads(res)
|
data = {name: Machine.from_dict(v) for name, v in json.loads(res).items()}
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
def list_command(args: argparse.Namespace) -> None:
|
def list_command(args: argparse.Namespace) -> None:
|
||||||
flake_path = Path(args.flake).resolve()
|
flake_path = Path(args.flake).resolve()
|
||||||
for name in list_machines(flake_path, args.debug):
|
for name in list_machines(flake_path, args.debug).keys():
|
||||||
print(name)
|
print(name)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
import { For, Match, Show, Switch, createSignal } from "solid-js";
|
import { Match, Show, Switch, createSignal } from "solid-js";
|
||||||
import { ErrorData, SuccessData, pyApi } from "../api";
|
import { ErrorData, SuccessData, pyApi } from "../api";
|
||||||
import { currClanURI } from "../App";
|
import { currClanURI } from "../App";
|
||||||
|
|
||||||
|
type MachineDetails = SuccessData<"list_machines">["data"][string];
|
||||||
|
|
||||||
interface MachineListItemProps {
|
interface MachineListItemProps {
|
||||||
name: string;
|
name: string;
|
||||||
|
info: MachineDetails;
|
||||||
}
|
}
|
||||||
|
|
||||||
type MachineDetails = Record<string, SuccessData<"show_machine">["data"]>;
|
|
||||||
type HWInfo = Record<string, SuccessData<"show_machine_hardware_info">["data"]>;
|
type HWInfo = Record<string, SuccessData<"show_machine_hardware_info">["data"]>;
|
||||||
type DeploymentInfo = Record<
|
type DeploymentInfo = Record<
|
||||||
string,
|
string,
|
||||||
|
@ -15,26 +17,12 @@ type DeploymentInfo = Record<
|
||||||
|
|
||||||
type MachineErrors = Record<string, ErrorData<"show_machine">["errors"]>;
|
type MachineErrors = Record<string, ErrorData<"show_machine">["errors"]>;
|
||||||
|
|
||||||
const [details, setDetails] = createSignal<MachineDetails>({});
|
|
||||||
const [hwInfo, setHwInfo] = createSignal<HWInfo>({});
|
const [hwInfo, setHwInfo] = createSignal<HWInfo>({});
|
||||||
|
|
||||||
const [deploymentInfo, setDeploymentInfo] = createSignal<DeploymentInfo>({});
|
const [deploymentInfo, setDeploymentInfo] = createSignal<DeploymentInfo>({});
|
||||||
|
|
||||||
const [errors, setErrors] = createSignal<MachineErrors>({});
|
const [errors, setErrors] = createSignal<MachineErrors>({});
|
||||||
|
|
||||||
pyApi.show_machine.receive((r) => {
|
|
||||||
if (r.status === "error") {
|
|
||||||
const { op_key } = r;
|
|
||||||
if (op_key) {
|
|
||||||
setErrors((e) => ({ ...e, [op_key]: r.errors }));
|
|
||||||
}
|
|
||||||
console.error(r.errors);
|
|
||||||
}
|
|
||||||
if (r.status === "success") {
|
|
||||||
setDetails((d) => ({ ...d, [r.data.machine_name]: r.data }));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
pyApi.show_machine_hardware_info.receive((r) => {
|
pyApi.show_machine_hardware_info.receive((r) => {
|
||||||
const { op_key } = r;
|
const { op_key } = r;
|
||||||
if (r.status === "error") {
|
if (r.status === "error") {
|
||||||
|
@ -64,13 +52,7 @@ pyApi.show_machine_deployment_target.receive((r) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
export const MachineListItem = (props: MachineListItemProps) => {
|
export const MachineListItem = (props: MachineListItemProps) => {
|
||||||
const { name } = props;
|
const { name, info } = props;
|
||||||
|
|
||||||
pyApi.show_machine.dispatch({
|
|
||||||
op_key: name,
|
|
||||||
machine_name: name,
|
|
||||||
flake_url: currClanURI(),
|
|
||||||
});
|
|
||||||
|
|
||||||
pyApi.show_machine_hardware_info.dispatch({
|
pyApi.show_machine_hardware_info.dispatch({
|
||||||
op_key: name,
|
op_key: name,
|
||||||
|
@ -97,16 +79,14 @@ export const MachineListItem = (props: MachineListItemProps) => {
|
||||||
<h2 class="card-title">{name}</h2>
|
<h2 class="card-title">{name}</h2>
|
||||||
<div class="text-slate-600">
|
<div class="text-slate-600">
|
||||||
<Show
|
<Show
|
||||||
when={details()[name]}
|
when={info}
|
||||||
fallback={
|
fallback={
|
||||||
<Switch fallback={<div class="skeleton h-8 w-full"></div>}>
|
<Switch fallback={<div class="skeleton h-8 w-full"></div>}>
|
||||||
<Match when={!details()[name]?.machine_description}>
|
<Match when={!info.description}>No description</Match>
|
||||||
No description
|
|
||||||
</Match>
|
|
||||||
</Switch>
|
</Switch>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
{(d) => d()?.machine_description}
|
{(d) => d()?.description}
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-row flex-wrap gap-4 py-2">
|
<div class="flex flex-row flex-wrap gap-4 py-2">
|
||||||
|
|
|
@ -23,6 +23,11 @@ type ServiceModel = Extract<
|
||||||
{ status: "success" }
|
{ status: "success" }
|
||||||
>["data"]["services"];
|
>["data"]["services"];
|
||||||
|
|
||||||
|
type MachinesModel = Extract<
|
||||||
|
OperationResponse<"list_machines">,
|
||||||
|
{ status: "success" }
|
||||||
|
>["data"];
|
||||||
|
|
||||||
export const MachineListView: Component = () => {
|
export const MachineListView: Component = () => {
|
||||||
const [{ machines, loading }, { getMachines }] = useMachineContext();
|
const [{ machines, loading }, { getMachines }] = useMachineContext();
|
||||||
|
|
||||||
|
@ -44,11 +49,13 @@ export const MachineListView: Component = () => {
|
||||||
console.log(files());
|
console.log(files());
|
||||||
});
|
});
|
||||||
|
|
||||||
const [data, setData] = createSignal<string[]>([]);
|
const [data, setData] = createSignal<MachinesModel>({});
|
||||||
createEffect(() => {
|
createEffect(() => {
|
||||||
if (route() === "machines") getMachines();
|
if (route() === "machines") getMachines();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const unpackedMachines = () => Object.entries(data());
|
||||||
|
|
||||||
createEffect(() => {
|
createEffect(() => {
|
||||||
const response = machines();
|
const response = machines();
|
||||||
if (response?.status === "success") {
|
if (response?.status === "success") {
|
||||||
|
@ -57,7 +64,7 @@ export const MachineListView: Component = () => {
|
||||||
toast.success("Machines loaded");
|
toast.success("Machines loaded");
|
||||||
}
|
}
|
||||||
if (response?.status === "error") {
|
if (response?.status === "error") {
|
||||||
setData([]);
|
setData({});
|
||||||
console.error(response.errors);
|
console.error(response.errors);
|
||||||
toast.error("Error loading machines");
|
toast.error("Error loading machines");
|
||||||
response.errors.forEach((error) =>
|
response.errors.forEach((error) =>
|
||||||
|
@ -162,13 +169,13 @@ export const MachineListView: Component = () => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={!loading() && data().length === 0}>
|
<Match when={!loading() && unpackedMachines().length === 0}>
|
||||||
No machines found
|
No machines found
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={!loading()}>
|
<Match when={!loading()}>
|
||||||
<ul>
|
<ul>
|
||||||
<For each={data()}>
|
<For each={unpackedMachines()}>
|
||||||
{(entry) => <MachineListItem name={entry} />}
|
{([name, info]) => <MachineListItem name={name} info={info} />}
|
||||||
</For>
|
</For>
|
||||||
</ul>
|
</ul>
|
||||||
</Match>
|
</Match>
|
||||||
|
|
|
@ -28,12 +28,13 @@ describe.concurrent("API types work properly", () => {
|
||||||
>();
|
>();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Machine list receives a list of names/id string", async () => {
|
it("Machine list receives a records of names and machine info.", async () => {
|
||||||
expectTypeOf(pyApi.list_machines.receive)
|
expectTypeOf(pyApi.list_machines.receive)
|
||||||
.parameter(0)
|
.parameter(0)
|
||||||
.parameter(0)
|
.parameter(0)
|
||||||
.toMatchTypeOf<
|
.toMatchTypeOf<
|
||||||
{ status: "success"; data: string[] } | { status: "error"; errors: any }
|
| { status: "success"; data: Record<string, object> }
|
||||||
|
| { status: "error"; errors: any }
|
||||||
>();
|
>();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user