3794 Commits
Author SHA1 Message Date
myasnikovdaniil b1f85b6891 [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.4.6 api/apps/v1alpha1/v1.4.6
2026-07-07 10:47:52 +05:00
IvanHunters b8a8d64d90 fix(linstor): set controller resource requests and relax liveness probe
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, the controller crash-loops, linstor-csi gets EPERM and
RWX-Filesystem DataVolumes never bind. Add CPU/memory requests (requests
only, no limits) so the JVM keeps answering /health under contention, and
relax the liveness timing to timeoutSeconds 5 / failureThreshold 6.

(cherry picked from commit 7801f7748e)
Signed-off-by: IvanHunters <xorokhotnikov@gmail.com>
2026-07-06 18:01:49 +03:00
myasnikovdaniil 745fee4f30 chore(release): cut v1.4.5 (#3082)
This PR prepares the release `v1.4.5`.
v1.4.5
2026-07-03 17:47:11 +05:00
cozystack-ci[bot] 531eef53d5 Prepare release v1.4.5
Signed-off-by: cozystack-ci[bot] <274107086+cozystack-ci[bot]@users.noreply.github.com>
2026-07-03 10:10:30 +00:00
myasnikovdaniil cf7dc6c76f [Backport release-1.4] fix(kamaji): backport datastore unused-deletion deadlock fix (clastix/kamaji#1122) (#3188)
# Description
Backport of #3146 to `release-1.4`.
api/apps/v1alpha1/v1.4.5
2026-07-03 14:53:15 +05:00
Myasnikov Daniil b0427a7b97 fix(kamaji): backport datastore unused-deletion deadlock fix (clastix/kamaji#1122)
Deleting a Tenant whose etcd DataStore has 0 referencing TenantControlPlanes left the DataStore stuck Terminating (finalizer kamaji.clastix.io/TenantControlPlane), hanging the etcd helm uninstall and wedging the tenant namespace. Backports clastix/kamaji#1122 (fixes clastix/kamaji#1115) as a source patch on the pinned 26.3.6-edge build. Refs #3018.

Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
(cherry picked from commit 47638f8569)
2026-07-03 09:52:31 +00:00
myasnikovdaniil 11339aaa59 [Backport release-1.4] fix(kubernetes): gate vmop cert-manager-crds dependency on certManager.enabled (#3186)
# Description
Backport of #3130 to `release-1.4`.
2026-07-03 14:08:41 +05:00
Myasnikov Daniil c069472154 fix(kubernetes): gate vmop cert-manager-crds dependency on certManager.enabled
The victoria-metrics-operator HelmRelease is gated on
monitoringAgents.enabled but listed cert-manager-crds in dependsOn
unconditionally, while the cert-manager-crds HelmRelease is only
created when certManager.enabled is true. The valid combination
monitoringAgents.enabled=true + certManager.enabled=false therefore
left vmop blocked on a non-existent dependency
("...cert-manager-crds ... not found"), cascading to monitoring-agents
and vertical-pod-autoscaler. Gate the dependency on the same condition
that creates it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
(cherry picked from commit 2b1d3e904d)
2026-07-03 09:07:07 +00:00
myasnikovdaniil 9369e61a56 [Backport release-1.4] fix(kubernetes): make node group resources optional when instanceType is set (#3157)
## What this PR does

Backport of #3121 to `release-1.4`.

Makes node group `resources` optional, so a node group sized purely by
`instanceType` (with `resources` omitted) passes `values.schema.json`
validation and installs. When a group sets both `instanceType` and
explicit `resources` (both `cpu` and `memory`), the explicit resources
take precedence: the instancetype is omitted from the rendered VM and
the per-group instancetype lookup is skipped, so KubeVirt does not
reject a VM that references an instancetype while overriding
`domain.cpu`/`memory`. A partial spec (only one of `cpu`/`memory`)
alongside an `instanceType` fails fast at render time.

Cherry-picked from `a349c753`; conflicts resolved against the
`release-1.4` tree (the management-cluster Talos worker bootstrap stack
present on `main` is not on this branch, so the schema/template/test
layout differ). Generated files (`values.schema.json`, `README.md`,
cozyrds, API types) regenerated with `make generate` to match. `helm
unittest` passes (130 tests), including the four new node-group sizing
cases adapted to this branch's document layout.

### Release note

```release-note
fix(kubernetes): make node group resources optional when instanceType is set
```
2026-07-03 12:54:13 +05:00
Aleksei Sviridkin 6797e11eb2 fix(kubernetes): make node group resources optional and prefer them over instanceType
A node group is sized either by instanceType or by explicit resources, but the
generated values schema required resources on every node group. A node group
with instanceType and no resources — or an empty resources dropped during
typed-CR to HelmRelease translation — failed schema validation with "missing
property 'resources'" even though sizing was fully specified.

Mark resources optional in the node group definition and regenerate the schema,
API types, README, and ApplicationDefinition. The chart template emits
domain.cpu/memory only when resources is present, so a node group sized purely
by instanceType now passes validation and installs.

When a node group sets both instanceType and explicit resources, explicit
resources take precedence: the instancetype is omitted from the rendered VM and
the per-group instancetype lookup is skipped, so KubeVirt accepts the explicit
domain.cpu/memory with no instancetype to conflict with. instanceType stays
required and defaulted (no schema change), so the console's required
instanceType dropdown keeps working — sending the default instanceType plus
explicit resources simply sizes the VM by resources. This replaces an earlier
render-time hard failure on the both-set case, which was unreachable to clear
from the dashboard (the required dropdown cannot be emptied).

Explicit resources are all-or-nothing alongside an instanceType: a partial spec
(only cpu, or only memory) on a group that carries a non-empty instanceType
would emit one domain override next to the instancetype — which KubeVirt rejects
— so it now fails at render time with a clear error. Partial resources on a
group without an instanceType (used to tune kubelet reservations) are unaffected.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
(cherry picked from commit a349c753ad)
2026-06-30 18:16:46 +05:00
myasnikovdaniil a90bf20376 [Backport release-1.4] fix(harbor): preserve jobservice and trivy storageClass on upgrade (#3151)
# Description
Backport of #2930 to `release-1.4`.
2026-06-30 17:49:11 +05:00
Myasnikov Daniil 7a33d3c377 fix(harbor): preserve jobservice and trivy storageClass on upgrade
The cozy-harbor wrapper never passed storageClass to the jobservice
jobLog PVC, so it was created without a storageClassName and the
default-StorageClass admission stamped the cluster default. Because PVC
storageClassName is immutable, this caused rendered-vs-live drift on
upgrade. Preserve an existing PVC's class via lookup and fall back to the
configured storageClass for fresh installs.

The trivy StatefulSet's volumeClaimTemplate had the same latent drift --
.Values.storageClass was forwarded blindly into a VCT that cannot be
patched at all -- so it gets the same lookup-preserve treatment, keyed
off data-<release>-trivy-0.

A live object pinned to an explicit "" (no dynamic provisioning) now
round-trips through upstream's "-" sentinel instead of collapsing to an
omitted storageClassName, and the spec lookup is guarded with
`| default dict` so a PVC carrying no storageClassName key stays omitted.

Adds a helm-unittest regression suite and wires a test target so
make unit-tests stops skipping packages/apps/harbor.

Fixes #2368

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
(cherry picked from commit bdf520bf74)
2026-06-30 12:48:20 +00:00
Andrei Kvapil 30edb8fe70 [Backport release-1.4] fix(kubernetes): add spec.timeout to tenant CSI HelmRelease (#2929)
# Description
Backport of #2727 to `release-1.4`.
2026-06-24 08:49:38 +02:00
Andrei Kvapil 813aee7f7d [Backport release-1.4] fix(csi): detach orphan hot-plug volumes when VMI outlives its VM (#2965)
# Description
Backport of #2866 to `release-1.4`.
2026-06-24 08:48:04 +02:00
Andrei Kvapil 1f0d221e67 fix(csi): detach orphan hot-plug volumes from VMI when parent VM is gone
Upstream treats a missing parent VM as detach success, so when the VMI
outlives its VM during node reprovisioning the hot-plug pod keeps the
infra device exclusively attached to the source host and subsequent
attaches fail. Re-check VMI volume status after upstream unpublish and
detach from the VMI directly. Backport of kubevirt/csi-driver#184.

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Andrei Kvapil <andrei.kvapil@aenix.io>
(cherry picked from commit 68136f9292)
2026-06-22 09:32:27 +00:00
Andrei Kvapil ab976c3b5f chore(csi): bump kubevirt-csi-driver to latest upstream
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Andrei Kvapil <andrei.kvapil@aenix.io>
(cherry picked from commit 6b4d7adb2c)
2026-06-22 09:32:27 +00:00
myasnikovdaniil 6b497b762a chore(release): cut v1.4.4 (#2949)
This PR prepares the release `v1.4.4`.
v1.4.4
2026-06-18 15:44:30 +05:00
cozystack-ci[bot] 8321c273f9 Prepare release v1.4.4
Signed-off-by: cozystack-ci[bot] <274107086+cozystack-ci[bot]@users.noreply.github.com>
2026-06-18 09:06:07 +00:00
myasnikovdaniil f0596534bf fix(dashboard): pin UI source branch to release-1.4 (#2945)
## What this PR does

Pins `CONSOLE_BRANCH` to `release-1.4` in the dashboard Makefile so that
patch builds of cozystack 1.4.x clone `cozystack-ui@release-1.4` instead
of `cozystack-ui@main`.

Before this change, every `make image` on the `release-1.4` branch
cloned the latest HEAD of `cozystack-ui/main`, which could pull in
unreleased UI features and break the patch release gate entirely.

### Release note

\`\`\`release-note
fix(dashboard): patch builds now clone cozystack-ui@release-1.4 instead
of @main
\`\`\`
api/apps/v1alpha1/v1.4.4
2026-06-18 13:38:28 +05:00
Myasnikov Daniil 2c61cb2196 docs(release): document UI release branch process for new minors
Explains that cutting vX.Y.0 requires creating cozystack-ui/release-X.Y
and pinning CONSOLE_BRANCH in packages/system/dashboard/Makefile.
Without this step, patch builds clone cozystack-ui@main and can pull
in unreleased UI features.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
2026-06-17 17:06:29 +05:00
Myasnikov Daniil 5cffa83525 fix(dashboard): pin UI source branch to release-1.4
CONSOLE_BRANCH was hardcoded to `main` on both the main and release-1.4
branches, so every patch build of cozystack 1.4.x cloned cozystack-ui@main —
picking up unreleased UI features and bypassing the patch release gate.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
2026-06-17 16:52:44 +05:00
Myasnikov Daniil 023dae3dd9 fix(kubernetes): add spec.timeout to tenant CSI HelmRelease
Aligns kubevirt-csi-node HR with every other tenant addon HR in
packages/apps/kubernetes/templates/helmreleases/ (cilium, coredns,
ingress-nginx, etc.) — all set timeout: 10m, csi.yaml was the only
exception. 9f9d8f85 ("Allign timeouts for HelmReleases") missed it.

Symptom: e2e NFS test (hack/e2e-apps/run-kubernetes.sh) times out
waiting for nfs-test-pod to reach Succeeded. Cozyreport events show
the tenant csi HR running Install -> Uninstall -> Install remediation
cycles. With install.remediation.retries: -1 and the default 5m Helm
timeout, kstatus marks the kubevirt-csi-node DaemonSet 'InProgress'
past 5m on a slow tenant control-plane bringup (Kamaji APIs flapping,
VM image pulls), helm-controller times out, the remediation uninstalls
the DaemonSet, then reinstalls. Any volume mount in flight at that
moment is wedged.

Observed on PR #2619 CI run 26142986969: csi HR remediation at
~07:07 happened ~10 min into the nfs-test-pod wait, killing the
mount and timing out the pod-Succeeded condition.

10m matches the surrounding HRs and gives the DaemonSet headroom
without changing remediation semantics on truly-broken installs.

Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
(cherry picked from commit 866588ff61)
(cherry picked from commit d8ba954e90)
2026-06-16 10:21:00 +00:00
myasnikovdaniil 99096b585a chore(release): cut v1.4.3 (#2840)
This PR prepares the release `v1.4.3`.
v1.4.3
2026-06-11 22:10:13 +05:00
cozystack-ci[bot] 7ad30f886c Prepare release v1.4.3
Signed-off-by: cozystack-ci[bot] <274107086+cozystack-ci[bot]@users.noreply.github.com>
2026-06-11 14:15:19 +00:00
myasnikovdaniil 721006129f [Backport release-1.4] fix(networking): point host ouroboros proxy at the root-tenant ingress (#2846)
# Description
Backport of #2800 to `release-1.4`.
api/apps/v1alpha1/v1.4.3
2026-06-10 10:25:49 +05:00
myasnikovdaniil 291ef1e50f [Backport release-1.4] fix(api): emit initial-events-end bookmark for core.cozystack.io watches (#2844)
# Description
Backport of #2786 to `release-1.4`.
2026-06-10 10:24:30 +05:00
myasnikovdaniil fec64c2aca [Backport release-1.4] fix(dashboard): grant tenant dashboard read on cozy-public PVCs (#2858)
# Description
Backport of #2843 to `release-1.4`.
2026-06-10 10:14:48 +05:00
Myasnikov Daniil a23341275c fix(dashboard): grant tenant dashboard read on cozy-public PVCs
The vm-disk source image dropdown in the console lists PersistentVolumeClaims in cozy-public (the vm-default-images-* golden images). The browser issues that list as the tenant identity (e.g. system:serviceaccount:tenant-root:tenant-root), but the cozy:tenant:dashboard Role only granted read on Flux helmrepositories and helmcharts. The list returned 403 and the dropdown stayed empty even when the images existed.

Add get/list/watch on persistentvolumeclaims to the Role. cozy-public is a shared public namespace, so read on its PVCs is safe to expose to every tenant dashboard subject. A helm-unittest regression pins the grant.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
(cherry picked from commit bb322138ec)
2026-06-09 20:52:03 +00:00
Aleksei Sviridkin 6da6b1836a docs(ingress): explain how ingress works in the platform (#2770)
## What this PR does

Adds a "How ingress works" overview to the ingress package README — the
source rendered onto the docs site at
/docs/v1.4/operations/services/ingress/. Until now that page was only
the
parameters table with no conceptual explanation.

The new section (placed above the auto-generated `## Parameters` table)
covers:
- per-tenant ingress-nginx controllers and the `ingress: true` tenant
toggle
- the per-namespace IngressClass model (`tenant-root`,
`k8s.io/ingress-nginx-<ns>`)
- cross-tenant sharing/inheritance via `namespace.cozystack.io/ingress`
- how managed apps attach (`ingressClassName` + cert-manager
annotations)
- external exposure (only `publishing.ingressName` is published; links
to the
  existing Exposure mode section)
- TLS via cert-manager issuers
- access control (`whitelist`, `cloudflareProxy`)

Docs-only. `make generate` leaves the parameters table and schema
untouched.

### Release note

```release-note
docs(ingress): document how the platform's per-tenant ingress works
```
2026-06-09 23:51:37 +03:00
Aleksei Sviridkin 3a855029e2 fix(networking): point host ouroboros proxy at the root-tenant ingress
With publishing.proxyProtocol enabled the host emits a cozystack.ouroboros
Package via the no-override Package macro, so the proxy inherits the wrapper
chart default backend ingress-nginx-controller.cozy-ingress-nginx. That
layout describes a managed Kubernetes tenant cluster; on the host,
extra/ingress deploys ingress-nginx into the root tenant namespace as
root-ingress-controller in tenant-root. The composed backend FQDN never
resolves, so ouroboros-proxy never reaches Ready.

Emit the host ouroboros Package with a proxy.target override derived from
publishing.ingressName (namespace plus <short>-ingress-controller service
name), mirroring the trimPrefix transform extra/ingress applies. Add bundle
helm-unittest coverage for the default and a non-default ingress name, and
correct the misleading wrapper values.yaml comment.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
(cherry picked from commit f90411da7a)
2026-06-08 13:41:36 +00:00
Simon Koudijs 3f7c796d78 fix(api): emit initial-events-end bookmark for core.cozystack.io watches
The aggregated apiserver resources in group core.cozystack.io
(TenantSecret, TenantModule, TenantNamespace) ignored the
SendInitialEvents field of ListOptions. Clients using the WatchList /
streaming-list protocol (client-go's WatchListClient feature, on by
default since v1.35) never received the required
k8s.io/initial-events-end bookmark, so their reflectors stayed stuck in
the initial-stream phase and logged "hasn't received required bookmark
event marking the end of initial events stream" every ~10s, never
reaching HasSynced.

apps.cozystack.io/Application already implemented this contract inline.
Extract that logic into a shared registry.InitialEventsBookmarker helper
(pkg/registry/utils.go) and wire it into all four translating Watch
implementations: after the initial ADDED events, the first backing
bookmark is annotated as the initial-events-end marker, with fallbacks
that emit it before the first live event and on watcher close. Application
is refactored onto the shared helper with its WorkloadMonitor
pending-event draining preserved.

Adds unit tests for the bookmarker and watch tests for each of the three
core resources asserting ADDED -> annotated Bookmark -> live event.

```release-note
[apiserver] core.cozystack.io resources (TenantSecret, TenantModule,
TenantNamespace) now emit the k8s.io/initial-events-end bookmark for
SendInitialEvents=true (WatchList) watches, so client-go informers reach
HasSynced instead of looping on the missing-bookmark warning.
```

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Simon Koudijs <simonkoudijs@gmail.com>
(cherry picked from commit a28e77c9a2)
2026-06-08 11:27:54 +00:00
Andrei Kvapil 0dcc1dd2ac [Backport release-1.4] feat(ouroboros): bump to v0.8.0 (#2835)
# Description
Backport of #2807 to `release-1.4`.
2026-06-05 17:22:24 +02:00
Aleksei Sviridkin 655b0c0482 feat(ouroboros): bump to v0.8.0
v0.8.0 makes the TCP proxy log an explicit reason when its backend
readiness check fails, instead of staying silently NotReady. That
silent failure mode is exactly what makes a mispointed proxy backend
hard to diagnose, so the upgrade pays off the moment the target is
wrong. The bump also carries the v0.7.3 migration of the kubectl
sidecar image off Docker Hub to mirror.gcr.io, sidestepping anonymous
pull rate-limits on shared CI/runner IPs.

Chart manifest and controller image are re-pinned by digest in lockstep
with the version, and the image-pin test fixture is updated to match.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
(cherry picked from commit 3a5ff3d9c8)
2026-06-05 12:25:22 +00:00
myasnikovdaniil e744c8652a [Backport release-1.4] chore(seaweedfs): bump seaweedfs-cosi-driver to v0.3.1 (#2827)
# Description
Backport of #2791 to `release-1.4`.
2026-06-05 17:17:21 +05:00
myasnikovdaniil 05eeb09a3c [Backport release-1.4] fix(objectstorage-controller): propagate Bucket readiness to BucketClaim (#2828)
# Description
Backport of #2792 to `release-1.4`.
2026-06-05 17:16:42 +05:00
myasnikovdaniil 0d39f206aa [Backport release-1.4] fix(kubernetes): stamp application lineage labels on worker node VMs (#2790)
# Description
Backport of #2779 to `release-1.4`.
2026-06-05 17:16:27 +05:00
myasnikovdaniil 153c061814 [Backport release-1.4] ci(release): repair orphaned draft tag_name on retag (#2829)
# Description
Backport of #2761 to `release-1.4`.
2026-06-05 13:58:01 +05:00
Myasnikov Daniil e437cf2e3d ci(release): repair orphaned draft tag_name on retag
When the git tag was deleted and re-created between draft creation
and merge, GitHub orphaned the draft release: tag_name became
"untagged-<hash>" while `name` was preserved. The finalize step
looked up the draft by tag_name and threw `Draft release for <tag>
not found`, blocking the release.

Fall back to matching by `name` only when the candidate is the
GitHub-orphaned form (tag_name matches /^untagged-/), repair the
draft's tag_name via updateRelease, then publish. Hard-fail is
preserved when neither lookup matches.

Same failure recurred on the v1.4.1 finalize run; this commit
prevents recurrence but does not auto-recover the stuck v1.4.2
draft.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
(cherry picked from commit 22187e069d)
2026-06-05 08:54:15 +00:00
Aleksei Sviridkin 79042f9351 fix(objectstorage-controller): propagate Bucket readiness to BucketClaim
The vendored COSI controller (v0.2.2) sets only BucketClaim.status.bucketName
in the dynamic-provisioning path and hardcodes bucketReady=false, never
re-reading the Bucket afterwards. The controller does not watch Buckets, so the
readiness transition the sidecar performs (false->true) is never reflected on
the BucketClaim: bucketReady stays false forever and BucketAccess is never
granted, leaving provisioned buckets without credentials.

Re-read the live Bucket after create and propagate its readiness, so the
periodic resync converges the BucketClaim to ready. This matches the behavior
the rewritten upstream controller already has on its main branch.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
(cherry picked from commit ed20a4322a)
2026-06-05 08:10:36 +00:00
Aleksei Sviridkin 351e275091 chore(seaweedfs): bump seaweedfs-cosi-driver to v0.3.1
v0.3.1 ships the stale-socket self-heal: the driver removes a leftover
COSI unix socket before binding, so the objectstorage provisioner
recovers from CrashLoopBackOff after a non-graceful exit (SIGKILL / OOM /
panic) instead of wedging on "bind: address already in use".

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
(cherry picked from commit 7857282d66)
2026-06-05 08:09:59 +00:00
Aleksei Sviridkin f8b88f934e fix(kubernetes): quote worker-VM application.name label and cover it with tests
Pin the apps.cozystack.io/application.{group,kind,name} labels stamped on the
worker VM template, including a case that trims the kubernetes- release prefix.
Also quote application.name so a purely-numeric cluster name renders a YAML
string rather than an integer that a label value would reject.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
(cherry picked from commit 7d1096b8da)
2026-06-02 21:07:11 +00:00
Andrei Kvapil 83b2f71f48 fix(kubernetes): stamp application lineage labels on worker node VMs
Worker-node VMs of a tenant Kubernetes cluster are created by Cluster API
and the KubeVirt provider, so their virt-launcher pods were never stamped
with the apps.cozystack.io/application.{group,kind,name} lineage labels the
chart already sets on its other resources (ingress, cloud-config). Without
them the dashboard cannot attribute those pods to the owning Kubernetes
application instance.

Add the labels to the worker VM template (KubevirtMachineTemplate ->
virtualMachineTemplate.spec.template.metadata.labels), mirroring the
existing stamping in ingress.yaml/cloud-config.yaml. KubeVirt propagates
them to the VMI and virt-launcher pods (the same path as the existing
cluster.x-k8s.io/deployment-name label).

Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Andrei Kvapil <andrei.kvapil@aenix.io>
(cherry picked from commit 99360dab29)
2026-06-02 21:07:11 +00:00
Myasnikov Daniil eb9ac66858 docs(ingress): explain how ingress works in the platform
Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
2026-05-29 17:04:08 +05:00
myasnikovdaniil 7e91f1ba3b chore(release): cut v1.4.2 (#2758)
This PR prepares the release `v1.4.2`.
v1.4.2
2026-05-28 11:35:32 +05:00
cozystack-ci[bot] bc56974fef Prepare release v1.4.2
Signed-off-by: cozystack-ci[bot] <274107086+cozystack-ci[bot]@users.noreply.github.com>
2026-05-28 01:41:38 +00:00
myasnikovdaniil 67a89c24ca [Backport release-1.4] fix(platform): add OpenSearch to PaaS bundle (#2757)
## What this PR does

Backport of #2648 to `release-1.4`.

OpenSearch ships as a complete package set in `release-1.4`
(`packages/apps/opensearch/`, `packages/system/opensearch-operator/`,
`packages/system/opensearch-rd/`, and the `opensearch-operator` /
`opensearch-application` PackageSources), but the PaaS bundle template
never referenced the two `cozystack.opensearch-*` PackageSources.

Result on any cluster with `bundles.paas.enabled=true`:
- `opensearch-operator` is not deployed → no `OpenSearchCluster` CRD
- `opensearch-rd` is not deployed → no
`ApplicationDefinition/opensearch`,
  so the dashboard catalog has no OpenSearch entry and tenants cannot
  create `opensearches.apps.cozystack.io`

This adds the two missing includes to
`packages/core/platform/templates/bundles/paas.yaml`, matching #2648
exactly.

### Release note
```release-note
Fix: OpenSearch is now installed by the PaaS bundle (`bundles.paas.enabled=true`); previously the operator and ApplicationDefinition were defined but never referenced from the bundle, so OpenSearch did not appear in the dashboard catalog.
```
api/apps/v1alpha1/v1.4.2
2026-05-27 23:43:41 +05:00
Myasnikov Daniil ea55d60d62 [Backport release-1.4] fix(platform): add OpenSearch to PaaS bundle
# Description
Backport of #2648 to `release-1.4`.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
2026-05-27 23:35:41 +05:00
myasnikovdaniil d046606adb [Backport release-1.4] fix(csi): verify VMI Ready after kubevirt-csi Publish to surface stuck-PVC failures (#2748)
# Description
Backport of #2659 to `release-1.4`.
2026-05-27 20:38:24 +05:00
myasnikovdaniil 0c7a8eab99 [Backport release-1.4] fix(csi): route RWX Block volumes to upstream hotplug detach (#2749)
# Description
Backport of #2658 to `release-1.4`.
2026-05-27 20:38:07 +05:00
Myasnikov Daniil d73def2250 fix(csi): tighten isNFSVolume to Filesystem-only
Address review feedback from gemini-code-assist on
packages/apps/kubernetes/images/kubevirt-csi-driver/controller.go:562:
classify a PVC as NFS only when its VolumeMode is Filesystem (or nil,
which defaults to Filesystem), instead of "anything not Block". Future
VolumeMode values will no longer be silently routed to the NFS path.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Myasnikov Daniil <myasnikovdaniil2001@gmail.com>
(cherry picked from commit c0db80591d)
2026-05-26 20:42:34 +00:00