Skip to content

Commit 39e6c1f

Browse files
authored
Remove os.Exit from the logs module and make the logs test output more realistic (#611)
Signed-off-by: Richard Wall <[email protected]>
1 parent 45a5d77 commit 39e6c1f

File tree

3 files changed

+31
-34
lines changed

3 files changed

+31
-34
lines changed

cmd/root.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ var rootCmd = &cobra.Command{
2020
configuration checks using Open Policy Agent (OPA).
2121
2222
Preflight checks are bundled into Packages`,
23-
PersistentPreRun: func(cmd *cobra.Command, args []string) {
24-
logs.Initialize()
23+
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
24+
return logs.Initialize()
2525
},
2626
// SilenceErrors and SilenceUsage prevents this command or any sub-command
2727
// from printing arbitrary text to stderr.

pkg/logs/logs.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"log"
77
"log/slog"
8-
"os"
98
"strings"
109

1110
"github.com/spf13/pflag"
@@ -108,13 +107,12 @@ func AddFlags(fs *pflag.FlagSet) {
108107

109108
// Initialize uses k8s.io/component-base/logs, to configure the following global
110109
// loggers: log, slog, and klog. All are configured to write in the same format.
111-
func Initialize() {
110+
func Initialize() error {
112111
// This configures the global logger in klog *and* slog, if compiled with Go
113112
// >= 1.21.
114113
logs.InitLogs()
115114
if err := logsapi.ValidateAndApply(configuration, features); err != nil {
116-
fmt.Fprintf(os.Stderr, "Error in logging configuration: %v\n", err)
117-
os.Exit(2)
115+
return fmt.Errorf("Error in logging configuration: %s", err)
118116
}
119117

120118
// Thanks to logs.InitLogs, slog.Default now uses klog as its backend. Thus,
@@ -133,6 +131,7 @@ func Initialize() {
133131
// to the global log logger. It can be removed when this is fixed upstream
134132
// in vcert: https://github.com/Venafi/vcert/pull/512
135133
vcertLog.SetPrefix("")
134+
return nil
136135
}
137136

138137
type LogToSlogWriter struct {

pkg/logs/logs_test.go

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"bytes"
55
"context"
66
"errors"
7+
"fmt"
8+
"io"
79
"log"
810
"log/slog"
911
"os"
@@ -33,10 +35,25 @@ import (
3335
func TestLogs(t *testing.T) {
3436
if flags, found := os.LookupEnv("GO_CHILD_FLAG"); found {
3537
if _, found := os.LookupEnv("GO_CHILD_SKIP_INITIALIZE"); !found {
36-
fs := pflag.NewFlagSet("test-logs", pflag.ExitOnError)
38+
fs := pflag.NewFlagSet("test-logs", pflag.ContinueOnError)
39+
fs.SetOutput(io.Discard)
3740
logs.AddFlags(fs)
38-
fs.Parse(strings.Split(flags, " "))
39-
logs.Initialize()
41+
if err := fs.Parse(strings.Split(flags, " ")); err != nil {
42+
exitCode := 0
43+
if errors.Is(err, pflag.ErrHelp) {
44+
fmt.Fprint(os.Stdout, fs.FlagUsages())
45+
os.Exit(exitCode)
46+
} else {
47+
exitCode := 1
48+
klog.ErrorS(err, "Exiting due to error", "exit-code", exitCode)
49+
klog.FlushAndExit(time.Second, exitCode)
50+
}
51+
}
52+
if err := logs.Initialize(); err != nil {
53+
exitCode := 1
54+
klog.ErrorS(err, "Exiting due to error", "exit-code", exitCode)
55+
klog.FlushAndExit(time.Second, exitCode)
56+
}
4057
}
4158

4259
log.Print("log Print")
@@ -63,14 +80,9 @@ func TestLogs(t *testing.T) {
6380
expectStderr string
6481
}{
6582
{
66-
name: "help",
67-
flags: "-h",
68-
expectError: true,
83+
name: "help",
84+
flags: "-h",
6985
expectStdout: `
70-
pflag: help requested
71-
`,
72-
expectStderr: `
73-
Usage of test-logs:
7486
-v, --log-level Level number for the log level verbosity
7587
--logging-format string Sets the log format. Permitted formats: "json", "text". (default "text")
7688
--vmodule pattern=N,... comma-separated list of pattern=N settings for file-filtered logging (only works for text log format)
@@ -80,38 +92,24 @@ Usage of test-logs:
8092
name: "unrecognized-flag",
8193
flags: "--foo",
8294
expectError: true,
83-
expectStdout: `
84-
unknown flag: --foo
85-
`,
8695
expectStderr: `
87-
unknown flag: --foo
88-
Usage of test-logs:
89-
-v, --log-level Level number for the log level verbosity
90-
--logging-format string Sets the log format. Permitted formats: "json", "text". (default "text")
91-
--vmodule pattern=N,... comma-separated list of pattern=N settings for file-filtered logging (only works for text log format)
96+
E0000 00:00:00.000000 00000 logs_test.go:000] "Exiting due to error" err="unknown flag: --foo" exit-code=1
9297
`,
9398
},
9499
{
95100
name: "v-long-form-not-available",
96101
flags: "--v=3",
97102
expectError: true,
98-
expectStdout: `
99-
unknown flag: --v
100-
`,
101103
expectStderr: `
102-
unknown flag: --v
103-
Usage of test-logs:
104-
-v, --log-level Level number for the log level verbosity
105-
--logging-format string Sets the log format. Permitted formats: "json", "text". (default "text")
106-
--vmodule pattern=N,... comma-separated list of pattern=N settings for file-filtered logging (only works for text log format)
104+
E0000 00:00:00.000000 00000 logs_test.go:000] "Exiting due to error" err="unknown flag: --v" exit-code=1
107105
`,
108106
},
109107
{
110108
name: "logging-format-unrecognized",
111109
flags: "--logging-format=foo",
112110
expectError: true,
113111
expectStderr: `
114-
Error in logging configuration: format: Invalid value: "foo": Unsupported log format
112+
E0000 00:00:00.000000 00000 logs_test.go:000] "Exiting due to error" err="Error in logging configuration: format: Invalid value: \"foo\": Unsupported log format" exit-code=1
115113
`,
116114
},
117115
{
@@ -297,7 +295,7 @@ E0000 00:00:00.000000 00000 logs_test.go:000] "Contextual error" err="fake-err
297295
if test.expectError {
298296
var target *exec.ExitError
299297
require.ErrorAs(t, err, &target)
300-
require.Equal(t, 2, target.ExitCode(), "Flag parsing failures should always result in exit code 2")
298+
require.Equal(t, 1, target.ExitCode(), "Flag parsing failures should always result in exit code 1")
301299
t.Logf("ERROR: %v", err)
302300
} else {
303301
require.NoError(t, err)

0 commit comments

Comments
 (0)