From 46ba35da8fb0b412a2ebb2b115d1a370f1b7da47 Mon Sep 17 00:00:00 2001 From: Swapnil Date: Wed, 29 Jul 2026 12:58:05 +0530 Subject: [PATCH] MIG-1963: Add csi.trident.netapp.io to accessModeList MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The accessModeList only contained the legacy Trident provisioner name (netapp.io/trident). Modern NetApp Trident CSI StorageClasses use csi.trident.netapp.io, which did not match, causing accessModesForProvisioner() to fall back to ReadWriteOnce/Filesystem only — silently dropping Block and ReadWriteMany support. Add a new accessModeList entry for csi.trident.netapp.io alongside the existing legacy entry to correctly report supported access modes for both provisioner names. Closes: https://redhat.atlassian.net/browse/MIG-1963 Ref: https://github.com/migtools/mig-controller/issues/1366 Co-authored-by: Cursor --- .../migration/v1alpha1/migcluster_types.go | 8 ++ .../v1alpha1/migcluster_types_test.go | 94 +++++++++++++++++++ 2 files changed, 102 insertions(+) diff --git a/pkg/apis/migration/v1alpha1/migcluster_types.go b/pkg/apis/migration/v1alpha1/migcluster_types.go index d4492f2c1..8e7b9ec28 100644 --- a/pkg/apis/migration/v1alpha1/migcluster_types.go +++ b/pkg/apis/migration/v1alpha1/migcluster_types.go @@ -804,6 +804,14 @@ var accessModeList = []provisionerAccessModes{ kapi.PersistentVolumeBlock: {kapi.ReadWriteOnce, kapi.ReadOnlyMany, kapi.ReadWriteMany}, }, }, + provisionerAccessModes{ + Provisioner: "csi.trident.netapp.io", + // Note: some backends won't support RWX + AccessModes: map[kapi.PersistentVolumeMode][]kapi.PersistentVolumeAccessMode{ + kapi.PersistentVolumeFilesystem: {kapi.ReadWriteOnce, kapi.ReadOnlyMany}, + kapi.PersistentVolumeBlock: {kapi.ReadWriteOnce, kapi.ReadOnlyMany, kapi.ReadWriteMany}, + }, + }, provisionerAccessModes{ Provisioner: "csi.kubevirt.io", AccessModes: map[kapi.PersistentVolumeMode][]kapi.PersistentVolumeAccessMode{ diff --git a/pkg/apis/migration/v1alpha1/migcluster_types_test.go b/pkg/apis/migration/v1alpha1/migcluster_types_test.go index e1bfb1ea6..36633fb65 100644 --- a/pkg/apis/migration/v1alpha1/migcluster_types_test.go +++ b/pkg/apis/migration/v1alpha1/migcluster_types_test.go @@ -18,10 +18,12 @@ package v1alpha1 import ( "context" + "reflect" "testing" "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" + kapi "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" k8sclient "sigs.k8s.io/controller-runtime/pkg/client" @@ -250,3 +252,95 @@ func TestMigCluster_GetRegistryLivenessTimeout(t *testing.T) { }) } } + +func TestMigCluster_accessModesForProvisioner(t *testing.T) { + m := &MigCluster{} + tests := []struct { + name string + provisioner string + volumeMode kapi.PersistentVolumeMode + want []kapi.PersistentVolumeAccessMode + }{ + { + name: "csi.trident.netapp.io Filesystem should return RWO and ROX", + provisioner: "csi.trident.netapp.io", + volumeMode: kapi.PersistentVolumeFilesystem, + want: []kapi.PersistentVolumeAccessMode{kapi.ReadWriteOnce, kapi.ReadOnlyMany}, + }, + { + name: "csi.trident.netapp.io Block should return RWO, ROX, and RWX", + provisioner: "csi.trident.netapp.io", + volumeMode: kapi.PersistentVolumeBlock, + want: []kapi.PersistentVolumeAccessMode{kapi.ReadWriteOnce, kapi.ReadOnlyMany, kapi.ReadWriteMany}, + }, + { + name: "legacy netapp.io/trident Filesystem should return RWO and ROX", + provisioner: "netapp.io/trident", + volumeMode: kapi.PersistentVolumeFilesystem, + want: []kapi.PersistentVolumeAccessMode{kapi.ReadWriteOnce, kapi.ReadOnlyMany}, + }, + { + name: "legacy netapp.io/trident Block should return RWO, ROX, and RWX", + provisioner: "netapp.io/trident", + volumeMode: kapi.PersistentVolumeBlock, + want: []kapi.PersistentVolumeAccessMode{kapi.ReadWriteOnce, kapi.ReadOnlyMany, kapi.ReadWriteMany}, + }, + { + name: "CSI and legacy Trident should return identical Filesystem modes", + provisioner: "csi.trident.netapp.io", + volumeMode: kapi.PersistentVolumeFilesystem, + want: m.accessModesForProvisioner("netapp.io/trident", kapi.PersistentVolumeFilesystem), + }, + { + name: "CSI and legacy Trident should return identical Block modes", + provisioner: "csi.trident.netapp.io", + volumeMode: kapi.PersistentVolumeBlock, + want: m.accessModesForProvisioner("netapp.io/trident", kapi.PersistentVolumeBlock), + }, + { + name: "rbd.csi.ceph.com suffix match for Filesystem should return RWO", + provisioner: "openshift-storage.rbd.csi.ceph.com", + volumeMode: kapi.PersistentVolumeFilesystem, + want: []kapi.PersistentVolumeAccessMode{kapi.ReadWriteOnce}, + }, + { + name: "rbd.csi.ceph.com suffix match for Block should return RWO, ROX, and RWX", + provisioner: "openshift-storage.rbd.csi.ceph.com", + volumeMode: kapi.PersistentVolumeBlock, + want: []kapi.PersistentVolumeAccessMode{kapi.ReadWriteOnce, kapi.ReadOnlyMany, kapi.ReadWriteMany}, + }, + { + name: "unknown provisioner Filesystem should fall back to RWO", + provisioner: "example.com/unknown-driver", + volumeMode: kapi.PersistentVolumeFilesystem, + want: []kapi.PersistentVolumeAccessMode{kapi.ReadWriteOnce}, + }, + { + name: "unknown provisioner Block should fall back to nil", + provisioner: "example.com/unknown-driver", + volumeMode: kapi.PersistentVolumeBlock, + want: nil, + }, + { + name: "kubernetes.io/aws-ebs Filesystem should return RWO", + provisioner: "kubernetes.io/aws-ebs", + volumeMode: kapi.PersistentVolumeFilesystem, + want: []kapi.PersistentVolumeAccessMode{kapi.ReadWriteOnce}, + }, + { + name: "kubernetes.io/aws-ebs Block should return nil (not in map)", + provisioner: "kubernetes.io/aws-ebs", + volumeMode: kapi.PersistentVolumeBlock, + want: nil, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := m.accessModesForProvisioner(tt.provisioner, tt.volumeMode) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("accessModesForProvisioner(%q, %q) = %v, want %v", + tt.provisioner, tt.volumeMode, got, tt.want) + } + }) + } +}