Skip to content

fix(kubevirt-instancetypes): drop persistent strip that produced null TPM - #2612

Closed
myasnikovdaniil wants to merge 2 commits into
mainfrom
daniil/fix-kubevirt-instancetypes-tpm
Closed

fix(kubevirt-instancetypes): drop persistent strip that produced null TPM#2612
myasnikovdaniil wants to merge 2 commits into
mainfrom
daniil/fix-kubevirt-instancetypes-tpm

Conversation

@myasnikovdaniil

@myasnikovdaniil myasnikovdaniil commented May 12, 2026

Copy link
Copy Markdown
Contributor

What this PR does

KubeVirt operator was bumped from v1.6.3 to v1.8.2 in 6af0bf71. The v1.8 operator ships a stricter VirtualMachineClusterPreference CRD schema that no longer tolerates null values for object-typed fields. Our packages/system/kubevirt-instancetypes/Makefile had sed -i '/persistent: true/d' in its update target, which stripped the only field from upstream's preferredTPM: { persistent: true } and left the parent key dangling as null. That produced YAML the new CRD rejects, breaking Helm reconciliation of cozy-kubevirt/kubevirt-instancetypes:

VirtualMachineClusterPreference.instancetype.kubevirt.io "windows.11" is invalid:
spec.devices.preferredTPM: Invalid value: "null": spec.devices.preferredTPM in body must be of type object: "null"

Changes:

  • Remove the broken sed from the Makefile.
  • Regenerate templates/preferences.yaml and templates/instancetypes.yaml from upstream kubevirt/common-instancetypes HEAD.
  • Regenerate vm-instance values.schema.json and the embedded schema in vm-instance-rd/cozyrds/vm-instance.yaml to match the new preference list.

Runtime implication: preferredTPM: { persistent: true } now reaches the cluster. When vmStateStorageClass is unset on the KubeVirt CR (the default in cozystack), KubeVirt falls back to the cluster's default StorageClass with RWO access mode for TPM state, per pkg/storage/backend-storage/backend-storage.go in v1.8.2. Cozystack ships replicated as the default StorageClass, so this works out of the box.

Drive-by content changes from the upstream refresh

  • Removed (upstream EOL): centos.7, centos.7.desktop, centos.stream8, centos.stream8.desktop, centos.stream8.dpdk preferences. See "Upgrade impact" below.
  • Added preferences: debian, oraclelinux, legacy, linux, linux.efi, linux.virtiotransitional, fedora.s390x, rhel.9.s390x, rhel.10.s390x, windows.xp, windows.7, windows.7.virtio, windows.2k3, windows.2k8, windows.2k8.virtio, windows.2k12, windows.2k12.virtio.
  • Added instancetypes: new cx1.*1gi (1 GiB-per-vCPU) variants, new d1 series.

Upgrade impact: VMs referencing removed preferences

The five removed CentOS-7 / CentOS-Stream-8 preferences are deleted on upgrade. Existing VMs that reference them fall into three buckets:

  • Running VMs — unaffected. KubeVirt resolves the preference once at VMI creation; the DomainSpec is already materialized. No live or live-migration impact. Becomes a latent problem on next stop/start or unscheduled node failure.

  • Stopped VMs (or VMs restarted after upgrade) — fail to start. The VM controller emits:

    Failed to apply VirtualMachinePreference:
    virtualmachineclusterpreferences.instancetype.kubevirt.io "centos.stream8" not found
    
  • Helm-managed VMs (vm-instance / virtual-machine charts)HelmRelease enters a failed reconcile on next chart upgrade because the regenerated values.schema.json enum rejects the old name. The existing VirtualMachine resource is not modified by the failed reconcile.

Discovery — find affected resources before upgrade

# Direct VirtualMachine resources cluster-wide
kubectl get vm -A -o jsonpath='{range .items[*]}{.metadata.namespace}/{.metadata.name}: {.spec.preference.name}{"\n"}{end}' \
  | grep -E ': (centos\.7(\.desktop)?|centos\.stream8(\.desktop|\.dpdk)?)$'

