From a64c2a6a10369221603e724c593d03519dadb352 Mon Sep 17 00:00:00 2001 From: Matthew Arnold Date: Mon, 16 Dec 2024 11:13:18 -0500 Subject: [PATCH 1/6] Add annotation for extra VDDK library arguments. The VDDK library itself accepts infrequently-used arguments in a configuration file, and some of these arguments have been tested to show a significant transfer speedup in some environments. This adds an annotation that references a ConfigMap holding the contents of this VDDK configuration file, and mounts it to the importer pod. The first file in the mounted directory is passed to the VDDK. Signed-off-by: Matthew Arnold --- pkg/common/common.go | 2 ++ pkg/controller/common/util.go | 2 ++ pkg/controller/import-controller.go | 26 +++++++++++++++++++++++ pkg/controller/util.go | 3 +++ pkg/image/nbdkit.go | 32 +++++++++++++++++++++++++++++ 5 files changed, 65 insertions(+) diff --git a/pkg/common/common.go b/pkg/common/common.go index 3e948fca63..6660f4afbf 100644 --- a/pkg/common/common.go +++ b/pkg/common/common.go @@ -254,6 +254,8 @@ const ( VddkConfigDataKey = "vddk-init-image" // AwaitingVDDK is a Pending condition reason that indicates the PVC is waiting for a VDDK image AwaitingVDDK = "AwaitingVDDK" + // VddkArgsDir is the path to the volume mount containing extra VDDK arguments + VddkArgsDir = "/vddk-args" // UploadContentTypeHeader is the header upload clients may use to set the content type explicitly UploadContentTypeHeader = "x-cdi-content-type" diff --git a/pkg/controller/common/util.go b/pkg/controller/common/util.go index 8b383a4a34..9aa50ed770 100644 --- a/pkg/controller/common/util.go +++ b/pkg/controller/common/util.go @@ -147,6 +147,8 @@ const ( AnnVddkHostConnection = AnnAPIGroup + "/storage.pod.vddk.host" // AnnVddkInitImageURL saves a per-DV VDDK image URL on the PVC AnnVddkInitImageURL = AnnAPIGroup + "/storage.pod.vddk.initimageurl" + // AnnVddkExtraArgs references a ConfigMap that holds arguments to pass directly to the VDDK library + AnnVddkExtraArgs = AnnAPIGroup + "/storage.pod.vddk.extraargs" // AnnRequiresScratch provides a const for our PVC requiring scratch annotation AnnRequiresScratch = AnnAPIGroup + "/storage.import.requiresScratch" diff --git a/pkg/controller/import-controller.go b/pkg/controller/import-controller.go index 49f1ff898f..364780eea1 100644 --- a/pkg/controller/import-controller.go +++ b/pkg/controller/import-controller.go @@ -116,6 +116,7 @@ type importerPodArgs struct { imagePullSecrets []corev1.LocalObjectReference workloadNodePlacement *sdkapi.NodePlacement vddkImageName *string + vddkExtraArgs *string priorityClassName string } @@ -480,6 +481,7 @@ func (r *ImportReconciler) createImporterPod(pvc *corev1.PersistentVolumeClaim) r.log.V(1).Info("Creating importer POD for PVC", "pvc.Name", pvc.Name) var scratchPvcName *string var vddkImageName *string + var vddkExtraArgs *string var err error requiresScratch := r.requiresScratchSpace(pvc) @@ -508,6 +510,11 @@ func (r *ImportReconciler) createImporterPod(pvc *corev1.PersistentVolumeClaim) } return errors.New(message) } + + if extraArgs, ok := anno[cc.AnnVddkExtraArgs]; ok && extraArgs != "" { + r.log.V(1).Info("Mounting extra VDDK args ConfigMap to importer pod", "ConfigMap", extraArgs) + vddkExtraArgs = &extraArgs + } } podEnvVar, err := r.createImportEnvVar(pvc) @@ -523,6 +530,7 @@ func (r *ImportReconciler) createImporterPod(pvc *corev1.PersistentVolumeClaim) pvc: pvc, scratchPvcName: scratchPvcName, vddkImageName: vddkImageName, + vddkExtraArgs: vddkExtraArgs, priorityClassName: cc.GetPriorityClass(pvc), } @@ -999,6 +1007,12 @@ func makeImporterContainerSpec(args *importerPodArgs) []corev1.Container { MountPath: "/opt", }) } + if args.vddkExtraArgs != nil { + containers[0].VolumeMounts = append(containers[0].VolumeMounts, corev1.VolumeMount{ + Name: VddkArgsVolName, + MountPath: common.VddkArgsDir, + }) + } if args.podEnvVar.certConfigMap != "" { containers[0].VolumeMounts = append(containers[0].VolumeMounts, corev1.VolumeMount{ Name: CertVolName, @@ -1070,6 +1084,18 @@ func makeImporterVolumeSpec(args *importerPodArgs) []corev1.Volume { }, }) } + if args.vddkExtraArgs != nil { + volumes = append(volumes, corev1.Volume{ + Name: VddkArgsVolName, + VolumeSource: corev1.VolumeSource{ + ConfigMap: &v1.ConfigMapVolumeSource{ + LocalObjectReference: v1.LocalObjectReference{ + Name: *args.vddkExtraArgs, + }, + }, + }, + }) + } if args.podEnvVar.certConfigMap != "" { volumes = append(volumes, createConfigMapVolume(CertVolName, args.podEnvVar.certConfigMap)) } diff --git a/pkg/controller/util.go b/pkg/controller/util.go index 81e050464d..d5301ccd25 100644 --- a/pkg/controller/util.go +++ b/pkg/controller/util.go @@ -52,6 +52,9 @@ const ( //nolint:gosec // This is not a real secret SecretVolName = "cdi-secret-vol" + // VddkArgsVolName is the name of the volume referencing the extra VDDK arguments ConfigMap + VddkArgsVolName = "vddk-extra-args" + // AnnOwnerRef is used when owner is in a different namespace AnnOwnerRef = cc.AnnAPIGroup + "/storage.ownerRef" diff --git a/pkg/image/nbdkit.go b/pkg/image/nbdkit.go index 21688b0e2c..78443e6eba 100644 --- a/pkg/image/nbdkit.go +++ b/pkg/image/nbdkit.go @@ -4,6 +4,7 @@ import ( "bufio" "fmt" "io" + "io/fs" "os" "os/exec" "path/filepath" @@ -168,6 +169,13 @@ func NewNbdkitVddk(nbdkitPidFile, socket string, args NbdKitVddkPluginArgs) (Nbd pluginArgs = append(pluginArgs, "-D", "nbdkit.backend.datapath=0") pluginArgs = append(pluginArgs, "-D", "vddk.datapath=0") pluginArgs = append(pluginArgs, "-D", "vddk.stats=1") + config, err := getVddkConfig() + if err != nil { + return nil, err + } + if config != "" { + pluginArgs = append(pluginArgs, "config="+config) + } p := getVddkPluginPath() n := &Nbdkit{ NbdPidFile: nbdkitPidFile, @@ -228,6 +236,30 @@ func getVddkPluginPath() NbdkitPlugin { return NbdkitVddkPlugin } +// Extra VDDK configuration options are stored in a ConfigMap mounted to the +// importer pod. Just look for the first file in the mounted directory, and +// pass that through nbdkit via the "config=" option. +func getVddkConfig() (string, error) { + withHidden, err := os.ReadDir(common.VddkArgsDir) + if err != nil { + if os.IsNotExist(err) { + return "", nil + } + return "", err + } + files := []fs.DirEntry{} + for _, file := range withHidden { // Ignore hidden files + if !strings.HasPrefix(file.Name(), ".") { + files = append(files, file) + } + } + if len(files) < 1 { + return "", fmt.Errorf("no VDDK configuration files found under %s", common.VddkArgsDir) + } + path := filepath.Join(common.VddkArgsDir, files[0].Name()) + return path, nil +} + func (n *Nbdkit) getSourceArg(s string) string { var source string switch n.plugin { From eb0f44e382123e5d9b6fd75b06b2c151ac2691c3 Mon Sep 17 00:00:00 2001 From: Matthew Arnold Date: Mon, 16 Dec 2024 11:53:32 -0500 Subject: [PATCH 2/6] Add functional test for VDDK args annotation. Signed-off-by: Matthew Arnold --- tests/datavolume_test.go | 46 ++++++++++++++++++++++++++++++ tools/vddk-test/vddk-test-plugin.c | 21 ++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/tests/datavolume_test.go b/tests/datavolume_test.go index 0af8362fde..f3cf39548f 100644 --- a/tests/datavolume_test.go +++ b/tests/datavolume_test.go @@ -1184,6 +1184,28 @@ var _ = Describe("[vendor:cnv-qe@redhat.com][level:component]DataVolume tests", return dv } + createVddkDataVolumeWithExtraArgs := func(dataVolumeName, size, url string) *cdiv1.DataVolume { + dv := createVddkDataVolumeWithInitImageURL(dataVolumeName, size, url) + extraArguments := v1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: f.Namespace.Name, + Name: "vddk-extra-args-map", + }, + Data: map[string]string{ // Must match vddk-test-plugin + "vddk-config-file": "VixDiskLib.nfcAio.Session.BufSizeIn64KB=16", + }, + } + _, err := f.K8sClient.CoreV1().ConfigMaps(f.Namespace.Name).Create(context.TODO(), &extraArguments, metav1.CreateOptions{}) + if !k8serrors.IsAlreadyExists(err) { + Expect(err).ToNot(HaveOccurred()) + } + if dv.Annotations == nil { + dv.Annotations = make(map[string]string) + } + dv.Annotations[controller.AnnVddkExtraArgs] = extraArguments.Name + return dv + } + // Similar to previous table, but with additional cleanup steps to save and restore VDDK image config map DescribeTable("should", Serial, func(args dataVolumeTestArguments) { _, err := utils.CopyConfigMap(f.K8sClient, f.CdiInstallNs, common.VddkConfigMap, f.CdiInstallNs, savedVddkConfigMap, "") @@ -1254,6 +1276,30 @@ var _ = Describe("[vendor:cnv-qe@redhat.com][level:component]DataVolume tests", Message: "Import Complete", Reason: "Completed", }}), + Entry("[test_id:5083]succeed importing VDDK data volume with extra arguments ConfigMap set", dataVolumeTestArguments{ + name: "dv-import-vddk", + size: "1Gi", + url: vcenterURL, + dvFunc: createVddkDataVolumeWithExtraArgs, + eventReason: dvc.ImportSucceeded, + phase: cdiv1.Succeeded, + checkPermissions: false, + readyCondition: &cdiv1.DataVolumeCondition{ + Type: cdiv1.DataVolumeReady, + Status: v1.ConditionTrue, + }, + boundCondition: &cdiv1.DataVolumeCondition{ + Type: cdiv1.DataVolumeBound, + Status: v1.ConditionTrue, + Message: "PVC dv-import-vddk Bound", + Reason: "Bound", + }, + runningCondition: &cdiv1.DataVolumeCondition{ + Type: cdiv1.DataVolumeRunning, + Status: v1.ConditionFalse, + Message: "Import Complete", + Reason: "Completed", + }}), ) // similar to other tables but with check of quota diff --git a/tools/vddk-test/vddk-test-plugin.c b/tools/vddk-test/vddk-test-plugin.c index 2d23ab9e30..7967c2d50d 100644 --- a/tools/vddk-test/vddk-test-plugin.c +++ b/tools/vddk-test/vddk-test-plugin.c @@ -13,6 +13,7 @@ #define NBDKIT_API_VERSION 2 #include #include +#include #include #include #include @@ -32,6 +33,26 @@ int fakevddk_config(const char *key, const char *value) { if (strcmp(key, "snapshot") == 0) { expected_arg_count = 9; // Expect one for 'snapshot' and one for 'transports' } + if (strcmp(key, "config") == 0) { + expected_arg_count = 8; + nbdkit_debug("Extra config option set to: %s\n", value); + + FILE *f = fopen(value, "r"); + if (f == NULL) { + nbdkit_error("Failed to open VDDK extra configuration file %s!\n", value); + return -1; + } + char extras[50]; + if (fgets(extras, 50, f) == NULL) { // Expect only one line of test data + nbdkit_error("Failed to read VDDK extra configuration file %s! Error was: %s", value, strerror(errno)); + return -1; + } + if (strcmp(extras, "VixDiskLib.nfcAio.Session.BufSizeIn64KB=16") != 0) { // Must match datavolume_test + nbdkit_error("Unexpected content in VDDK extra configuration file %s: %s\n", value, extras); + return -1; + } + fclose(f); + } return 0; } From a55a611b29229b77cbd0dab6212df23b4447b9a9 Mon Sep 17 00:00:00 2001 From: Matthew Arnold Date: Mon, 16 Dec 2024 13:09:17 -0500 Subject: [PATCH 3/6] Add unit test for extra VDDK arguments annotation. Signed-off-by: Matthew Arnold --- pkg/controller/import-controller_test.go | 30 ++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/pkg/controller/import-controller_test.go b/pkg/controller/import-controller_test.go index 96fb5e14a7..b2118cab62 100644 --- a/pkg/controller/import-controller_test.go +++ b/pkg/controller/import-controller_test.go @@ -935,6 +935,36 @@ var _ = Describe("Create Importer Pod", func() { Entry("with long PVC name", strings.Repeat("test-pvc-", 20), "snap1"), Entry("with long PVC and checkpoint names", strings.Repeat("test-pvc-", 20), strings.Repeat("repeating-checkpoint-id-", 10)), ) + + It("should mount extra VDDK arguments ConfigMap when annotation is set", func() { + pvcName := "testPvc1" + podName := "testpod" + extraArgs := "testing-123" + annotations := map[string]string{ + cc.AnnEndpoint: testEndPoint, + cc.AnnImportPod: podName, + cc.AnnSource: cc.SourceVDDK, + cc.AnnVddkInitImageURL: "testing-vddk", + cc.AnnVddkExtraArgs: extraArgs, + } + pvc := cc.CreatePvcInStorageClass(pvcName, "default", &testStorageClass, annotations, nil, corev1.ClaimBound) + reconciler := createImportReconciler(pvc) + + _, err := reconciler.Reconcile(context.TODO(), reconcile.Request{NamespacedName: types.NamespacedName{Name: pvcName, Namespace: "default"}}) + Expect(err).ToNot(HaveOccurred()) + + pod := &corev1.Pod{} + err = reconciler.client.Get(context.TODO(), types.NamespacedName{Name: podName, Namespace: "default"}, pod) + Expect(err).ToNot(HaveOccurred()) + + found := false // Look for vddk-args mount + for _, volume := range pod.Spec.Volumes { + if volume.ConfigMap != nil && volume.ConfigMap.Name == extraArgs { + found = true + } + } + Expect(found).To(BeTrue()) + }) }) var _ = Describe("Import test env", func() { From b260353696149278d36ee66eb4100d13e9c81d34 Mon Sep 17 00:00:00 2001 From: Matthew Arnold Date: Tue, 17 Dec 2024 10:59:32 -0500 Subject: [PATCH 4/6] Add documentation for extra VDDK arguments. Signed-off-by: Matthew Arnold --- doc/datavolumes.md | 7 +++++++ manifests/example/vddk-args-annotation.yaml | 22 +++++++++++++++++++++ manifests/example/vddk-args-configmap.yaml | 9 +++++++++ pkg/image/nbdkit.go | 2 +- 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 manifests/example/vddk-args-annotation.yaml create mode 100644 manifests/example/vddk-args-configmap.yaml diff --git a/doc/datavolumes.md b/doc/datavolumes.md index f543c430e1..1b594be2be 100644 --- a/doc/datavolumes.md +++ b/doc/datavolumes.md @@ -349,6 +349,13 @@ spec: [Get VDDK ConfigMap example](../manifests/example/vddk-configmap.yaml) [Ways to find thumbprint](https://libguestfs.org/nbdkit-vddk-plugin.1.html#THUMBPRINTS) +#### Extra VDDK Configuration Options + +The VDDK library itself looks in a configuration file (such as `/etc/vmware/config`) for extra options to fine tune data transfers. To pass these options through to the VDDK, store the configuration file contents in a ConfigMap and add a `cdi.kubevirt.io/storage.pod.vddk.extraargs` annotation to the DataVolume specification. The ConfigMap will be mounted to the importer pod as a volume, and the first file in the mounted directory will be passed to the VDDK. This means that the ConfigMap must be placed in the same namespace as the DataVolume, and the ConfigMap should only have one file entry. + +[Example annotation](../manifests/example/vddk-args-annotation.yaml) +[Example ConfigMap](../manifests/example/vddk-args-configmap.yaml) + ## Multi-stage Import In a multi-stage import, multiple pods are started in succession to copy different parts of the source to an existing base disk image. Currently only the [ImageIO](#multi-stage-imageio-import) and [VDDK](#multi-stage-vddk-import) data sources support multi-stage imports. diff --git a/manifests/example/vddk-args-annotation.yaml b/manifests/example/vddk-args-annotation.yaml new file mode 100644 index 0000000000..fcada06358 --- /dev/null +++ b/manifests/example/vddk-args-annotation.yaml @@ -0,0 +1,22 @@ +apiVersion: cdi.kubevirt.io/v1beta1 +kind: DataVolume +metadata: + name: "vddk-dv" + namespace: "cdi" + annotations: + cdi.kubevirt.io/storage.pod.vddk.extraargs: vddk-arguments +spec: + source: + vddk: + backingFile: "[iSCSI_Datastore] vm/vm_1.vmdk" # From 'Hard disk'/'Disk File' in vCenter/ESX VM settings + url: "https://vcenter.corp.com" + uuid: "52260566-b032-36cb-55b1-79bf29e30490" + thumbprint: "20:6C:8A:5D:44:40:B3:79:4B:28:EA:76:13:60:90:6E:49:D9:D9:A3" # SSL fingerprint of vCenter/ESX host + secretRef: "vddk-credentials" + initImageURL: "registry:5000/vddk-init:latest" + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: "32Gi" \ No newline at end of file diff --git a/manifests/example/vddk-args-configmap.yaml b/manifests/example/vddk-args-configmap.yaml new file mode 100644 index 0000000000..278918969e --- /dev/null +++ b/manifests/example/vddk-args-configmap.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + namespace: cdi + name: vddk-arguments +data: + vddk-config-file: -| + VixDiskLib.nfcAio.Session.BufSizeIn64KB=16 + VixDiskLib.nfcAio.Session.BufCount=4 \ No newline at end of file diff --git a/pkg/image/nbdkit.go b/pkg/image/nbdkit.go index 78443e6eba..d863edb54e 100644 --- a/pkg/image/nbdkit.go +++ b/pkg/image/nbdkit.go @@ -242,7 +242,7 @@ func getVddkPluginPath() NbdkitPlugin { func getVddkConfig() (string, error) { withHidden, err := os.ReadDir(common.VddkArgsDir) if err != nil { - if os.IsNotExist(err) { + if os.IsNotExist(err) { // No extra arguments ConfigMap specified, so mount directory does not exist return "", nil } return "", err From 625a9e944e3b75e514ca67e394c3e9931bf9634a Mon Sep 17 00:00:00 2001 From: Matthew Arnold Date: Wed, 18 Dec 2024 11:06:51 -0500 Subject: [PATCH 5/6] Simplify new functional test annotation creation. Signed-off-by: Matthew Arnold --- tests/datavolume_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/datavolume_test.go b/tests/datavolume_test.go index f3cf39548f..f6c8161490 100644 --- a/tests/datavolume_test.go +++ b/tests/datavolume_test.go @@ -1199,10 +1199,7 @@ var _ = Describe("[vendor:cnv-qe@redhat.com][level:component]DataVolume tests", if !k8serrors.IsAlreadyExists(err) { Expect(err).ToNot(HaveOccurred()) } - if dv.Annotations == nil { - dv.Annotations = make(map[string]string) - } - dv.Annotations[controller.AnnVddkExtraArgs] = extraArguments.Name + controller.AddAnnotation(dv, controller.AnnVddkExtraArgs, extraArguments.Name) return dv } From aacc61ac61a1b5da9b1c691b3541806d8eededfc Mon Sep 17 00:00:00 2001 From: Matthew Arnold Date: Fri, 20 Dec 2024 12:09:59 -0500 Subject: [PATCH 6/6] Look for specific file instead of first file. Instead of listing the mounted VDDK arguments directory and filtering out hidden files, just hard-code the expected file name and ConfigMap key. Signed-off-by: Matthew Arnold --- doc/datavolumes.md | 2 +- pkg/common/common.go | 4 ++++ pkg/controller/import-controller.go | 4 ++-- pkg/controller/util.go | 3 --- pkg/image/nbdkit.go | 17 ++++------------- tests/datavolume_test.go | 2 +- 6 files changed, 12 insertions(+), 20 deletions(-) diff --git a/doc/datavolumes.md b/doc/datavolumes.md index 1b594be2be..793a4831b3 100644 --- a/doc/datavolumes.md +++ b/doc/datavolumes.md @@ -351,7 +351,7 @@ spec: #### Extra VDDK Configuration Options -The VDDK library itself looks in a configuration file (such as `/etc/vmware/config`) for extra options to fine tune data transfers. To pass these options through to the VDDK, store the configuration file contents in a ConfigMap and add a `cdi.kubevirt.io/storage.pod.vddk.extraargs` annotation to the DataVolume specification. The ConfigMap will be mounted to the importer pod as a volume, and the first file in the mounted directory will be passed to the VDDK. This means that the ConfigMap must be placed in the same namespace as the DataVolume, and the ConfigMap should only have one file entry. +The VDDK library itself looks in a configuration file (such as `/etc/vmware/config`) for extra options to fine tune data transfers. To pass these options through to the VDDK, store the configuration file contents in a ConfigMap with the key `vddk-config-file` and add a `cdi.kubevirt.io/storage.pod.vddk.extraargs` annotation to the DataVolume specification. The ConfigMap will be mounted to the importer pod as a volume, and the mount directory will have a file named `vddk-config-file` with the contents of the file. This means that the ConfigMap must be placed in the same namespace as the DataVolume, and the ConfigMap should only have one file entry, `vddk-config-file`. [Example annotation](../manifests/example/vddk-args-annotation.yaml) [Example ConfigMap](../manifests/example/vddk-args-configmap.yaml) diff --git a/pkg/common/common.go b/pkg/common/common.go index 6660f4afbf..be77b264d0 100644 --- a/pkg/common/common.go +++ b/pkg/common/common.go @@ -256,6 +256,10 @@ const ( AwaitingVDDK = "AwaitingVDDK" // VddkArgsDir is the path to the volume mount containing extra VDDK arguments VddkArgsDir = "/vddk-args" + // VddkArgsVolName is the name of the volume referencing the extra VDDK arguments ConfigMap + VddkArgsVolName = "vddk-extra-args" + // VddkArgsKeyName is the name of the key that must be present in the VDDK arguments ConfigMap + VddkArgsKeyName = "vddk-config-file" // UploadContentTypeHeader is the header upload clients may use to set the content type explicitly UploadContentTypeHeader = "x-cdi-content-type" diff --git a/pkg/controller/import-controller.go b/pkg/controller/import-controller.go index 364780eea1..225117308d 100644 --- a/pkg/controller/import-controller.go +++ b/pkg/controller/import-controller.go @@ -1009,7 +1009,7 @@ func makeImporterContainerSpec(args *importerPodArgs) []corev1.Container { } if args.vddkExtraArgs != nil { containers[0].VolumeMounts = append(containers[0].VolumeMounts, corev1.VolumeMount{ - Name: VddkArgsVolName, + Name: common.VddkArgsVolName, MountPath: common.VddkArgsDir, }) } @@ -1086,7 +1086,7 @@ func makeImporterVolumeSpec(args *importerPodArgs) []corev1.Volume { } if args.vddkExtraArgs != nil { volumes = append(volumes, corev1.Volume{ - Name: VddkArgsVolName, + Name: common.VddkArgsVolName, VolumeSource: corev1.VolumeSource{ ConfigMap: &v1.ConfigMapVolumeSource{ LocalObjectReference: v1.LocalObjectReference{ diff --git a/pkg/controller/util.go b/pkg/controller/util.go index d5301ccd25..81e050464d 100644 --- a/pkg/controller/util.go +++ b/pkg/controller/util.go @@ -52,9 +52,6 @@ const ( //nolint:gosec // This is not a real secret SecretVolName = "cdi-secret-vol" - // VddkArgsVolName is the name of the volume referencing the extra VDDK arguments ConfigMap - VddkArgsVolName = "vddk-extra-args" - // AnnOwnerRef is used when owner is in a different namespace AnnOwnerRef = cc.AnnAPIGroup + "/storage.ownerRef" diff --git a/pkg/image/nbdkit.go b/pkg/image/nbdkit.go index d863edb54e..fd5d1eb055 100644 --- a/pkg/image/nbdkit.go +++ b/pkg/image/nbdkit.go @@ -4,7 +4,6 @@ import ( "bufio" "fmt" "io" - "io/fs" "os" "os/exec" "path/filepath" @@ -240,23 +239,15 @@ func getVddkPluginPath() NbdkitPlugin { // importer pod. Just look for the first file in the mounted directory, and // pass that through nbdkit via the "config=" option. func getVddkConfig() (string, error) { - withHidden, err := os.ReadDir(common.VddkArgsDir) + path := filepath.Join(common.VddkArgsDir, common.VddkArgsKeyName) + _, err := os.Stat(path) if err != nil { - if os.IsNotExist(err) { // No extra arguments ConfigMap specified, so mount directory does not exist + if os.IsNotExist(err) { // No configuration file found, so no extra arguments to give to VDDK return "", nil } return "", err } - files := []fs.DirEntry{} - for _, file := range withHidden { // Ignore hidden files - if !strings.HasPrefix(file.Name(), ".") { - files = append(files, file) - } - } - if len(files) < 1 { - return "", fmt.Errorf("no VDDK configuration files found under %s", common.VddkArgsDir) - } - path := filepath.Join(common.VddkArgsDir, files[0].Name()) + return path, nil } diff --git a/tests/datavolume_test.go b/tests/datavolume_test.go index f6c8161490..a0fa34d5ee 100644 --- a/tests/datavolume_test.go +++ b/tests/datavolume_test.go @@ -1192,7 +1192,7 @@ var _ = Describe("[vendor:cnv-qe@redhat.com][level:component]DataVolume tests", Name: "vddk-extra-args-map", }, Data: map[string]string{ // Must match vddk-test-plugin - "vddk-config-file": "VixDiskLib.nfcAio.Session.BufSizeIn64KB=16", + common.VddkArgsKeyName: "VixDiskLib.nfcAio.Session.BufSizeIn64KB=16", }, } _, err := f.K8sClient.CoreV1().ConfigMaps(f.Namespace.Name).Create(context.TODO(), &extraArguments, metav1.CreateOptions{})