Skip to content

VirtualMachineMigration webhook panic #110

@maxpain

Description

@maxpain

Description

When I try to live-migrate a VM, the VirtualMachineMigration resource is rejected by the admission webhook with a nil pointer panic.

Steps to reproduce

  1. Create the following VM:
apiVersion: virt.virtink.smartx.com/v1alpha1
kind: VirtualMachine
metadata:
  name: ubuntu-container-rootfs
  namespace: kube-system
spec:
  instance:
    memory:
      size: 1Gi
    kernel:
      image: smartxworks/virtink-kernel-5.15.12
      cmdline: "console=ttyS0 root=/dev/vda rw"
    disks:
      - name: ubuntu
      - name: cloud-init
    interfaces:
      - name: pod
  volumes:
    - name: ubuntu
      containerRootfs:
        image: smartxworks/virtink-container-rootfs-ubuntu
        size: 4Gi
    - name: cloud-init
      cloudInit:
        userData: |-
          #cloud-config
          password: password
          chpasswd: { expire: False }
          ssh_pwauth: True
  networks:
    - name: pod
      pod: {}
  1. Create the following VirtualMachineMigration:
apiVersion: virt.virtink.smartx.com/v1alpha1
kind: VirtualMachineMigration
metadata:
  generateName: ubuntu-container-rootfs-migration-
  namespace: kube-system
spec:
  vmName: ubuntu-container-rootfs

Expected behavior

Migration CR should be created successfully.

Actual behavior

Webhook crashes with panic:

Error from server: error when creating "../vm-migration.yaml": admission webhook "validate.virtualmachinemigration.v1alpha1.virt.virtink.smartx.com" denied the request: panic: runtime error: invalid memory address or nil pointer dereference [recovered]

virt-controller logs:

2025-10-04T09:20:23.872Z	ERROR	admission	Observed a panic	{"object": {"name":"ubuntu-container-rootfs-migration-6zqkv","namespace":"kube-system"}, "namespace": "kube-system", "name": "ubuntu-container-rootfs-migration-6zqkv", "resource": {"group":"virt.virtink.smartx.com","version":"v1alpha1","resource":"virtualmachinemigrations"}, "user": "admin", "requestID": "775f660e-1f81-4fc7-8675-5c74a84b5c4a", "panic": "runtime error: invalid memory address or nil pointer dereference", "panicGoValue": "\"invalid memory address or nil pointer dereference\"", "stacktrace": "goroutine 2210 [running]:\nk8s.io/apimachinery/pkg/util/runtime.logPanic({0x1d794a0, 0xc000d37380}, {0x188c1a0, 0x2adb120})\n\t/go/pkg/mod/k8s.io/apimachinery@v0.31.3/pkg/util/runtime/runtime.go:107 +0xbc\nsigs.k8s.io/controller-runtime/pkg/webhook/admission.(*Webhook).Handle.func1()\n\t/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.19.3/pkg/webhook/admission/webhook.go:163 +0x103\npanic({0x188c1a0?, 0x2adb120?})\n\t/usr/local/go/src/runtime/panic.go:785 +0x132\ngithub.com/smartxworks/virtink/pkg/controller.ValidateVMName({0x1d794a0, 0xc000d37380}, {0x0, 0x0}, {0xc0008a8920, 0xb}, {0xc0006bf290, 0x17}, 0xc000d37470)\n\t/workspace/pkg/controller/vmm_webhook.go:103 +0x198\ngithub.com/smartxworks/virtink/pkg/controller.ValidateVMMSpec({0x1d794a0, 0xc000d37380}, {0x0, 0x0}, {0xc0008a8920, 0xb}, 0xc0008f7c88, 0xc000d37440)\n\t/workspace/pkg/controller/vmm_webhook.go:90 +0x1fd\ngithub.com/smartxworks/virtink/pkg/controller.ValidateVMM({0x1d794a0, 0xc000d37380}, {0x0, 0x0}, 0xc0008f7b80, 0x8?)\n\t/workspace/pkg/controller/vmm_webhook.go:80 +0x9b\ngithub.com/smartxworks/virtink/pkg/controller.(*VMMValidator).Handle(_, {_, _}, {{{0xc00108c780, 0x24}, {{0xc0006bf158, 0x17}, {0xc0008a8838, 0x8}, {0xc0006bf170, ...}}, ...}})\n\t/workspace/pkg/controller/vmm_webhook.go:52 +0x239\nsigs.k8s.io/controller-runtime/pkg/webhook/admission.(*Webhook).Handle(_, {_, _}, {{{0xc00108c780, 0x24}, {{0xc0006bf158, 0x17}, {0xc0008a8838, 0x8}, {0xc0006bf170, ...}}, ...}})\n\t/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.19.3/pkg/webhook/admission/webhook.go:181 +0x224\nsigs.k8s.io/controller-runtime/pkg/webhook/admission.(*Webhook).ServeHTTP(0xc0009f94a0, {0x7fb856c84a78, 0xc0007918b0}, 0xc000c55040)\n\t/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.19.3/pkg/webhook/admission/http.go:119 +0xaf0\nsigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics.InstrumentedHook.InstrumentHandlerInFlight.func1({0x7fb856c84a78, 0xc0007918b0}, 0xc000c55040)\n\t/go/pkg/mod/github.com/prometheus/client_golang@v1.20.5/prometheus/promhttp/instrument_server.go:60 +0xbc\nnet/http.HandlerFunc.ServeHTTP(0x2ae1fb0?, {0x7fb856c84a78?, 0xc0007918b0?}, 0xc000e00008?)\n\t/usr/local/go/src/net/http/server.go:2220 +0x29\ngithub.com/prometheus/client_golang/prometheus/promhttp.InstrumentHandlerCounter.func1({0x1d6bec0?, 0xc0003c0d20?}, 0xc000c55040)\n\t/go/pkg/mod/github.com/prometheus/client_golang@v1.20.5/prometheus/promhttp/instrument_server.go:147 +0xc3\nnet/http.HandlerFunc.ServeHTTP(0x40?, {0x1d6bec0?, 0xc0003c0d20?}, 0xc000e93a20?)\n\t/usr/local/go/src/net/http/server.go:2220 +0x29\ngithub.com/prometheus/client_golang/prometheus/promhttp.InstrumentHandlerDuration.func2({0x1d6bec0, 0xc0003c0d20}, 0xc000c55040)\n\t/go/pkg/mod/github.com/prometheus/client_golang@v1.20.5/prometheus/promhttp/instrument_server.go:109 +0xc2\nnet/http.HandlerFunc.ServeHTTP(0xc0003c1420?, {0x1d6bec0?, 0xc0003c0d20?}, 0x3?)\n\t/usr/local/go/src/net/http/server.go:2220 +0x29\nnet/http.(*ServeMux).ServeHTTP(0x410845?, {0x1d6bec0, 0xc0003c0d20}, 0xc000c55040)\n\t/usr/local/go/src/net/http/server.go:2747 +0x1ca\nnet/http.serverHandler.ServeHTTP({0x1d64d90?}, {0x1d6bec0?, 0xc0003c0d20?}, 0x6?)\n\t/usr/local/go/src/net/http/server.go:3210 +0x8e\nnet/http.(*conn).serve(0xc00099cea0, {0x1d794a0, 0xc00088a240})\n\t/usr/local/go/src/net/http/server.go:2092 +0x5d0\ncreated by net/http.(*Server).Serve in goroutine 330\n\t/usr/local/go/src/net/http/server.go:3360 +0x485\n"}
runtime.sigpanic
	/usr/local/go/src/runtime/signal_unix.go:917
