Skip to content

Tags: cozystack/cozystack

Tags

v1.6.0-rc.2

Toggle v1.6.0-rc.2's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
fix(kubernetes): bump tenant worker Talos to v1.13.6 (#3269)

## What this PR does

Tenant worker VMs were pinned to Talos v1.13.0, which ships Linux
6.18.24. That kernel predates the fixes for two related KVM x86
shadow-paging use-after-free bugs in `arch/x86/kvm/mmu/mmu.c`:
CVE-2026-46113, fixed upstream in
`0cb2af2ea66ad8ff195c156ea690f11216285bdf` and released in 6.18.30, and
CVE-2026-53359, fixed in `81ccda30b4e83d8f5cc4fd50503c44e3a33abfeb` and
released in 6.18.38. A worker's own kernel runs KVM whenever a tenant
enables nested virtualization inside the VM, and either bug lets a
nested guest escape into the worker.

This bumps the worker pin to Talos v1.13.6, which ships Linux 6.18.38.
Stable kernel branches are cumulative, so v1.13.6 is the first v1.13
patch release carrying both fixes. The pinned v1.13.0 ships 6.18.24 and
carries neither; v1.13.5 ships 6.18.36 and carries only CVE-2026-46113.
Nested virtualization stays available to tenants; the kernel bump is the
fix, not a capability removal.

The image-factory schematic is unchanged and resolves for the new
version: both the `openstack-amd64.raw.xz` artifact and the
`installer/<schematicID>:v1.13.6` manifest are served by the public
factory. Talos v1.13 supports Kubernetes 1.31 through 1.36, so the
chart's Talos-to-Kubernetes support window is unaffected and no tenant
`spec.version` needs to move.

Applying this rolls each worker pool once. The new pin changes the
rendered worker spec, which rotates the content hash in the
`KubevirtMachineTemplate` and `talos-reconcile` Job names, and CAPI
replaces the worker VMs to deliver the new kernel. The pinned hashes in
the chart tests are recomputed to match.

A second commit fixes the support-matrix lookup itself. The matrix dict
was keyed on the full patch version, so every Talos patch bump dropped
out of the dict and silently disabled the render-time guard — exactly
the mismatch the guard exists to catch. The lookup now derives the minor
from `talos.version`. The supported-Kubernetes window is unchanged;
unknown minors are still skipped, leaving compatibility to whoever
overrode the pin.

### Screenshots

Not applicable — no UI changes.

### Release note

```release-note
fix(kubernetes): bump tenant worker Talos to v1.13.6, picking up the Linux 6.18.38 kernel fixes for CVE-2026-46113 and CVE-2026-53359 (KVM shadow-paging use-after-free, nested-guest escape into the worker VM). Nested virtualization remains available. Applying this upgrade rolls each tenant worker pool once, as the worker template is renamed to carry the new image.
```


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **New Features**
- Updated the default Talos worker release to v1.13.6 for Kubernetes
cluster provisioning.
- Improved compatibility checks to apply consistently across Talos patch
releases within the same minor version.

- **Bug Fixes**
- Corrected generated resource naming expectations when storage settings
or GPU configuration change.

- **Tests**
- Added coverage confirming Kubernetes clusters render successfully with
Talos v1.13.6.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

v1.6.0-rc.1

Toggle v1.6.0-rc.1's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
feat(release): immutable tags & rc→stable promotion (#2677) (#3017)

## What this PR does

Implements the immutable-tag + rc-promotion flow from #2677. A **stable
release becomes a renamed release-candidate**: the bytes shipped as
`vX.Y.Z` are bit-for-bit the bytes built and e2e-tested as
`vX.Y.Z-rc.N`. No tag is ever force-moved, and stable is never rebuilt —
it is *promoted* by retagging the rc's existing images.

Layered onto the build matrix from #2937/#2983 (this PR is **stacked on
`refactor/build-matrix-2937`** and must merge after it).

## The five force-retag sites, removed

| Site | Before | After |
|---|---|---|
| `tags.yaml` api/apps/v1alpha1 tag | `git tag -f` / `push -f` |
write-once (create-if-absent, fail if it would move) |
| `tags.yaml` release-X.Y.Z branch | `git branch -f` / `push -f` |
compare-before-force (no-op if unchanged; staging branch only) |
| `pull-requests-release.yaml` stable tag | `git tag -f` / `push -f` |
write-once at the PR merge commit (force impossible by construction) |
| `pull-requests-release.yaml` maintenance branch | `updateRef
force:true` | fast-forward-only |
| `auto-release.yaml` patch tags | delete-recreate (cron) | **workflow
deleted** — stable only via explicit promote |

## Version decoupling (the enabler)

The operator baked its version into the image at build time, so an rc
image self-reported the rc string — blocking retag-promotion. It now
reads `COZYSTACK_VERSION` from the environment (threaded via
`cozystackOperator.platformVersion` → Deployment env, stamped by `make
manifests`), falling back to the build-time value when unset. The same
image bits can report any release name. The only runtime reader is the
telemetry metric `cozy_cluster_info{cozystack_version=...}`.

## Promotion flow

`promote-rc.yaml` (`workflow_dispatch`, `rc_tag=vX.Y.Z-rc.N`):

1. Validate the rc release exists and the stable tag does not.
2. `hack/promote-retag.sh` reads the rc's digest-pinned image refs from
`packages/*/*/values.yaml` and `skopeo copy`s each — **by digest** — to
`:vX.Y.Z` and `:latest`, verifying with `skopeo inspect`.
3. Rewrite the cosmetic `-rc.N` substring in vendored tags to the stable
version (the `@sha256` wins regardless), restamp the version-stamped
assets (operator manifests, cozypkg, openapi; the heavy Talos assets are
copied verbatim from the rc draft), open a `release-X.Y.Z` PR.
4. Merging the PR reuses the existing release-PR e2e and
`pull-requests-release.yaml` finalize to cut the **write-once** stable
tag at the merge commit and publish the release. Squash is disallowed
(the tag needs a real merge commit).

`nightly.yaml` cuts write-once `*-nightly.<date>` tags (gated by
`NIGHTLY_ENABLED`); `retention.yaml` keeps the newest 14 per line
(dry-run by default).

## Validation

**Local end-to-end — the core claim is proven, not asserted.** The whole
design rests on "copy-by-digest to a new tag preserves the digest, so
stable == the e2e-tested rc, bit-for-bit." This was exercised against a
real registry (`ttl.sh`) with real `skopeo`:

- Pushed a multi-arch image under a `:v1.4.0-rc.2` tag, built a temp
tree exercising all three `values.yaml` digest shapes (single `image:`
string, split `repository`/`tag`/`digest` map, and the
`platformSourceRef` OCI artifact), then ran the actual
`hack/promote-retag.sh v1.4.0`.
- **Result: `:v1.4.0-rc.2`, `:v1.4.0`, and `:latest` all resolve to the
identical digest** (`sha256:fd8d9aa6…`), across all 17 platform
manifests. The script's own `skopeo inspect` post-check passed, and an
independent re-inspection confirmed it.

Local validation caught (and this PR fixes) two bugs that only surface
against a real registry — never in static lint:
1. `skopeo copy --multi-arch all --all` — mutually exclusive flags,
fatal error; every retag would have failed on CI. Now `--multi-arch
all`.
2. The same digest was retagged twice when an image appeared in two
value shapes; the ref set is now deduped on the canonical `repo@digest`.

**Other local checks:** `go test ./pkg/version` + `go build`/`vet`;
`helm template` renders `COZYSTACK_VERSION` in all 3 operator variants
(omitted when unset); `make manifests` stamps the version into the
install assets; `shellcheck` clean on `promote-retag.sh`; `actionlint`
clean and `act -l` resolves the job graph on all workflows; the rc-tag
parser and nightly version-math unit-tested (accept/reject +
minor-vs-patch bumps).

**Still CI-only (cannot be exercised offline):** the full workflow
runtime — github-script API calls, OCIR auth, the rc-release /
staging-branch preconditions, the nightly `base_ref` push mechanics, and
self-hosted runners. The *logic* inside the steps is unit-tested; the
*orchestration* is not. Treat it as unproven until the workflows run.

## Out of scope / required follow-up (needs repo admin — not doable from
a PR)

