@@ -25,9 +25,12 @@ import (
25
25
"runtime"
26
26
"testing"
27
27
28
+ "github.com/Azure/azure-sdk-for-go/tools/apidiff/ioext"
28
29
"github.com/blang/semver"
29
30
30
31
"k8s.io/minikube/pkg/minikube/driver"
32
+ "k8s.io/minikube/pkg/minikube/localpath"
33
+ "k8s.io/minikube/pkg/version"
31
34
)
32
35
33
36
func TestKVMDriverInstallOrUpdate (t * testing.T ) {
@@ -158,8 +161,8 @@ func TestHyperKitDriverInstallOrUpdate(t *testing.T) {
158
161
t .Fatalf ("Expected new semver. test: %v, got: %v" , tc .name , err )
159
162
}
160
163
161
- if err := exec . Command ( "sudo" , "-n" , "ls" ). Run (); err != nil {
162
- t .Skipf ("password required to execute 'ls ', skipping remaining test: %v" , err )
164
+ if sudoNeedsPassword () {
165
+ t .Skipf ("password required to execute 'sudo ', skipping remaining test" )
163
166
}
164
167
165
168
err = driver .InstallOrUpdate ("hyperkit" , dir , newerVersion , false , true )
@@ -173,3 +176,123 @@ func TestHyperKitDriverInstallOrUpdate(t *testing.T) {
173
176
}
174
177
}
175
178
}
179
+
180
+ func TestHyperkitDriverSkipUpgrade (t * testing.T ) {
181
+ if runtime .GOOS != "darwin" {
182
+ t .Skip ("Skip if not darwin." )
183
+ }
184
+
185
+ MaybeParallel (t )
186
+ tests := []struct {
187
+ name string
188
+ path string
189
+ expectedVersion string
190
+ }{
191
+ {
192
+ name : "upgrade-v1.11.0-to-current" ,
193
+ path : filepath .Join (* testdataDir , "hyperkit-driver-version-1.11.0" ),
194
+ expectedVersion : "v1.11.0" ,
195
+ },
196
+ {
197
+ name : "upgrade-v1.2.0-to-current" ,
198
+ path : filepath .Join (* testdataDir , "hyperkit-driver-older-version" ),
199
+ expectedVersion : version .GetVersion (),
200
+ },
201
+ }
202
+
203
+ sudoPath , err := exec .LookPath ("sudo" )
204
+ if err != nil {
205
+ t .Fatalf ("No sudo in path: %v" , err )
206
+ }
207
+
208
+ for _ , tc := range tests {
209
+ t .Run (tc .name , func (t * testing.T ) {
210
+ mkDir , drvPath , err := prepareTempMinikubeDirWithHyperkitDriver (tc .name , tc .path )
211
+ if err != nil {
212
+ t .Fatalf ("Failed to prepare tempdir. test: %s, got: %v" , tc .name , err )
213
+ }
214
+ defer func () {
215
+ if err := os .RemoveAll (mkDir ); err != nil {
216
+ t .Errorf ("Failed to remove mkDir %q: %v" , mkDir , err )
217
+ }
218
+ }()
219
+
220
+ cmd := exec .Command (Target (), "start" , "--download-only" , "--interactive=false" , "--driver=hyperkit" )
221
+ cmd .Stdout = os .Stdout
222
+ cmd .Stderr = os .Stdout
223
+ cmd .Env = append (os .Environ (),
224
+ fmt .Sprintf ("PATH=%v%c%v" , filepath .Dir (drvPath ), filepath .ListSeparator , filepath .Dir (sudoPath )),
225
+ "MINIKUBE_HOME=" + mkDir )
226
+ if err = cmd .Run (); err != nil {
227
+ t .Fatalf ("failed to run minikube. got: %v" , err )
228
+ }
229
+
230
+ upgradedVersion , err := driverVersion (drvPath )
231
+ if err != nil {
232
+ t .Fatalf ("failed to check driver version. got: %v" , err )
233
+ }
234
+
235
+ if upgradedVersion != tc .expectedVersion {
236
+ t .Fatalf ("invalid driver version. expected: %v, got: %v" , tc .expectedVersion , upgradedVersion )
237
+ }
238
+ })
239
+ }
240
+ }
241
+
242
+ func sudoNeedsPassword () bool {
243
+ err := exec .Command ("sudo" , "-n" , "ls" ).Run ()
244
+ return err != nil
245
+ }
246
+
247
+ func driverVersion (path string ) (string , error ) {
248
+ output , err := exec .Command (path , "version" ).Output ()
249
+ if err != nil {
250
+ return "" , err
251
+ }
252
+
253
+ var resultVersion string
254
+ _ , err = fmt .Sscanf (string (output ), "version: %s\n " , & resultVersion )
255
+ if err != nil {
256
+ return "" , err
257
+ }
258
+ return resultVersion , nil
259
+ }
260
+
261
+ // prepareTempMinikubeDirWithHyperkitDriver creates a temp .minikube directory
262
+ // with structure essential to testing of hyperkit driver updates
263
+ func prepareTempMinikubeDirWithHyperkitDriver (name , driver string ) (string , string , error ) {
264
+ temp , err := ioutil .TempDir ("" , name )
265
+ if err != nil {
266
+ return "" , "" , fmt .Errorf ("failed to create tempdir: %v" , err )
267
+ }
268
+ mkDir := filepath .Join (temp , ".minikube" )
269
+ mkBinDir := filepath .Join (mkDir , "bin" )
270
+ err = os .MkdirAll (mkBinDir , 0777 )
271
+ if err != nil {
272
+ return "" , "" , fmt .Errorf ("failed to prepare tempdir: %v" , err )
273
+ }
274
+
275
+ pwd , err := os .Getwd ()
276
+ if err != nil {
277
+ return "" , "" , fmt .Errorf ("failed to get working directory: %v" , err )
278
+ }
279
+
280
+ testDataDriverPath := filepath .Join (pwd , driver , "docker-machine-driver-hyperkit" )
281
+ if _ , err = os .Stat (testDataDriverPath ); err != nil {
282
+ return "" , "" , fmt .Errorf ("expected driver to exist: %v" , err )
283
+ }
284
+ // copy driver to temp bin
285
+ testDriverPath := filepath .Join (mkBinDir , "docker-machine-driver-hyperkit" )
286
+ if err = ioext .CopyFile (testDataDriverPath , testDriverPath , false ); err != nil {
287
+ return "" , "" , fmt .Errorf ("failed to setup current hyperkit driver: %v" , err )
288
+ }
289
+
290
+ // try to copy cached files to the temp minikube folder to avoid downloading of iso and preloads
291
+ _ = ioext .CopyDir (filepath .Join (localpath .MakeMiniPath ("cache" )), filepath .Join (mkDir , "cache" ))
292
+
293
+ // change permission to allow driver to be executable
294
+ if err = os .Chmod (testDriverPath , 0755 ); err != nil {
295
+ return "" , "" , fmt .Errorf ("failed to set driver permission: %v" , err )
296
+ }
297
+ return temp , testDriverPath , nil
298
+ }
0 commit comments