API: migrate machines delete and list to inventory
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import json
|
||||
import re
|
||||
from dataclasses import asdict, dataclass, is_dataclass
|
||||
from pathlib import Path
|
||||
@@ -136,3 +137,26 @@ class Inventory:
|
||||
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 json
|
||||
import logging
|
||||
import re
|
||||
from pathlib import Path
|
||||
@@ -7,7 +6,7 @@ from pathlib import Path
|
||||
from clan_cli.api import API
|
||||
from clan_cli.errors import ClanError
|
||||
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__)
|
||||
|
||||
@@ -18,26 +17,12 @@ def create_machine(flake_dir: str | Path, machine: Machine) -> None:
|
||||
if not re.match(hostname_regex, machine.name):
|
||||
raise ClanError("Machine name must be a valid hostname")
|
||||
|
||||
inventory = Inventory(machines={}, services={})
|
||||
|
||||
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 = Inventory.load_file(flake_dir)
|
||||
inventory.machines.update({machine.name: machine})
|
||||
|
||||
with open(inventory_file, "w") as g:
|
||||
d = dataclass_to_dict(inventory)
|
||||
json.dump(d, g, indent=2)
|
||||
inventory.persist(flake_dir)
|
||||
|
||||
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:
|
||||
|
||||
@@ -1,21 +1,36 @@
|
||||
import argparse
|
||||
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 ..dirs import specific_machine_dir
|
||||
from ..errors import ClanError
|
||||
|
||||
|
||||
def delete_command(args: argparse.Namespace) -> None:
|
||||
folder = specific_machine_dir(args.flake, args.host)
|
||||
@API.register
|
||||
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():
|
||||
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:
|
||||
machines_parser = parser.add_argument("host", type=str)
|
||||
machines_parser = parser.add_argument("name", type=str)
|
||||
add_dynamic_completer(machines_parser, complete_machines)
|
||||
|
||||
parser.set_defaults(func=delete_command)
|
||||
|
||||
@@ -4,22 +4,19 @@ import logging
|
||||
from pathlib import Path
|
||||
|
||||
from clan_cli.api import API
|
||||
from clan_cli.inventory import Machine
|
||||
|
||||
from ..cmd import run_no_stdout
|
||||
from ..nix import nix_config, nix_eval
|
||||
from ..nix import nix_eval
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@API.register
|
||||
def list_machines(flake_url: str | Path, debug: bool = False) -> list[str]:
|
||||
config = nix_config()
|
||||
system = config["system"]
|
||||
def list_machines(flake_url: str | Path, debug: bool = False) -> dict[str, Machine]:
|
||||
cmd = nix_eval(
|
||||
[
|
||||
f"{flake_url}#clanInternals.machines.{system}",
|
||||
"--apply",
|
||||
"builtins.attrNames",
|
||||
f"{flake_url}#clanInternals.inventory.machines",
|
||||
"--json",
|
||||
]
|
||||
)
|
||||
@@ -27,12 +24,13 @@ def list_machines(flake_url: str | Path, debug: bool = False) -> list[str]:
|
||||
proc = run_no_stdout(cmd)
|
||||
|
||||
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:
|
||||
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)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user