diff --git a/cmd/controller-manager/app/options/globalflags.go b/cmd/controller-manager/app/options/globalflags.go new file mode 100644 index 0000000000..b7a05ee2b0 --- /dev/null +++ b/cmd/controller-manager/app/options/globalflags.go @@ -0,0 +1,35 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package options + +import ( + "github.com/spf13/pflag" + + "k8s.io/apiserver/pkg/util/globalflag" + + // ensure libs have a chance to globally register their flags + _ "k8s.io/kubernetes/pkg/cloudprovider/providers" +) + +// AddCustomGlobalFlags explicitly registers flags that internal packages register +// against the global flagsets from "flag". We do this in order to prevent +// unwanted flags from leaking into the *-controller-manager's flagset. +func AddCustomGlobalFlags(fs *pflag.FlagSet) { + // lookup flags in global flag set and re-register the values with our flagset + // adds flags from k8s.io/kubernetes/pkg/cloudprovider/providers + globalflag.Register(fs, "cloud-provider-gce-lb-src-cidrs") +} diff --git a/cmd/controller-manager/app/options/globalflags_test.go b/cmd/controller-manager/app/options/globalflags_test.go new file mode 100644 index 0000000000..4c27d0223f --- /dev/null +++ b/cmd/controller-manager/app/options/globalflags_test.go @@ -0,0 +1,60 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package options + +import ( + "flag" + "reflect" + "sort" + "strings" + "testing" + + "github.com/spf13/pflag" + + apiserverflag "k8s.io/apiserver/pkg/util/flag" + "k8s.io/apiserver/pkg/util/globalflag" +) + +func TestAddCustomGlobalFlags(t *testing.T) { + namedFlagSets := &apiserverflag.NamedFlagSets{} + // Note that we will register all flags (including klog flags) into the same + // flag set. This allows us to test against all global flags from + // flags.CommandLine. + nfs := namedFlagSets.FlagSet("generic") + globalflag.AddGlobalFlags(nfs, "test-cmd") + AddCustomGlobalFlags(nfs) + + actualFlag := []string{} + nfs.VisitAll(func(flag *pflag.Flag) { + actualFlag = append(actualFlag, flag.Name) + }) + + // Get all flags from flags.CommandLine, except flag `test.*`. + wantedFlag := []string{"help"} + pflag.CommandLine.SetNormalizeFunc(apiserverflag.WordSepNormalizeFunc) + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + pflag.VisitAll(func(flag *pflag.Flag) { + if !strings.Contains(flag.Name, "test.") { + wantedFlag = append(wantedFlag, flag.Name) + } + }) + sort.Strings(wantedFlag) + + if !reflect.DeepEqual(wantedFlag, actualFlag) { + t.Errorf("Got different flags than expected: expected %+v, got %+v", wantedFlag, actualFlag) + } +}