Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
5e99874
docs: add release notes for v1.9.3 (#2604)
Isteb4k Jul 7, 2026
e132f73
Changelog v1.9.3 (#2573)
deckhouse-BOaTswain Jul 7, 2026
1144772
fix(vm): reduce virt-launcher log volume (#2561)
eofff Jul 8, 2026
14583ba
fix(vm): start VM after restore for all run policies (#2577)
danilrwx Jul 8, 2026
888698f
chore(ci): silence dmt mount-points and webhook-annotation checks (#2…
nevermarine Jul 8, 2026
f4fcd9e
chore(ci): add sds-elastic e2e tests (#2608)
nevermarine Jul 8, 2026
7600bd0
test(test): add iperf migration continuity checks to release e2e (#2617)
hayer969 Jul 9, 2026
4694576
fix(vm): read ansible-inventory host vars from the vars. annotation p…
fl64 Jul 9, 2026
2ae8bae
fix(vm): fix VM stuck until the child KVVMI in Failed phase is delet…
yaroslavborbat Jul 9, 2026
531e7d6
feat(vmpool): add VirtualMachinePool for group VM management (#2572)
fl64 Jul 9, 2026
54f6d8a
feat(vmpool): enable VirtualMachinePool in EE/SE+ without a feature g…
fl64 Jul 9, 2026
a7d61a8
feat(network): bind live migration to a dedicated SystemNetwork (#2222)
loktev-d Jul 9, 2026
dbb09fc
chore(ci): use ru registry for release checks (#2476)
universal-itengineer Jul 9, 2026
4ff8078
fix(vmclass): make sizing policy validation messages actionable and c…
fl64 Jul 9, 2026
53555c3
docs: add VM launcher update notes to release notes (#2613)
prismagod Jul 9, 2026
855f8db
Chore/remove cdi (#2394)
Isteb4k Jul 9, 2026
247fddb
test(e2e): bump VI-derived disk size to 450Mi (#2627)
Isteb4k Jul 9, 2026
1994cce
feat(vm): switch VM network datapath to eBPF bpfbridge binding (#2212)
LopatinDmitr Jul 9, 2026
65c4ebb
feat(audit): add audit events (#2611)
Suselz Jul 10, 2026
5d1718f
chore(ci): fix dlv debug tasks for all controller components (#2631)
danilrwx Jul 10, 2026
0447deb
fix(images, disks): self-heal uploader ingress tls secret to unblock …
fl64 Jul 10, 2026
8dfbd20
feat(network): add metrics for conntrack sync (#2542)
loktev-d Jul 10, 2026
121e8de
fix(vm): dynamic domain wait timeout (#2616)
danilrwx Jul 10, 2026
df1a317
chore(api): integrate crd-enricher into CRD codegen (#2622)
prismagod Jul 10, 2026
f9568db
fix(vm): move disks to preset bus when enableParavirtualization flips…
universal-itengineer Jul 10, 2026
4ebef2f
fix(observability): correct audit server default TLS paths and prefix…
danilrwx Jul 10, 2026
155bf11
docs: add localized disable confirmation messages (#2639)
prismagod Jul 10, 2026
5522f64
docs: update codeowners (#2640)
prismagod Jul 10, 2026
cab4406
chore(ci): replace E2E_IMAGE_BASE_URL with virtlab endpoint (#2646)
nevermarine Jul 13, 2026
3719fb3
fix(kubevirt): build bpf_bridge.o without the svace wrapper (#2644)
nevermarine Jul 13, 2026
790ddda
fix(vi): attach PVC-backed images to VMs in read-only mode (#2620)
eofff Jul 13, 2026
28e9848
docs: add release notes v1.8.4 (#2625)
prismagod Jul 13, 2026
0645dde
Changelog v1.8.4 (#2485)
deckhouse-BOaTswain Jul 13, 2026
21243d9
chore(ci): migrate GitHub Actions CI to GitLab CI (#2543)
universal-itengineer Jul 13, 2026
bdfd877
fix(vm): preserve scsi bus for VMBDA disks when enableParavirtualizat…
universal-itengineer Jul 13, 2026
7bcf9f5
fix(vm): tolerate concurrent finalizer changes when releasing PVC pro…
Isteb4k Jul 14, 2026
7ee9ec4
chore(docs): add missing release notes fro 1.8.4 (#2660)
diafour Jul 14, 2026
0863024
fix(dra): drop redundant /sys hostPath mount breaking container start…
universal-itengineer Jul 14, 2026
b1b9de2
fix(vm): respect node placement when picking TSC frequency (#2630)
eofff Jul 14, 2026
2c86898
fix(dra): load xz-compressed usbip kernel modules (#2647)
danilrwx Jul 14, 2026
7218e37
fix(vm): allow volume migration while restart is pending (#2634)
danilrwx Jul 14, 2026
1bb8c44
docs: add release notes v1.9.4 (#2642)
prismagod Jul 14, 2026
6520fad
chore(vmclass): discovered features should be frozen after first disc…
diafour Jul 14, 2026
6e97e59
Changelog v1.9.4 (#2636)
deckhouse-BOaTswain Jul 14, 2026
b5892fd
chore(ci): fix release check (#2669)
nevermarine Jul 14, 2026
b8b9593
chore(core): cve mitigation 13-06-2026 (#2648)
LopatinDmitr Jul 14, 2026
db2e66b
fix(vm): secureboot vm no default storageclass (#2614)
danilrwx Jul 14, 2026
58b4970
test: migrate VirtualMachineImageHotplug e2e test to new framework (#…
eofff Jul 15, 2026
51175f2
feat(ci): manual workflow to recheck and rebuild broken dev images (#…
universal-itengineer Jul 15, 2026
6fd4a40
fix(ci): rebuild broken dev module tags (GitHub + GitLab) (#2683)
universal-itengineer Jul 15, 2026
5a3d9e8
feat(vm): add IPAM for additional network interfaces (#2612)
hardcoretime Jul 15, 2026
5fd7705
feat(core): split migration prep and sync pools per source node (#2230)
loktev-d Jul 15, 2026
7aaf182
fix(module): include per-version changelog in release image (#2674)
universal-itengineer Jul 16, 2026
d7c2873
fix(cli): keep collect-debug-info going when secondary resources are …
LopatinDmitr Jul 16, 2026
ecd65ac
fix(cli): propagate global client-config flags to ssh/scp proxy comma…
LopatinDmitr Jul 16, 2026
1b5ca5e
Re-generate changelog v1.11.0
LopatinDmitr Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
83 changes: 66 additions & 17 deletions .dmtlint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,15 @@ linters-settings:
- "spec.versions[0].schema.openAPIV3Schema.properties.spec.properties.contentType"
rbac:
exclude-rules:
# We exclude RBAC rules for virt-operator and cdi-operator because they create ClusterRoles and ClusterRoleBindings with wildcards.
# If we remove wildcard, virt-operator and cdi-operator will be unable to create them, as they do not have wildcard permissions themselves.
# We exclude RBAC rules for virt-operator because it creates ClusterRoles and ClusterRoleBindings with wildcards.
# If we remove wildcard, virt-operator will be unable to create them, as it does not have wildcard permissions itself.
wildcards:
- kind: ClusterRole
name: d8:virtualization:kubevirt-operator
- kind: ClusterRole
name: d8:containerized-data-importer:cdi-operator

# We exclude RBAC rules for CDI and Kubevirt resources because they are used by upstream deployments.
# We exclude RBAC rules for Kubevirt resources because they are used by upstream deployments.
# Changing these rules will require patching upstream code.
placement:
- kind: ClusterRoleBinding
name: d8:containerized-data-importer:cdi-operator
- kind: ServiceAccount
name: cdi-operator
- kind: Role
name: cdi-operator
- kind: RoleBinding
name: cdi-operator
- kind: ServiceAccount
name: kubevirt-operator
- kind: Role
Expand All @@ -40,10 +30,7 @@ linters-settings:
name: kubevirt-operator
- kind: RoleBinding
name: virt-operator
- kind: ClusterRole
name: d8:containerized-data-importer:cdi-operator
binding-subject:
- cdi-sa
- kubevirt-internal-virtualization-controller
- kubevirt-internal-virtualization-handler
module:
Expand All @@ -52,8 +39,8 @@ linters-settings:
directories:
- tools/addlicense/testdata
- test/performance/ssh
- test/e2e/legacy/testdata/sshkeys
- images/dvcr-artifact/staging
- images/pvc-artifact/staging
container:
exclude-rules:
readiness-probe:
Expand All @@ -64,3 +51,65 @@ linters-settings:
- kind: Deployment
name: dvcr
container: dvcr-garbage-collection
no-cyrillic:
exclude-rules:
files:
- templates/security-events.yaml # Ru information for docs
templates:
exclude-rules:
# These mount-points.yaml directories pre-create mount points for containerd strict mode.
# They are consumed by pods that are NOT rendered from this module's Helm templates:
# virt-launcher (created per-VM by KubeVirt at runtime), dvcr importer/uploader (created on
# demand by the controllers), and the virt-* components deployed by virt-operator.
# The mount-points linter only inspects Helm pod controllers, so it cannot see these
# mountPaths and reports false positives.
mount-points:
- /auth
- /certs
- /data
- /dev/bus/usb
- /dvcr-auth
- /dvcr-src-auth
- /etc/docker/registry
- /etc/libvirt
- /etc/podinfo
- /etc/ssl/docker
- /etc/virt-api/certificates
- /etc/virt-controller/certificates
- /etc/virt-controller/exportca
- /etc/virt-handler/clientcertificates
- /etc/virt-handler/servercertificates
- /etc/virt-operator/certificates
- /etc/virtualization-api-proxy/certificates
- /etc/virtualization-api/certificates
- /etc/virtualization-audit/certificates
- /init/usr/bin
- /kubeconfig.local
- /opt
- /path
- /pods
- /profile-data
- /proxycerts
- /run/cilium
- /run/kubevirt
- /run/kubevirt-libvirt-runtimes
- /run/kubevirt-private
- /scratch
- /shared
- /tmp/k8s-webhook-server/serving-certs
- /usr/lib/modules
- /var/cache/libvirt
- /var/lib/kubelet/device-plugins
- /var/lib/kubelet/plugins
- /var/lib/kubelet/plugins_registry
- /var/lib/kubelet/pods
- /var/lib/kubevirt
- /var/lib/kubevirt-node-labeller
- /var/lib/libvirt
- /var/lib/libvirt/qemu
- /var/lib/libvirt/qemu/nvram
- /var/lib/libvirt/swtpm
- /var/lib/registry
- /var/lib/swtpm-localca
- /var/log/libvirt
- /var/run/cdi
8 changes: 4 additions & 4 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
* @Isteb4k
/.github/ @universal-itengineer @nevermarine

/crds/ @fl64 @prismagod @goganat
/docs/ @fl64 @prismagod @goganat
/openapi/ @fl64 @prismagod @goganat
/crds/ @fl64 @z9r5 @goganat
/docs/ @fl64 @z9r5 @goganat
/openapi/ @fl64 @z9r5 @goganat
/monitoring/ @fl64 @Isteb4k
/tests/ @hardcoretime @danilrwx

/images/ @universal-itengineer @nevermarine
/images/cdi-artifact/ @Isteb4k @yaroslavborbat @diafour
/images/pvc-artifact/ @Isteb4k @yaroslavborbat @diafour
/images/virt-artifact/ @Isteb4k @yaroslavborbat @diafour
/images/dvcr-artifact/ @Isteb4k @yaroslavborbat @diafour
/images/vm-route-forge/ @yaroslavborbat @diafour
Expand Down
1 change: 1 addition & 0 deletions .github/actions/milestone-changelog/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ runs:
vdsnapshot
vmsnapshot
vmrestore
vmpool
disks
vd
images
Expand Down
68 changes: 68 additions & 0 deletions .github/scripts/bash/check-and-rebuild/check-image-digests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#!/usr/bin/env bash

# Copyright 2026 Flant JSC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Check that every component image referenced by a module tag is pullable.
# Usage: check-image-digests.sh --repo <repo> --tag <tag>
# Exit: 0 all pullable, 1 some missing, 2 module image not found.

set -Eeuo pipefail

repo=""
tag=""
while [[ $# -gt 0 ]]; do
case "$1" in
--repo) repo="$2"; shift 2 ;;
--tag) tag="$2"; shift 2 ;;
*) echo "unknown argument: $1" >&2; exit 2 ;;
esac
done
[[ -n "$repo" && -n "$tag" ]] || { echo "usage: $0 --repo <repo> --tag <tag>" >&2; exit 2; }

echo "[INFO] Repo ${repo}"
echo "[INFO] Tag ${tag}"

if ! crane digest "${repo}:${tag}" >/dev/null 2>&1; then
echo "::error::module image ${repo}:${tag} not found"
exit 2
fi

digests="$(crane export "${repo}:${tag}" - | tar -Oxf - images_digests.json)"

ok_images=()
missing_images=()
while read -r component digest; do
image="${repo}@${digest}"
if crane digest "$image" >/dev/null 2>&1; then
echo "✅ ${component}"
ok_images+=("$(printf '%-25s %s' "${component}:" "$image")")
else
echo "❌ ${component}"
missing_images+=("$(printf '%-25s %s' "${component}:" "$image")")
fi
done < <(echo "${digests}" | jq -r 'to_entries[] | "\(.key) \(.value)"')

echo "──────────────────────────────"
if [[ ${#missing_images[@]} -eq 0 ]]; then
echo "🎉 All ${#ok_images[@]} component images are pullable"
exit 0
fi

echo "⚠️ Missing component images:"
for img in "${missing_images[@]}"; do
echo " - $img"
done
echo "Total missing: ${#missing_images[@]}"
exit 1
57 changes: 57 additions & 0 deletions .github/scripts/bash/check-and-rebuild/rebuild-broken-stages.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/usr/bin/env bash

# Copyright 2026 Flant JSC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Delete stale stages so the next werf build rebuilds broken component images.
# Usage: rebuild-broken-stages.sh --repo <repo> --report <build-report.json>

set -Eeuo pipefail

repo=""
report=""
while [[ $# -gt 0 ]]; do
case "$1" in
--repo) repo="$2"; shift 2 ;;
--report) report="$2"; shift 2 ;;
*) echo "unknown argument: $1" >&2; exit 2 ;;
esac
done
[[ -n "$repo" && -n "$report" ]] || { echo "usage: $0 --repo <repo> --report <file>" >&2; exit 2; }
[[ -f "$report" ]] || { echo "::error::report ${report} not found"; exit 1; }

# Warn (don't fail) if the tag is already gone.
delete_tag() {
crane delete "${repo}:$1" && echo " deleted ${repo}:$1" || echo "::warning::failed to delete $1"
}

# A GC'd component keeps a resolvable stage tag, so werf reuses the stage and
# re-reports the dead digest. The dead digest can't be deleted, but the tag can:
# drop every stage by tag so werf rebuilds and re-pushes a live image.
while read -r img; do
final="$(jq -r --arg i "$img" '.Images[$i].DockerImageDigest // empty' "$report")"
[[ -n "$final" ]] || continue
crane digest "${repo}@${final}" >/dev/null 2>&1 && continue
echo "broken: ${img} — deleting its stages"
while read -r t; do
[[ -n "$t" ]] || continue
delete_tag "$t"
done < <(jq -r --arg i "$img" '.Images[$i].Stages[].DockerTag // empty' "$report")
done < <(jq -r '.Images | to_entries[] | select(.value.Final == true) | .key' "$report")

# Regenerate the digests chain so fresh component digests reach the module :tag.
for img in images-digests prepare-bundle; do
t="$(jq -r --arg i "$img" '.Images[$i].DockerTag // empty' "$report")"
[[ -n "$t" ]] && delete_tag "$t" || echo "::warning::no tag for ${img} in report"
done
18 changes: 15 additions & 3 deletions .github/scripts/bash/e2e/cleanup-nightly-resources.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ source "${SCRIPT_DIR}/common.sh"
LABEL_SELECTOR="${LABEL_SELECTOR:-test=nightly-e2e}"
KEEP_HOURS="${KEEP_HOURS:-47}"
FRIDAY_KEEP_HOURS="${FRIDAY_KEEP_HOURS:-71}"
# sds-elastic (Ceph) nested clusters are heavy, so they are torn down sooner (~1 day)
# and are not granted the Friday extension. Matched by storage type in the resource name.
ELASTIC_KEEP_HOURS="${ELASTIC_KEEP_HOURS:-23}"
ELASTIC_NAME_PATTERN="${ELASTIC_NAME_PATTERN:-sds-elastic}"

current_date_seconds="$(date -u +%s)"

Expand All @@ -35,20 +39,28 @@ collect_items_json() {

should_keep() {
local created_at="$1"
local name="$2"
local resource_created_at_seconds
local age_seconds
local weekday_of_day
local keep_hours="${KEEP_HOURS}"
local friday_keep_hours="${FRIDAY_KEEP_HOURS}"

if [[ "${name}" == *"${ELASTIC_NAME_PATTERN}"* ]]; then
keep_hours="${ELASTIC_KEEP_HOURS}"
friday_keep_hours="${ELASTIC_KEEP_HOURS}"
fi

resource_created_at_seconds="$(date -d "${created_at}" -u +%s)"
age_seconds="$(( current_date_seconds - resource_created_at_seconds ))"
weekday_of_day="$(date -d "${created_at}" -u +%u)"

if [ "${age_seconds}" -lt "$(( KEEP_HOURS * 3600 ))" ]; then
if [ "${age_seconds}" -lt "$(( keep_hours * 3600 ))" ]; then
echo "keep"
return 0
fi

if [ "${weekday_of_day}" -eq 5 ] && [ "${age_seconds}" -lt "$(( FRIDAY_KEEP_HOURS * 3600 ))" ]; then
if [ "${weekday_of_day}" -eq 5 ] && [ "${age_seconds}" -lt "$(( friday_keep_hours * 3600 ))" ]; then
echo "keep"
return 0
fi
Expand All @@ -69,7 +81,7 @@ cleanup_kind() {
created_at="$(echo "${item}" | jq -r '.created_at')"
[ -z "${name}" ] && continue

decision="$(should_keep "${created_at}")"
decision="$(should_keep "${created_at}" "${name}")"
if [ "${decision}" = "keep" ]; then
printf "%-63s %22s\n" "[INFO] Keep ${kind}/${name}:" "created_at ${created_at}"
continue
Expand Down
Loading
Loading