Skip to content

Releases: colonelpanik/litevirt

v1.7.0

Choose a tag to compare

@github-actions github-actions released this 13 Sep 07:48
fd8572f

Two opt-in features and a forward-only schema bump. The binary arrives behaviour-neutral: both features are default-off, so an upgrade changes nothing until the flags are set fleet-wide.

Schema

v50 → v51, forward-only. Upgrade every host in one lv host upgrade invocation — it pre-stages the schema cluster-wide before rolling any node. A binary downgrade onto a migrated database will refuse to start, by design.

NetBox as external IPAM (opt-in: netbox.enabled)

A litevirt network can be bound to a NetBox prefix (lv network create --netbox-prefix-id). VM NIC addresses are then claimed from and released to NetBox under a per-incarnation identity, instead of from the builtin allocator. An orphan sweep reclaims addresses nothing references, gated on whole-cluster proof that no host still claims them.

An inventory mirror is a second, narrower opt-in (netbox.mirror_inventory): with it off, NetBox holds addresses carrying this cluster's identity and nothing else.

Both are gated on capability latches (netbox_ipam_v1, netbox_mirror_v1) advertised only while the corresponding flag is on, so a latch requires config uniformity rather than merely a uniform build.

lv cutover as one guarded transition (opt-in: enforcement.vm_replace)

Giving a replacement VM the name a replaced VM still holds used to fail — destructively — whenever the replaced VM actually existed: its tombstone still occupies the primary key, and the rename ran after the original's disks and firmware were already gone.

It is now a single guarded transition that a receiver applies whole or not at all, carrying the replacement's incarnation and authority above both inputs. The destruction that has to follow it is driven from a journaled, immutable manifest whose authorizing step is committed in the same batch as the transition, so a crash anywhere leaves the operation resumable rather than half-applied. Addresses move with the transition and the replaced VM's own are released afterwards, ownership-checked on both the local row and the external object.

A running replacement is briefly interrupted — libvirt cannot rename a live domain — and the CLI says so before it starts.

Requires enforcement.operation_protocol alongside enforcement.vm_replace; lv cutover refuses until both have latched, before stopping a domain or writing to either VM.

Upgrading

lv host upgrade --binary <path to v1.7.0> -y

Run it with every host. Features stay off until you set the flags on every node and the latches form; see docs/configuration.md and docs/diagnostics.md.

v1.6.2

Choose a tag to compare

@github-actions github-actions released this 05 Sep 14:45

