Refactor VM lifecycle management and enhance validation
- Introduced a new method `installed_kernel` in `ImageStore` to handle kernel verification and checksum validation. - Updated `Installer` to include additional packages: `nftables` and `conntrack`. - Refined `LifecycleService` to improve error handling and state management during VM creation, starting, stopping, and deletion. - Enhanced port management with new methods for setting and syncing ports, including validation for port rules. - Improved error handling in `StateStore` to raise specific `NotFoundError` and `ConflictError` exceptions. - Updated network management to ensure proper TAP device handling and firewall integration. - Enhanced API responses in `vms.py` to include policy status for better client-side handling. - Added validation for VM names and ports in `validation.py` to enforce stricter rules and prevent conflicts.
This commit is contained in:
+18
-9
@@ -5,6 +5,7 @@ from __future__ import annotations
|
||||
import fcntl
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import tempfile
|
||||
from collections.abc import Iterator
|
||||
from contextlib import contextmanager
|
||||
@@ -12,7 +13,7 @@ from pathlib import Path
|
||||
|
||||
from .config import Settings
|
||||
from .domain import State, VmRecord
|
||||
from .errors import StateError, UvmError
|
||||
from .errors import ConflictError, NotFoundError, StateError
|
||||
from .system import ensure_data_directories
|
||||
|
||||
|
||||
@@ -63,16 +64,24 @@ class StateStore:
|
||||
try:
|
||||
return state.vms[vm_id]
|
||||
except KeyError as error:
|
||||
raise UvmError(f"VM not found: {vm_id}") from error
|
||||
raise NotFoundError(f"VM not found: {vm_id}") from error
|
||||
|
||||
def find_by_id_or_ip(self, identifier: str) -> VmRecord:
|
||||
state = self.load()
|
||||
if identifier in state.vms:
|
||||
return state.vms[identifier]
|
||||
for vm in state.vms.values():
|
||||
if vm.guest_ip == identifier:
|
||||
return vm
|
||||
raise UvmError(f"VM not found: {identifier}")
|
||||
return self.resolve(self.load(), identifier)
|
||||
|
||||
@staticmethod
|
||||
def resolve(state: State, identifier: str) -> VmRecord:
|
||||
if re.fullmatch(r"vm-[0-9a-f]{32}", identifier):
|
||||
try:
|
||||
return state.vms[identifier]
|
||||
except KeyError as error:
|
||||
raise NotFoundError(f"VM not found: {identifier}") from error
|
||||
matches = [vm for vm in state.vms.values() if identifier in {vm.id, vm.name, vm.guest_ip}]
|
||||
if len(matches) > 1:
|
||||
raise ConflictError(f"ambiguous VM identifier: {identifier}; use an exact VM ID")
|
||||
if not matches:
|
||||
raise NotFoundError(f"VM not found: {identifier}")
|
||||
return matches[0]
|
||||
|
||||
@contextmanager
|
||||
def _locked(self) -> Iterator[None]:
|
||||
|
||||
Reference in New Issue
Block a user