@@ -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,14 @@ 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
+ if csitranslationlib .IsMigratedCSIDriverByName (r .name ) && resizerName == r .name {
118
+ return true
119
+ }
120
+
111
121
source := pv .Spec .CSI
112
122
if source == nil {
113
123
klog .V (4 ).Infof ("PV %s is not a CSI volume, skip it" , pv .Name )
@@ -120,14 +130,32 @@ func (r *csiResizer) CanSupport(pv *v1.PersistentVolume) bool {
120
130
return true
121
131
}
122
132
133
+ // Resize resizes the persistence volume given request size
134
+ // It supports both CSI volume and migrated in-tree volume
123
135
func (r * csiResizer ) Resize (pv * v1.PersistentVolume , requestSize resource.Quantity ) (resource.Quantity , bool , error ) {
124
136
oldSize := pv .Spec .Capacity [v1 .ResourceStorage ]
125
137
126
- source := pv .Spec .CSI
127
- if source == nil {
128
- return oldSize , false , errors .New ("not a CSI volume" )
138
+ var volumeID string
139
+ var source * v1.CSIPersistentVolumeSource
140
+ if pv .Spec .CSI != nil {
141
+ // handle CSI volume
142
+ source = pv .Spec .CSI
143
+ volumeID = source .VolumeHandle
144
+ } else {
145
+ if csitranslationlib .IsMigratedCSIDriverByName (r .name ) {
146
+ // handle migrated in-tree volume
147
+ csiPV , err := csitranslationlib .TranslateInTreePVToCSI (pv )
148
+ if err != nil {
149
+ return oldSize , false , fmt .Errorf ("failed to translate persistent volume: %v" , err )
150
+ }
151
+ source = csiPV .Spec .CSI
152
+ volumeID = source .VolumeHandle
153
+ } else {
154
+ // non-migrated in-tree volume
155
+ return oldSize , false , fmt .Errorf ("volume %v is not migrated to CSI" , pv .Name )
156
+ }
129
157
}
130
- volumeID := source . VolumeHandle
158
+
131
159
if len (volumeID ) == 0 {
132
160
return oldSize , false , errors .New ("empty volume handle" )
133
161
}
@@ -148,7 +176,12 @@ func (r *csiResizer) Resize(pv *v1.PersistentVolume, requestSize resource.Quanti
148
176
if err != nil {
149
177
return oldSize , nodeResizeRequired , err
150
178
}
151
- return * resource .NewQuantity (newSizeBytes , resource .BinarySI ), nodeResizeRequired , err
179
+
180
+ if pv .Spec .VolumeMode == nil || * pv .Spec .VolumeMode == v1 .PersistentVolumeFilesystem {
181
+ return * resource .NewQuantity (newSizeBytes , resource .BinarySI ), nodeResizeRequired , err
182
+ }
183
+
184
+ return * resource .NewQuantity (newSizeBytes , resource .BinarySI ), false , err
152
185
}
153
186
154
187
func getDriverName (client csi.Client , timeout time.Duration ) (string , error ) {
0 commit comments