diff --git a/cmd/kubelet/app/options/options_test.go b/cmd/kubelet/app/options/options_test.go index a52d290620..5a82a33633 100644 --- a/cmd/kubelet/app/options/options_test.go +++ b/cmd/kubelet/app/options/options_test.go @@ -120,7 +120,12 @@ func asArgs(fn, defaultFn func(*pflag.FlagSet)) []string { defaultFn(defaults) var args []string fs.VisitAll(func(flag *pflag.Flag) { + // if the flag implements utilflag.OmitEmpty and the value is Empty, then just omit it from the command line + if omit, ok := flag.Value.(utilflag.OmitEmpty); ok && omit.Empty() { + return + } s := flag.Value.String() + // if the flag has the same value as the default, we can omit it without changing the meaning of the command line var defaultValue string if defaultFlag := defaults.Lookup(flag.Name); defaultFlag != nil { defaultValue = defaultFlag.Value.String() @@ -128,6 +133,7 @@ func asArgs(fn, defaultFn func(*pflag.FlagSet)) []string { return } } + // if the flag is a string slice, each element is specified with an independent flag invocation if values, err := fs.GetStringSlice(flag.Name); err == nil { for _, s := range values { args = append(args, fmt.Sprintf("--%s=%s", flag.Name, s)) diff --git a/staging/src/k8s.io/apiserver/pkg/util/flag/BUILD b/staging/src/k8s.io/apiserver/pkg/util/flag/BUILD index 9cf2715c60..57ab4058da 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/flag/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/util/flag/BUILD @@ -30,6 +30,7 @@ go_library( "map_string_bool.go", "map_string_string.go", "namedcertkey_flag.go", + "omitempty.go", "string_flag.go", "tristate.go", ], diff --git a/staging/src/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string.go b/staging/src/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string.go index c2b950e77b..bf8dbfb9bf 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string.go +++ b/staging/src/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string.go @@ -38,10 +38,6 @@ func NewLangleSeparatedMapStringString(m *map[string]string) *LangleSeparatedMap // String implements github.com/spf13/pflag.Value func (m *LangleSeparatedMapStringString) String() string { - if *m.Map == nil { - return "nil" - } - pairs := []string{} for k, v := range *m.Map { pairs = append(pairs, fmt.Sprintf("%s<%s", k, v)) @@ -55,12 +51,6 @@ func (m *LangleSeparatedMapStringString) Set(value string) error { if m.Map == nil { return fmt.Errorf("no target (nil pointer to map[string]string)") } - // allow explicit nil map - if value == "nil" { - *m.Map = nil - m.initialized = true - return nil - } if !m.initialized || *m.Map == nil { // clear default values, or allocate if no existing map *m.Map = make(map[string]string) @@ -85,3 +75,8 @@ func (m *LangleSeparatedMapStringString) Set(value string) error { func (*LangleSeparatedMapStringString) Type() string { return "mapStringString" } + +// Empty implements OmitEmpty +func (m *LangleSeparatedMapStringString) Empty() bool { + return len(*m.Map) == 0 +} diff --git a/staging/src/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string_test.go b/staging/src/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string_test.go index fd2ca25a55..80c67c32bc 100644 --- a/staging/src/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string_test.go +++ b/staging/src/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string_test.go @@ -28,7 +28,7 @@ func TestStringLangleSeparatedMapStringString(t *testing.T) { m *LangleSeparatedMapStringString expect string }{ - {"nil", NewLangleSeparatedMapStringString(&nilMap), "nil"}, + {"nil", NewLangleSeparatedMapStringString(&nilMap), ""}, {"empty", NewLangleSeparatedMapStringString(&map[string]string{}), ""}, {"one key", NewLangleSeparatedMapStringString(&map[string]string{"one": "foo"}), "one