kubevirt / containerized-data-importer

Data Import Service for kubernetes, designed with kubevirt in mind.
Apache License 2.0
413 stars 259 forks source link

Labels derived from env vars on containerdisks are not set on imported PVC when using populators #3315

Closed 0xFelix closed 3 months ago

0xFelix commented 3 months ago

What happened:

When using import populators, there seems to be race condition between the controllers and the env vars set on containerdisks are not set on the final imported PVC. However, they are visible on the intermediate prime PVCs.

The controller logs show the following:

2024-06-12T13:00:00Z    ERROR   controller.datavolume-import-controller unable to update datavolume status      {"name": "example-import-dv", "error": "Operation cannot be fulfilled on datavolumes.cdi.kubevirt.io \"example-import-dv\": the object has been modified; please apply your changes to the latest version and try again"}
kubevirt.io/containerized-data-importer/pkg/controller/datavolume.(*ReconcilerBase).emitEvent
        pkg/controller/datavolume/controller-base.go:1081
kubevirt.io/containerized-data-importer/pkg/controller/datavolume.(*ReconcilerBase).updateStatus
        pkg/controller/datavolume/controller-base.go:978
kubevirt.io/containerized-data-importer/pkg/controller/datavolume.(*ReconcilerBase).reconcile
        pkg/controller/datavolume/controller-base.go:457
kubevirt.io/containerized-data-importer/pkg/controller/datavolume.(*ImportReconciler).Reconcile
        pkg/controller/datavolume/import-controller.go:184
kubevirt.io/containerized-data-importer/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).Reconcile
        vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go:119
kubevirt.io/containerized-data-importer/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).reconcileHandler
        vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go:316
kubevirt.io/containerized-data-importer/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem
        vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go:266
kubevirt.io/containerized-data-importer/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).Start.func2.2
        vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go:227
2024-06-12T13:00:00Z    ERROR   Reconciler error        {"controller": "datavolume-import-controller", "object": {"name":"example-import-dv","namespace":"default"}, "namespace": "default", "name": "example-import-dv", "reconcileID": "8d3a750d-9320-4ee8-aa3a-f53ca2796af9", "error": "Operation cannot be fulfilled on datavolumes.cdi.kubevirt.io \"example-import-dv\": the object has been modified; please apply your changes to the latest version and try again"}
kubevirt.io/containerized-data-importer/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).reconcileHandler
        vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go:329
kubevirt.io/containerized-data-importer/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem
        vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go:266
kubevirt.io/containerized-data-importer/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).Start.func2.2
        vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go:227
2024-06-12T13:00:00Z    DEBUG   controller.import-populator     reconciling Import Source PVCs  {"PVC": {"name":"example-import-dv","namespace":"default"}}

Strangely, in the func tests it still works. (see https://github.com/kubevirt/containerized-data-importer/blob/03bac05833925334994f2a8ecfdcdca97c6c28a2/tests/import_test.go#L2156)

What you expected to happen:

Labels derived from env vars on containerdisks are set on imported PVCs when using populators.

How to reproduce it (as minimally and precisely as possible):

See description of #3103

+

export KUBEVIRT_MEMORY_SIZE=16G
export KUBEVIRT_STORAGE=rook-ceph-default

Additional context: Add any other context about the problem here.

Environment:

0xFelix commented 3 months ago

The issue turns out to be a too restrictive regex here:

https://github.com/kubevirt/containerized-data-importer/blob/0e750262a3590e8d70a0dd6d20532b388fdfc8f5/pkg/controller/populators/populator-base.go#L67

It matches test.kubevirt.io/test but not instancetype.kubevirt.io/default-preference.

Thanks to @akalenyu

I'll come up with a fix.