5
5
"fmt"
6
6
"os"
7
7
"path/filepath"
8
+ "regexp"
9
+ "strconv"
8
10
"strings"
9
11
"text/template"
10
12
)
@@ -70,7 +72,6 @@ func generateDriverConfigFile(platform, pkgDir, storageClassFile, snapshotClassF
70
72
"ext2" ,
71
73
"ext3" ,
72
74
"ext4" ,
73
- "xfs" ,
74
75
}
75
76
}
76
77
@@ -82,12 +83,25 @@ func generateDriverConfigFile(platform, pkgDir, storageClassFile, snapshotClassF
82
83
dataSource
83
84
*/
84
85
85
- // TODO: Support adding/removing capabilities based on Kubernetes version.
86
86
switch deploymentStrat {
87
87
case "gke" :
88
- fallthrough
89
- case "gce" :
90
88
caps = append (caps , "controllerExpansion" , "nodeExpansion" )
89
+ if * imageType == "cos" {
90
+ major , minor , err := getGKEClusterVersion ()
91
+ if err != nil {
92
+ return "" , fmt .Errorf ("Cannot find GKE cluster version to set driver config: %w" , err )
93
+ }
94
+ if major > 1 || minor >= 18 {
95
+ // COS supports XFS from 1.18 on.
96
+ fsTypes = append (fsTypes , "xfs" )
97
+ }
98
+ // Otherwise XFS is not supported on COS.
99
+ } else {
100
+ // XFS is supported on all non-COS images.
101
+ fsTypes = append (fsTypes , "xfs" )
102
+ }
103
+ case "gce" :
104
+ fsTypes = append (fsTypes , "xfs" )
91
105
default :
92
106
return "" , fmt .Errorf ("got unknown deployment strat %s, expected gce or gke" , deploymentStrat )
93
107
}
@@ -124,3 +138,38 @@ func generateDriverConfigFile(platform, pkgDir, storageClassFile, snapshotClassF
124
138
125
139
return configFilePath , nil
126
140
}
141
+
142
+ func getGKEClusterVersion () (major , minor int , err error ) {
143
+ if * gkeClusterVer == "" && * gkeReleaseChannel == "" {
144
+ return 0 , 0 , fmt .Errorf ("No GKE version found" )
145
+ }
146
+ // TODO: the release channels are hardcoded (as is latest, below), which means they will need to be updated at each GKE release. It would be better to find the version automatically, maybe through gcloud container get-server-config.
147
+ switch * gkeReleaseChannel {
148
+ case "" : // Use gkeClusterVer instead.
149
+ case "rapid" :
150
+ return 1 , 18 , nil
151
+ case "regular" :
152
+ return 1 , 17 , nil
153
+ case "stable" :
154
+ return 1 , 16 , nil
155
+ }
156
+
157
+ if * gkeClusterVer == "latest" {
158
+ return 1 , 17 , nil
159
+ }
160
+
161
+ versionRE := regexp .MustCompile (`^(\d+)\.(\d+)` )
162
+ matches := versionRE .FindStringSubmatch (* gkeClusterVer )
163
+ if len (matches ) != 3 {
164
+ return 0 , 0 , fmt .Errorf ("Unknown GKE cluster version %s" , * gkeClusterVer )
165
+ }
166
+ major , err = strconv .Atoi (matches [1 ])
167
+ if err != nil || major < 1 {
168
+ return 0 , 0 , fmt .Errorf ("Couldn't parse major version %s in %s: %w" , matches [1 ], * gkeClusterVer , err )
169
+ }
170
+ minor , err = strconv .Atoi (matches [2 ])
171
+ if err != nil || minor < 0 {
172
+ return 0 , 0 , fmt .Errorf ("Couldn't parse minor version %s in %s: %w" , matches [2 ], * gkeClusterVer , err )
173
+ }
174
+ return
175
+ }
0 commit comments