Skip to content

Commit df086de

Browse files
authored
fix(kubernetes): correct handling of kubectl stderr (#61)
Always shows stderr from kubectl in case an error occurs
1 parent 8b210e8 commit df086de

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

pkg/kubernetes/errors.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ package kubernetes
33
import "fmt"
44

55
type ErrorNotFound struct {
6-
resource string
6+
name string
7+
kind string
78
}
89

910
func (e ErrorNotFound) Error() string {
10-
return fmt.Sprintf(`error from server (NotFound): secrets "%s" not found`, e.resource)
11+
return fmt.Sprintf(`error from server (NotFound): %s "%s" not found`, e.kind, e.name)
1112
}
1213

1314
type ErrorMissingConfig struct {

pkg/kubernetes/kubectl.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"os"
1010
"os/exec"
11+
"regexp"
1112
"strings"
1213

1314
"github.com/Masterminds/semver"
@@ -39,6 +40,7 @@ func (k Kubectl) Version() (client, server semver.Version, err error) {
3940
)
4041
var buf bytes.Buffer
4142
cmd.Stdout = &buf
43+
cmd.Stderr = os.Stderr
4244
if err := cmd.Run(); err != nil {
4345
return zero, zero, err
4446
}
@@ -57,6 +59,7 @@ func (k *Kubectl) setupContext() error {
5759
cmd := exec.Command("kubectl", "config", "view", "-o", "json")
5860
cfgJSON := bytes.Buffer{}
5961
cmd.Stdout = &cfgJSON
62+
cmd.Stderr = os.Stderr
6063
if err := cmd.Run(); err != nil {
6164
return err
6265
}
@@ -115,9 +118,9 @@ func (k Kubectl) Get(namespace, kind, name string) (map[string]interface{}, erro
115118
cmd.Stderr = &serr
116119
if err := cmd.Run(); err != nil {
117120
if strings.HasPrefix(serr.String(), "Error from server (NotFound)") {
118-
return nil, ErrorNotFound{name}
121+
return nil, ErrorNotFound{kind, name}
119122
}
120-
fmt.Println(serr.String())
123+
fmt.Print(serr.String())
121124
return nil, err
122125
}
123126
var obj map[string]interface{}
@@ -196,6 +199,7 @@ func (k Kubectl) Diff(yaml string) (*string, error) {
196199
cmd := exec.Command("kubectl", argv...)
197200
raw := bytes.Buffer{}
198201
cmd.Stdout = &raw
202+
cmd.Stderr = FilteredErr{regexp.MustCompile(`exit status \d`)}
199203

200204
stdin, err := cmd.StdinPipe()
201205
if err != nil {

pkg/kubernetes/util.go

+14
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"os"
88
"os/exec"
99
"path/filepath"
10+
"regexp"
1011
)
1112

1213
func diff(name, is, should string) (string, error) {
@@ -44,3 +45,16 @@ func diff(name, is, should string) (string, error) {
4445

4546
return out, nil
4647
}
48+
49+
// FilteredErr is a filtered Stderr. If one of the regular expressions match, the current input is discarded.
50+
type FilteredErr []*regexp.Regexp
51+
52+
func (r FilteredErr) Write(p []byte) (n int, err error) {
53+
for _, re := range r {
54+
if re.Match(p) {
55+
// silently discard
56+
return len(p), nil
57+
}
58+
}
59+
return os.Stderr.Write(p)
60+
}

0 commit comments

Comments
 (0)