@@ -28,6 +28,7 @@ import (
28
28
"time"
29
29
30
30
"k8s.io/klog/v2"
31
+ "k8s.io/utils/strings/slices"
31
32
32
33
"sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/common"
33
34
"sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/deviceutils"
@@ -98,7 +99,7 @@ func init() {
98
99
// Use V(4) for general debug information logging
99
100
// Use V(5) for GCE Cloud Provider Call informational logging
100
101
// Use V(6) for extra repeated/polling information
101
- enumFlag (& computeEnvironment , "compute-environment" , allowedComputeEnvironment , "Operating compute environment" )
102
+ stringEnumFlag (& computeEnvironment , "compute-environment" , allowedComputeEnvironment , "Operating compute environment" )
102
103
urlFlag (& computeEndpoint , "compute-endpoint" , "Compute endpoint" )
103
104
klog .InitFlags (flag .CommandLine )
104
105
flag .Set ("logtostderr" , "true" )
@@ -175,23 +176,23 @@ func handle() {
175
176
identityServer := driver .NewIdentityServer (gceDriver )
176
177
177
178
// Initialize requisite zones
178
- fallbackRequisiteZones := strings . Split (* fallbackRequisiteZonesFlag , "," )
179
+ fallbackRequisiteZones := parseCSVFlag (* fallbackRequisiteZonesFlag )
179
180
180
181
// Initialize multi-zone disk types
181
- multiZoneVolumeHandleDiskTypes := strings . Split (* multiZoneVolumeHandleDiskTypesFlag , "," )
182
+ multiZoneVolumeHandleDiskTypes := parseCSVFlag (* multiZoneVolumeHandleDiskTypesFlag )
182
183
multiZoneVolumeHandleConfig := driver.MultiZoneVolumeHandleConfig {
183
184
Enable : * multiZoneVolumeHandleEnableFlag ,
184
185
DiskTypes : multiZoneVolumeHandleDiskTypes ,
185
186
}
186
187
187
188
// Initialize waitForAttach config
188
- useInstanceAPIOnWaitForAttachDiskTypes := strings . Split (* useInstanceAPIOnWaitForAttachDiskTypesFlag , "," )
189
+ useInstanceAPIOnWaitForAttachDiskTypes := parseCSVFlag (* useInstanceAPIOnWaitForAttachDiskTypesFlag )
189
190
waitForAttachConfig := gce.WaitForAttachConfig {
190
191
UseInstancesAPIForDiskTypes : useInstanceAPIOnWaitForAttachDiskTypes ,
191
192
}
192
193
193
194
// Initialize listVolumes config
194
- instancesListFilters := strings . Split (* instancesListFiltersFlag , "," )
195
+ instancesListFilters := parseCSVFlag (* instancesListFiltersFlag )
195
196
listInstancesConfig := gce.ListInstancesConfig {
196
197
Filters : instancesListFilters ,
197
198
}
@@ -252,18 +253,48 @@ func handle() {
252
253
gceDriver .Run (* endpoint , * grpcLogCharCap , * enableOtelTracing )
253
254
}
254
255
255
- func enumFlag (target * gce.Environment , name string , allowedComputeEnvironment []gce.Environment , usage string ) {
256
+ func notEmpty (v string ) bool {
257
+ return v != ""
258
+ }
259
+
260
+ func parseCSVFlag (list string ) []string {
261
+ return slices .Filter (nil , strings .Split (list , "," ), notEmpty )
262
+ }
263
+
264
+ type enumConverter [T any ] interface {
265
+ convert (v string ) (T , error )
266
+ eq (a , b T ) bool
267
+ }
268
+
269
+ type stringConverter [T ~ string ] struct {}
270
+
271
+ func (s stringConverter [T ]) convert (v string ) (T , error ) {
272
+ return T (v ), nil
273
+ }
274
+
275
+ func (s stringConverter [T ]) eq (a , b T ) bool {
276
+ return a == b
277
+ }
278
+
279
+ func stringEnumFlag [T ~ string ](target * T , name string , allowed []T , usage string ) {
280
+ enumFlag (target , name , stringConverter [T ]{}, allowed , usage )
281
+ }
282
+
283
+ func enumFlag [T any ](target * T , name string , converter enumConverter [T ], allowed []T , usage string ) {
256
284
flag .Func (name , usage , func (flagValue string ) error {
257
- for _ , allowedValue := range allowedComputeEnvironment {
258
- if gce .Environment (flagValue ) == allowedValue {
259
- * target = gce .Environment (flagValue )
285
+ tValue , err := converter .convert (flagValue )
286
+ if err != nil {
287
+ return err
288
+ }
289
+ for _ , allowedValue := range allowed {
290
+ if converter .eq (allowedValue , tValue ) {
291
+ * target = tValue
260
292
return nil
261
293
}
262
294
}
263
295
errMsg := fmt .Sprintf (`must be one of %v` , allowedComputeEnvironment )
264
296
return errors .New (errMsg )
265
297
})
266
-
267
298
}
268
299
269
300
func urlFlag (target * * url.URL , name string , usage string ) {
0 commit comments