-
Notifications
You must be signed in to change notification settings - Fork 290
/
logging_kubectl_runner.go
78 lines (64 loc) · 2.5 KB
/
logging_kubectl_runner.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package k8s
import (
"context"
"fmt"
"github.com/windmilleng/tilt/internal/logger"
)
// wraps a kubectlRunner with logging
type loggingKubectlRunner struct {
kubectlLogLevel KubectlLogLevel
runner kubectlRunner
}
var _ kubectlRunner = loggingKubectlRunner{}
func (k loggingKubectlRunner) logExecStart(ctx context.Context, args []string, stdin string) {
if k.kubectlLogLevel == 0 {
return
}
logger.Get(ctx).Infof("Running: %q\n", append([]string{"kubectl"}, args...))
if stdin != "" {
logger.Get(ctx).Infof("stdin: '%s'\n", stdin)
}
}
func (k loggingKubectlRunner) logExecStop(ctx context.Context, stdout, stderr string) {
if k.kubectlLogLevel == 0 {
return
}
logger.Get(ctx).Infof("kubectl stdout: '%s'\nkubectl stderr: '%s'\n", stdout, stderr)
}
func (k loggingKubectlRunner) adjustedVerbosity(argv []string) []string {
if k.kubectlLogLevel == 0 {
// don't add -v0 so that in the normal case we're not doing anything surprising
return argv
}
// We're not gonna worry about the case where the input args already have a -v.
// Empirically, kubectl's behavior is to use the last -v arg it receives, so some call that specifies its own
// -v would get its -v, and not whatever the user specified on the command line.
// This isn't necessarily ideal (maybe we want to use the max, or always prefer k.kubectlLogLevel?), but:
// 1. We aren't calling this with any other -v at the moment.
// 2. Doing it right would mean handling ["-v" "4"], ["-v4"], ["-v=4"], and maybe others? really we'd ought to just
// call whatever arg parser kubectl uses.
return append([]string{"-v", fmt.Sprintf("%d", k.kubectlLogLevel)}, argv...)
}
func (k loggingKubectlRunner) exec(ctx context.Context, argv []string) (stdout string, stderr string, err error) {
argv = k.adjustedVerbosity(argv)
k.logExecStart(ctx, argv, "")
stdout, stderr, err = k.runner.exec(ctx, argv)
k.logExecStop(ctx, stdout, stderr)
return stdout, stderr, err
}
func (k loggingKubectlRunner) execWithStdin(ctx context.Context, argv []string, stdin string) (stdout string, stderr string, err error) {
argv = k.adjustedVerbosity(argv)
k.logExecStart(ctx, argv, stdin)
stdout, stderr, err = k.runner.execWithStdin(ctx, argv, stdin)
k.logExecStop(ctx, stdout, stderr)
return stdout, stderr, err
}
type KubectlLogLevel = int
func ProvideKubectlRunner(kubeContext KubeContext, logLevel KubectlLogLevel) kubectlRunner {
return loggingKubectlRunner{
kubectlLogLevel: logLevel,
runner: realKubectlRunner{
kubeContext: kubeContext,
},
}
}