@@ -100,15 +100,13 @@ func (d *Driver) GetSSHPort() (int, error) {
100
100
if d .SSHPort == 0 {
101
101
d .SSHPort = 22
102
102
}
103
-
104
103
return d .SSHPort , nil
105
104
}
106
105
107
106
func (d * Driver ) GetSSHUsername () string {
108
107
if d .SSHUser == "" {
109
108
d .SSHUser = "docker"
110
109
}
111
-
112
110
return d .SSHUser
113
111
}
114
112
@@ -117,13 +115,12 @@ func (d *Driver) DriverName() string {
117
115
}
118
116
119
117
func (d * Driver ) GetURL () (string , error ) {
120
- log .Debugf ("GetURL called" )
121
118
if _ , err := os .Stat (d .pidfilePath ()); err != nil {
122
119
return "" , nil
123
120
}
124
121
ip , err := d .GetIP ()
125
122
if err != nil {
126
- log .Warnf ("Failed to get IP: %s " , err )
123
+ log .Warnf ("Failed to get IP: %v " , err )
127
124
return "" , err
128
125
}
129
126
if ip == "" {
@@ -170,7 +167,6 @@ func checkPid(pid int) error {
170
167
}
171
168
172
169
func (d * Driver ) GetState () (state.State , error ) {
173
-
174
170
if _ , err := os .Stat (d .pidfilePath ()); err != nil {
175
171
return state .Stopped , nil
176
172
}
@@ -191,6 +187,7 @@ func (d *Driver) GetState() (state.State, error) {
191
187
if err != nil {
192
188
return state .Error , err
193
189
}
190
+
194
191
// RunState is one of:
195
192
// 'debug', 'inmigrate', 'internal-error', 'io-error', 'paused',
196
193
// 'postmigrate', 'prelaunch', 'finish-migrate', 'restore-vm',
@@ -241,24 +238,24 @@ func (d *Driver) Create() error {
241
238
return err
242
239
}
243
240
244
- log .Infof ("Creating SSH key..." )
241
+ log .Info ("Creating SSH key..." )
245
242
if err := ssh .GenerateSSHKey (d .sshKeyPath ()); err != nil {
246
243
return err
247
244
}
248
245
249
- log .Infof ("Creating Disk image..." )
246
+ log .Info ("Creating Disk image..." )
250
247
if err := d .generateDiskImage (d .DiskSize ); err != nil {
251
248
return err
252
249
}
253
250
254
251
if d .UserDataFile != "" {
255
- log .Infof ("Creating Userdata Disk..." )
252
+ log .Info ("Creating Userdata Disk..." )
256
253
if d .CloudConfigRoot , err = d .generateUserdataDisk (d .UserDataFile ); err != nil {
257
254
return err
258
255
}
259
256
}
260
257
261
- log .Infof ("Starting QEMU VM..." )
258
+ log .Info ("Starting QEMU VM..." )
262
259
return d .Start ()
263
260
}
264
261
@@ -270,34 +267,34 @@ func parsePortRange(rawPortRange string) (int, int, error) {
270
267
portRange := strings .Split (rawPortRange , "-" )
271
268
272
269
if len (portRange ) < 2 {
273
- return 0 , 0 , errors .New ("Invalid port range, must be at least of length 2 " )
270
+ return 0 , 0 , errors .New ("invalid port range, requires at least 2 ports " )
274
271
}
275
272
276
273
minPort , err := strconv .Atoi (portRange [0 ])
277
274
if err != nil {
278
- return 0 , 0 , errors .Wrap (err , "Invalid port range" )
275
+ return 0 , 0 , errors .Wrap (err , "invalid min port range" )
279
276
}
277
+
280
278
maxPort , err := strconv .Atoi (portRange [1 ])
281
279
if err != nil {
282
- return 0 , 0 , errors .Wrap (err , "Invalid port range" )
280
+ return 0 , 0 , errors .Wrap (err , "invalid max port range" )
283
281
}
284
282
285
283
if maxPort < minPort {
286
- return 0 , 0 , errors .New ("Invalid port range" )
284
+ return 0 , 0 , errors .New ("invalid port range, max less than min " )
287
285
}
288
286
289
287
if maxPort - minPort < 2 {
290
- return 0 , 0 , errors .New ("Port range must be minimum 2 ports" )
288
+ return 0 , 0 , errors .New ("invalid port range, requires at least 2 ports" )
291
289
}
292
-
293
290
return minPort , maxPort , nil
294
291
}
295
292
296
- func getRandomPortNumberInRange (min int , max int ) int {
293
+ func getRandomPortNumberInRange (min , max int ) int {
297
294
return rand .Intn (max - min ) + min
298
295
}
299
296
300
- func getAvailableTCPPortFromRange (minPort int , maxPort int ) (int , error ) {
297
+ func getAvailableTCPPortFromRange (minPort , maxPort int ) (int , error ) {
301
298
port := 0
302
299
for i := 0 ; i <= 10 ; i ++ {
303
300
var ln net.Listener
@@ -327,13 +324,12 @@ func getAvailableTCPPortFromRange(minPort int, maxPort int) (int, error) {
327
324
port = p
328
325
return port , nil
329
326
}
330
- time .Sleep (1 * time .Second )
327
+ time .Sleep (time .Second )
331
328
}
332
329
return 0 , fmt .Errorf ("unable to allocate tcp port" )
333
330
}
334
331
335
332
func (d * Driver ) Start () error {
336
- // fmt.Printf("Init qemu %s\n", i.VM)
337
333
machineDir := filepath .Join (d .StorePath , "machines" , d .GetMachineName ())
338
334
339
335
var startCmd []string
@@ -344,6 +340,7 @@ func (d *Driver) Start() error {
344
340
"-M" , machineType ,
345
341
)
346
342
}
343
+
347
344
if d .CPUType != "" {
348
345
startCmd = append (startCmd ,
349
346
"-cpu" , d .CPUType ,
@@ -380,9 +377,13 @@ func (d *Driver) Start() error {
380
377
381
378
// hardware acceleration is important, it increases performance by 10x
382
379
if runtime .GOOS == "darwin" {
383
- startCmd = append (startCmd , "-accel" , "hvf" )
380
+ // On macOS, enable the Hypervisor framework accelerator.
381
+ startCmd = append (startCmd ,
382
+ "-accel" , "hvf" )
384
383
} else if _ , err := os .Stat ("/dev/kvm" ); err == nil && runtime .GOOS == "linux" {
385
- startCmd = append (startCmd , "-accel" , "kvm" )
384
+ // On Linux, enable the Kernel Virtual Machine accelerator.
385
+ startCmd = append (startCmd ,
386
+ "-accel" , "kvm" )
386
387
}
387
388
388
389
startCmd = append (startCmd ,
@@ -402,41 +403,46 @@ func (d *Driver) Start() error {
402
403
"-pidfile" , d .pidfilePath (),
403
404
)
404
405
405
- if d .Network == "user" {
406
+ switch d .Network {
407
+ case "user" :
406
408
startCmd = append (startCmd ,
407
409
"-nic" , fmt .Sprintf ("user,model=virtio,hostfwd=tcp::%d-:22,hostfwd=tcp::%d-:2376,hostname=%s" , d .SSHPort , d .EnginePort , d .GetMachineName ()),
408
410
)
409
- } else if d . Network == "tap" {
411
+ case "tap" :
410
412
startCmd = append (startCmd ,
411
413
"-nic" , fmt .Sprintf ("tap,model=virtio,ifname=%s,script=no,downscript=no" , d .NetworkInterface ),
412
414
)
413
- } else if d . Network == "vde" {
415
+ case "vde" :
414
416
startCmd = append (startCmd ,
415
417
"-nic" , fmt .Sprintf ("vde,model=virtio,sock=%s" , d .NetworkSocket ),
416
418
)
417
- } else if d . Network == "bridge" {
419
+ case "bridge" :
418
420
startCmd = append (startCmd ,
419
421
"-nic" , fmt .Sprintf ("bridge,model=virtio,br=%s" , d .NetworkBridge ),
420
422
)
421
- } else {
422
- log .Errorf ("Unknown network: %s" , d .Network )
423
+ default :
424
+ log .Errorf ("unknown network: %s" , d .Network )
423
425
}
424
426
425
- startCmd = append (startCmd , "-daemonize" )
427
+ startCmd = append (startCmd ,
428
+ "-daemonize" )
426
429
427
430
if d .CloudConfigRoot != "" {
428
431
startCmd = append (startCmd ,
429
432
"-fsdev" ,
430
433
fmt .Sprintf ("local,security_model=passthrough,readonly,id=fsdev0,path=%s" , d .CloudConfigRoot ))
431
- startCmd = append (startCmd , "-device" , "virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=config-2" )
434
+ startCmd = append (startCmd ,
435
+ "-device" ,
436
+ "virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=config-2" )
432
437
}
433
438
434
439
if d .VirtioDrives {
435
440
startCmd = append (startCmd ,
436
441
"-drive" , fmt .Sprintf ("file=%s,index=0,media=disk,if=virtio" , d .diskPath ()))
437
442
} else {
438
443
// last argument is always the name of the disk image
439
- startCmd = append (startCmd , d .diskPath ())
444
+ startCmd = append (startCmd ,
445
+ d .diskPath ())
440
446
}
441
447
442
448
if stdout , stderr , err := cmdOutErr (d .Program , startCmd ... ); err != nil {
@@ -457,27 +463,25 @@ func cmdOutErr(cmdStr string, args ...string) (string, string, error) {
457
463
cmd .Stdout = & stdout
458
464
cmd .Stderr = & stderr
459
465
err := cmd .Run ()
466
+ stdoutStr := stdout .String ()
460
467
stderrStr := stderr .String ()
461
- log .Debugf ("STDOUT: %v" , stdout . String () )
468
+ log .Debugf ("STDOUT: %v" , stdoutStr )
462
469
log .Debugf ("STDERR: %v" , stderrStr )
463
470
if err != nil {
464
471
if ee , ok := err .(* exec.Error ); ok && ee == exec .ErrNotFound {
465
- err = fmt .Errorf ("mystery error: %s " , ee )
472
+ err = fmt .Errorf ("mystery error: %v " , ee )
466
473
}
467
474
} else {
468
- // also catch error messages in stderr, even if the return code
469
- // looks OK
475
+ // also catch error messages in stderr, even if the return code looks OK
470
476
if strings .Contains (stderrStr , "error:" ) {
471
- err = fmt .Errorf ("%v %v failed: %v " , cmdStr , strings .Join (args , " " ), stderrStr )
477
+ err = fmt .Errorf ("%s %s failed: %s " , cmdStr , strings .Join (args , " " ), stderrStr )
472
478
}
473
479
}
474
- return stdout . String () , stderrStr , err
480
+ return stdoutStr , stderrStr , err
475
481
}
476
482
477
483
func (d * Driver ) Stop () error {
478
- // _, err := d.RunQMPCommand("stop")
479
- _ , err := d .RunQMPCommand ("system_powerdown" )
480
- if err != nil {
484
+ if _ , err := d .RunQMPCommand ("system_powerdown" ); err != nil {
481
485
return err
482
486
}
483
487
return nil
@@ -494,8 +498,7 @@ func (d *Driver) Remove() error {
494
498
}
495
499
}
496
500
if s != state .Stopped {
497
- _ , err = d .RunQMPCommand ("quit" )
498
- if err != nil {
501
+ if _ , err := d .RunQMPCommand ("quit" ); err != nil {
499
502
return errors .Wrap (err , "quit" )
500
503
}
501
504
}
@@ -517,9 +520,7 @@ func (d *Driver) Restart() error {
517
520
}
518
521
519
522
func (d * Driver ) Kill () error {
520
- // _, err := d.RunQMPCommand("quit")
521
- _ , err := d .RunQMPCommand ("system_powerdown" )
522
- if err != nil {
523
+ if _ , err := d .RunQMPCommand ("system_powerdown" ); err != nil {
523
524
return err
524
525
}
525
526
return nil
@@ -623,7 +624,6 @@ func (d *Driver) generateDiskImage(size int) error {
623
624
return err
624
625
}
625
626
log .Debugf ("DONE writing to %s and %s" , rawFile , d .diskPath ())
626
-
627
627
return nil
628
628
}
629
629
@@ -652,13 +652,10 @@ func (d *Driver) generateUserdataDisk(userdataFile string) (string, error) {
652
652
if err := os .WriteFile (writeFile , userdata , 0644 ); err != nil {
653
653
return "" , err
654
654
}
655
-
656
655
return ccRoot , nil
657
-
658
656
}
659
657
660
658
func (d * Driver ) RunQMPCommand (command string ) (map [string ]interface {}, error ) {
661
-
662
659
// connect to monitor
663
660
conn , err := net .Dial ("unix" , d .monitorPath ())
664
661
if err != nil {
@@ -701,8 +698,7 @@ func (d *Driver) RunQMPCommand(command string) (map[string]interface{}, error) {
701
698
if err != nil {
702
699
return nil , err
703
700
}
704
- _ , err = conn .Write (jsonCommand )
705
- if err != nil {
701
+ if _ , err := conn .Write (jsonCommand ); err != nil {
706
702
return nil , err
707
703
}
708
704
nr , err = conn .Read (buf [:])
@@ -727,8 +723,7 @@ func (d *Driver) RunQMPCommand(command string) (map[string]interface{}, error) {
727
723
if err != nil {
728
724
return nil , err
729
725
}
730
- _ , err = conn .Write (jsonCommand )
731
- if err != nil {
726
+ if _ , err := conn .Write (jsonCommand ); err != nil {
732
727
return nil , err
733
728
}
734
729
nr , err = conn .Read (buf [:])
@@ -756,7 +751,7 @@ func WaitForTCPWithDelay(addr string, duration time.Duration) error {
756
751
continue
757
752
}
758
753
defer conn .Close ()
759
- if _ , err = conn .Read (make ([]byte , 1 )); err != nil {
754
+ if _ , err : = conn .Read (make ([]byte , 1 )); err != nil {
760
755
time .Sleep (duration )
761
756
continue
762
757
}
0 commit comments