diff --git a/cyclops-ctrl/.env b/cyclops-ctrl/.env index 011a7a1d..bb1967f0 100644 --- a/cyclops-ctrl/.env +++ b/cyclops-ctrl/.env @@ -3,3 +3,4 @@ PORT=8888 WATCH_NAMESPACE=cyclops WATCH_NAMESPACE_HELM= CYCLOPS_VERSION=v0.0.0 +DISABLE_MODULE_RECONCILER=false diff --git a/cyclops-ctrl/cmd/main/main.go b/cyclops-ctrl/cmd/main/main.go index 1f905812..77f09271 100644 --- a/cyclops-ctrl/cmd/main/main.go +++ b/cyclops-ctrl/cmd/main/main.go @@ -1,6 +1,7 @@ package main import ( + "context" "flag" "fmt" "os" @@ -55,7 +56,7 @@ func main() { "Enable leader election for controller manager. "+ "Enabling this will ensure there is only one active controller manager.") opts := zap.Options{ - Development: true, + Development: false, } opts.BindFlags(flag.CommandLine) flag.Parse() @@ -101,58 +102,67 @@ func main() { panic(err) } - go handler.Start() - - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - HealthProbeBindAddress: probeAddr, - LeaderElection: enableLeaderElection, - LeaderElectionID: "f9d9f115.cyclops-ui.com", - Metrics: metricsserver.Options{ - BindAddress: metricsAddr, - }, - WebhookServer: webhook.NewServer(webhook.Options{ - Port: 9443, - }), - Cache: ctrlCache.Options{ - DefaultNamespaces: map[string]ctrlCache.Config{ - watchNamespace: {}, - }, - }, - }) - if err != nil { - setupLog.Error(err, "unable to start manager") - os.Exit(1) - } - - if err = (modulecontroller.NewModuleReconciler( - mgr.GetClient(), - mgr.GetScheme(), - templatesRepo, - k8sClient, - renderer, - telemetryClient, - monitor, - )).SetupWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "Module") - os.Exit(1) + disableReconciler := getEnvBool("DISABLE_MODULE_RECONCILER") + if disableReconciler { + setupLog.Info("reconciler disabled") } - //+kubebuilder:scaffold:builder - if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { - setupLog.Error(err, "unable to set up health check") - os.Exit(1) - } - if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { - setupLog.Error(err, "unable to set up ready check") - os.Exit(1) + if !disableReconciler { + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + Scheme: scheme, + HealthProbeBindAddress: probeAddr, + LeaderElection: enableLeaderElection, + LeaderElectionID: "f9d9f115.cyclops-ui.com", + Metrics: metricsserver.Options{ + BindAddress: metricsAddr, + }, + WebhookServer: webhook.NewServer(webhook.Options{ + Port: 9443, + }), + Cache: ctrlCache.Options{ + DefaultNamespaces: map[string]ctrlCache.Config{ + watchNamespace: {}, + }, + }, + }) + if err != nil { + setupLog.Error(err, "unable to start manager") + os.Exit(1) + } + + if err = (modulecontroller.NewModuleReconciler( + mgr.GetClient(), + mgr.GetScheme(), + templatesRepo, + k8sClient, + renderer, + telemetryClient, + monitor, + )).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "Module") + os.Exit(1) + } + //+kubebuilder:scaffold:builder + + if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up health check") + os.Exit(1) + } + if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up ready check") + os.Exit(1) + } + + go func() { + setupLog.Info("starting manager") + if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { + setupLog.Error(err, "problem running manager") + os.Exit(1) + } + }() } - setupLog.Info("starting manager") - if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { - setupLog.Error(err, "problem running manager") - os.Exit(1) - } + handler.Start(context.Background()) } func getEnvBool(key string) bool { diff --git a/cyclops-ctrl/internal/handler/handler.go b/cyclops-ctrl/internal/handler/handler.go index f31f158f..0007ef1a 100644 --- a/cyclops-ctrl/internal/handler/handler.go +++ b/cyclops-ctrl/internal/handler/handler.go @@ -1,12 +1,16 @@ package handler import ( - "github.com/cyclops-ui/cyclops/cyclops-ctrl/internal/controller/sse" - "github.com/cyclops-ui/cyclops/cyclops-ctrl/internal/integrations/helm" - "github.com/gin-gonic/gin" + "context" "net/http" + "os/signal" + "syscall" + + "github.com/gin-gonic/gin" "github.com/cyclops-ui/cyclops/cyclops-ctrl/internal/controller" + "github.com/cyclops-ui/cyclops/cyclops-ctrl/internal/controller/sse" + "github.com/cyclops-ui/cyclops/cyclops-ctrl/internal/integrations/helm" "github.com/cyclops-ui/cyclops/cyclops-ctrl/internal/prometheus" "github.com/cyclops-ui/cyclops/cyclops-ctrl/internal/telemetry" templaterepo "github.com/cyclops-ui/cyclops/cyclops-ctrl/internal/template" @@ -45,7 +49,7 @@ func New( }, nil } -func (h *Handler) Start() error { +func (h *Handler) Start(ctx context.Context) { gin.SetMode(gin.DebugMode) templatesController := controller.NewTemplatesController(h.templatesRepo, h.k8sClient, h.telemetryClient) @@ -57,6 +61,9 @@ func (h *Handler) Start() error { server := sse.NewServer(h.k8sClient) + h.router.GET("/healthz", func(c *gin.Context) { c.String(http.StatusOK, "OK") }) + h.router.GET("/readyz", func(c *gin.Context) { c.String(http.StatusOK, "OK") }) + h.router.GET("/stream/resources/:name", sse.HeadersMiddleware(), server.Resources) h.router.GET("/stream/releases/resources/:name", sse.HeadersMiddleware(), server.ReleaseResources) h.router.POST("/stream/resources", sse.HeadersMiddleware(), server.SingleResource) @@ -116,7 +123,10 @@ func (h *Handler) Start() error { h.router.Use(h.options) - return h.router.Run() + c, stop := signal.NotifyContext(ctx, syscall.SIGINT, syscall.SIGTERM) + go h.router.Run() + <-c.Done() + stop() } func (h *Handler) pong() func(ctx *gin.Context) { diff --git a/install/cyclops-install.yaml b/install/cyclops-install.yaml index a2a17a29..ce28c3ce 100644 --- a/install/cyclops-install.yaml +++ b/install/cyclops-install.yaml @@ -383,7 +383,7 @@ spec: spec: containers: - name: cyclops-ui - image: cyclopsui/cyclops-ui:v0.15.1 + image: cyclopsui/cyclops-ui:v0.15.2-rc.1 ports: - containerPort: 80 env: @@ -448,7 +448,7 @@ spec: serviceAccountName: cyclops-ctrl containers: - name: cyclops-ctrl - image: cyclopsui/cyclops-ctrl:v0.15.1 + image: cyclopsui/cyclops-ctrl:v0.15.2-rc.1 ports: - containerPort: 8080 env: