package app import ( "context" "flag" "fmt" "net/http" "os" "github.com/spf13/cobra" "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/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) } }, } // Init log flags // TODO(@RainbowMango): Group the flags to "logs" flag set. klog.InitFlags(flag.CommandLine) cmd.Flags().AddGoFlagSet(flag.CommandLine) cmd.AddCommand(sharedcommand.NewCmdVersion(os.Stdout, "karmada-interpreter-webhook-example")) opts.AddFlags(cmd.Flags()) 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 }