penguin/monok8s

k8s image for Mono Gateway Dev Kit

clitools/pkg/cmd/controller/controller.go

raw ยท 2480 bytes

package controller

import (
	"context"
	"net"
	"net/http"
	"os"
	"time"

	"github.com/spf13/cobra"
	"k8s.io/cli-runtime/pkg/genericclioptions"
	"k8s.io/klog/v2"

	mksadmission "example.com/monok8s/pkg/controller/admission"
	"example.com/monok8s/pkg/kube"
	"example.com/monok8s/pkg/templates"
)

type ServerConfig struct {
	TLSCertFile       string `json:"tlsCertFile,omitempty"`
	TLSPrivateKeyFile string `json:"tlsPrivateKeyFile,omitempty"`
}

func NewCmdController(flags *genericclioptions.ConfigFlags) *cobra.Command {
	var namespace string = templates.DefaultNamespace
	var conf ServerConfig

	cmd := &cobra.Command{
		Use:   "controller",
		Short: "Admission controller that handles OSUpgrade resources",
		RunE: func(cmd *cobra.Command, _ []string) error {

			ctx := cmd.Context()

			klog.InfoS("starting controller",
				"namespace", namespace,
			)

			clients, err := kube.NewClients(flags)
			if err != nil {
				return err
			}

			return httpListen(ctx, clients, conf)
		},
	}

	cmd.Flags().StringVar(&namespace, "namespace", templates.DefaultNamespace, "namespace to watch")
	cmd.Flags().StringVar(&conf.TLSCertFile, "tls-cert-file", conf.TLSCertFile,
		"File containing x509 Certificate used for serving HTTPS (with intermediate certs, if any, concatenated after server cert).")
	cmd.Flags().StringVar(&conf.TLSPrivateKeyFile, "tls-private-key-file", conf.TLSPrivateKeyFile, "File containing x509 private key matching --tls-cert-file.")

	return cmd
}

func httpListen(ctx context.Context, clients *kube.Clients, conf ServerConfig) error {
	address, port := "", "8443"
	addr := net.JoinHostPort(address, port)

	ns := os.Getenv("POD_NAMESPACE")
	nodeName := os.Getenv("NODE_NAME")

	server := mksadmission.NewServer(ctx, clients, ns, nodeName)

	s := &http.Server{
		Addr:           addr,
		Handler:        server,
		IdleTimeout:    90 * time.Second,
		ReadTimeout:    4 * 60 * time.Minute,
		WriteTimeout:   4 * 60 * time.Minute,
		MaxHeaderBytes: 1 << 20,
	}

	if conf.TLSCertFile != "" {
		klog.InfoS("starting HTTPS server",
			"addr", addr,
			"certFile", conf.TLSCertFile,
			"keyFile", conf.TLSPrivateKeyFile,
		)

		if err := s.ListenAndServeTLS(conf.TLSCertFile, conf.TLSPrivateKeyFile); err != nil {
			klog.ErrorS(err, "HTTPS server failed")
			os.Exit(1)
		}
	} else {
		klog.InfoS("starting HTTP server",
			"addr", addr,
		)

		if err := s.ListenAndServe(); err != nil {
			klog.ErrorS(err, "HTTP server failed")
			os.Exit(1)
		}
	}

	return nil
}