- Tag-protection rules: `v*` and `api/apps/v1alpha1/*` create-only by
the CI app, no delete/update; "limit branches/tags updated in a single
push" = 1.
- Enable `NIGHTLY_ENABLED` (and `RETENTION_APPLY` when ready) repo
variables.
- Registry-side pruning of `*-nightly.*` image tags (no OCIR delete
parity yet — tracked TODO in `retention.yaml`).

## Release note

```release-note
NONE
```


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added nightly publishing (mirror-by-digest, disk build, e2e
validation) and nightly retention pruning.
  * Added RC-to-stable promotion via digest retagging (no rebuild).
* Operator/installer and console now expose version/platform metadata,
including runtime override via `COZYSTACK_VERSION`.
* **Bug Fixes**
* Enforced write-once tag behavior and fast-forward-only maintenance
updates across release workflows.
* Made nightly mirroring/selection and retention pruning more selective
and safer.
* **Tests**
* Added Bats coverage for nightly mirroring and RC retagging, plus new
Helm/unit checks.
* **Documentation**
* Updated the release model to center RC promotion and tag immutability.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

v1.4.6

Toggle v1.4.6's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
[Backport release-1.4] fix(linstor): set controller resource requests…

… and relax liveness probe (#3216)

## What this PR does

Backport of #3043 to `release-1.4`.

Under node CPU contention the `linstor-controller` JVM cannot answer its
`GET /health` liveness probe within the piraeus-operator default timing
(`timeoutSeconds: 1`, `failureThreshold: 3`). The kubelet then
liveness-kills
the container (exit 137), the controller crash-loops, its Service loses
ready
endpoints, `linstor-csi` gets `EPERM`, and RWX-Filesystem `DataVolume`s
never
bind — breaking tenant Kubernetes / NFS provisioning.

On the `linstor-controller` container in `spec.controller.podTemplate`:
- adds `resources.requests` (cpu `250m`, memory `700Mi`) — requests
only, no
  limits: a CPU request guarantees CPU shares so the JVM keeps answering
  `/health` under contention, while omitting limits avoids throttling or
  OOM-killing the JVM;
- relaxes the liveness timing to `timeoutSeconds: 5`, `failureThreshold:
6`.

The change is confined to the `linstor` package (`cluster.yaml`,
`values.yaml`)
with a `helm unittest` suite (`tests/cluster_test.yaml`). The
`linstor-csi` tag
on `release-1.4` (`v1.10.6`) is preserved.

### Release note

```release-note
fix(linstor): guarantee controller CPU/memory requests and relax the liveness probe so the linstor-controller does not crash-loop under node CPU contention
```

api/apps/v1alpha1/v1.4.6

Toggle api/apps/v1alpha1/v1.4.6's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
[Backport release-1.4] fix(linstor): set controller resource requests…

… and relax liveness probe (#3216)

## What this PR does

Backport of #3043 to `release-1.4`.

Under node CPU contention the `linstor-controller` JVM cannot answer its
`GET /health` liveness probe within the piraeus-operator default timing
(`timeoutSeconds: 1`, `failureThreshold: 3`). The kubelet then
liveness-kills
the container (exit 137), the controller crash-loops, its Service loses
ready
endpoints, `linstor-csi` gets `EPERM`, and RWX-Filesystem `DataVolume`s
never
bind — breaking tenant Kubernetes / NFS provisioning.

On the `linstor-controller` container in `spec.controller.podTemplate`:
- adds `resources.requests` (cpu `250m`, memory `700Mi`) — requests
only, no
  limits: a CPU request guarantees CPU shares so the JVM keeps answering
  `/health` under contention, while omitting limits avoids throttling or
  OOM-killing the JVM;
- relaxes the liveness timing to `timeoutSeconds: 5`, `failureThreshold:
6`.

The change is confined to the `linstor` package (`cluster.yaml`,
`values.yaml`)
with a `helm unittest` suite (`tests/cluster_test.yaml`). The
`linstor-csi` tag
on `release-1.4` (`v1.10.6`) is preserved.

### Release note

```release-note
fix(linstor): guarantee controller CPU/memory requests and relax the liveness probe so the linstor-controller does not crash-loop under node CPU contention
```

v1.5.3

Toggle v1.5.3's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
[Backport release-1.5] fix(kubevirt-instancetypes): restore persisten…

…t EFI/TPM state (#3212)

# Description
Backport of #3154 to `release-1.5`.

api/apps/v1alpha1/v1.5.3

Toggle api/apps/v1alpha1/v1.5.3's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
[Backport release-1.5] fix(kubevirt-instancetypes): restore persisten…

…t EFI/TPM state (#3212)

# Description
Backport of #3154 to `release-1.5`.

v1.5.2

Toggle v1.5.2's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore(release): cut v1.5.2 (#3161)

This PR prepares the release `v1.5.2`.

v1.4.5

Toggle v1.4.5's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
chore(release): cut v1.4.5 (#3082)

This PR prepares the release `v1.4.5`.

api/apps/v1alpha1/v1.5.2

Toggle api/apps/v1alpha1/v1.5.2's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
[Backport release-1.5] fix(kamaji): backport datastore unused-deletio…

…n deadlock fix (clastix/kamaji#1122) (#3187)

# Description
Backport of #3146 to `release-1.5`.

api/apps/v1alpha1/v1.4.5

Toggle api/apps/v1alpha1/v1.4.5's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
[Backport release-1.4] fix(kamaji): backport datastore unused-deletio…

…n deadlock fix (clastix/kamaji#1122) (#3188)

# Description
Backport of #3146 to `release-1.4`.