# HelmReleases for vm-instance / virtual-machine charts
kubectl get hr -A -o json | jq -r '
  .items[]
  | select(.spec.chart.spec.chart == "vm-instance" or .spec.chart.spec.chart == "virtual-machine")
  | select(.spec.values.instanceProfile as $p | ["centos.7","centos.7.desktop","centos.stream8","centos.stream8.desktop","centos.stream8.dpdk"] | index($p))
  | "\(.metadata.namespace)/\(.metadata.name): \(.spec.values.instanceProfile)"'

Self-serve remediation for tenants

Tenants can fix their own VMs in their tenant namespace without platform-team involvement:

  • Dashboard: open the VM's edit form, change OS profile to a current value (e.g., centos.stream9), save. The form is driven by the regenerated values.schema.json, so only valid choices are offered.
  • kubectl (tenant-scoped kubeconfig):
    • Helm-managed VMs: kubectl -n <tenant-ns> edit hr <release> and update spec.values.instanceProfile.
    • Directly-created VMs: kubectl -n <tenant-ns> patch vm <name> --type=json -p='[{"op":"replace","path":"/spec/preference/name","value":"centos.stream9"}]'.

Suggested replacements (the hardware defaults are nearly identical; guest OS remains whatever it is):

Old Replacement
centos.7, centos.stream8 centos.stream9
centos.7.desktop, centos.stream8.desktop centos.stream9.desktop
centos.stream8.dpdk centos.stream9.dpdk

Release note

fix(kubevirt-instancetypes): refresh templates from upstream common-instancetypes and drop the post-processing step that left `preferredTPM` with a null value. Fixes Helm upgrade failures on KubeVirt v1.8+ where the stricter CRD rejects `windows.*` preferences.

Removes EOL preferences `centos.7`, `centos.7.desktop`, `centos.stream8`, `centos.stream8.desktop`, `centos.stream8.dpdk`. Running VMs are unaffected; stopped/restarted VMs and HelmReleases referencing these names fail until updated to a supported preference (e.g. `centos.stream9*`). Discovery commands and self-serve remediation are in the PR description. New Linux, Windows, s390x preferences and additional instancetype variants are added.

… TPM

`make update` stripped `persistent: true` from upstream's
`preferredTPM: { persistent: true }`, leaving the parent key with a null value.
KubeVirt v1.6's CRD tolerated it; v1.8 (the operator version we bumped to in
6af0bf7) enforces structural schema and rejects null:

  VirtualMachineClusterPreference "windows.11" is invalid:
  spec.devices.preferredTPM: Invalid value: "null": spec.devices.preferredTPM
  in body must be of type object: "null"

Stop stripping the line and regenerate the templates from upstream
common-instancetypes. Persistent TPM state falls back to the cluster default
StorageClass with RWO access mode when `vmStateStorageClass` is unset on the
KubeVirt CR, per pkg/storage/backend-storage/backend-storage.go.

Drive-by from the regen:
- Removed (upstream EOL): centos.7*, centos.stream8*
- Added: debian, oraclelinux, legacy, linux*, fedora.s390x, rhel.{9,10}.s390x,
  windows.{xp,7,7.virtio,2k3,2k8,2k8.virtio,2k12,2k12.virtio}, plus new
  cx1.*1gi and d1 instancetype variants.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
