virtink icon indicating copy to clipboard operation
virtink copied to clipboard

VirtualMachineMigration webhook panic

Open maxpain opened this issue 2 months ago • 1 comments

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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/pkg/webhook/admission/webhook.go:181
sigs.k8s.io/controller-runtime/pkg/webhook/admission.(*Webhook).ServeHTTP
	/go/pkg/mod/sigs.k8s.io/[email protected]/pkg/webhook/admission/http.go:119
sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics.InstrumentedHook.InstrumentHandlerInFlight.func1
	/go/pkg/mod/github.com/prometheus/[email protected]/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/[email protected]/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/[email protected]/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

maxpain avatar Oct 04 '25 09:10 maxpain

It should be easy to locate the bug using the stack trace above. Could you send us a PR please?

fengye87 avatar Oct 09 '25 02:10 fengye87