penguin/monok8s

k8s image for Mono Gateway Dev Kit

clitools/pkg/controller/server.go

raw ยท 2143 bytes

package controller

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

	"example.com/monok8s/pkg/kube"

	"github.com/emicklei/go-restful/v3"
	"k8s.io/apiserver/pkg/server/httplog"
)

var statusesNoTracePred = httplog.StatusIsNot(
	http.StatusOK,
	http.StatusFound,
	http.StatusMovedPermanently,
	http.StatusTemporaryRedirect,
	http.StatusBadRequest,
	http.StatusNotFound,
	http.StatusSwitchingProtocols,
)

type Server struct {
	restfulCont *restful.Container

	ctx       context.Context
	clients   *kube.Clients
	namespace string
	nodeName  string
	startedAt time.Time
}

type StatusResponse struct {
	OK        bool   `json:"ok"`
	Service   string `json:"service"`
	Namespace string `json:"namespace,omitempty"`
	NodeName  string `json:"nodeName,omitempty"`
	UptimeSec int64  `json:"uptimeSec"`
}

func NewServer(ctx context.Context, clients *kube.Clients, namespace, nodeName string) *Server {
	s := &Server{
		ctx:       ctx,
		clients:   clients,
		namespace: namespace,
		nodeName:  nodeName,
		startedAt: time.Now(),
	}
	s.Initialize()
	return s
}

func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
	if s == nil {
		http.Error(w, "server is nil", http.StatusInternalServerError)
		return
	}
	if s.restfulCont == nil {
		http.Error(w, "server not initialized", http.StatusInternalServerError)
		return
	}

	handler := httplog.WithLogging(s.restfulCont, statusesNoTracePred)
	handler.ServeHTTP(w, req)
}

func (s *Server) Initialize() {
	s.restfulCont = restful.NewContainer()

	ws := new(restful.WebService)
	ws.Path("/")
	ws.Consumes(restful.MIME_JSON)
	ws.Produces(restful.MIME_JSON)

	ws.Route(ws.GET("/healthz").To(s.queryHealthz).
		Doc("Return basic controller status"))

	// Stub for now
	ws.Route(ws.GET("/readyz").To(s.queryHealthz).
		Doc("Stub for now"))

	s.restfulCont.Add(ws)
}

func (s *Server) queryHealthz(request *restful.Request, response *restful.Response) {
	resp := StatusResponse{
		OK:        true,
		Service:   "monok8s-controller",
		Namespace: s.namespace,
		NodeName:  s.nodeName,
		UptimeSec: int64(time.Since(s.startedAt).Seconds()),
	}

	_ = response.WriteHeaderAndEntity(http.StatusOK, resp)
}