@github-actions github-actions Bot added area/uncategorized PR auto-labeler could not map title scope to a known area/*; please review kind/bug Categorizes issue or PR as related to a bug size/XXL This PR changes 1000+ lines, ignoring generated files labels May 12, 2026
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request resolves a critical issue introduced by the KubeVirt operator upgrade to v1.8.2, where the stricter CRD schema rejected null values in the 'preferredTPM' field. By removing an outdated post-processing step in the Makefile and refreshing the upstream templates, the operator now correctly handles TPM configurations. Furthermore, this update aligns the project with the latest upstream instancetype definitions, adding support for modern OS versions and new hardware variants while cleaning up deprecated configurations.

Highlights

  • Fix for KubeVirt v1.8+ compatibility: Removed the sed command from the Makefile that was incorrectly stripping 'persistent: true' from 'preferredTPM', which caused Helm reconciliation failures due to a stricter CRD schema.
  • Upstream Refresh: Regenerated templates/preferences.yaml and templates/instancetypes.yaml from the latest upstream kubevirt/common-instancetypes repository.
  • Preference and Instancetype Updates: Removed EOL preferences (e.g., centos.7), added new Linux, Windows, and s390x preferences, and introduced new cx1 instancetype variants.
New Features

🧠 You can now enable Memory (public preview) to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment Gemini (@gemini-code-assist) Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on Gemini (@gemini-code-assist) comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@dosubot dosubot Bot added area/virtualization Issues or PRs related to virtualization (kubevirt, cdi, vmi, vm-import) backport Should change be backported on previous release labels May 12, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates KubeVirt instance types and preferences, introducing the D series (Dedicated vCPU), expanding M and CX series variants, and adding numerous OS preferences for various Linux distributions and Windows versions. Key changes include specific hugepage configurations, the addition of maxSockets to prevent CPU hotplugging issues, and persistence settings for TPM/EFI on modern Windows types. Feedback indicates that structural modifications to the generated template files (instancetypes.yaml and preferences.yaml) must be moved to patch files in the patches/ directory and applied via the Makefile to comply with Rule 21 of the Repository Style Guide and ensure changes are preserved during future regenerations.

Comment on lines 14 to +25
the IO threading from cores dedicated to the workload.
In addition, in this series, the NUMA topology of the used
cores is provided to the VM.

The amount of spec.cpu.maxSockets is set to the same as
guest cpus. This avoids KubeVirt's default behavior of
providing extra CPUs for hotplugging, which can exceed the
amount of available CPUs on a node and cause the VM to fail.

Requirements for CX series instance types:
- CPU manager has to be enabled.
- Huge pages have to be available on the nodes.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Structural changes to generated files should be applied via a patch file in packages/system/kubevirt-instancetypes/patches/ and applied by the Makefile to ensure they are not lost during regeneration. Please refer to the Repository Style Guide, Rule 21.

References
  1. Rule 21: For structural changes: suggest a patch file in packages/<name>/patches/ applied by the Makefile. (link)
  2. Rule 21: For structural changes: suggest a patch file in packages/<name>/patches/ applied by the Makefile.

Comment on lines 4 to 12
annotations:
iconClass: icon-alpine
openshift.io/display-name: Alpine
openshift.io/documentation-url: https://github.com/kubevirt/common-instancetypes
openshift.io/documentation-url: |
"https://github.com/kubevirt/common-instancetypes"
openshift.io/provider-display-name: KubeVirt
openshift.io/support-url: https://github.com/kubevirt/common-instancetypes/issues
openshift.io/support-url: |
"https://github.com/kubevirt/common-instancetypes/issues"
tags: hidden,kubevirt,alpine

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Structural changes to generated files should be applied via a patch file in packages/system/kubevirt-instancetypes/patches/ and applied by the Makefile to ensure they are not lost during regeneration. Please refer to the Repository Style Guide, Rule 21.

References
  1. Rule 21: For structural changes: suggest a patch file in packages/<name>/patches/ applied by the Makefile. (link)
  2. Rule 21: For structural changes: suggest a patch file in packages/<name>/patches/ applied by the Makefile.

… refresh

`make generate` in packages/apps/vm-instance/ rebuilds the instanceProfile
enum from packages/system/kubevirt-instancetypes/templates/preferences.yaml.
The pre-commit job picked up the drift after the upstream refresh in the
previous commit. No source changes — only regenerated outputs.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
@coderabbitai

coderabbitai Bot commented May 12, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

This PR standardizes KubeVirt VM instance profiles and configuration templates. Instance profile enum values are expanded to include new Linux distributions and Windows variants across multiple schema files. The build pipeline is simplified by removing persistent field cleanup from the Makefile. InstanceType configurations add explicit hugepage sizing and CPU socket constraints, while preference templates receive standardized metadata annotations, resource requirement labels, and device settings across all OS variants.

Changes

VM Instance Profile and KubeVirt Configuration Standardization

Layer / File(s) Summary
VM instance profile enum updates
packages/apps/vm-instance/values.schema.json, packages/system/vm-instance-rd/cozyrds/vm-instance.yaml
instanceProfile enum values are updated across multiple schemas to remove CentOS 7/Stream 8 entries and add new Linux variants (debian, s390x architecture options) and Windows versions (2k3, 2k8, 2k12, 7, XP).
Build pipeline update
packages/system/kubevirt-instancetypes/Makefile
The update target removes the sed command that was stripping persistent: true entries from preferences.yaml, allowing the configuration to pass through unchanged.
CX and M series instancetype updates
packages/system/kubevirt-instancetypes/templates/instancetypes.yaml
CX instances gain spec.cpu.maxSockets constraints and hugepage configuration with explicit 1Gi/2Mi sizing across all sizes and new 1gi-suffixed variants; M series adds multiple 1gi variants with corresponding hugepage pageSize updates.
N and RT series hugepage standardization
packages/system/kubevirt-instancetypes/templates/instancetypes.yaml
N and RT series update instancetype.kubevirt.io/hugepages labels from boolean-style values to explicit 1Gi page size strings for consistency.
Preference template standardization
packages/system/kubevirt-instancetypes/templates/preferences.yaml
All OS preference templates (Alpine, CentOS Stream, Debian, Fedora, OpenSUSE, Oracle Linux, RHEL, SLES, Ubuntu, Windows) are updated with standardized block-scalar OpenShift URL annotations, added required-cpu/required-memory labels, new preferredRng: {} device settings, and architecture-specific preference fields where applicable.

🎯 4 (Complex) | ⏱️ ~60 minutes

A rabbit hops through the KubeVirt garden, 🐰
Planting hugepages here, socket limits there,
Tending preferences from Alpine to Windows fair,
Each schema and template now standardized with care—
The infrastructure blooms with consistent flair!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title directly and specifically describes the main fix: removing a sed step that stripped 'persistent: true' from TPM configuration, causing null values. This matches the core purpose of the PR.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch daniil/fix-kubevirt-instancetypes-tpm

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/system/kubevirt-instancetypes/templates/preferences.yaml`:
- Around line 7-11: The YAML annotations openshift.io/documentation-url and
openshift.io/support-url are using literal block scalars (|) with quoted
strings, which causes the stored values to include the quotes and newline;
update every preference definition so these two annotation keys are plain scalar
strings (remove the | block indicator and surrounding quotes) so the values are
stored as normal URL strings without embedded quotes or trailing newlines (apply
this change for all occurrences of openshift.io/documentation-url and
openshift.io/support-url in the file).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 8e6f56d1-7d91-4d3a-9564-7410aeebd9e3

📥 Commits

Reviewing files that changed from the base of the PR and between 86f5267 and 0b581f0.

📒 Files selected for processing (5)
  • packages/apps/vm-instance/values.schema.json
  • packages/system/kubevirt-instancetypes/Makefile
  • packages/system/kubevirt-instancetypes/templates/instancetypes.yaml
  • packages/system/kubevirt-instancetypes/templates/preferences.yaml
  • packages/system/vm-instance-rd/cozyrds/vm-instance.yaml
💤 Files with no reviewable changes (1)
  • packages/system/kubevirt-instancetypes/Makefile

Comment on lines +7 to +11
openshift.io/documentation-url: |
"https://github.com/kubevirt/common-instancetypes"
openshift.io/provider-display-name: KubeVirt
openshift.io/support-url: https://github.com/kubevirt/common-instancetypes/issues
openshift.io/support-url: |
"https://github.com/kubevirt/common-instancetypes/issues"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

python - <<'PY'
import pathlib
import subprocess
import sys

try:
    import yaml
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", "--quiet", "pyyaml"])
    import yaml

path = pathlib.Path("packages/system/kubevirt-instancetypes/templates/preferences.yaml")
for doc in yaml.safe_load_all(path.read_text()):
    if not doc:
        continue
    name = doc.get("metadata", {}).get("name")
    ann = doc.get("metadata", {}).get("annotations", {})
    bad = {}
    for key in ("openshift.io/documentation-url", "openshift.io/support-url"):
        val = ann.get(key)
        if isinstance(val, str) and (val.startswith('"') or val.endswith("\n")):
            bad[key] = repr(val)
    if bad:
        print(name, bad)
PY

Repository: cozystack/cozystack

Length of output: 11161


Fix YAML annotation serialization across all preference definitions.

The openshift.io/documentation-url and openshift.io/support-url annotations use YAML literal block scalars (|) that preserve the surrounding quotes and trailing newline as literal content. This affects all 43 preference objects in the file, causing the annotation values to be stored as strings like "https://github.com/kubevirt/common-instancetypes"\n instead of valid URLs. Use plain scalar values without the | syntax and quotes.

Example fix (apply to all affected annotations)
-    openshift.io/documentation-url: |
-      "https://github.com/kubevirt/common-instancetypes"
+    openshift.io/documentation-url: https://github.com/kubevirt/common-instancetypes
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
openshift.io/documentation-url: |
"https://github.com/kubevirt/common-instancetypes"
openshift.io/provider-display-name: KubeVirt
openshift.io/support-url: https://github.com/kubevirt/common-instancetypes/issues
openshift.io/support-url: |
"https://github.com/kubevirt/common-instancetypes/issues"
openshift.io/documentation-url: https://github.com/kubevirt/common-instancetypes
openshift.io/provider-display-name: KubeVirt
openshift.io/support-url: |
"https://github.com/kubevirt/common-instancetypes/issues"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/system/kubevirt-instancetypes/templates/preferences.yaml` around
lines 7 - 11, The YAML annotations openshift.io/documentation-url and
openshift.io/support-url are using literal block scalars (|) with quoted
strings, which causes the stored values to include the quotes and newline;
update every preference definition so these two annotation keys are plain scalar
strings (remove the | block indicator and surrounding quotes) so the values are
stored as normal URL strings without embedded quotes or trailing newlines (apply
this change for all occurrences of openshift.io/documentation-url and
openshift.io/support-url in the file).

@myasnikovdaniil

Copy link
Copy Markdown
Contributor Author

Folded into #2602 ("feat(flux): upgrade to v2.8.0 + chart fixes for strict SSA & kstatus").

The kubevirt-instancetypes null-TPM fix from this PR lives there as commit db1fa6efc (rebased onto fresh main, GPG-signed, DCO-signed-off, original commit message preserved). The fix belongs alongside the Flux v2.8 upgrade since v2.8's strict Server-Side Apply is what triggers the original null-TPM rejection.

Closing in favor of #2602.

myasnikovdaniil added a commit that referenced this pull request Jun 2, 2026
…(folds #2612) (#2602)

## What this PR does

Upgrades Flux v2.7.3 → v2.8.0 across both the vendored tenant chart and
the embedded management-cluster manifests, and folds in the chart fixes
that become hard errors under the new strict helm-controller v1.5.

Flux v2.8's helm-controller v1.5.0 ships:
- **Server-Side Apply with `--force-conflicts`** — strict CRD schema
enforcement; misplaced fields (silently dropped on v2.7) now fail the
apply.
- **kstatus-based health checking** by default — parent HR waits for
every applied resource (including child HRs) to be Ready before flipping
its own Ready, surfacing latent ordering deadlocks.
- **Helm v4 embedded** — `upgrade.force: true` is deprecated and now
conflicts with SSA.
- **`HelmRelease.spec.healthCheckExprs`** — prerequisite for proper
readiness gating (used in PR #2601 split).

Folds in PR #2612 (kubevirt-instancetypes null TPM fix) since the same
Flux upgrade triggers it.

## Commits

**Flux upgrade itself:**
- `feat(fluxcd)`: bump `flux-operator` / `flux-instance` vendored charts
to v0.48.0; web UI opt-in.
- `feat(flux)`: regenerate embedded management-cluster manifests via
`make update` in `packages/core/flux-aio` (timoni bundle build).

**Chart fixes for strict SSA — fields the chart sent that v2.7 silently
dropped, v2.8 rejects:**
- `fix(kubevirt-instancetypes)`: drop persistent strip that produced
null `preferredTPM` (folds #2612).
- `fix(foundationdb)`: relocate `faultDomain`, `imageType`, `labels`,
`minimumUptimeSecondsForBounce` from inside `automationOptions` to
direct children of `spec`.
- `fix(kafka)`: place `enableServiceLinks` under `template.pod`, not a
phantom `template.spec`.
- `fix(vm-instance)`: emit `disk: {}` (not `disk:`/null) when no bus is
set.
- `fix(platform)`: drop deprecated `upgrade.force: true` from
HelmReleases; fix `kafka` WorkloadMonitor `replicas` paths.

**Ordering / deadlock fixes under v2.8 kstatus:**
- `fix(vpa)`: break circular wait between parent install and nested
`vpa-for-vpa` HR.
- `fix(kubernetes)`: drop lookup-guarded parent-HR `dependsOn` on tenant
addon child HRs (parent waits on child via kstatus, child waited on
parent — deadlock).

**E2E waits for v2.8 kstatus timing:**
- `test(e2e)`: bump app HR-Ready waits to 5m (was 20s–100s under v2.7's
faster dispatch).
- `test(e2e)`: wait for parent HR Ready before downstream asserts in
`run-kubernetes.sh` and `vminstance.bats`.

## Scope discipline

This PR is part of the split of #2619 (the consolidated CI fixes branch)
into review-friendly pieces. Companion PRs:
- **PR #2601** (seaweedfs split) — folded into this PR (commits
`29c6afc8`, `0e8b46d7`, `7157158c`, `dccdeb52`, `f880b324`): the
seaweedfs-system → seaweedfs-db + seaweedfs-system split, its adoption
migration 43 (targetVersion 44), and the configurable db resources all
land here, because the strict-SSA `upgrade.force` removal and the
kstatus parent-HR timeout bump only make sense together with the split.
#2601 is superseded.
- **PR #2558** (drop 3× retry on `Run E2E` + `Install Cozystack`) —
independent, lands separately.
- Several smaller standalone fixes lifted out of #2619 (startup probes,
cert-manager `dependsOn`, prepull machinery, CSI HR timeout, NFS/OIDC
test improvements) — opened as separate PRs.

## Verification

- `helm template` renders cleanly for both `fluxcd` and
`fluxcd-operator` packages with `web.enabled=false` (default) and
`web.enabled=true`.
- Embedded `cmd/cozystack-operator` binary contains the v1.5.0 / v1.8.0
/ v2.1.0 controller image strings.
- No references to the v0.39-removed `--disable-wait-interruption` flag
anywhere in `packages/` or `internal/`.

### Release note

```release-note
Flux upgraded to v2.8.0 (helm-controller v1.5 — Helm v4 Server-Side Apply with --force-conflicts, kstatus health checking).

When upgrading existing clusters:
- Kubernetes 1.33+ is now required for the platform (management) cluster, and for any tenant cluster that enables the optional (default-off) Flux addon — that addon ships the bumped Flux too.
- HelmReleases no longer set `upgrade.force: true`. Helm v4 SSA resolves field-ownership conflicts automatically (`--force-conflicts`), but that is not the old client-side replace: immutable-field changes (e.g. StatefulSet volumeClaimTemplates/serviceName) no longer self-heal and require manual recreation — delete the object (e.g. `kubectl delete sts <name> --cascade=orphan`) and let Flux recreate it.
- KubeVirt: persistent TPM/EFI is re-enabled for the Windows 11/2k22/2k25 preferences (KubeVirt 1.8 VMPersistentState); each affected VM provisions an extra RWO backend-storage PVC from the default StorageClass.
- KubeVirt: the EOL centos.7*/centos.stream8* preferences are retained as deprecated, hidden aliases (`tags: hidden`, `instancetype.kubevirt.io/deprecated: "true"`) — existing VMInstances on these profiles keep rendering and need no action on upgrade, but the profiles are no longer offered for new VMs; repoint to centos.stream9/10 when convenient. The gn1.* GPU instancetypes are likewise retained.
- FoundationDB: imageType now reaches the operator (silently dropped pre-SSA); it is pinned to `split` to match the value existing clusters effectively ran, so upgrades stay non-disruptive. Set `imageType: unified` to migrate deliberately.
```


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

* **New Features**
* Flux Status web UI: optional web server, config secret, service port,
HTTPRoute/Ingress, network policy, and RBAC roles.
  * New SeaweedFS DB Helm chart and optional managed DB release.

* **Improvements**
* CRD/schema enhancements: new provider kinds, validations, variant
option, and external checksum refs.
* Raised Kubernetes prerequisite to 1.30+; extended e2e timeouts for
reliability.

* **Chores**
* Bumped Flux Operator and Flux versions; documentation links updated to
fluxoperator.dev.
* **Bug Fixes**
  * Removed aggressive HelmRelease force-upgrade/install flags.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cozystack/cozystack/pull/2602?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/uncategorized PR auto-labeler could not map title scope to a known area/*; please review area/virtualization Issues or PRs related to virtualization (kubevirt, cdi, vmi, vm-import) backport Should change be backported on previous release kind/bug Categorizes issue or PR as related to a bug size/XXL This PR changes 1000+ lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant