• v0.5.5 da62538e36

    brian released this 2026-09-21 12:19:48 +00:00 | 24 commits to main since this release

    Overview

    Storage management across the board — a new Storage Pools page (pool inventory, available
    disks, pool creation) plus custom volume create/attach from both the Storage Volumes page and
    the instance menu — a round of static-IP fixes that simplified instance networking, and reliable
    System deletion with a new type-to-confirm safety gate. This release includes everything
    previously shipped piecemeal as the 0.5.4-beta and 0.5.5-beta images since v0.5.2.

    New Features

    Storage Pools Page

    • New top-level Storage Pools page: pick a system to see its configured pools (driver,
      usage bars) alongside the physical disks that are free for new pools (Available Disks).
    • New: POST /api/systems/{id}/storage-pools — admins can create a storage pool from an
      available source (403 for non-admins). Backed by GET /{id}/storage-pools (configured) and
      GET /{id}/storage-pools/available (unconfigured disks from host resources).

    Create Custom Storage Volumes

    • New: POST /api/systems/{id}/storage-pools/{pool}/volumes creates a filesystem custom volume
      (name + size, e.g. 10GiB). Gated to admin/tenant_admin, validates the name and size format, and
      checks pool free space before creating (400 on insufficient capacity, 502 on Incus errors).
    • UI: A Create Volume button on the Storage Volumes page (admin/tenant_admin) opens a modal
      to pick system, pool, name, and size.

    Attach Existing / New Volumes to Instances

    • New: POST /api/systems/{id}/instances/{name}/storage/attach attaches an existing custom
      volume as a disk device on a container or VM (admin, tenant admin, or instance owner).
    • UI: The instance Attach Storage modal now has modes: Storage Template (as before),
      Existing Volume (pool → volume → mount point), and New Volume for admins (creates the
      volume then attaches it in one action). With no templates available the modal opens in
      Existing Volume mode.

    Bug Fixes

    Static IP during instance creation failed with "Unsupported device type"

    • Fixed: Creating a container with a static IP (modal Network Configuration) against a profile
      whose NIC uses nictype: bridged/parent: (or network:) failed with:
      Invalid devices: Device validation failed for "eth0": Failed loading device "eth0": Unsupported device type.
    • Root cause: The static-IP NIC override submitted to Incus only carried type, name, and
      the IP keys. Incus validates the submitted device before applying profile overrides, so a NIC
      without a parent/network reference has no determinable device type and is rejected.
    • Fix: The override now inherits the profile NIC's base keys (nictype/parent or network)
      before the IP keys are applied.
    • Fixed (follow-up): Containers with a static IP then failed to start with
      Failed to start device "eth0": "ipv4.gateway" is only supported on OCI containers. Incus only
      accepts ipv4.gateway on a NIC for OCI app containers — system containers/VMs must get the
      gateway from the managed network's DHCP or configure it inside the guest. The API now never
      submits ipv4.gateway (the deprecated ipv4_gateway field is accepted but ignored).
    • Removed: The Network Configuration section (static IP / gateway inputs) is gone from the
      Create Instance modal. Containers now simply boot with DHCP from their network (managed = Incus
      DHCP, unmanaged bridge = LAN router DHCP); pin addresses with a router DHCP reservation or
      guest-side netplan. The network_config API field remains for managed-network use.

    "Failed to delete system" when removing a registered host

    • Fixed: Deleting a system from the Systems page failed with a generic error whenever the
      system had any activity history. delete_system only cleaned up four tables, while six others
      hold non-cascade foreign keys to it (audit_logs, background_tasks, storage_templates,
      local_images, federated_instances, console_tokens), so the database rejected the delete.
    • Fix: The endpoint now runs in a single transaction: audit log and background task history
      are preserved (detached from the deleted system; the activity log keeps its system name),
      and all system-scoped artifacts (templates, attachments, local image records, federated
      instances, console tokens) are removed. This makes it possible to cleanly delete a system whose
      Incus host no longer exists.
    • UI: The delete error toast now shows the server's error detail instead of only a generic
      message.

    System deletion now requires confirmation by name

    • Safety: Deleting a system now requires typing the system name to confirm (same pattern as
      instance Destroy) — the Delete button stays disabled until the name matches exactly, preventing
      accidental removal of the wrong host.

    Technical Changes

    • backend/app/api/systems.py: added create_storage_pool, create_storage_pool_volume and
      attach_existing_volume endpoints; delete_system now performs transactional cleanup of all FK
      dependents (history preserved); create_system_instance static-IP handling now merges profile
      NIC base keys and never submits ipv4.gateway.
    • backend/app/services/incus.py: added create_storage_pool() connector method.
    • backend/app/utils/human.py: added parse_size_to_bytes() size-string parser.
    • frontend/src/views/StoragePoolsView.vue: new pools + available-disks page with admin pool
      creation.
    • frontend/src/components/CreateStorageVolumeModal.vue: new shared create-volume modal.
    • frontend/src/views/StorageVolumesView.vue: Create Volume button (role-gated).
    • frontend/src/views/InstancesView.vue, SystemInstancesView.vue: multi-mode Attach Storage modal.
    • frontend/src/views/SystemsView.vue: type-to-confirm delete modal (replaces the plain confirm).
    • frontend/src/components/CreateInstanceModal.vue: Network Configuration section removed
      (~200 lines of NIC/IP/gateway inputs, validation, and conflict checks).

    Breaking Changes

    • None at the database or authentication level. The instance-create UI no longer offers static
      IP entry (the network_config API field and check-ip endpoint remain, API-only); the
      deprecated ipv4_gateway field in network_config is now accepted but ignored.

    Upgrade Notes

    • No migration required. Pull the new Docker image (bmcgonag/incus-commander:0.5.5 or
      latest) and restart the container.
    • Hard-refresh the browser (Ctrl+Shift+R) after upgrading to pick up the new frontend build.
    Downloads