Skip to content

Commit 1bc30be

Browse files
authored
Merge pull request #14771 from klaases/qemu-tidy1
Improve qemu driver code for readability
2 parents 6a7be9a + ce5a5b5 commit 1bc30be

File tree

1 file changed

+48
-53
lines changed

1 file changed

+48
-53
lines changed

pkg/drivers/qemu/qemu.go

+48-53
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,13 @@ func (d *Driver) GetSSHPort() (int, error) {
100100
if d.SSHPort == 0 {
101101
d.SSHPort = 22
102102
}
103-
104103
return d.SSHPort, nil
105104
}
106105

107106
func (d *Driver) GetSSHUsername() string {
108107
if d.SSHUser == "" {
109108
d.SSHUser = "docker"
110109
}
111-
112110
return d.SSHUser
113111
}
114112

@@ -117,13 +115,12 @@ func (d *Driver) DriverName() string {
117115
}
118116

119117
func (d *Driver) GetURL() (string, error) {
120-
log.Debugf("GetURL called")
121118
if _, err := os.Stat(d.pidfilePath()); err != nil {
122119
return "", nil
123120
}
124121
ip, err := d.GetIP()
125122
if err != nil {
126-
log.Warnf("Failed to get IP: %s", err)
123+
log.Warnf("Failed to get IP: %v", err)
127124
return "", err
128125
}
129126
if ip == "" {
@@ -170,7 +167,6 @@ func checkPid(pid int) error {
170167
}
171168

172169
func (d *Driver) GetState() (state.State, error) {
173-
174170
if _, err := os.Stat(d.pidfilePath()); err != nil {
175171
return state.Stopped, nil
176172
}
@@ -191,6 +187,7 @@ func (d *Driver) GetState() (state.State, error) {
191187
if err != nil {
192188
return state.Error, err
193189
}
190+
194191
// RunState is one of:
195192
// 'debug', 'inmigrate', 'internal-error', 'io-error', 'paused',
196193
// 'postmigrate', 'prelaunch', 'finish-migrate', 'restore-vm',
@@ -241,24 +238,24 @@ func (d *Driver) Create() error {
241238
return err
242239
}
243240

244-
log.Infof("Creating SSH key...")
241+
log.Info("Creating SSH key...")
245242
if err := ssh.GenerateSSHKey(d.sshKeyPath()); err != nil {
246243
return err
247244
}
248245

249-
log.Infof("Creating Disk image...")
246+
log.Info("Creating Disk image...")
250247
if err := d.generateDiskImage(d.DiskSize); err != nil {
251248
return err
252249
}
253250

254251
if d.UserDataFile != "" {
255-
log.Infof("Creating Userdata Disk...")
252+
log.Info("Creating Userdata Disk...")
256253
if d.CloudConfigRoot, err = d.generateUserdataDisk(d.UserDataFile); err != nil {
257254
return err
258255
}
259256
}
260257

261-
log.Infof("Starting QEMU VM...")
258+
log.Info("Starting QEMU VM...")
262259
return d.Start()
263260
}
264261

@@ -270,34 +267,34 @@ func parsePortRange(rawPortRange string) (int, int, error) {
270267
portRange := strings.Split(rawPortRange, "-")
271268

272269
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")
274271
}
275272

276273
minPort, err := strconv.Atoi(portRange[0])
277274
if err != nil {
278-
return 0, 0, errors.Wrap(err, "Invalid port range")
275+
return 0, 0, errors.Wrap(err, "invalid min port range")
279276
}
277+
280278
maxPort, err := strconv.Atoi(portRange[1])
281279
if err != nil {
282-
return 0, 0, errors.Wrap(err, "Invalid port range")
280+
return 0, 0, errors.Wrap(err, "invalid max port range")
283281
}
284282

285283
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")
287285
}
288286

289287
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")
291289
}
292-
293290
return minPort, maxPort, nil
294291
}
295292

