From 69fee369c96d2d62c08985a364ea9ca81b85c550 Mon Sep 17 00:00:00 2001 From: cici37 Date: Sun, 28 Feb 2021 01:50:52 -0800 Subject: [PATCH] Update extension mechanism and related sample. --- cmd/cloud-controller-manager/main.go | 12 ++++++++++-- .../k8s.io/cloud-provider/app/controllermanager.go | 6 +++++- .../k8s.io/cloud-provider/app/testing/testserver.go | 2 +- .../src/k8s.io/cloud-provider/sample/basic_main.go | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/cmd/cloud-controller-manager/main.go b/cmd/cloud-controller-manager/main.go index f47e009b6ee..cf366935dad 100644 --- a/cmd/cloud-controller-manager/main.go +++ b/cmd/cloud-controller-manager/main.go @@ -41,10 +41,15 @@ import ( _ "k8s.io/component-base/metrics/prometheus/clientgo" // load all the prometheus client-go plugins _ "k8s.io/component-base/metrics/prometheus/version" // for version metric registration "k8s.io/klog/v2" + nodeipamcontrolleroptions "k8s.io/kubernetes/cmd/kube-controller-manager/app/options" + nodeipamconfig "k8s.io/kubernetes/pkg/controller/nodeipam/config" // For existing cloud providers, the option to import legacy providers is still available. // e.g. _"k8s.io/legacy-cloud-providers/" ) +var nodeIPAMControllerConfiguration nodeipamconfig.NodeIPAMControllerConfiguration +var nodeIPAMControllerOptions nodeipamcontrolleroptions.NodeIPAMControllerOptions + func main() { rand.Seed(time.Now().UnixNano()) @@ -59,11 +64,14 @@ func main() { //delete(controllerInitializers, "cloud-node-lifecycle") // Here is an example to add an controller(NodeIpamController) which will be used by cloud provider - // generate nodeIPAMConfig. Here is an sample code. Please pass the right parameter in your code. + // generate nodeIPAMConfig. Here is an sample code. // If you do not need additional controller, please ignore. + nodeIPAMControllerOptions.NodeIPAMControllerConfiguration = &nodeIPAMControllerConfiguration + fs := pflag.NewFlagSet("fs", pflag.ContinueOnError) + nodeIPAMControllerOptions.AddFlags(fs) controllerInitializers["nodeipam"] = startNodeIpamControllerWrapper - command := app.NewCloudControllerManagerCommand(ccmOptions, cloudInitializer, controllerInitializers, wait.NeverStop) + command := app.NewCloudControllerManagerCommand(ccmOptions, cloudInitializer, controllerInitializers, fs, wait.NeverStop) // TODO: once we switch everything over to Cobra commands, we can go back to calling // utilflag.InitFlags() (by removing its pflag.Parse() call). For now, we have to set the diff --git a/staging/src/k8s.io/cloud-provider/app/controllermanager.go b/staging/src/k8s.io/cloud-provider/app/controllermanager.go index f848c6ac82c..42c0cc94353 100644 --- a/staging/src/k8s.io/cloud-provider/app/controllermanager.go +++ b/staging/src/k8s.io/cloud-provider/app/controllermanager.go @@ -26,6 +26,7 @@ import ( "time" "github.com/spf13/cobra" + "github.com/spf13/pflag" "k8s.io/apimachinery/pkg/runtime/schema" utilruntime "k8s.io/apimachinery/pkg/util/runtime" cacheddiscovery "k8s.io/client-go/discovery/cached" @@ -65,7 +66,7 @@ const ( // NewCloudControllerManagerCommand creates a *cobra.Command object with default parameters // initFuncConstructor is a map of named controller groups (you can start more than one in an init func) paired to their InitFuncConstructor. -func NewCloudControllerManagerCommand(s *options.CloudControllerManagerOptions, cloudInitializer InitCloudFunc, initFuncConstructor map[string]InitFuncConstructor, stopCh <-chan struct{}) *cobra.Command { +func NewCloudControllerManagerCommand(s *options.CloudControllerManagerOptions, cloudInitializer InitCloudFunc, initFuncConstructor map[string]InitFuncConstructor, additionalFlags *pflag.FlagSet, stopCh <-chan struct{}) *cobra.Command { cmd := &cobra.Command{ Use: "cloud-controller-manager", @@ -117,6 +118,9 @@ the cloud specific control loops shipped with Kubernetes.`, for _, f := range namedFlagSets.FlagSets { fs.AddFlagSet(f) } + if additionalFlags != nil { + fs.AddFlagSet(additionalFlags) + } usageFmt := "Usage:\n %s\n" cols, _, _ := term.TerminalSize(cmd.OutOrStdout()) cmd.SetUsageFunc(func(cmd *cobra.Command) error { diff --git a/staging/src/k8s.io/cloud-provider/app/testing/testserver.go b/staging/src/k8s.io/cloud-provider/app/testing/testserver.go index 685d9b11bdb..3f7a53656c5 100644 --- a/staging/src/k8s.io/cloud-provider/app/testing/testserver.go +++ b/staging/src/k8s.io/cloud-provider/app/testing/testserver.go @@ -102,7 +102,7 @@ func StartTestServer(t Logger, customFlags []string) (result TestServer, err err } return cloud } - command := app.NewCloudControllerManagerCommand(s, cloudInitializer, app.DefaultInitFuncConstructors, stopCh) + command := app.NewCloudControllerManagerCommand(s, cloudInitializer, app.DefaultInitFuncConstructors, nil, stopCh) pflag.CommandLine.SetNormalizeFunc(flag.WordSepNormalizeFunc) commandArgs := []string{} diff --git a/staging/src/k8s.io/cloud-provider/sample/basic_main.go b/staging/src/k8s.io/cloud-provider/sample/basic_main.go index e5749ae8121..ee9f41ae686 100644 --- a/staging/src/k8s.io/cloud-provider/sample/basic_main.go +++ b/staging/src/k8s.io/cloud-provider/sample/basic_main.go @@ -48,7 +48,7 @@ func main() { klog.Fatalf("unable to initialize command options: %v", err) } - command := app.NewCloudControllerManagerCommand(ccmOptions, cloudInitializer, app.DefaultInitFuncConstructors, wait.NeverStop) + command := app.NewCloudControllerManagerCommand(ccmOptions, cloudInitializer, app.DefaultInitFuncConstructors, nil, wait.NeverStop) // TODO: once we switch everything over to Cobra commands, we can go back to calling // utilflag.InitFlags() (by removing its pflag.Parse() call). For now, we have to set the