@@ -66,6 +66,9 @@ const (
6666 VolumeContextKeyEphemeral = "csi.storage.k8s.io/ephemeral"
6767 VolumeContextKeyBucketName = "bucketName"
6868 tokenServerSidecarMinVersion = "v1.12.2-gke.0" // #nosec G101
69+ // TODO: Update with actual minimum sidecar version after the first feature release
70+ AutoconfigDefaultingSidecarMinVersion = "v1.99.0-gke.0"
71+ FlagFileForDefaultingPath = "flags-for-defaulting"
6972)
7073
7174var volumeIDRegEx = regexp .MustCompile (`:.*$` )
@@ -473,22 +476,73 @@ func getSidecarContainerStatus(isInitContainer bool, pod *corev1.Pod) (*corev1.C
473476}
474477
475478func isSidecarVersionSupportedForTokenServer (imageName string ) bool {
479+ return isSidecarVersionSupportedForGivenFeature (imageName , tokenServerSidecarMinVersion )
480+ }
481+
482+ func isSidecarVersionSupportedForGivenFeature (imageName string , sidecarMinSupportedVersion string ) bool {
476483 managedSidecarPattern := `.*/gke-release(-staging)?/gcs-fuse-csi-driver-sidecar-mounter:v\d+.\d+.\d+-gke\.\d+.*`
477484 re := regexp .MustCompile (managedSidecarPattern )
478485 isManagedSidecar := re .MatchString (imageName )
479486
480487 if ! isManagedSidecar {
481488 klog .Infof ("mountOptions should not be passed because this is a private sidecar image %q" , imageName )
482-
483489 return false
484490 }
485491 imageVersion := strings .Split (strings .Split (imageName , ":" )[1 ], "@" )[0 ]
486492 klog .Infof ("sidecar image version: %v" , imageVersion )
487- if semver .Compare (imageVersion , tokenServerSidecarMinVersion ) >= 0 {
493+ if semver .Compare (imageVersion , sidecarMinSupportedVersion ) >= 0 {
488494 klog .Infof ("sidecar version is supported for token server" )
489-
490495 return true
491496 }
492497
493498 return false
494499}
500+
501+ func PutFlagsFromDriverToTargetPath (flagMap map [string ]string , targetPath string , fileName string ) error {
502+ emptyDirBasePath , err := util .PrepareEmptyDir (targetPath , true )
503+ if err != nil {
504+ return fmt .Errorf ("failed to get emptyDir path: %w" , err )
505+ }
506+
507+ absolutePath := filepath .Dir (emptyDirBasePath ) + "/" + fileName
508+ klog .V (4 ).Infof ("Writing flags needed for gcsfuse defaulting logic to file %q: %v" , absolutePath , flagMap )
509+
510+ f , err := os .Create (absolutePath )
511+ if err != nil {
512+ return fmt .Errorf ("failed to create defaulting-flag file: %w" , err )
513+ }
514+ content := prepareFileContentFromFlagMap (flagMap )
515+ if _ , err := f .WriteString (content ); err != nil {
516+ return fmt .Errorf ("failed to write defaulting-flag file: %w" , err )
517+ }
518+
519+ f .Close ()
520+
521+ return nil
522+ }
523+
524+ func prepareFileContentFromFlagMap (flagMap map [string ]string ) string {
525+ var sb strings.Builder
526+ for key , value := range flagMap {
527+ sb .WriteString (key )
528+ sb .WriteString (":" )
529+ sb .WriteString (value )
530+ sb .WriteString ("\n " )
531+ }
532+ return sb .String ()
533+ }
534+
535+ func ParseFlagMapFromFlagFile (flagFileContent string ) map [string ]string {
536+ configFlags := make (map [string ]string )
537+ lines := strings .Split (flagFileContent , "\n " )
538+ for _ , line := range lines {
539+ if line == "" { // Skip empty lines
540+ continue
541+ }
542+ parts := strings .Split (line , ":" )
543+ key := parts [0 ]
544+ value := parts [1 ]
545+ configFlags [key ] = value
546+ }
547+ return configFlags
548+ }
0 commit comments