From 0791c400127e90f201209fa6c7f0289a97d0780a Mon Sep 17 00:00:00 2001 From: Ryotaro Banno Date: Mon, 24 Jun 2024 04:41:51 +0000 Subject: [PATCH] use cobra to support subcommands and add controller subcommand Signed-off-by: Ryotaro Banno --- Dockerfile | 5 ++- Makefile | 4 +- charts/mantle/templates/deployment.yaml | 1 + cmd/{ => controller}/main.go | 59 +++++++++++++++---------- cmd/root.go | 23 ++++++++++ go.mod | 4 +- go.sum | 6 +++ main.go | 7 +++ 8 files changed, 81 insertions(+), 28 deletions(-) rename cmd/{ => controller}/main.go (76%) create mode 100644 cmd/root.go create mode 100644 main.go diff --git a/Dockerfile b/Dockerfile index 29992161..33073bf2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,8 @@ COPY go.sum go.sum RUN go mod download # Copy the go source -COPY cmd/main.go cmd/main.go +COPY main.go main.go +COPY cmd/ cmd/ COPY api/ api/ COPY internal/controller/ internal/controller/ @@ -20,7 +21,7 @@ COPY internal/controller/ internal/controller/ # the docker BUILDPLATFORM arg will be linux/arm64 when for Apple x86 it will be linux/amd64. Therefore, # by leaving it empty we can ensure that the container and binary shipped on it will have the same platform. # TODO: RUN CGO_ENABLED=0 go build -a -o manager cmd/main.go -RUN CGO_ENABLED=0 go build -o manager cmd/main.go +RUN CGO_ENABLED=0 go build -o manager main.go FROM quay.io/cybozu/ceph:18.2.1.1 WORKDIR / diff --git a/Makefile b/Makefile index 77ff935b..4da36634 100644 --- a/Makefile +++ b/Makefile @@ -85,11 +85,11 @@ lint-fix: golangci-lint ## Run golangci-lint linter and perform fixes .PHONY: build build: manifests generate fmt vet ## Build manager binary. - go build -o bin/manager cmd/main.go + go build -o bin/manager main.go .PHONY: run run: manifests generate fmt vet ## Run a controller from your host. - go run ./cmd/main.go + go run main.go # If you wish to build the manager image targeting other platforms you can use the --platform flag. # (i.e. docker build --platform linux/arm64). However, you must enable docker buildKit for it. diff --git a/charts/mantle/templates/deployment.yaml b/charts/mantle/templates/deployment.yaml index 2b12da58..af1d2bc6 100644 --- a/charts/mantle/templates/deployment.yaml +++ b/charts/mantle/templates/deployment.yaml @@ -58,6 +58,7 @@ spec: command: - /manager args: + - controller - --leader-elect env: - name: POD_NAMESPACE diff --git a/cmd/main.go b/cmd/controller/main.go similarity index 76% rename from cmd/main.go rename to cmd/controller/main.go index a0af301a..0c3202c1 100644 --- a/cmd/main.go +++ b/cmd/controller/main.go @@ -1,4 +1,4 @@ -package main +package controller import ( "errors" @@ -9,6 +9,7 @@ import ( // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" + "github.com/spf13/cobra" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" @@ -22,34 +23,44 @@ import ( //+kubebuilder:scaffold:imports ) +var ControllerCmd = &cobra.Command{ + Use: "controller", + RunE: func(cmd *cobra.Command, args []string) error { + return subMain() + }, +} + var ( + metricsAddr string + enableLeaderElection bool + probeAddr string + zapOpts zap.Options + scheme = runtime.NewScheme() setupLog = ctrl.Log.WithName("setup") ) func init() { + flags := ControllerCmd.Flags() + flags.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.") + flags.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") + flags.BoolVar(&enableLeaderElection, "leader-elect", false, + "Enable leader election for controller manager. "+ + "Enabling this will ensure there is only one active controller manager.") + + goflags := flag.NewFlagSet("goflags", flag.ExitOnError) + zapOpts.Development = true + zapOpts.BindFlags(goflags) + flags.AddGoFlagSet(goflags) + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(mantlev1.AddToScheme(scheme)) //+kubebuilder:scaffold:scheme } -func main() { - var metricsAddr string - var enableLeaderElection bool - var probeAddr string - flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.") - flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") - flag.BoolVar(&enableLeaderElection, "leader-elect", false, - "Enable leader election for controller manager. "+ - "Enabling this will ensure there is only one active controller manager.") - opts := zap.Options{ - Development: true, - } - opts.BindFlags(flag.CommandLine) - flag.Parse() - - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) +func subMain() error { + ctrl.SetLogger(zap.New(zap.UseFlagOptions(&zapOpts))) mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ Scheme: scheme, @@ -71,13 +82,13 @@ func main() { }) if err != nil { setupLog.Error(err, "unable to start manager") - os.Exit(1) + return err } managedCephClusterID := os.Getenv("POD_NAMESPACE") if managedCephClusterID == "" { setupLog.Error(errors.New("POD_NAMESPACE is empty"), "POD_NAMESPACE is empty") - os.Exit(1) + return err } reconciler := controller.NewMantleBackupReconciler( @@ -88,22 +99,24 @@ func main() { if err = reconciler.SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "MantleBackup") - os.Exit(1) + return err } //+kubebuilder:scaffold:builder if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { setupLog.Error(err, "unable to set up health check") - os.Exit(1) + return err } if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { setupLog.Error(err, "unable to set up ready check") - os.Exit(1) + return err } setupLog.Info("starting manager") if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { setupLog.Error(err, "problem running manager") - os.Exit(1) + return err } + + return nil } diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 00000000..e3a0dbc4 --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,23 @@ +package cmd + +import ( + "os" + + "github.com/cybozu-go/mantle/cmd/controller" + "github.com/spf13/cobra" +) + +var rootCmd = &cobra.Command{ + Use: "mantle", +} + +func init() { + rootCmd.AddCommand(controller.ControllerCmd) +} + +func Execute() { + err := rootCmd.Execute() + if err != nil { + os.Exit(1) + } +} diff --git a/go.mod b/go.mod index 47f8cb75..fc10e365 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.21 require ( github.com/onsi/ginkgo/v2 v2.11.0 github.com/onsi/gomega v1.27.10 - gopkg.in/yaml.v2 v2.4.0 + github.com/spf13/cobra v1.7.0 k8s.io/api v0.28.3 k8s.io/apimachinery v0.28.3 k8s.io/client-go v0.28.3 @@ -35,6 +35,7 @@ require ( github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect github.com/google/uuid v1.3.0 // indirect github.com/imdario/mergo v0.3.6 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect @@ -63,6 +64,7 @@ require ( google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/apiextensions-apiserver v0.28.3 // indirect k8s.io/component-base v0.28.3 // indirect diff --git a/go.sum b/go.sum index 7e5d7e3a..551a49d2 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,7 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -57,6 +58,8 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= @@ -102,6 +105,9 @@ github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+Pymzi github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/main.go b/main.go new file mode 100644 index 00000000..871d19c9 --- /dev/null +++ b/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/cybozu-go/mantle/cmd" + +func main() { + cmd.Execute() +}