diff --git a/staging/src/k8s.io/component-base/logs/api/v1/options_test.go b/staging/src/k8s.io/component-base/logs/api/v1/options_test.go index fc38c64dfef..2597d8797a0 100644 --- a/staging/src/k8s.io/component-base/logs/api/v1/options_test.go +++ b/staging/src/k8s.io/component-base/logs/api/v1/options_test.go @@ -19,6 +19,7 @@ package v1 import ( "bytes" "context" + "flag" "testing" "github.com/go-logr/logr" @@ -100,6 +101,59 @@ func TestOptions(t *testing.T) { } } +func TestFlagSet(t *testing.T) { + t.Run("pflag", func(t *testing.T) { + newOptions := NewLoggingConfiguration() + var fs pflag.FlagSet + AddFlags(newOptions, &fs) + var buffer bytes.Buffer + fs.SetOutput(&buffer) + fs.PrintDefaults() + // Expected (Go 1.19, pflag v1.0.5): + // --logging-format string Sets the log format. Permitted formats: "text". (default "text") + // --log-flush-frequency duration Maximum number of seconds between log flushes (default 5s) + // -v, --v Level number for the log level verbosity + // --vmodule pattern=N,... comma-separated list of pattern=N settings for file-filtered logging (only works for text log format) + assert.Regexp(t, `.*--logging-format.*default.*text.* +.*--log-flush-frequency.*default 5s.* +.*-v.*--v.* +.*--vmodule.*pattern=N.* +`, buffer.String()) + }) + + t.Run("flag", func(t *testing.T) { + newOptions := NewLoggingConfiguration() + var pfs pflag.FlagSet + AddFlags(newOptions, &pfs) + var fs flag.FlagSet + pfs.VisitAll(func(f *pflag.Flag) { + fs.Var(f.Value, f.Name, f.Usage) + }) + var buffer bytes.Buffer + fs.SetOutput(&buffer) + fs.PrintDefaults() + // Expected (Go 1.19): + // -log-flush-frequency value + // Maximum number of seconds between log flushes (default 5s) + // -logging-format value + // Sets the log format. Permitted formats: "text". (default text) + // -v value + // number for the log level verbosity + // -vmodule value + // comma-separated list of pattern=N settings for file-filtered logging (only works for text log format) + assert.Regexp(t, `.*-log-flush-frequency.* +.*default 5s.* +.*-logging-format.* +.*default.*text.* +.*-v.* +.* +.*-vmodule.* +.* +`, buffer.String()) + }) + +} + func TestContextualLogging(t *testing.T) { t.Run("enabled", func(t *testing.T) { testContextualLogging(t, true) diff --git a/staging/src/k8s.io/component-base/logs/api/v1/pflags.go b/staging/src/k8s.io/component-base/logs/api/v1/pflags.go index 36a98cc81cf..b74e132a722 100644 --- a/staging/src/k8s.io/component-base/logs/api/v1/pflags.go +++ b/staging/src/k8s.io/component-base/logs/api/v1/pflags.go @@ -36,6 +36,9 @@ type vmoduleConfigurationPFlag struct { // String returns the -vmodule parameter (comma-separated list of pattern=N). func (wrapper vmoduleConfigurationPFlag) String() string { + if wrapper.value == nil { + return "" + } var patterns []string for _, item := range *wrapper.value { patterns = append(patterns, fmt.Sprintf("%s=%d", item.FilePattern, item.Verbosity)) @@ -82,10 +85,16 @@ type verbosityLevelPflag struct { } func (wrapper verbosityLevelPflag) String() string { + if wrapper.value == nil { + return "0" + } return strconv.FormatInt(int64(*wrapper.value), 10) } func (wrapper verbosityLevelPflag) Get() interface{} { + if wrapper.value == nil { + return VerbosityLevel(0) + } return *wrapper.value }