github.com/smartxworks/virtink/pkg/controller.ValidateVMName
	/workspace/pkg/controller/vmm_webhook.go:103
github.com/smartxworks/virtink/pkg/controller.ValidateVMMSpec
	/workspace/pkg/controller/vmm_webhook.go:90
github.com/smartxworks/virtink/pkg/controller.ValidateVMM
	/workspace/pkg/controller/vmm_webhook.go:80
github.com/smartxworks/virtink/pkg/controller.(*VMMValidator).Handle
	/workspace/pkg/controller/vmm_webhook.go:52
sigs.k8s.io/controller-runtime/pkg/webhook/admission.(*Webhook).Handle
	/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.19.3/pkg/webhook/admission/webhook.go:181
sigs.k8s.io/controller-runtime/pkg/webhook/admission.(*Webhook).ServeHTTP
	/go/pkg/mod/sigs.k8s.io/controller-runtime@v0.19.3/pkg/webhook/admission/http.go:119
sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics.InstrumentedHook.InstrumentHandlerInFlight.func1
	/go/pkg/mod/github.com/prometheus/client_golang@v1.20.5/prometheus/promhttp/instrument_server.go:60
net/http.HandlerFunc.ServeHTTP
	/usr/local/go/src/net/http/server.go:2220
github.com/prometheus/client_golang/prometheus/promhttp.InstrumentHandlerCounter.func1
	/go/pkg/mod/github.com/prometheus/client_golang@v1.20.5/prometheus/promhttp/instrument_server.go:147
net/http.HandlerFunc.ServeHTTP
	/usr/local/go/src/net/http/server.go:2220
github.com/prometheus/client_golang/prometheus/promhttp.InstrumentHandlerDuration.func2
	/go/pkg/mod/github.com/prometheus/client_golang@v1.20.5/prometheus/promhttp/instrument_server.go:109
net/http.HandlerFunc.ServeHTTP
	/usr/local/go/src/net/http/server.go:2220
net/http.(*ServeMux).ServeHTTP
	/usr/local/go/src/net/http/server.go:2747
net/http.serverHandler.ServeHTTP
	/usr/local/go/src/net/http/server.go:3210
net/http.(*conn).serve
	/usr/local/go/src/net/http/server.go:2092

Environment

  • virtink v0.17.0
  • Talos Linux v1.12.0-alpha.1 with Linux Kernel 6.16.9
  • Kubernetes v1.34.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions