diff --git a/cmd/main.go b/cmd/main.go index fbf63e0..3c4b6d4 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "net/http" "time" "git.uploadfilter24.eu/covidnetes/canada-kaktus/internal" @@ -20,11 +21,13 @@ func main() { }).Fatal(fmt.Sprintf("Error generating Config: %s", err.Error())) } + hs := internal.NewHealthServer() + go func() { log.WithFields(log.Fields{ "Caller": "Main", }).Info("Starting Health Endpoint") - internal.StartHealthEndpoint() + hs.Start() }() log.WithFields(log.Fields{ @@ -37,18 +40,21 @@ func main() { log.WithFields(log.Fields{ "Caller": "Main", }).Error(fmt.Sprintf("Error getting all Nodes: %s", err.Error())) + hs.SetHealthState(http.StatusServiceUnavailable) } ips, err := internal.GetAllIps(servers) if err != nil { log.WithFields(log.Fields{ "Caller": "Main", }).Error(fmt.Sprintf("Error getting all IPs: %s", err.Error())) + hs.SetHealthState(http.StatusServiceUnavailable) } err = internal.RecreateIPPoolCrd(cfg, "covidnetes-pool", ips) if err != nil { log.WithFields(log.Fields{ "Caller": "Main", }).Error(fmt.Sprintf("Error recreating IP Pool CRD: %s", err.Error())) + hs.SetHealthState(http.StatusServiceUnavailable) } else { log.WithFields(log.Fields{ "Caller": "Main", diff --git a/go.mod b/go.mod index aab251f..a69e287 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,6 @@ require ( github.com/sirupsen/logrus v1.9.3 k8s.io/apimachinery v0.34.1 k8s.io/client-go v0.34.1 - sigs.k8s.io/controller-runtime v0.22.2 ) require ( diff --git a/go.sum b/go.sum index fa99ef8..211b446 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,6 @@ github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2Kv github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= @@ -29,8 +27,6 @@ github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7O github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= @@ -63,10 +59,6 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= -github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= -github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw= -github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -136,8 +128,6 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -166,8 +156,6 @@ k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOP k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.22.2 h1:cK2l8BGWsSWkXz09tcS4rJh95iOLney5eawcK5A33r4= -sigs.k8s.io/controller-runtime v0.22.2/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= diff --git a/internal/health.go b/internal/health.go index bbe2592..351ae73 100644 --- a/internal/health.go +++ b/internal/health.go @@ -3,29 +3,54 @@ package internal import ( "fmt" "net/http" + "sync" "github.com/gorilla/mux" log "github.com/sirupsen/logrus" ) -func StartHealthEndpoint() { +type HealthServer struct { + mu sync.RWMutex + state int +} + +func NewHealthServer() *HealthServer { + return &HealthServer{ + state: http.StatusOK, + } +} + +func (hs *HealthServer) SetHealthState(code int) { + hs.mu.Lock() + defer hs.mu.Unlock() + hs.state = code +} + +func (hs *HealthServer) GetHealthState() int { + hs.mu.RLock() + defer hs.mu.RUnlock() + return hs.state +} + +func (hs *HealthServer) Start() { r := mux.NewRouter() r.Use(mux.CORSMethodMiddleware(r)) - r.HandleFunc("/health", send200).Methods(http.MethodGet) + r.HandleFunc("/health", hs.sendHealth).Methods(http.MethodGet) err := http.ListenAndServe("0.0.0.0:8080", r) if err != nil { log.WithFields(log.Fields{ - "Caller": "StartHealthEndpoint", + "Caller": "HealthServer.Start", }).Error(fmt.Sprintf("Error creating health endpoint: %s", err.Error())) } } -func send200(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) +func (hs *HealthServer) sendHealth(w http.ResponseWriter, r *http.Request) { + code := hs.GetHealthState() + w.WriteHeader(code) _, err := w.Write([]byte{}) if err != nil { log.WithFields(log.Fields{ - "Caller": "send200", + "Caller": "HealthServer.sendHealth", }).Error(fmt.Sprintf("Error answering health endpoint: %s", err.Error())) } } diff --git a/internal/health_test.go b/internal/health_test.go index e7e8ed7..01667b4 100644 --- a/internal/health_test.go +++ b/internal/health_test.go @@ -7,8 +7,9 @@ import ( ) func TestHealth(t *testing.T) { + hs := NewHealthServer() go func() { - StartHealthEndpoint() + hs.Start() }() request, _ := http.NewRequest(http.MethodGet, "http://localhost:8080/health", strings.NewReader("")) resp, err := http.DefaultClient.Do(request) diff --git a/internal/hetzner.go b/internal/hetzner.go index 8e25869..4321f20 100644 --- a/internal/hetzner.go +++ b/internal/hetzner.go @@ -25,7 +25,7 @@ func GetAllNodes(cfg *Config) ([]*hcloud.Server, error) { for _, instance := range servers { log.WithFields(log.Fields{ "Caller": "GetAllNodes", - }).Info(fmt.Sprintf("Found server: %s", instance.Name)) + }).Debugf("Found server: %s", instance.Name) } return servers, nil @@ -39,7 +39,7 @@ func GetAllIps(servers []*hcloud.Server) ([]string, error) { } log.WithFields(log.Fields{ "Caller": "GetAllIps", - }).Info(fmt.Sprintf("Found IP: %s", instance.PublicNet.IPv4.IP.String())) + }).Debugf("Found IP: %s", instance.PublicNet.IPv4.IP.String()) ips[i] = instance.PublicNet.IPv4.IP.String() } return ips, nil diff --git a/internal/k8s.go b/internal/k8s.go index 9973322..f56480e 100644 --- a/internal/k8s.go +++ b/internal/k8s.go @@ -166,12 +166,3 @@ func getResourceVersion(client *rest.RESTClient, name string) (string, error) { } return rv, nil } - -// func RegisterCiliumCrd() error { -// SchemeBuilder := &apiSchema.Builder{GroupVersion: CILIUM_GROUP_VERSION} -// err := SchemeBuilder.AddToScheme(scheme.Scheme) -// if err != nil { -// return fmt.Errorf("could not register cilium crd: %v", err.Error()) -// } -// return nil -// }