package app import ( "context" "flag" "fmt" "net/http" "os" "github.com/spf13/cobra" cliflag "k8s.io/component-base/cli/flag" "k8s.io/component-base/term" "k8s.io/klog/v2" controllerruntime "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/healthz" "github.com/karmada-io/karmada/examples/customresourceinterpreter/webhook/app/options" "github.com/karmada-io/karmada/pkg/sharedcli" "github.com/karmada-io/karmada/pkg/sharedcli/klogflag" "github.com/karmada-io/karmada/pkg/util/gclient" "github.com/karmada-io/karmada/pkg/version/sharedcommand" "github.com/karmada-io/karmada/pkg/webhook/interpreter" ) // NewWebhookCommand creates a *cobra.Command object with default parameters func NewWebhookCommand(ctx context.Context) *cobra.Command { opts := options.NewOptions() cmd := &cobra.Command{ Use: "karmada-interpreter-webhook-example", Run: func(cmd *cobra.Command, args []string) { // validate options if errs := opts.Validate(); len(errs) != 0 { fmt.Fprintf(os.Stderr, "configuration is not valid: %v\n", errs.ToAggregate()) os.Exit(1) } if err := Run(ctx, opts); err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } }, } fss := cliflag.NamedFlagSets{} genericFlagSet := fss.FlagSet("generic") genericFlagSet.AddGoFlagSet(flag.CommandLine) opts.AddFlags(genericFlagSet) // Set klog flags logsFlagSet := fss.FlagSet("logs") klogflag.Add(logsFlagSet) cmd.AddCommand(sharedcommand.NewCmdVersion(os.Stdout, "karmada-interpreter-webhook-example")) cmd.Flags().AddFlagSet(genericFlagSet) cmd.Flags().AddFlagSet(logsFlagSet) cols, _, _ := term.TerminalSize(cmd.OutOrStdout()) sharedcli.SetUsageAndHelpFunc(cmd, fss, cols) return cmd } // Run runs the webhook server with options. This should never exit. func Run(ctx context.Context, opts *options.Options) error { config, err := controllerruntime.GetConfig() if err != nil { panic(err) } hookManager, err := controllerruntime.NewManager(config, controllerruntime.Options{ Host: opts.BindAddress, Port: opts.SecurePort, CertDir: opts.CertDir, LeaderElection: false, }) if err != nil { klog.Errorf("failed to build webhook server: %v", err) return err } klog.Info("registering webhooks to the webhook server") hookServer := hookManager.GetWebhookServer() hookServer.Register("/interpreter-workload", interpreter.NewWebhook(&workloadInterpreter{}, interpreter.NewDecoder(gclient.NewSchema()))) hookServer.WebhookMux.Handle("/readyz/", http.StripPrefix("/readyz/", &healthz.Handler{})) // blocks until the context is done. if err := hookManager.Start(ctx); err != nil { klog.Errorf("webhook server exits unexpectedly: %v", err) return err } // never reach here return nil }