From 6c5fa4102cf07fe1a3581b05c4fe52ee3f470eb9 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 14:59:50 +0200 Subject: [PATCH 01/28] fix(dvcr): Filesystem dataSource for importer Signed-off-by: Daniil Antoshin fix Signed-off-by: Daniil Antoshin update Signed-off-by: Daniil Antoshin get pvc Signed-off-by: Daniil Antoshin --- .../pkg/datasource/filesystem-datasource.go | 75 +++++++++++++++++++ images/dvcr-artifact/pkg/importer/importer.go | 7 ++ .../cvi/internal/source/object_ref_vd.go | 24 +++++- .../internal/source/object_ref_vdsnapshot.go | 12 ++- .../pkg/controller/importer/importer_pod.go | 26 +++---- .../pkg/controller/importer/settings.go | 7 ++ .../vi/internal/source/object_ref_vd.go | 23 +++++- .../source/object_ref_vdsnapshot_cr.go | 2 +- .../internal/source/step/create_pod_step.go | 21 +++++- 9 files changed, 170 insertions(+), 27 deletions(-) create mode 100644 images/dvcr-artifact/pkg/datasource/filesystem-datasource.go diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go new file mode 100644 index 0000000000..ed033beaed --- /dev/null +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -0,0 +1,75 @@ +/* +Copyright 2024 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. +*/ + +package datasource + +import ( + "fmt" + "io" + "os" + + "github.com/google/uuid" +) + +type FilesystemDataSource struct { + readCloser io.ReadCloser + sourceImageSize int64 + sourceImageFilename string +} + +func NewFilesystemDataSource() (*FilesystemDataSource, error) { + filesystemImagePath := "/tmp/fs/disk.img" + + file, err := os.Open(filesystemImagePath) + if err != nil { + return nil, fmt.Errorf("can not get open image %s: %w", filesystemImagePath, err) + } + + sourceImageSize, err := file.Seek(0, io.SeekEnd) + if err != nil { + return nil, fmt.Errorf("error seeking to end: %w", err) + } + + _, err = file.Seek(0, io.SeekStart) + if err != nil { + return nil, fmt.Errorf("error seeking to start: %w", err) + } + + uuid, _ := uuid.NewUUID() + sourceImageFilename := uuid.String() + ".img" + + return &FilesystemDataSource{ + readCloser: file, + sourceImageSize: sourceImageSize, + sourceImageFilename: sourceImageFilename, + }, nil +} + +func (ds *FilesystemDataSource) ReadCloser() (io.ReadCloser, error) { + return ds.readCloser, nil +} + +func (ds *FilesystemDataSource) Length() (int, error) { + return int(ds.sourceImageSize), nil +} + +func (ds *FilesystemDataSource) Filename() (string, error) { + return ds.sourceImageFilename, nil +} + +func (ds *FilesystemDataSource) Close() error { + return ds.readCloser.Close() +} diff --git a/images/dvcr-artifact/pkg/importer/importer.go b/images/dvcr-artifact/pkg/importer/importer.go index a544a77f4e..a21fe574e5 100644 --- a/images/dvcr-artifact/pkg/importer/importer.go +++ b/images/dvcr-artifact/pkg/importer/importer.go @@ -49,6 +49,7 @@ const ( DockerRegistrySchemePrefix = "docker://" DVCRSource = "dvcr" BlockDeviceSource = "blockDevice" + FilesystemSource = "filesystem" ) func New() *Importer { @@ -201,6 +202,12 @@ func (i *Importer) newDataSource(_ context.Context) (datasource.DataSourceInterf if err != nil { return nil, fmt.Errorf("error creating block device data source: %w", err) } + case FilesystemSource: + var err error + result, err = datasource.NewFilesystemDataSource() + if err != nil { + return nil, fmt.Errorf("error creating filesystem data source: %w", err) + } default: return nil, fmt.Errorf("unknown source type: %s", i.srcType) } diff --git a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go index 8faf025d12..56f8016e00 100644 --- a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go @@ -25,6 +25,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -111,7 +112,18 @@ func (ds ObjectRefVirtualDisk) Sync(ctx context.Context, cvi *v1alpha2.ClusterVi cvi.Status.Progress = ds.statService.GetProgress(cvi.GetUID(), pod, cvi.Status.Progress) cvi.Status.Target.RegistryURL = ds.statService.GetDVCRImageName(pod) - envSettings := ds.getEnvSettings(cvi, supgen) + var pvc *corev1.PersistentVolumeClaim + err := ds.client.Get(ctx, types.NamespacedName{Name: vdRef.Status.Target.PersistentVolumeClaim, Namespace: vdRef.Namespace}, pvc) + if err != nil { + return reconcile.Result{}, err + } + + var envSettings *importer.Settings + if pvc.Spec.VolumeMode != nil { + envSettings = ds.getEnvSettings(cvi, supgen, pvc.Spec.VolumeMode) + } else { + envSettings = ds.getEnvSettings(cvi, supgen, ptr.To(corev1.PersistentVolumeBlock)) + } ownerRef := metav1.NewControllerRef(cvi, cvi.GroupVersionKind()) podSettings := ds.importerService.GetPodSettingsWithPVC(ownerRef, supgen, vdRef.Status.Target.PersistentVolumeClaim, vdRef.Namespace) @@ -216,9 +228,15 @@ func (ds ObjectRefVirtualDisk) CleanUp(ctx context.Context, cvi *v1alpha2.Cluste return ds.importerService.DeletePod(ctx, cvi, controllerName, supgen) } -func (ds ObjectRefVirtualDisk) getEnvSettings(cvi *v1alpha2.ClusterVirtualImage, sup supplements.Generator) *importer.Settings { +func (ds ObjectRefVirtualDisk) getEnvSettings(cvi *v1alpha2.ClusterVirtualImage, sup supplements.Generator, volumeMode *corev1.PersistentVolumeMode) *importer.Settings { var settings importer.Settings - importer.ApplyBlockDeviceSourceSettings(&settings) + + if volumeMode != nil && *volumeMode == corev1.PersistentVolumeFilesystem { + importer.ApplyFilesystemSourceSettings(&settings) + } else { + importer.ApplyBlockDeviceSourceSettings(&settings) + } + importer.ApplyDVCRDestinationSettings( &settings, ds.dvcrSettings, diff --git a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vdsnapshot.go b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vdsnapshot.go index 4064d59a5e..824ca54481 100644 --- a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vdsnapshot.go +++ b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vdsnapshot.go @@ -207,7 +207,7 @@ func (ds ObjectRefVirtualDiskSnapshot) Sync(ctx context.Context, cvi *v1alpha2.C cvi.Status.Progress = ds.statService.GetProgress(cvi.GetUID(), pod, cvi.Status.Progress) cvi.Status.Target.RegistryURL = ds.statService.GetDVCRImageName(pod) - envSettings := ds.getEnvSettings(cvi, supgen) + envSettings := ds.getEnvSettings(cvi, supgen, pvc.Spec.VolumeMode) ownerRef := metav1.NewControllerRef(cvi, cvi.GroupVersionKind()) podSettings := ds.importerService.GetPodSettingsWithPVC(ownerRef, supgen, pvc.Name, pvc.Namespace) @@ -358,9 +358,15 @@ func (ds ObjectRefVirtualDiskSnapshot) CleanUp(ctx context.Context, cvi *v1alpha return importerRequeue || diskRequeue, nil } -func (ds ObjectRefVirtualDiskSnapshot) getEnvSettings(cvi *v1alpha2.ClusterVirtualImage, sup supplements.Generator) *importer.Settings { +func (ds ObjectRefVirtualDiskSnapshot) getEnvSettings(cvi *v1alpha2.ClusterVirtualImage, sup supplements.Generator, volumeMode *corev1.PersistentVolumeMode) *importer.Settings { var settings importer.Settings - importer.ApplyBlockDeviceSourceSettings(&settings) + + if volumeMode != nil && *volumeMode == corev1.PersistentVolumeFilesystem { + importer.ApplyFilesystemSourceSettings(&settings) + } else { + importer.ApplyBlockDeviceSourceSettings(&settings) + } + importer.ApplyDVCRDestinationSettings( &settings, ds.dvcrSettings, diff --git a/images/virtualization-artifact/pkg/controller/importer/importer_pod.go b/images/virtualization-artifact/pkg/controller/importer/importer_pod.go index 44d2ac912a..098ba2ac75 100644 --- a/images/virtualization-artifact/pkg/controller/importer/importer_pod.go +++ b/images/virtualization-artifact/pkg/controller/importer/importer_pod.go @@ -365,21 +365,19 @@ func (imp *Importer) addVolumes(pod *corev1.Pod, container *corev1.Container) { } if imp.PodSettings.PVCName != "" { - podutil.AddVolumeDevice( - pod, - container, - corev1.Volume{ - Name: "volume", - VolumeSource: corev1.VolumeSource{ - PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ - ClaimName: imp.PodSettings.PVCName, - }, + volume := corev1.Volume{ + Name: "volume", + VolumeSource: corev1.VolumeSource{ + PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ + ClaimName: imp.PodSettings.PVCName, }, }, - corev1.VolumeDevice{ - Name: "volume", - DevicePath: "/dev/xvda", - }, - ) + } + + if imp.EnvSettings.Source == SourceFilesystem { + podutil.AddVolume(pod, container, volume, corev1.VolumeMount{Name: "volume", MountPath: "/tmp/fs"}, corev1.EnvVar{Name: "IMPORTER_FILESYSTEM_DIR", Value: "/tmp/fs"}) + } else { + podutil.AddVolumeDevice(pod, container, volume, corev1.VolumeDevice{Name: "volume", DevicePath: "/dev/xvda"}) + } } } diff --git a/images/virtualization-artifact/pkg/controller/importer/settings.go b/images/virtualization-artifact/pkg/controller/importer/settings.go index 8a312f65b7..3560c7884e 100644 --- a/images/virtualization-artifact/pkg/controller/importer/settings.go +++ b/images/virtualization-artifact/pkg/controller/importer/settings.go @@ -33,6 +33,8 @@ const ( SourceDVCR = "dvcr" // SourceBlockDevice is the source type of block device SourceBlockDevice = "blockDevice" + // SourceFilesystem is the source type of filesystem + SourceFilesystem = "filesystem" ) // Settings stores all possible settings for dvcr-importer binary. @@ -132,3 +134,8 @@ func ApplyDVCRSourceSettings(podEnvVars *Settings, dvcrImageName string) { func ApplyBlockDeviceSourceSettings(podEnvVars *Settings) { podEnvVars.Source = SourceBlockDevice } + +// ApplyFilesystemSourceSettings updates importer Pod settings to use filesystem as source. +func ApplyFilesystemSourceSettings(podEnvVars *Settings) { + podEnvVars.Source = SourceFilesystem +} diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go index 344f45924a..399ccdbeb2 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/utils/ptr" cdiv1 "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -113,7 +114,17 @@ func (ds ObjectRefVirtualDisk) StoreToDVCR(ctx context.Context, vi *v1alpha2.Vir vi.Status.Progress = ds.statService.GetProgress(vi.GetUID(), pod, vi.Status.Progress) vi.Status.Target.RegistryURL = ds.statService.GetDVCRImageName(pod) - envSettings := ds.getEnvSettings(vi, supgen) + pvc, err := ds.diskService.GetPersistentVolumeClaim(ctx, supgen) + if err != nil { + return reconcile.Result{}, err + } + + var envSettings *importer.Settings + if pvc.Spec.VolumeMode != nil { + envSettings = ds.getEnvSettings(vi, supgen, pvc.Spec.VolumeMode) + } else { + envSettings = ds.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeBlock)) + } ownerRef := metav1.NewControllerRef(vi, vi.GroupVersionKind()) podSettings := ds.importerService.GetPodSettingsWithPVC(ownerRef, supgen, vdRef.Status.Target.PersistentVolumeClaim, vdRef.Namespace) @@ -411,9 +422,15 @@ func (ds ObjectRefVirtualDisk) CleanUp(ctx context.Context, vi *v1alpha2.Virtual return importerRequeue || diskRequeue, nil } -func (ds ObjectRefVirtualDisk) getEnvSettings(vi *v1alpha2.VirtualImage, sup supplements.Generator) *importer.Settings { +func (ds ObjectRefVirtualDisk) getEnvSettings(vi *v1alpha2.VirtualImage, sup supplements.Generator, volumeMode *corev1.PersistentVolumeMode) *importer.Settings { var settings importer.Settings - importer.ApplyBlockDeviceSourceSettings(&settings) + + if volumeMode != nil && *volumeMode == corev1.PersistentVolumeFilesystem { + importer.ApplyFilesystemSourceSettings(&settings) + } else { + importer.ApplyBlockDeviceSourceSettings(&settings) + } + importer.ApplyDVCRDestinationSettings( &settings, ds.dvcrSettings, diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr.go index 9478c42aee..02bbdc9f96 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr.go @@ -89,7 +89,7 @@ func (ds ObjectRefVirtualDiskSnapshotCR) Sync(ctx context.Context, vi *v1alpha2. step.NewReadyContainerRegistryStep(pod, ds.importer, ds.diskService, ds.stat, ds.recorder, cb), step.NewTerminatingStep(pvc), step.NewCreatePersistentVolumeClaimStep(pvc, ds.recorder, ds.client, cb), - step.NewCreatePodStep(pod, ds.dvcrSettings, ds.recorder, ds.importer, ds.stat, cb), + step.NewCreatePodStep(pod, pvc, ds.dvcrSettings, ds.recorder, ds.importer, ds.stat, cb), step.NewWaitForPodStep(pod, pvc, ds.stat, cb), ).Run(ctx, vi) } diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go index 9b28b8558e..a0966d04a5 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go @@ -23,6 +23,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/deckhouse/virtualization-controller/pkg/common" @@ -53,6 +54,7 @@ type CreatePodStepStat interface { type CreatePodStep struct { pod *corev1.Pod + pvc *corev1.PersistentVolumeClaim dvcrSettings *dvcr.Settings recorder eventrecord.EventRecorderLogger importer CreatePodStepImporter @@ -62,6 +64,7 @@ type CreatePodStep struct { func NewCreatePodStep( pod *corev1.Pod, + pvc *corev1.PersistentVolumeClaim, dvcrSettings *dvcr.Settings, recorder eventrecord.EventRecorderLogger, importer CreatePodStepImporter, @@ -70,6 +73,7 @@ func NewCreatePodStep( ) *CreatePodStep { return &CreatePodStep{ pod: pod, + pvc: pvc, dvcrSettings: dvcrSettings, recorder: recorder, importer: importer, @@ -88,7 +92,12 @@ func (s CreatePodStep) Take(ctx context.Context, vi *v1alpha2.VirtualImage) (*re pvcKey := supgen.PersistentVolumeClaim() podSettings := s.importer.GetPodSettingsWithPVC(ownerRef, supgen, pvcKey.Name, pvcKey.Namespace) - envSettings := s.getEnvSettings(vi, supgen) + var envSettings *importer.Settings + if s.pvc.Spec.VolumeMode != nil { + envSettings = s.getEnvSettings(vi, supgen, s.pvc.Spec.VolumeMode) + } else { + envSettings = s.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeBlock)) + } err := s.importer.StartWithPodSetting(ctx, envSettings, supgen, datasource.NewCABundleForVMI(vi.GetNamespace(), vi.Spec.DataSource), podSettings) switch { @@ -111,9 +120,15 @@ func (s CreatePodStep) Take(ctx context.Context, vi *v1alpha2.VirtualImage) (*re return nil, nil } -func (s CreatePodStep) getEnvSettings(vi *v1alpha2.VirtualImage, sup supplements.Generator) *importer.Settings { +func (s CreatePodStep) getEnvSettings(vi *v1alpha2.VirtualImage, sup supplements.Generator, volumeMode *corev1.PersistentVolumeMode) *importer.Settings { var settings importer.Settings - importer.ApplyBlockDeviceSourceSettings(&settings) + + if volumeMode != nil && *volumeMode == corev1.PersistentVolumeFilesystem { + importer.ApplyFilesystemSourceSettings(&settings) + } else { + importer.ApplyBlockDeviceSourceSettings(&settings) + } + importer.ApplyDVCRDestinationSettings( &settings, s.dvcrSettings, From aa7ac1a359db0b102afcaca868f653bea4389548 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 16:14:13 +0200 Subject: [PATCH 02/28] list files Signed-off-by: Daniil Antoshin --- .../pkg/datasource/filesystem-datasource.go | 19 +++++++++++++++++++ .../cvi/internal/source/object_ref_vd.go | 2 +- .../vi/internal/source/object_ref_vd.go | 5 +++-- .../internal/source/step/create_pod_step.go | 2 +- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index ed033beaed..d259443c3b 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -20,6 +20,7 @@ import ( "fmt" "io" "os" + "time" "github.com/google/uuid" ) @@ -33,6 +34,24 @@ type FilesystemDataSource struct { func NewFilesystemDataSource() (*FilesystemDataSource, error) { filesystemImagePath := "/tmp/fs/disk.img" + files, err := os.ReadDir("/tmp/fs") + if err != nil { + return nil, fmt.Errorf("can not read directory /tmp/fs: %w", err) + } + + for _, file := range files { + if file.IsDir() { + continue + } + filesystemImagePath = file.Name() + fmt.Printf("filesystemImagePath: %s\n", filesystemImagePath) + break + } + + for { + time.Sleep(10 * time.Second) + } + file, err := os.Open(filesystemImagePath) if err != nil { return nil, fmt.Errorf("can not get open image %s: %w", filesystemImagePath, err) diff --git a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go index 56f8016e00..4402b93d61 100644 --- a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go @@ -112,7 +112,7 @@ func (ds ObjectRefVirtualDisk) Sync(ctx context.Context, cvi *v1alpha2.ClusterVi cvi.Status.Progress = ds.statService.GetProgress(cvi.GetUID(), pod, cvi.Status.Progress) cvi.Status.Target.RegistryURL = ds.statService.GetDVCRImageName(pod) - var pvc *corev1.PersistentVolumeClaim + pvc := &corev1.PersistentVolumeClaim{} err := ds.client.Get(ctx, types.NamespacedName{Name: vdRef.Status.Target.PersistentVolumeClaim, Namespace: vdRef.Namespace}, pvc) if err != nil { return reconcile.Result{}, err diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go index 399ccdbeb2..626eebe1aa 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go @@ -114,13 +114,14 @@ func (ds ObjectRefVirtualDisk) StoreToDVCR(ctx context.Context, vi *v1alpha2.Vir vi.Status.Progress = ds.statService.GetProgress(vi.GetUID(), pod, vi.Status.Progress) vi.Status.Target.RegistryURL = ds.statService.GetDVCRImageName(pod) - pvc, err := ds.diskService.GetPersistentVolumeClaim(ctx, supgen) + pvc := &corev1.PersistentVolumeClaim{} + err := ds.client.Get(ctx, types.NamespacedName{Name: vdRef.Status.Target.PersistentVolumeClaim, Namespace: vdRef.Namespace}, pvc) if err != nil { return reconcile.Result{}, err } var envSettings *importer.Settings - if pvc.Spec.VolumeMode != nil { + if pvc != nil && pvc.Spec.VolumeMode != nil { envSettings = ds.getEnvSettings(vi, supgen, pvc.Spec.VolumeMode) } else { envSettings = ds.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeBlock)) diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go index a0966d04a5..7aaf456ecc 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go @@ -93,7 +93,7 @@ func (s CreatePodStep) Take(ctx context.Context, vi *v1alpha2.VirtualImage) (*re podSettings := s.importer.GetPodSettingsWithPVC(ownerRef, supgen, pvcKey.Name, pvcKey.Namespace) var envSettings *importer.Settings - if s.pvc.Spec.VolumeMode != nil { + if s.pvc != nil && s.pvc.Spec.VolumeMode != nil { envSettings = s.getEnvSettings(vi, supgen, s.pvc.Spec.VolumeMode) } else { envSettings = s.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeBlock)) From 98a3fca3912142425bfe19bf30976f6b40cd6f4a Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 17:06:49 +0200 Subject: [PATCH 03/28] update Signed-off-by: Daniil Antoshin --- images/dvcr-artifact/pkg/datasource/filesystem-datasource.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index d259443c3b..5033d58133 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -43,8 +43,7 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { if file.IsDir() { continue } - filesystemImagePath = file.Name() - fmt.Printf("filesystemImagePath: %s\n", filesystemImagePath) + fmt.Printf("filesystemImagePath: %s\n", file.Name()) break } From be460265f99c5b5ec41428a51bc428a7f31c75d5 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 17:08:27 +0200 Subject: [PATCH 04/28] fix Signed-off-by: Daniil Antoshin --- .../pkg/datasource/filesystem-datasource.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index 5033d58133..efd4873264 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -47,13 +47,14 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { break } - for { - time.Sleep(10 * time.Second) - } - file, err := os.Open(filesystemImagePath) + file, err := os.OpenFile(filesystemImagePath, os.O_RDONLY, 0) if err != nil { - return nil, fmt.Errorf("can not get open image %s: %w", filesystemImagePath, err) + fmt.Printf("can not get open image %s: %w", filesystemImagePath, err) + } + + for { + time.Sleep(10 * time.Second) } sourceImageSize, err := file.Seek(0, io.SeekEnd) From d922fbd39192018011471ef14ec9d0f17acafb5f Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 17:21:40 +0200 Subject: [PATCH 05/28] fix Signed-off-by: Daniil Antoshin --- .../pkg/datasource/filesystem-datasource.go | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index efd4873264..b0550db84a 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -17,9 +17,12 @@ limitations under the License. package datasource import ( + "context" + "encoding/json" "fmt" "io" "os" + "os/exec" "time" "github.com/google/uuid" @@ -47,24 +50,27 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { break } - file, err := os.OpenFile(filesystemImagePath, os.O_RDONLY, 0) if err != nil { fmt.Printf("can not get open image %s: %w", filesystemImagePath, err) } - for { - time.Sleep(10 * time.Second) + ctx := context.Background() + + type ImageInfo struct { + VirtualSize uint64 `json:"virtual-size"` + Format string `json:"format"` } + var imageInfo ImageInfo - sourceImageSize, err := file.Seek(0, io.SeekEnd) + cmd := exec.CommandContext(ctx, "qemu-img", "info", "--output=json", filesystemImagePath) + rawOut, err := cmd.Output() if err != nil { - return nil, fmt.Errorf("error seeking to end: %w", err) + return nil, fmt.Errorf("error running qemu-img info: %w", err) } - _, err = file.Seek(0, io.SeekStart) - if err != nil { - return nil, fmt.Errorf("error seeking to start: %w", err) + if err = json.Unmarshal(rawOut, &imageInfo); err != nil { + return nil, fmt.Errorf("error parsing qemu-img info output: %w", err) } uuid, _ := uuid.NewUUID() @@ -72,7 +78,7 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { return &FilesystemDataSource{ readCloser: file, - sourceImageSize: sourceImageSize, + sourceImageSize: int64(imageInfo.VirtualSize), sourceImageFilename: sourceImageFilename, }, nil } From c8db9ff592fd293a35eedba6e8b6ece4471f2801 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 17:32:01 +0200 Subject: [PATCH 06/28] fix Signed-off-by: Daniil Antoshin --- images/dvcr-artifact/pkg/datasource/filesystem-datasource.go | 1 - 1 file changed, 1 deletion(-) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index b0550db84a..c8284ec85b 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -23,7 +23,6 @@ import ( "io" "os" "os/exec" - "time" "github.com/google/uuid" ) From 3eb5abf3ef33bd782c7a977143175e6338866cfe Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 17:40:11 +0200 Subject: [PATCH 07/28] update Signed-off-by: Daniil Antoshin --- .../source/object_ref_vdsnapshot_cr.go | 2 +- .../internal/source/step/create_pod_step.go | 26 ++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr.go index 02bbdc9f96..176269f2c6 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr.go @@ -89,7 +89,7 @@ func (ds ObjectRefVirtualDiskSnapshotCR) Sync(ctx context.Context, vi *v1alpha2. step.NewReadyContainerRegistryStep(pod, ds.importer, ds.diskService, ds.stat, ds.recorder, cb), step.NewTerminatingStep(pvc), step.NewCreatePersistentVolumeClaimStep(pvc, ds.recorder, ds.client, cb), - step.NewCreatePodStep(pod, pvc, ds.dvcrSettings, ds.recorder, ds.importer, ds.stat, cb), + step.NewCreatePodStep(pod, ds.client, ds.dvcrSettings, ds.recorder, ds.importer, ds.stat, cb), step.NewWaitForPodStep(pod, pvc, ds.stat, cb), ).Run(ctx, vi) } diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go index 7aaf456ecc..858682f554 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go @@ -23,7 +23,9 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" "k8s.io/utils/ptr" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" "github.com/deckhouse/virtualization-controller/pkg/common" @@ -54,8 +56,8 @@ type CreatePodStepStat interface { type CreatePodStep struct { pod *corev1.Pod - pvc *corev1.PersistentVolumeClaim dvcrSettings *dvcr.Settings + client client.Client recorder eventrecord.EventRecorderLogger importer CreatePodStepImporter stat CreatePodStepStat @@ -64,7 +66,7 @@ type CreatePodStep struct { func NewCreatePodStep( pod *corev1.Pod, - pvc *corev1.PersistentVolumeClaim, + client client.Client, dvcrSettings *dvcr.Settings, recorder eventrecord.EventRecorderLogger, importer CreatePodStepImporter, @@ -73,7 +75,7 @@ func NewCreatePodStep( ) *CreatePodStep { return &CreatePodStep{ pod: pod, - pvc: pvc, + client: client, dvcrSettings: dvcrSettings, recorder: recorder, importer: importer, @@ -92,14 +94,26 @@ func (s CreatePodStep) Take(ctx context.Context, vi *v1alpha2.VirtualImage) (*re pvcKey := supgen.PersistentVolumeClaim() podSettings := s.importer.GetPodSettingsWithPVC(ownerRef, supgen, pvcKey.Name, pvcKey.Namespace) + vd := &v1alpha2.VirtualDisk{} + err := s.client.Get(ctx, types.NamespacedName{Name: vi.Spec.DataSource.ObjectRef.Name, Namespace: vi.Namespace}, vd) + if err != nil { + return &reconcile.Result{}, err + } + + pvc := &corev1.PersistentVolumeClaim{} + err = s.client.Get(ctx, types.NamespacedName{Name: vd.Status.Target.PersistentVolumeClaim, Namespace: vd.Namespace}, pvc) + if err != nil { + return &reconcile.Result{}, err + } + var envSettings *importer.Settings - if s.pvc != nil && s.pvc.Spec.VolumeMode != nil { - envSettings = s.getEnvSettings(vi, supgen, s.pvc.Spec.VolumeMode) + if pvc != nil && pvc.Spec.VolumeMode != nil { + envSettings = s.getEnvSettings(vi, supgen, pvc.Spec.VolumeMode) } else { envSettings = s.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeBlock)) } - err := s.importer.StartWithPodSetting(ctx, envSettings, supgen, datasource.NewCABundleForVMI(vi.GetNamespace(), vi.Spec.DataSource), podSettings) + err = s.importer.StartWithPodSetting(ctx, envSettings, supgen, datasource.NewCABundleForVMI(vi.GetNamespace(), vi.Spec.DataSource), podSettings) switch { case err == nil: // OK. From 625403d64c95e05b4795e69359cc0a5ca81ddf22 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 17:43:11 +0200 Subject: [PATCH 08/28] fix Signed-off-by: Daniil Antoshin --- .../pkg/datasource/filesystem-datasource.go | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index c8284ec85b..ecab098571 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -35,23 +35,9 @@ type FilesystemDataSource struct { func NewFilesystemDataSource() (*FilesystemDataSource, error) { filesystemImagePath := "/tmp/fs/disk.img" - - files, err := os.ReadDir("/tmp/fs") - if err != nil { - return nil, fmt.Errorf("can not read directory /tmp/fs: %w", err) - } - - for _, file := range files { - if file.IsDir() { - continue - } - fmt.Printf("filesystemImagePath: %s\n", file.Name()) - break - } - file, err := os.OpenFile(filesystemImagePath, os.O_RDONLY, 0) if err != nil { - fmt.Printf("can not get open image %s: %w", filesystemImagePath, err) + return nil, fmt.Errorf("can not get open image %s: %w", filesystemImagePath, err) } ctx := context.Background() From 79eed482ad17fc9ca9954743cc0816fb460d3321 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 17:51:05 +0200 Subject: [PATCH 09/28] combined output Signed-off-by: Daniil Antoshin --- .../dvcr-artifact/pkg/datasource/filesystem-datasource.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index ecab098571..9b96abbbeb 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -51,6 +51,12 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { cmd := exec.CommandContext(ctx, "qemu-img", "info", "--output=json", filesystemImagePath) rawOut, err := cmd.Output() if err != nil { + rawOut, err = cmd.CombinedOutput() + if err != nil { + return nil, fmt.Errorf("error running qemu-img info: %w", err) + } + fmt.Printf("qemu-img command output: %s\n", string(rawOut)) + return nil, fmt.Errorf("error running qemu-img info: %w", err) } From 827914b32b1b999f9bb50ddb82db6953d09c8143 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 17:52:44 +0200 Subject: [PATCH 10/28] fix Signed-off-by: Daniil Antoshin --- images/dvcr-artifact/pkg/datasource/filesystem-datasource.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index 9b96abbbeb..2dfe11e363 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -23,6 +23,7 @@ import ( "io" "os" "os/exec" + "time" "github.com/google/uuid" ) @@ -67,6 +68,10 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { uuid, _ := uuid.NewUUID() sourceImageFilename := uuid.String() + ".img" + for { + time.Sleep(time.Second) + } + return &FilesystemDataSource{ readCloser: file, sourceImageSize: int64(imageInfo.VirtualSize), From 0b6d952052cb5cf71c131bbe5833e26a402571ec Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 17:53:30 +0200 Subject: [PATCH 11/28] test Signed-off-by: Daniil Antoshin --- .../pkg/datasource/filesystem-datasource.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index 2dfe11e363..2a6ee4ae7d 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -69,6 +69,20 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { sourceImageFilename := uuid.String() + ".img" for { + cmd := exec.CommandContext(ctx, "qemu-img", "info", "--output=json", filesystemImagePath) + rawOut, err := cmd.Output() + if err != nil { + rawOut, err = cmd.CombinedOutput() + if err != nil { + return nil, fmt.Errorf("error running qemu-img info: %w", err) + } + fmt.Printf("qemu-img command output: %s\n", string(rawOut)) + + return nil, fmt.Errorf("error running qemu-img info: %w", err) + } + + fmt.Printf("qemu-img command output: %s\n", string(rawOut)) + time.Sleep(time.Second) } From 34bf564bde6c3a6d835bc5beab153fe5dd77ecd3 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 18:03:27 +0200 Subject: [PATCH 12/28] fix Signed-off-by: Daniil Antoshin --- .../pkg/datasource/filesystem-datasource.go | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index 2a6ee4ae7d..6d2b2ae35d 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -35,13 +35,32 @@ type FilesystemDataSource struct { } func NewFilesystemDataSource() (*FilesystemDataSource, error) { + ctx := context.Background() filesystemImagePath := "/tmp/fs/disk.img" + + for { + cmd := exec.CommandContext(ctx, "qemu-img", "info", "--output=json", filesystemImagePath) + rawOut, err := cmd.Output() + if err != nil { + rawOut, err = cmd.CombinedOutput() + if err != nil { + fmt.Printf("inner error running qemu-img info: %w\n", err) + } + fmt.Printf("qemu-img command output: %s\n", string(rawOut)) + + fmt.Printf("error running qemu-img info: %w\n", err) + } + + fmt.Printf("qemu-img command output: %s\n", string(rawOut)) + + time.Sleep(time.Second) + } + file, err := os.OpenFile(filesystemImagePath, os.O_RDONLY, 0) if err != nil { return nil, fmt.Errorf("can not get open image %s: %w", filesystemImagePath, err) } - ctx := context.Background() type ImageInfo struct { VirtualSize uint64 `json:"virtual-size"` @@ -49,6 +68,7 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { } var imageInfo ImageInfo + cmd := exec.CommandContext(ctx, "qemu-img", "info", "--output=json", filesystemImagePath) rawOut, err := cmd.Output() if err != nil { @@ -68,24 +88,6 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { uuid, _ := uuid.NewUUID() sourceImageFilename := uuid.String() + ".img" - for { - cmd := exec.CommandContext(ctx, "qemu-img", "info", "--output=json", filesystemImagePath) - rawOut, err := cmd.Output() - if err != nil { - rawOut, err = cmd.CombinedOutput() - if err != nil { - return nil, fmt.Errorf("error running qemu-img info: %w", err) - } - fmt.Printf("qemu-img command output: %s\n", string(rawOut)) - - return nil, fmt.Errorf("error running qemu-img info: %w", err) - } - - fmt.Printf("qemu-img command output: %s\n", string(rawOut)) - - time.Sleep(time.Second) - } - return &FilesystemDataSource{ readCloser: file, sourceImageSize: int64(imageInfo.VirtualSize), From bae598699092517fc110d0d468aeb26be85bc394 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 18:19:20 +0200 Subject: [PATCH 13/28] fix Signed-off-by: Daniil Antoshin --- .../pkg/datasource/filesystem-datasource.go | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index 6d2b2ae35d..ad7c77b89a 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -40,19 +40,11 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { for { cmd := exec.CommandContext(ctx, "qemu-img", "info", "--output=json", filesystemImagePath) - rawOut, err := cmd.Output() + rawOut, err := cmd.CombinedOutput() if err != nil { - rawOut, err = cmd.CombinedOutput() - if err != nil { - fmt.Printf("inner error running qemu-img info: %w\n", err) - } fmt.Printf("qemu-img command output: %s\n", string(rawOut)) - - fmt.Printf("error running qemu-img info: %w\n", err) } - fmt.Printf("qemu-img command output: %s\n", string(rawOut)) - time.Sleep(time.Second) } @@ -61,23 +53,15 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { return nil, fmt.Errorf("can not get open image %s: %w", filesystemImagePath, err) } - type ImageInfo struct { VirtualSize uint64 `json:"virtual-size"` Format string `json:"format"` } var imageInfo ImageInfo - cmd := exec.CommandContext(ctx, "qemu-img", "info", "--output=json", filesystemImagePath) - rawOut, err := cmd.Output() + rawOut, err := cmd.CombinedOutput() if err != nil { - rawOut, err = cmd.CombinedOutput() - if err != nil { - return nil, fmt.Errorf("error running qemu-img info: %w", err) - } - fmt.Printf("qemu-img command output: %s\n", string(rawOut)) - return nil, fmt.Errorf("error running qemu-img info: %w", err) } From a04d0ad507b8fead6412d185e72056b86cebf379 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 18:25:41 +0200 Subject: [PATCH 14/28] fix Signed-off-by: Daniil Antoshin --- .../controller/vi/internal/source/step/create_pod_step.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go index 858682f554..5e07309974 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go @@ -94,8 +94,14 @@ func (s CreatePodStep) Take(ctx context.Context, vi *v1alpha2.VirtualImage) (*re pvcKey := supgen.PersistentVolumeClaim() podSettings := s.importer.GetPodSettingsWithPVC(ownerRef, supgen, pvcKey.Name, pvcKey.Namespace) + vds := &v1alpha2.VirtualDiskSnapshot{} + err := s.client.Get(ctx, types.NamespacedName{Name: vi.Spec.DataSource.ObjectRef.Name, Namespace: vi.Namespace}, vds) + if err != nil { + return &reconcile.Result{}, err + } + vd := &v1alpha2.VirtualDisk{} - err := s.client.Get(ctx, types.NamespacedName{Name: vi.Spec.DataSource.ObjectRef.Name, Namespace: vi.Namespace}, vd) + err = s.client.Get(ctx, types.NamespacedName{Name: vds.Spec.VirtualDiskName, Namespace: vds.Namespace}, vd) if err != nil { return &reconcile.Result{}, err } From 16dbcdd9a3c2a59aa435cecffb5f4942c0c5d80f Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 19:07:47 +0200 Subject: [PATCH 15/28] fix Signed-off-by: Daniil Antoshin --- .../pkg/controller/importer/importer_pod.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/importer/importer_pod.go b/images/virtualization-artifact/pkg/controller/importer/importer_pod.go index 098ba2ac75..4870f70745 100644 --- a/images/virtualization-artifact/pkg/controller/importer/importer_pod.go +++ b/images/virtualization-artifact/pkg/controller/importer/importer_pod.go @@ -153,13 +153,14 @@ func (imp *Importer) makeImporterPodSpec() (*corev1.Pod, error) { } } - annotations.SetRecommendedLabels(&pod, imp.PodSettings.InstallerLabels, imp.PodSettings.ControllerName) - podutil.SetRestrictedSecurityContext(&pod.Spec) container := imp.makeImporterContainerSpec() imp.addVolumes(&pod, container) pod.Spec.Containers = append(pod.Spec.Containers, *container) + annotations.SetRecommendedLabels(&pod, imp.PodSettings.InstallerLabels, imp.PodSettings.ControllerName) + podutil.SetRestrictedSecurityContext(&pod.Spec) + return &pod, nil } From f7309b72863dd12172f82e6eae53eefd243c5fb2 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 19:24:05 +0200 Subject: [PATCH 16/28] fix Signed-off-by: Daniil Antoshin --- .../pkg/datasource/filesystem-datasource.go | 17 +++-------------- .../pkg/controller/importer/importer_pod.go | 1 - 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index ad7c77b89a..1cefddeb8b 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -23,7 +23,6 @@ import ( "io" "os" "os/exec" - "time" "github.com/google/uuid" ) @@ -34,20 +33,8 @@ type FilesystemDataSource struct { sourceImageFilename string } -func NewFilesystemDataSource() (*FilesystemDataSource, error) { - ctx := context.Background() +func NewFilesystemDataSource(ctx context.Context) (*FilesystemDataSource, error) { filesystemImagePath := "/tmp/fs/disk.img" - - for { - cmd := exec.CommandContext(ctx, "qemu-img", "info", "--output=json", filesystemImagePath) - rawOut, err := cmd.CombinedOutput() - if err != nil { - fmt.Printf("qemu-img command output: %s\n", string(rawOut)) - } - - time.Sleep(time.Second) - } - file, err := os.OpenFile(filesystemImagePath, os.O_RDONLY, 0) if err != nil { return nil, fmt.Errorf("can not get open image %s: %w", filesystemImagePath, err) @@ -69,6 +56,8 @@ func NewFilesystemDataSource() (*FilesystemDataSource, error) { return nil, fmt.Errorf("error parsing qemu-img info output: %w", err) } + fmt.Printf("imageInfo: %+v\n", imageInfo) + uuid, _ := uuid.NewUUID() sourceImageFilename := uuid.String() + ".img" diff --git a/images/virtualization-artifact/pkg/controller/importer/importer_pod.go b/images/virtualization-artifact/pkg/controller/importer/importer_pod.go index 4870f70745..c33c9fa1e6 100644 --- a/images/virtualization-artifact/pkg/controller/importer/importer_pod.go +++ b/images/virtualization-artifact/pkg/controller/importer/importer_pod.go @@ -153,7 +153,6 @@ func (imp *Importer) makeImporterPodSpec() (*corev1.Pod, error) { } } - container := imp.makeImporterContainerSpec() imp.addVolumes(&pod, container) pod.Spec.Containers = append(pod.Spec.Containers, *container) From 3af63ab18d0c975bab74672ccac22b653f4b948d Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 19:25:07 +0200 Subject: [PATCH 17/28] fix nil Signed-off-by: Daniil Antoshin --- .../pkg/controller/vi/internal/source/object_ref_vd.go | 2 +- .../pkg/controller/vi/internal/source/step/create_pod_step.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go index 626eebe1aa..a8fe645a87 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go @@ -121,7 +121,7 @@ func (ds ObjectRefVirtualDisk) StoreToDVCR(ctx context.Context, vi *v1alpha2.Vir } var envSettings *importer.Settings - if pvc != nil && pvc.Spec.VolumeMode != nil { + if pvc.Spec.VolumeMode != nil { envSettings = ds.getEnvSettings(vi, supgen, pvc.Spec.VolumeMode) } else { envSettings = ds.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeBlock)) diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go index 5e07309974..f3dbedface 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go @@ -113,7 +113,7 @@ func (s CreatePodStep) Take(ctx context.Context, vi *v1alpha2.VirtualImage) (*re } var envSettings *importer.Settings - if pvc != nil && pvc.Spec.VolumeMode != nil { + if pvc.Spec.VolumeMode != nil { envSettings = s.getEnvSettings(vi, supgen, pvc.Spec.VolumeMode) } else { envSettings = s.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeBlock)) From e440eea4297a24f361952a48dec414517e689eaa Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 19:30:04 +0200 Subject: [PATCH 18/28] fix consts Signed-off-by: Daniil Antoshin --- images/virtualization-artifact/pkg/common/consts.go | 6 ++++++ .../pkg/controller/importer/importer_pod.go | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/images/virtualization-artifact/pkg/common/consts.go b/images/virtualization-artifact/pkg/common/consts.go index 1a78a19bf3..41ddc972c7 100644 --- a/images/virtualization-artifact/pkg/common/consts.go +++ b/images/virtualization-artifact/pkg/common/consts.go @@ -79,6 +79,12 @@ const ( ImportProxyNoProxy = "no_proxy" // ImporterProxyCertDirVar provides a constant to capture our env variable "IMPORTER_PROXY_CERT_DIR" ImporterProxyCertDirVar = "IMPORTER_PROXY_CERT_DIR" + // ImporterFilesystemVar provides a constant to capture our env variable "IMPORTER_FILESYSTEM" + ImporterFilesystemVar = "IMPORTER_FILESYSTEM" + // ImporterFilesystemDir provides a constant to capture our env variable "IMPORTER_FILESYSTEM_DIR" + ImporterFilesystemDir = "/tmp/fs" + // ImporterBlockDeviceDir provides a constant to capture our directory for block device + ImporterBlockDeviceDir = "/dev/xvda" // ImporterDestinationAuthConfigDir is a mount directory for auth Secret. ImporterDestinationAuthConfigDir = "/dvcr-auth" diff --git a/images/virtualization-artifact/pkg/controller/importer/importer_pod.go b/images/virtualization-artifact/pkg/controller/importer/importer_pod.go index c33c9fa1e6..15949abb71 100644 --- a/images/virtualization-artifact/pkg/controller/importer/importer_pod.go +++ b/images/virtualization-artifact/pkg/controller/importer/importer_pod.go @@ -375,9 +375,9 @@ func (imp *Importer) addVolumes(pod *corev1.Pod, container *corev1.Container) { } if imp.EnvSettings.Source == SourceFilesystem { - podutil.AddVolume(pod, container, volume, corev1.VolumeMount{Name: "volume", MountPath: "/tmp/fs"}, corev1.EnvVar{Name: "IMPORTER_FILESYSTEM_DIR", Value: "/tmp/fs"}) + podutil.AddVolume(pod, container, volume, corev1.VolumeMount{Name: "volume", MountPath: common.ImporterFilesystemDir}, corev1.EnvVar{Name: common.ImporterFilesystemVar, Value: common.ImporterFilesystemDir}) } else { - podutil.AddVolumeDevice(pod, container, volume, corev1.VolumeDevice{Name: "volume", DevicePath: "/dev/xvda"}) + podutil.AddVolumeDevice(pod, container, volume, corev1.VolumeDevice{Name: "volume", DevicePath: common.ImporterBlockDeviceDir}) } } } From aaee3e34bbecd30c00c47ac77c5db28815208384 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 19:50:12 +0200 Subject: [PATCH 19/28] fix ctx Signed-off-by: Daniil Antoshin --- images/dvcr-artifact/pkg/importer/importer.go | 4 ++-- .../virtualization-artifact/pkg/controller/bounder/bounder.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/images/dvcr-artifact/pkg/importer/importer.go b/images/dvcr-artifact/pkg/importer/importer.go index a21fe574e5..1c6534cb6b 100644 --- a/images/dvcr-artifact/pkg/importer/importer.go +++ b/images/dvcr-artifact/pkg/importer/importer.go @@ -181,7 +181,7 @@ func (i *Importer) runForDataSource(ctx context.Context) error { return monitoring.WriteImportCompleteMessage(res.SourceImageSize, res.VirtualSize, res.AvgSpeed, res.Format, durCollector.Collect()) } -func (i *Importer) newDataSource(_ context.Context) (datasource.DataSourceInterface, error) { +func (i *Importer) newDataSource(ctx context.Context) (datasource.DataSourceInterface, error) { var result datasource.DataSourceInterface switch i.srcType { case cc.SourceHTTP: @@ -204,7 +204,7 @@ func (i *Importer) newDataSource(_ context.Context) (datasource.DataSourceInterf } case FilesystemSource: var err error - result, err = datasource.NewFilesystemDataSource() + result, err = datasource.NewFilesystemDataSource(ctx) if err != nil { return nil, fmt.Errorf("error creating filesystem data source: %w", err) } diff --git a/images/virtualization-artifact/pkg/controller/bounder/bounder.go b/images/virtualization-artifact/pkg/controller/bounder/bounder.go index ed361e6a0d..5404c3a899 100644 --- a/images/virtualization-artifact/pkg/controller/bounder/bounder.go +++ b/images/virtualization-artifact/pkg/controller/bounder/bounder.go @@ -155,7 +155,7 @@ func (imp *Bounder) addVolumes(pod *corev1.Pod, container *corev1.Container) { }, corev1.VolumeDevice{ Name: "volume", - DevicePath: "/dev/xvda", + DevicePath: common.ImporterBlockDeviceDir, }, ) } From e96417f4ea463a756f7a6bd0d8b46c1324f521c4 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 20:12:05 +0200 Subject: [PATCH 20/28] fix test Signed-off-by: Daniil Antoshin --- .../source/object_ref_vdsnapshot_cr_test.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr_test.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr_test.go index 33c5db4a06..da64fd1a44 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr_test.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vdsnapshot_cr_test.go @@ -57,6 +57,7 @@ var _ = Describe("ObjectRef VirtualImageSnapshot ContainerRegistry", func() { ctx context.Context scheme *runtime.Scheme vi *v1alpha2.VirtualImage + vd *v1alpha2.VirtualDisk vs *vsv1.VolumeSnapshot sc *storagev1.StorageClass vdSnapshot *v1alpha2.VirtualDiskSnapshot @@ -142,7 +143,7 @@ var _ = Describe("ObjectRef VirtualImageSnapshot ContainerRegistry", func() { Name: "vd-snapshot", UID: "11111111-1111-1111-1111-111111111111", }, - Spec: v1alpha2.VirtualDiskSnapshotSpec{}, + Spec: v1alpha2.VirtualDiskSnapshotSpec{VirtualDiskName: "vd"}, Status: v1alpha2.VirtualDiskSnapshotStatus{ Phase: v1alpha2.VirtualDiskSnapshotPhaseReady, VolumeSnapshotName: vs.Name, @@ -185,6 +186,18 @@ var _ = Describe("ObjectRef VirtualImageSnapshot ContainerRegistry", func() { Name: supgen.ImporterPod().Name, }, } + + vd = &v1alpha2.VirtualDisk{ + ObjectMeta: metav1.ObjectMeta{ + Name: "vd", + UID: "11111111-1111-1111-1111-111111111111", + }, + Status: v1alpha2.VirtualDiskStatus{ + Target: v1alpha2.DiskTarget{ + PersistentVolumeClaim: pvc.Name, + }, + }, + } }) Context("VirtualImage has just been created", func() { @@ -208,7 +221,7 @@ var _ = Describe("ObjectRef VirtualImageSnapshot ContainerRegistry", func() { } vi.Status = v1alpha2.VirtualImageStatus{} - client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(vdSnapshot, vs). + client := fake.NewClientBuilder().WithScheme(scheme).WithObjects(vdSnapshot, vs, vd, pvc). WithInterceptorFuncs(interceptor.Funcs{ Create: func(_ context.Context, _ client.WithWatch, obj client.Object, _ ...client.CreateOption) error { switch obj.(type) { From 7f59fbdb21aaa8f35a256d8eb48998cffd09256e Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Tue, 9 Dec 2025 20:14:25 +0200 Subject: [PATCH 21/28] check without qemu-img Signed-off-by: Daniil Antoshin --- .../pkg/datasource/filesystem-datasource.go | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index 1cefddeb8b..e46d1a62c5 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -18,11 +18,9 @@ package datasource import ( "context" - "encoding/json" "fmt" "io" "os" - "os/exec" "github.com/google/uuid" ) @@ -35,35 +33,28 @@ type FilesystemDataSource struct { func NewFilesystemDataSource(ctx context.Context) (*FilesystemDataSource, error) { filesystemImagePath := "/tmp/fs/disk.img" - file, err := os.OpenFile(filesystemImagePath, os.O_RDONLY, 0) + + file, err := os.Open(filesystemImagePath) if err != nil { return nil, fmt.Errorf("can not get open image %s: %w", filesystemImagePath, err) } - type ImageInfo struct { - VirtualSize uint64 `json:"virtual-size"` - Format string `json:"format"` - } - var imageInfo ImageInfo - - cmd := exec.CommandContext(ctx, "qemu-img", "info", "--output=json", filesystemImagePath) - rawOut, err := cmd.CombinedOutput() + sourceImageSize, err := file.Seek(0, io.SeekEnd) if err != nil { - return nil, fmt.Errorf("error running qemu-img info: %w", err) + return nil, fmt.Errorf("error seeking to end: %w", err) } - if err = json.Unmarshal(rawOut, &imageInfo); err != nil { - return nil, fmt.Errorf("error parsing qemu-img info output: %w", err) + _, err = file.Seek(0, io.SeekStart) + if err != nil { + return nil, fmt.Errorf("error seeking to start: %w", err) } - fmt.Printf("imageInfo: %+v\n", imageInfo) - uuid, _ := uuid.NewUUID() sourceImageFilename := uuid.String() + ".img" return &FilesystemDataSource{ readCloser: file, - sourceImageSize: int64(imageInfo.VirtualSize), + sourceImageSize: int64(sourceImageSize), sourceImageFilename: sourceImageFilename, }, nil } From 7e6a821bf716143bd20408a7c463d28df57c1a78 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Wed, 10 Dec 2025 12:48:42 +0200 Subject: [PATCH 22/28] fix year Signed-off-by: Daniil Antoshin --- images/dvcr-artifact/pkg/datasource/filesystem-datasource.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go index e46d1a62c5..2a997499e7 100644 --- a/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go +++ b/images/dvcr-artifact/pkg/datasource/filesystem-datasource.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Flant JSC +Copyright 2025 Flant JSC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From edb2d62edb23c7f668d6d382867ccc6f7f057b8e Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Wed, 10 Dec 2025 13:01:51 +0200 Subject: [PATCH 23/28] filesystem volumeMode as fallback Signed-off-by: Daniil Antoshin --- .../pkg/controller/cvi/internal/source/object_ref_vd.go | 2 +- .../pkg/controller/vi/internal/source/object_ref_vd.go | 2 +- .../pkg/controller/vi/internal/source/step/create_pod_step.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go index 4402b93d61..8937102394 100644 --- a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go @@ -122,7 +122,7 @@ func (ds ObjectRefVirtualDisk) Sync(ctx context.Context, cvi *v1alpha2.ClusterVi if pvc.Spec.VolumeMode != nil { envSettings = ds.getEnvSettings(cvi, supgen, pvc.Spec.VolumeMode) } else { - envSettings = ds.getEnvSettings(cvi, supgen, ptr.To(corev1.PersistentVolumeBlock)) + envSettings = ds.getEnvSettings(cvi, supgen, ptr.To(corev1.PersistentVolumeFilesystem)) } ownerRef := metav1.NewControllerRef(cvi, cvi.GroupVersionKind()) diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go index a8fe645a87..6e276ac876 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go @@ -124,7 +124,7 @@ func (ds ObjectRefVirtualDisk) StoreToDVCR(ctx context.Context, vi *v1alpha2.Vir if pvc.Spec.VolumeMode != nil { envSettings = ds.getEnvSettings(vi, supgen, pvc.Spec.VolumeMode) } else { - envSettings = ds.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeBlock)) + envSettings = ds.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeFilesystem)) } ownerRef := metav1.NewControllerRef(vi, vi.GroupVersionKind()) diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go index f3dbedface..717ce023a4 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go @@ -116,7 +116,7 @@ func (s CreatePodStep) Take(ctx context.Context, vi *v1alpha2.VirtualImage) (*re if pvc.Spec.VolumeMode != nil { envSettings = s.getEnvSettings(vi, supgen, pvc.Spec.VolumeMode) } else { - envSettings = s.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeBlock)) + envSettings = s.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeFilesystem)) } err = s.importer.StartWithPodSetting(ctx, envSettings, supgen, datasource.NewCABundleForVMI(vi.GetNamespace(), vi.Spec.DataSource), podSettings) From 62a8f2386d6921eee2ccad087a635f5c246a9c60 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Wed, 10 Dec 2025 13:03:59 +0200 Subject: [PATCH 24/28] filesystem volmeVome as fallback Signed-off-by: Daniil Antoshin --- .../pkg/controller/cvi/internal/source/object_ref_vd.go | 6 +++--- .../controller/cvi/internal/source/object_ref_vdsnapshot.go | 6 +++--- .../pkg/controller/vi/internal/source/object_ref_vd.go | 6 +++--- .../controller/vi/internal/source/step/create_pod_step.go | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go index 8937102394..e49cce5341 100644 --- a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go @@ -231,10 +231,10 @@ func (ds ObjectRefVirtualDisk) CleanUp(ctx context.Context, cvi *v1alpha2.Cluste func (ds ObjectRefVirtualDisk) getEnvSettings(cvi *v1alpha2.ClusterVirtualImage, sup supplements.Generator, volumeMode *corev1.PersistentVolumeMode) *importer.Settings { var settings importer.Settings - if volumeMode != nil && *volumeMode == corev1.PersistentVolumeFilesystem { - importer.ApplyFilesystemSourceSettings(&settings) - } else { + if volumeMode != nil && *volumeMode == corev1.PersistentVolumeBlock { importer.ApplyBlockDeviceSourceSettings(&settings) + } else { + importer.ApplyFilesystemSourceSettings(&settings) } importer.ApplyDVCRDestinationSettings( diff --git a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vdsnapshot.go b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vdsnapshot.go index 824ca54481..9bef91ea9c 100644 --- a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vdsnapshot.go +++ b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vdsnapshot.go @@ -361,10 +361,10 @@ func (ds ObjectRefVirtualDiskSnapshot) CleanUp(ctx context.Context, cvi *v1alpha func (ds ObjectRefVirtualDiskSnapshot) getEnvSettings(cvi *v1alpha2.ClusterVirtualImage, sup supplements.Generator, volumeMode *corev1.PersistentVolumeMode) *importer.Settings { var settings importer.Settings - if volumeMode != nil && *volumeMode == corev1.PersistentVolumeFilesystem { - importer.ApplyFilesystemSourceSettings(&settings) - } else { + if volumeMode != nil && *volumeMode == corev1.PersistentVolumeBlock { importer.ApplyBlockDeviceSourceSettings(&settings) + } else { + importer.ApplyFilesystemSourceSettings(&settings) } importer.ApplyDVCRDestinationSettings( diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go index 6e276ac876..73eaf31a4d 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go @@ -426,10 +426,10 @@ func (ds ObjectRefVirtualDisk) CleanUp(ctx context.Context, vi *v1alpha2.Virtual func (ds ObjectRefVirtualDisk) getEnvSettings(vi *v1alpha2.VirtualImage, sup supplements.Generator, volumeMode *corev1.PersistentVolumeMode) *importer.Settings { var settings importer.Settings - if volumeMode != nil && *volumeMode == corev1.PersistentVolumeFilesystem { - importer.ApplyFilesystemSourceSettings(&settings) - } else { + if volumeMode != nil && *volumeMode == corev1.PersistentVolumeBlock { importer.ApplyBlockDeviceSourceSettings(&settings) + } else { + importer.ApplyFilesystemSourceSettings(&settings) } importer.ApplyDVCRDestinationSettings( diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go index 717ce023a4..b7979a053e 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go @@ -143,10 +143,10 @@ func (s CreatePodStep) Take(ctx context.Context, vi *v1alpha2.VirtualImage) (*re func (s CreatePodStep) getEnvSettings(vi *v1alpha2.VirtualImage, sup supplements.Generator, volumeMode *corev1.PersistentVolumeMode) *importer.Settings { var settings importer.Settings - if volumeMode != nil && *volumeMode == corev1.PersistentVolumeFilesystem { - importer.ApplyFilesystemSourceSettings(&settings) - } else { + if volumeMode != nil && *volumeMode == corev1.PersistentVolumeBlock { importer.ApplyBlockDeviceSourceSettings(&settings) + } else { + importer.ApplyFilesystemSourceSettings(&settings) } importer.ApplyDVCRDestinationSettings( From aca3077b6ea585f6052313f5d80e6106e0e061a8 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Wed, 10 Dec 2025 13:09:27 +0200 Subject: [PATCH 25/28] fix bug Signed-off-by: Daniil Antoshin --- .../pkg/controller/bounder/bounder.go | 6 +++--- .../pkg/controller/uploader/uploader_pod.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/bounder/bounder.go b/images/virtualization-artifact/pkg/controller/bounder/bounder.go index 5404c3a899..4dffbcf623 100644 --- a/images/virtualization-artifact/pkg/controller/bounder/bounder.go +++ b/images/virtualization-artifact/pkg/controller/bounder/bounder.go @@ -112,13 +112,13 @@ func (imp *Bounder) makeBounderPodSpec() (*corev1.Pod, error) { } } - annotations.SetRecommendedLabels(&pod, imp.PodSettings.InstallerLabels, imp.PodSettings.ControllerName) - podutil.SetRestrictedSecurityContext(&pod.Spec) - container := imp.makeBounderContainerSpec() imp.addVolumes(&pod, container) pod.Spec.Containers = append(pod.Spec.Containers, *container) + annotations.SetRecommendedLabels(&pod, imp.PodSettings.InstallerLabels, imp.PodSettings.ControllerName) + podutil.SetRestrictedSecurityContext(&pod.Spec) + return &pod, nil } diff --git a/images/virtualization-artifact/pkg/controller/uploader/uploader_pod.go b/images/virtualization-artifact/pkg/controller/uploader/uploader_pod.go index 813e6d86f0..4db1e97049 100644 --- a/images/virtualization-artifact/pkg/controller/uploader/uploader_pod.go +++ b/images/virtualization-artifact/pkg/controller/uploader/uploader_pod.go @@ -121,13 +121,13 @@ func (p *Pod) makeSpec() (*corev1.Pod, error) { } } - annotations.SetRecommendedLabels(&pod, p.PodSettings.InstallerLabels, p.PodSettings.ControllerName) - podutil.SetRestrictedSecurityContext(&pod.Spec) - container := p.makeUploaderContainerSpec() p.addVolumes(&pod, container) pod.Spec.Containers = append(pod.Spec.Containers, *container) + annotations.SetRecommendedLabels(&pod, p.PodSettings.InstallerLabels, p.PodSettings.ControllerName) + podutil.SetRestrictedSecurityContext(&pod.Spec) + return &pod, nil } From 3e639dc24c45cb2fea08b94723522946e753fe5c Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Wed, 10 Dec 2025 13:14:22 +0200 Subject: [PATCH 26/28] remove if Signed-off-by: Daniil Antoshin --- .../pkg/controller/cvi/internal/source/object_ref_vd.go | 8 +------- .../pkg/controller/vi/internal/source/object_ref_vd.go | 8 +------- .../controller/vi/internal/source/step/create_pod_step.go | 8 +------- 3 files changed, 3 insertions(+), 21 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go index e49cce5341..1a22ca9caf 100644 --- a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go @@ -118,13 +118,7 @@ func (ds ObjectRefVirtualDisk) Sync(ctx context.Context, cvi *v1alpha2.ClusterVi return reconcile.Result{}, err } - var envSettings *importer.Settings - if pvc.Spec.VolumeMode != nil { - envSettings = ds.getEnvSettings(cvi, supgen, pvc.Spec.VolumeMode) - } else { - envSettings = ds.getEnvSettings(cvi, supgen, ptr.To(corev1.PersistentVolumeFilesystem)) - } - + envSettings := ds.getEnvSettings(cvi, supgen, pvc.Spec.VolumeMode) ownerRef := metav1.NewControllerRef(cvi, cvi.GroupVersionKind()) podSettings := ds.importerService.GetPodSettingsWithPVC(ownerRef, supgen, vdRef.Status.Target.PersistentVolumeClaim, vdRef.Namespace) err = ds.importerService.StartWithPodSetting(ctx, envSettings, supgen, datasource.NewCABundleForCVMI(cvi.Spec.DataSource), podSettings) diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go index 73eaf31a4d..e2d7a9f70b 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go @@ -120,13 +120,7 @@ func (ds ObjectRefVirtualDisk) StoreToDVCR(ctx context.Context, vi *v1alpha2.Vir return reconcile.Result{}, err } - var envSettings *importer.Settings - if pvc.Spec.VolumeMode != nil { - envSettings = ds.getEnvSettings(vi, supgen, pvc.Spec.VolumeMode) - } else { - envSettings = ds.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeFilesystem)) - } - + envSettings := ds.getEnvSettings(vi, supgen, pvc.Spec.VolumeMode) ownerRef := metav1.NewControllerRef(vi, vi.GroupVersionKind()) podSettings := ds.importerService.GetPodSettingsWithPVC(ownerRef, supgen, vdRef.Status.Target.PersistentVolumeClaim, vdRef.Namespace) err = ds.importerService.StartWithPodSetting(ctx, envSettings, supgen, datasource.NewCABundleForVMI(vi.GetNamespace(), vi.Spec.DataSource), podSettings) diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go index b7979a053e..336f5ca778 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go @@ -112,13 +112,7 @@ func (s CreatePodStep) Take(ctx context.Context, vi *v1alpha2.VirtualImage) (*re return &reconcile.Result{}, err } - var envSettings *importer.Settings - if pvc.Spec.VolumeMode != nil { - envSettings = s.getEnvSettings(vi, supgen, pvc.Spec.VolumeMode) - } else { - envSettings = s.getEnvSettings(vi, supgen, ptr.To(corev1.PersistentVolumeFilesystem)) - } - + envSettings := s.getEnvSettings(vi, supgen, pvc.Spec.VolumeMode) err = s.importer.StartWithPodSetting(ctx, envSettings, supgen, datasource.NewCABundleForVMI(vi.GetNamespace(), vi.Spec.DataSource), podSettings) switch { case err == nil: From 9cb51bc6c28b80a2ba46bb710c9e1db3a03f73d0 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Wed, 10 Dec 2025 13:17:54 +0200 Subject: [PATCH 27/28] fix import Signed-off-by: Daniil Antoshin --- .../pkg/controller/vi/internal/source/object_ref_vd.go | 1 - 1 file changed, 1 deletion(-) diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go index e2d7a9f70b..b3ccea6390 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/object_ref_vd.go @@ -28,7 +28,6 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/utils/ptr" cdiv1 "kubevirt.io/containerized-data-importer-api/pkg/apis/core/v1beta1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" From bcaf366f6d384285d07d012bfc88c04c0e4e5e46 Mon Sep 17 00:00:00 2001 From: Daniil Antoshin Date: Wed, 10 Dec 2025 13:25:15 +0200 Subject: [PATCH 28/28] fix Signed-off-by: Daniil Antoshin --- .../pkg/controller/cvi/internal/source/object_ref_vd.go | 1 - .../pkg/controller/vi/internal/source/step/create_pod_step.go | 1 - 2 files changed, 2 deletions(-) diff --git a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go index 1a22ca9caf..25ba137f87 100644 --- a/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go +++ b/images/virtualization-artifact/pkg/controller/cvi/internal/source/object_ref_vd.go @@ -25,7 +25,6 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" diff --git a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go index 336f5ca778..2509ebbeb9 100644 --- a/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go +++ b/images/virtualization-artifact/pkg/controller/vi/internal/source/step/create_pod_step.go @@ -24,7 +24,6 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile"