@@ -23,12 +23,15 @@ import (
2323 "time"
2424
2525 "github.com/kubernetes-csi/external-resizer/pkg/csi"
26+ "github.com/kubernetes-csi/external-resizer/pkg/util"
2627
2728 "k8s.io/api/core/v1"
2829 "k8s.io/apimachinery/pkg/api/resource"
2930 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3031 "k8s.io/client-go/informers"
3132 "k8s.io/client-go/kubernetes"
33+
34+ csitranslationlib "k8s.io/csi-translation-lib"
3235 "k8s.io/klog"
3336)
3437
@@ -107,7 +110,18 @@ func (r *csiResizer) Name() string {
107110 return r .name
108111}
109112
110- func (r * csiResizer ) CanSupport (pv * v1.PersistentVolume ) bool {
113+ // CanSupport returns whether the PV is supported by resizer
114+ // Resizer will resize the volume if it is CSI volume or is migration enabled in-tree volume
115+ func (r * csiResizer ) CanSupport (pv * v1.PersistentVolume , pvc * v1.PersistentVolumeClaim ) bool {
116+ resizerName := pvc .Annotations [util .VolumeResizerKey ]
117+ // resizerName will be CSI driver name when CSI migration is enabled
118+ // otherwise, it will be in-tree plugin name
119+ // r.name is the CSI driver name, return true only when they match
120+ // and the CSI driver is migrated
121+ if csitranslationlib .IsMigratedCSIDriverByName (r .name ) && resizerName == r .name {
122+ return true
123+ }
124+
111125 source := pv .Spec .CSI
112126 if source == nil {
113127 klog .V (4 ).Infof ("PV %s is not a CSI volume, skip it" , pv .Name )
@@ -120,14 +134,32 @@ func (r *csiResizer) CanSupport(pv *v1.PersistentVolume) bool {
120134 return true
121135}
122136
137+ // Resize resizes the persistence volume given request size
138+ // It supports both CSI volume and migrated in-tree volume
123139func (r * csiResizer ) Resize (pv * v1.PersistentVolume , requestSize resource.Quantity ) (resource.Quantity , bool , error ) {
124140 oldSize := pv .Spec .Capacity [v1 .ResourceStorage ]
125141
126- source := pv .Spec .CSI
127- if source == nil {
128- return oldSize , false , errors .New ("not a CSI volume" )
142+ var volumeID string
143+ var source * v1.CSIPersistentVolumeSource
144+ if pv .Spec .CSI != nil {
145+ // handle CSI volume
146+ source = pv .Spec .CSI
147+ volumeID = source .VolumeHandle
148+ } else {
149+ if csitranslationlib .IsMigratedCSIDriverByName (r .name ) {
150+ // handle migrated in-tree volume
151+ csiPV , err := csitranslationlib .TranslateInTreePVToCSI (pv )
152+ if err != nil {
153+ return oldSize , false , fmt .Errorf ("failed to translate persistent volume: %v" , err )
154+ }
155+ source = csiPV .Spec .CSI
156+ volumeID = source .VolumeHandle
157+ } else {
158+ // non-migrated in-tree volume
159+ return oldSize , false , fmt .Errorf ("volume %v is not migrated to CSI" , pv .Name )
160+ }
129161 }
130- volumeID := source . VolumeHandle
162+
131163 if len (volumeID ) == 0 {
132164 return oldSize , false , errors .New ("empty volume handle" )
133165 }
@@ -148,6 +180,7 @@ func (r *csiResizer) Resize(pv *v1.PersistentVolume, requestSize resource.Quanti
148180 if err != nil {
149181 return oldSize , nodeResizeRequired , err
150182 }
183+
151184 return * resource .NewQuantity (newSizeBytes , resource .BinarySI ), nodeResizeRequired , err
152185}
153186
0 commit comments