@@ -24,6 +24,7 @@ import (
24
24
"time"
25
25
26
26
"github.com/kubernetes-csi/external-resizer/pkg/csi"
27
+ "github.com/kubernetes-csi/external-resizer/pkg/util"
27
28
28
29
"k8s.io/api/core/v1"
29
30
"k8s.io/apimachinery/pkg/api/resource"
@@ -33,6 +34,8 @@ import (
33
34
"k8s.io/client-go/informers"
34
35
"k8s.io/client-go/kubernetes"
35
36
storagev1listers "k8s.io/client-go/listers/storage/v1"
37
+
38
+ csitranslationlib "k8s.io/csi-translation-lib"
36
39
"k8s.io/klog"
37
40
)
38
41
@@ -118,7 +121,14 @@ func (r *csiResizer) Name() string {
118
121
return r .name
119
122
}
120
123
121
- func (r * csiResizer ) CanSupport (pv * v1.PersistentVolume ) bool {
124
+ // CanSupport returns whether the PV is supported by resizer
125
+ // Resizer will resize the volume if it is CSI volume or is migration enabled in-tree volume
126
+ func (r * csiResizer ) CanSupport (pv * v1.PersistentVolume , pvc * v1.PersistentVolumeClaim ) bool {
127
+ resizerName := pvc .Annotations [util .VolumeResizerKey ]
128
+ if csitranslationlib .IsMigratedCSIDriverByName (r .name ) && resizerName == r .name {
129
+ return true
130
+ }
131
+
122
132
source := pv .Spec .CSI
123
133
if source == nil {
124
134
klog .V (4 ).Infof ("PV %s is not a CSI volume, skip it" , pv .Name )
@@ -131,14 +141,30 @@ func (r *csiResizer) CanSupport(pv *v1.PersistentVolume) bool {
131
141
return true
132
142
}
133
143
144
+ // Resize resizes the persistence volume given request size
145
+ // It supports both CSI volume and migrated in-tree volume
134
146
func (r * csiResizer ) Resize (pv * v1.PersistentVolume , requestSize resource.Quantity ) (resource.Quantity , bool , error ) {
135
147
oldSize := pv .Spec .Capacity [v1 .ResourceStorage ]
136
148
137
- source := pv .Spec .CSI
138
- if source == nil {
139
- return oldSize , false , errors .New ("not a CSI volume" )
149
+ var volumeID string
150
+ if pv .Spec .CSI != nil {
151
+ // handle CSI volume
152
+ source := pv .Spec .CSI
153
+ volumeID = source .VolumeHandle
154
+ } else {
155
+ if csitranslationlib .IsMigratedCSIDriverByName (r .name ) {
156
+ // handle migrated in-tree volume
157
+ csiPV , err := csitranslationlib .TranslateInTreePVToCSI (pv )
158
+ if err != nil {
159
+ return oldSize , false , fmt .Errorf ("failed to translate persistent volume: %v" , err )
160
+ }
161
+ volumeID = csiPV .Spec .CSI .VolumeHandle
162
+ } else {
163
+ // non-migrated in-tree volume
164
+ return oldSize , false , fmt .Errorf ("volume %v is not migrated to CSI" , pv .Name )
165
+ }
140
166
}
141
- volumeID := source . VolumeHandle
167
+
142
168
if len (volumeID ) == 0 {
143
169
return oldSize , false , errors .New ("empty volume handle" )
144
170
}
@@ -167,7 +193,12 @@ func (r *csiResizer) Resize(pv *v1.PersistentVolume, requestSize resource.Quanti
167
193
if err != nil {
168
194
return oldSize , nodeResizeRequired , err
169
195
}
170
- return * resource .NewQuantity (newSizeBytes , resource .BinarySI ), nodeResizeRequired , err
196
+
197
+ if pv .Spec .VolumeMode == nil || * pv .Spec .VolumeMode == v1 .PersistentVolumeFilesystem {
198
+ return * resource .NewQuantity (newSizeBytes , resource .BinarySI ), nodeResizeRequired , err
199
+ }
200
+
201
+ return * resource .NewQuantity (newSizeBytes , resource .BinarySI ), false , err
171
202
}
172
203
173
204
func getDriverName (client csi.Client , timeout time.Duration ) (string , error ) {
0 commit comments