Skip to content

Commit 67bbbb9

Browse files
Merge pull request #23017 from Luap99/wsl-error
pkg/machine/wsl: wrap command errors
2 parents aa2bbee + 5c1e5cd commit 67bbbb9

File tree

3 files changed

+61
-14
lines changed

3 files changed

+61
-14
lines changed

pkg/machine/wsl/machine.go

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package wsl
44

55
import (
66
"bufio"
7+
"bytes"
78
"errors"
89
"fmt"
910
"io"
@@ -550,7 +551,10 @@ func runCmdPassThrough(name string, arg ...string) error {
550551
cmd.Stdin = os.Stdin
551552
cmd.Stdout = os.Stdout
552553
cmd.Stderr = os.Stderr
553-
return cmd.Run()
554+
if err := cmd.Run(); err != nil {
555+
return fmt.Errorf("command %s %v failed: %w", name, arg, err)
556+
}
557+
return nil
554558
}
555559

556560
func runCmdPassThroughTee(out io.Writer, name string, arg ...string) error {
@@ -562,7 +566,10 @@ func runCmdPassThroughTee(out io.Writer, name string, arg ...string) error {
562566
cmd.Stdin = os.Stdin
563567
cmd.Stdout = io.MultiWriter(os.Stdout, out)
564568
cmd.Stderr = io.MultiWriter(os.Stderr, out)
565-
return cmd.Run()
569+
if err := cmd.Run(); err != nil {
570+
return fmt.Errorf("command %s %v failed: %w", name, arg, err)
571+
}
572+
return nil
566573
}
567574

568575
func pipeCmdPassThrough(name string, input string, arg ...string) error {
@@ -571,7 +578,10 @@ func pipeCmdPassThrough(name string, input string, arg ...string) error {
571578
cmd.Stdin = strings.NewReader(input)
572579
cmd.Stdout = os.Stdout
573580
cmd.Stderr = os.Stderr
574-
return cmd.Run()
581+
if err := cmd.Run(); err != nil {
582+
return fmt.Errorf("command %s %v failed: %w", name, arg, err)
583+
}
584+
return nil
575585
}
576586

577587
func setupWslProxyEnv() (hasProxy bool) {
@@ -638,8 +648,10 @@ func getAllWSLDistros(running bool) (map[string]struct{}, error) {
638648
if err != nil {
639649
return nil, err
640650
}
651+
stderr := &bytes.Buffer{}
652+
cmd.Stderr = stderr
641653
if err = cmd.Start(); err != nil {
642-
return nil, err
654+
return nil, fmt.Errorf("failed to start command %s %v: %w", cmd.Path, args, err)
643655
}
644656

645657
all := make(map[string]struct{})
@@ -651,7 +663,10 @@ func getAllWSLDistros(running bool) (map[string]struct{}, error) {
651663
}
652664
}
653665

654-
_ = cmd.Wait()
666+
err = cmd.Wait()
667+
if err != nil {
668+
return nil, fmt.Errorf("command %s %v failed: %w (%s)", cmd.Path, args, err, strings.TrimSpace(stderr.String()))
669+
}
655670

656671
return all, nil
657672
}
@@ -663,6 +678,8 @@ func isSystemdRunning(dist string) (bool, error) {
663678
if err != nil {
664679
return false, err
665680
}
681+
stderr := &bytes.Buffer{}
682+
cmd.Stderr = stderr
666683
if err = cmd.Start(); err != nil {
667684
return false, err
668685
}
@@ -676,19 +693,30 @@ func isSystemdRunning(dist string) (bool, error) {
676693
}
677694
}
678695

679-
_ = cmd.Wait()
696+
err = cmd.Wait()
697+
if err != nil {
698+
return false, fmt.Errorf("command %s %v failed: %w (%s)", cmd.Path, cmd.Args, err, strings.TrimSpace(stderr.String()))
699+
}
680700

681701
return result, nil
682702
}
683703

684704
func terminateDist(dist string) error {
685705
cmd := exec.Command(wutil.FindWSL(), "--terminate", dist)
686-
return cmd.Run()
706+
out, err := cmd.CombinedOutput()
707+
if err != nil {
708+
return fmt.Errorf("command %s %v failed: %w (%s)", cmd.Path, cmd.Args, err, strings.TrimSpace(string(out)))
709+
}
710+
return nil
687711
}
688712

689713
func unregisterDist(dist string) error {
690714
cmd := exec.Command(wutil.FindWSL(), "--unregister", dist)
691-
return cmd.Run()
715+
out, err := cmd.CombinedOutput()
716+
if err != nil {
717+
return fmt.Errorf("command %s %v failed: %w (%s)", cmd.Path, cmd.Args, err, strings.TrimSpace(string(out)))
718+
}
719+
return nil
692720
}
693721

694722
func isRunning(name string) (bool, error) {
@@ -736,6 +764,8 @@ func getCPUs(name string) (uint64, error) {
736764
if err != nil {
737765
return 0, err
738766
}
767+
stderr := &bytes.Buffer{}
768+
cmd.Stderr = stderr
739769
if err = cmd.Start(); err != nil {
740770
return 0, err
741771
}
@@ -744,7 +774,10 @@ func getCPUs(name string) (uint64, error) {
744774
for scanner.Scan() {
745775
result = scanner.Text()
746776
}
747-
_ = cmd.Wait()
777+
err = cmd.Wait()
778+
if err != nil {
779+
return 0, fmt.Errorf("command %s %v failed: %w (%s)", cmd.Path, cmd.Args, err, strings.TrimSpace(strings.TrimSpace(stderr.String())))
780+
}
748781

749782
ret, err := strconv.Atoi(result)
750783
return uint64(ret), err
@@ -761,6 +794,8 @@ func getMem(name string) (strongunits.MiB, error) {
761794
if err != nil {
762795
return 0, err
763796
}
797+
stderr := &bytes.Buffer{}
798+
cmd.Stderr = stderr
764799
if err = cmd.Start(); err != nil {
765800
return 0, err
766801
}
@@ -783,7 +818,10 @@ func getMem(name string) (strongunits.MiB, error) {
783818
break
784819
}
785820
}
786-
_ = cmd.Wait()
821+
err = cmd.Wait()
822+
if err != nil {
823+
return 0, fmt.Errorf("command %s %v failed: %w (%s)", cmd.Path, cmd.Args, err, strings.TrimSpace(stderr.String()))
824+
}
787825

788826
return strongunits.MiB(total - available), err
789827
}

pkg/machine/wsl/stubber.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package wsl
44

55
import (
6+
"bytes"
67
"errors"
78
"fmt"
89
"os"
@@ -110,7 +111,7 @@ func (w WSLStubber) Remove(mc *vmconfigs.MachineConfig) ([]string, func() error,
110111
// of the vm
111112
wslRemoveFunc := func() error {
112113
if err := runCmdPassThrough(wutil.FindWSL(), "--unregister", env.WithPodmanPrefix(mc.Name)); err != nil {
113-
logrus.Error(err)
114+
return err
114115
}
115116
return nil
116117
}
@@ -251,17 +252,21 @@ func (w WSLStubber) StopVM(mc *vmconfigs.MachineConfig, hardStop bool) error {
251252

252253
cmd := exec.Command(wutil.FindWSL(), "-u", "root", "-d", dist, "sh")
253254
cmd.Stdin = strings.NewReader(waitTerm)
255+
out := &bytes.Buffer{}
256+
cmd.Stderr = out
257+
cmd.Stdout = out
258+
254259
if err = cmd.Start(); err != nil {
255260
return fmt.Errorf("executing wait command: %w", err)
256261
}
257262

258263
exitCmd := exec.Command(wutil.FindWSL(), "-u", "root", "-d", dist, "/usr/local/bin/enterns", "systemctl", "exit", "0")
259264
if err = exitCmd.Run(); err != nil {
260-
return fmt.Errorf("stopping sysd: %w", err)
265+
return fmt.Errorf("stopping systemd: %w", err)
261266
}
262267

263268
if err = cmd.Wait(); err != nil {
264-
return err
269+
logrus.Warnf("Failed to wait for systemd to exit: (%s)", strings.TrimSpace(out.String()))
265270
}
266271

267272
return terminateDist(dist)

pkg/machine/wsl/wutil/wutil.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package wutil
44

55
import (
66
"bufio"
7+
"fmt"
78
"io"
89
"os"
910
"os/exec"
@@ -74,7 +75,10 @@ func SilentExec(command string, args ...string) error {
7475
cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: 0x08000000}
7576
cmd.Stdout = nil
7677
cmd.Stderr = nil
77-
return cmd.Run()
78+
if err := cmd.Run(); err != nil {
79+
return fmt.Errorf("command %s %v failed: %w", command, args, err)
80+
}
81+
return nil
7882
}
7983

8084
func SilentExecCmd(command string, args ...string) *exec.Cmd {

0 commit comments

Comments
 (0)