What's Changed

  • ci: make the release step idempotent so a pre-existing tag does not fail it by @colonelpanik in #147
  • fix(lxc): parse cgroup2-native limit forms, not just our own emission by @livingstaccato in #144
  • Fix three verified doc-vs-code mismatches in a single docs-only chang... by @colonelpanik in #153
  • Extract the repeated dnsmasq pidfile path literals in internal/networ... by @colonelpanik in #148
  • Replace the duplicated withinDir path-containment helpers in internal... by @colonelpanik in #149
  • Fix internal/corrosion/vms.go's scanVMRow (used by ListVMs/ListVMsPag... by @colonelpanik in #150
  • Implement Fake.FireEvent(domainName string, event libvirt.DomainEvent... by @colonelpanik in #151
  • Export a NotFound-classifying helper from internal/libvirt (generaliz... by @colonelpanik in #152
  • Replace the seven duplicated 8-byte-hex random ID generators (interna... by @colonelpanik in #154
  • fix(health): a pre-epoch newborn VM is not an owner-epoch violation by @livingstaccato in #145
  • fix(deps): bump modernc.org/sqlite to v1.58.0 to stop a WAL checkpoint stall by @colonelpanik in #159

Full Changelog: v1.6.1...v1.6.2

v1.6.1 — host certificate rotation no longer locks a cluster out of itself

Choose a tag to compare

@colonelpanik colonelpanik released this 08 Aug 06:55
42f6641

Schema v50, unchanged from v1.6.0. No migration.

Fixes

  • A reissued host certificate left the serial recorded in its host row
    stale, and peer trust binds a live row to that serial. Nothing wrote the
    column on rotation, so every daemon refused every peer ("replication RPC
    requires peer mTLS") and replication stopped cluster-wide, with the
    split-brain detector blind for the same reason while workloads kept
    running. A node now re-records its own serial at startup from the
    certificate installed on its own disk, so a rotation converges by
    ordinary replication.
  • An unreadable certificate never overwrites a good recorded serial: a
    local file-permission problem must not become a cluster-wide trust
    downgrade.

Added

  • auth.trust_rotated_peer_certs (default false) — the recovery switch for
    a cluster ALREADY locked out by stale recorded serials, where the
    correction cannot replicate because replication is what is refused. Set
    it on every node, let the re-recorded serials replicate, then set it
    back to false. It relaxes the serial comparison only: a removed host
    stays removed, and a distributable client certificate still cannot act
    as a peer. Revocation is unaffected — the CRL is verified at the TLS
    handshake.

Upgrading

  • Schema-neutral, so this rolls like any ordinary binary upgrade. Running
    domains survive the daemon re-exec. Clusters whose recorded serials are
    already stale need the recovery switch on for one roll, then off.

v1.6.0 — capacity admission, reservation-safe integration, unified cluster health

Choose a tag to compare

@colonelpanik colonelpanik released this 07 Aug 18:49
b1cedae

Schema v42 → v50. Forward-only: there is no downgrade path once a node has
migrated.

Capacity and quota

  • Host capacity, project quota and explicit overcommit are now decided by a
    serialized reserve-then-verify admission carrying a commit fence, rather than
    read-only checks that could not see a concurrent request's in-flight claim.
  • Host CPU/memory overcommit ratios and explicit reserves; container memory
    counts toward host capacity; storage-pool free space is admitted.
  • Explicit overcommit is gated behind its own authorization verb.
  • Project quota covers all four bounded dimensions — vCPU, memory, disk and
    NICs — on every path that lands a workload: create, clone, restore and
    import, for VMs and containers alike.
  • One bytes-to-GiB rule for disk everywhere it is measured, so a charge made at
    admission is a number the accounting can observe as paid.

Cluster health

  • The fragmented health APIs are replaced by one durable model.

Platform

  • OTLP logging and distributed tracing.
  • Darwin client builds and Homebrew packaging.
  • Explicit, documented multi-homed host advertisement.

Correctness

  • A host-less container operation whose name matches containers on more than
    one host is refused, naming the candidates, instead of acting on whichever
    matched first.

Upgrading

  • Run the host upgrade with ALL hosts named, so the schema pre-stages
    cluster-wide before any node rolls. Upgrading a single node against older
    peers strands the majority on a schema it cannot accept.
  • Running domains survive the daemon re-exec.

v1.5.2

Choose a tag to compare

@github-actions github-actions released this 24 Jul 10:45
237d4e8

What's Changed

  • feat(ui): set a static IP + pick a network when creating a VM by @colonelpanik in #124

Full Changelog: v1.5.1...v1.5.2

v1.5.1

Choose a tag to compare

@github-actions github-actions released this 23 Jul 12:16
725a0c1

What's Changed

  • feat(ui): VM hardware tab UX rework — modal add flows, scan-populated PCI picker, disk resize by @colonelpanik in #123

Full Changelog: v1.5.0...v1.5.1

v1.5.0

Choose a tag to compare

@github-actions github-actions released this 22 Jul 19:46
976ded7

What's Changed

Full Changelog: v1.4.3...v1.5.0

v1.4.3

Choose a tag to compare

@github-actions github-actions released this 19 Jul 17:36
2cc750f

What's Changed

  • fix(ui): attach htmx event listeners to document, not document.body (bulk-select auto-deselect) by @colonelpanik in #121

Full Changelog: v1.4.2...v1.4.3

v1.4.2

Choose a tag to compare

@github-actions github-actions released this 19 Jul 17:16
2fb7d6e

What's Changed

  • fix(corrosion): order-invariant equality short-circuit in resolveTie (tie-tracker false positives) by @colonelpanik in #120

Full Changelog: v1.4.1...v1.4.2

v1.4.1

Choose a tag to compare

@github-actions github-actions released this 19 Jul 16:08
e2d0bf6

What's Changed

  • fix(corrosion): apply replicated INSERTs to tables without an updated_at column by @colonelpanik in #119

Full Changelog: v1.4.0...v1.4.1