296-
func getRandomPortNumberInRange(min int, max int) int {
293+
func getRandomPortNumberInRange(min, max int) int {
297294
return rand.Intn(max-min) + min
298295
}
299296

300-
func getAvailableTCPPortFromRange(minPort int, maxPort int) (int, error) {
297+
func getAvailableTCPPortFromRange(minPort, maxPort int) (int, error) {
301298
port := 0
302299
for i := 0; i <= 10; i++ {
303300
var ln net.Listener
@@ -327,13 +324,12 @@ func getAvailableTCPPortFromRange(minPort int, maxPort int) (int, error) {
327324
port = p
328325
return port, nil
329326
}
330-
time.Sleep(1 * time.Second)
327+
time.Sleep(time.Second)
331328
}
332329
return 0, fmt.Errorf("unable to allocate tcp port")
333330
}
334331

335332
func (d *Driver) Start() error {
336-
// fmt.Printf("Init qemu %s\n", i.VM)
337333
machineDir := filepath.Join(d.StorePath, "machines", d.GetMachineName())
338334

339335
var startCmd []string
@@ -344,6 +340,7 @@ func (d *Driver) Start() error {
344340
"-M", machineType,
345341
)
346342
}
343+
347344
if d.CPUType != "" {
348345
startCmd = append(startCmd,
349346
"-cpu", d.CPUType,
@@ -380,9 +377,13 @@ func (d *Driver) Start() error {
380377

381378
// hardware acceleration is important, it increases performance by 10x
382379
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")
384383
} 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")
386387
}
387388

388389
startCmd = append(startCmd,
@@ -402,41 +403,46 @@ func (d *Driver) Start() error {
402403
"-pidfile", d.pidfilePath(),
403404
)
404405

405-
if d.Network == "user" {
406+
switch d.Network {
407+
case "user":
406408
startCmd = append(startCmd,
407409
"-nic", fmt.Sprintf("user,model=virtio,hostfwd=tcp::%d-:22,hostfwd=tcp::%d-:2376,hostname=%s", d.SSHPort, d.EnginePort, d.GetMachineName()),
408410
)
409-
} else if d.Network == "tap" {
411+
case "tap":
410412
startCmd = append(startCmd,
411413
"-nic", fmt.Sprintf("tap,model=virtio,ifname=%s,script=no,downscript=no", d.NetworkInterface),
412414
)
413-
} else if d.Network == "vde" {
415+
case "vde":
414416
startCmd = append(startCmd,
415417
"-nic", fmt.Sprintf("vde,model=virtio,sock=%s", d.NetworkSocket),
416418
)
417-
} else if d.Network == "bridge" {
419+
case "bridge":
418420
startCmd = append(startCmd,
419421
"-nic", fmt.Sprintf("bridge,model=virtio,br=%s", d.NetworkBridge),
420422
)
421-
} else {
422-
log.Errorf("Unknown network: %s", d.Network)
423+
default:
424+
log.Errorf("unknown network: %s", d.Network)
423425
}
424426

425-
startCmd = append(startCmd, "-daemonize")
427+
startCmd = append(startCmd,
428+
"-daemonize")
426429

427430
if d.CloudConfigRoot != "" {
428431
startCmd = append(startCmd,
429432
"-fsdev",
430433
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")
432437
}
433438

434439
if d.VirtioDrives {
435440
startCmd = append(startCmd,
436441
"-drive", fmt.Sprintf("file=%s,index=0,media=disk,if=virtio", d.diskPath()))
437442
} else {
438443
// last argument is always the name of the disk image
439-
startCmd = append(startCmd, d.diskPath())
444+
startCmd = append(startCmd,
445+
d.diskPath())
440446
}
441447

442448
if stdout, stderr, err := cmdOutErr(d.Program, startCmd...); err != nil {
@@ -457,27 +463,25 @@ func cmdOutErr(cmdStr string, args ...string) (string, string, error) {
457463
cmd.Stdout = &stdout
458464
cmd.Stderr = &stderr
459465
err := cmd.Run()
466+
stdoutStr := stdout.String()
460467
stderrStr := stderr.String()
461-
log.Debugf("STDOUT: %v", stdout.String())
468+
log.Debugf("STDOUT: %v", stdoutStr)
462469
log.Debugf("STDERR: %v", stderrStr)
463470
if err != nil {
464471
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)
466473
}
467474
} 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
470476
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)
472478
}
473479
}
474-
return stdout.String(), stderrStr, err
480+
return stdoutStr, stderrStr, err
475481
}
476482

477483
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 {
481485
return err
482486
}
483487
return nil
@@ -494,8 +498,7 @@ func (d *Driver) Remove() error {
494498
}
495499
}
496500
if s != state.Stopped {
497-
_, err = d.RunQMPCommand("quit")
498-
if err != nil {
501+
if _, err := d.RunQMPCommand("quit"); err != nil {
499502
return errors.Wrap(err, "quit")
500503
}
501504
}
@@ -517,9 +520,7 @@ func (d *Driver) Restart() error {
517520
}
518521

519522
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 {
523524
return err
524525
}
525526
return nil
@@ -623,7 +624,6 @@ func (d *Driver) generateDiskImage(size int) error {
623624
return err
624625
}
625626
log.Debugf("DONE writing to %s and %s", rawFile, d.diskPath())
626-
627627
return nil
628628
}
629629

@@ -652,13 +652,10 @@ func (d *Driver) generateUserdataDisk(userdataFile string) (string, error) {
652652
if err := os.WriteFile(writeFile, userdata, 0644); err != nil {
653653
return "", err
654654
}
655-
656655
return ccRoot, nil
657-
658656
}
659657

660658
func (d *Driver) RunQMPCommand(command string) (map[string]interface{}, error) {
661-
662659
// connect to monitor
663660
conn, err := net.Dial("unix", d.monitorPath())
664661
if err != nil {
@@ -701,8 +698,7 @@ func (d *Driver) RunQMPCommand(command string) (map[string]interface{}, error) {
701698
if err != nil {
702699
return nil, err
703700
}
704-
_, err = conn.Write(jsonCommand)
705-
if err != nil {
701+
if _, err := conn.Write(jsonCommand); err != nil {
706702
return nil, err
707703
}
708704
nr, err = conn.Read(buf[:])
@@ -727,8 +723,7 @@ func (d *Driver) RunQMPCommand(command string) (map[string]interface{}, error) {
727723
if err != nil {
728724
return nil, err
729725
}
730-
_, err = conn.Write(jsonCommand)
731-
if err != nil {
726+
if _, err := conn.Write(jsonCommand); err != nil {
732727
return nil, err
733728
}
734729
nr, err = conn.Read(buf[:])
@@ -756,7 +751,7 @@ func WaitForTCPWithDelay(addr string, duration time.Duration) error {
756751
continue
757752
}
758753
defer conn.Close()
759-
if _, err = conn.Read(make([]byte, 1)); err != nil {
754+
if _, err := conn.Read(make([]byte, 1)); err != nil {
760755
time.Sleep(duration)
761756
continue
762757
}

0 commit comments

Comments
 (0)