@@ -23,12 +23,15 @@ import (
23
23
"time"
24
24
25
25
"github.com/kubernetes-csi/external-resizer/pkg/csi"
26
+ "github.com/kubernetes-csi/external-resizer/pkg/util"
26
27
27
28
"k8s.io/api/core/v1"
28
29
"k8s.io/apimachinery/pkg/api/resource"
29
30
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30
31
"k8s.io/client-go/informers"
31
32
"k8s.io/client-go/kubernetes"
33
+
34
+ csitranslationlib "k8s.io/csi-translation-lib"
32
35
"k8s.io/klog"
33
36
)
34
37
@@ -107,7 +110,18 @@ func (r *csiResizer) Name() string {
107
110
return r .name
108
111
}
109
112
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
+
111
125
source := pv .Spec .CSI
112
126
if source == nil {
113
127
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 {
120
134
return true
121
135
}
122
136
137
+ // Resize resizes the persistence volume given request size
138
+ // It supports both CSI volume and migrated in-tree volume
123
139
func (r * csiResizer ) Resize (pv * v1.PersistentVolume , requestSize resource.Quantity ) (resource.Quantity , bool , error ) {
124
140
oldSize := pv .Spec .Capacity [v1 .ResourceStorage ]
125
141
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
+ }
129
161
}
130
- volumeID := source . VolumeHandle
162
+
131
163
if len (volumeID ) == 0 {
132
164
return oldSize , false , errors .New ("empty volume handle" )
133
165
}
@@ -148,7 +180,12 @@ func (r *csiResizer) Resize(pv *v1.PersistentVolume, requestSize resource.Quanti
148
180
if err != nil {
149
181
return oldSize , nodeResizeRequired , err
150
182
}
151
- return * resource .NewQuantity (newSizeBytes , resource .BinarySI ), nodeResizeRequired , err
183
+
184
+ if pv .Spec .VolumeMode == nil || * pv .Spec .VolumeMode == v1 .PersistentVolumeFilesystem {
185
+ return * resource .NewQuantity (newSizeBytes , resource .BinarySI ), nodeResizeRequired , err
186
+ }
187
+
188
+ return * resource .NewQuantity (newSizeBytes , resource .BinarySI ), false , err
152
189
}
153
190
154
191
func getDriverName (client csi.Client , timeout time.Duration ) (string , error ) {
0 commit comments