diff --git a/internal/controller/deployment.go b/internal/controller/deployment.go index 5060736..ff18297 100644 --- a/internal/controller/deployment.go +++ b/internal/controller/deployment.go @@ -203,7 +203,7 @@ func equalDeploymentSpec(existing, desired v1.DeploymentSpec, autoScalingEnabled } return true } -func (r *RouteReconciler) RestartDeployment(ctx context.Context, req ctrl.Request, gateway gomaprojv1beta1.Gateway) error { +func restartDeployment(r client.Client, ctx context.Context, req ctrl.Request, gateway *gomaprojv1beta1.Gateway) error { logger := log.FromContext(ctx) // Fetch the Deployment var deployment v1.Deployment diff --git a/internal/controller/gateway_controller.go b/internal/controller/gateway_controller.go index fb4b156..acb08e0 100644 --- a/internal/controller/gateway_controller.go +++ b/internal/controller/gateway_controller.go @@ -31,6 +31,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/predicate" "strings" ) @@ -151,6 +152,11 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct addCondition(&gateway.Status, "ConfigMapReady", metav1.ConditionFalse, "ConfigMapReady", "Failed to update ConfigMap for Gateway") return ctrl.Result{}, err } + if err = restartDeployment(r.Client, ctx, req, gateway); err != nil { + logger.Error(err, "Failed to restart Deployment") + return ctrl.Result{}, err + + } logger.Info("Updated ConfigMap", "ConfigMap.Name", configMap.Name) } @@ -194,11 +200,6 @@ func (r *GatewayReconciler) updateStatus(ctx context.Context, gateway *gomaprojv return r.Client.Status().Update(ctx, gateway) } -// Helper function to return a pointer to an int32 -func int32Ptr(i int32) *int32 { - return &i -} - func addCondition(status *gomaprojv1beta1.GatewayStatus, condType string, statusType metav1.ConditionStatus, reason, message string) { for i, existingCondition := range status.Conditions { if existingCondition.Type == condType { @@ -291,8 +292,10 @@ func (r *GatewayReconciler) finalize(ctx context.Context, gateway *gomaprojv1bet // SetupWithManager sets up the controller with the Manager. func (r *GatewayReconciler) SetupWithManager(mgr ctrl.Manager) error { + pred := predicate.GenerationChangedPredicate{} return ctrl.NewControllerManagedBy(mgr). For(&gomaprojv1beta1.Gateway{}). + WithEventFilter(pred). Owns(&corev1.ConfigMap{}). // Watch ConfigMaps created by the controller Owns(&v1.Deployment{}). // Watch Deployments created by the controller Owns(&corev1.Service{}). // Watch Services created by the controller diff --git a/internal/controller/helpers.go b/internal/controller/helpers.go index 551d9a6..5d2097a 100644 --- a/internal/controller/helpers.go +++ b/internal/controller/helpers.go @@ -62,7 +62,7 @@ func gatewayConfig(r GatewayReconciler, ctx context.Context, req ctrl.Request, g } return *gomaConfig } -func updateGatewayConfig(r RouteReconciler, ctx context.Context, req ctrl.Request, gateway gomaprojv1beta1.Gateway) error { +func updateGatewayConfig(r RouteReconciler, ctx context.Context, req ctrl.Request, gateway gomaprojv1beta1.Gateway) (bool, error) { logger := log.FromContext(ctx) gomaConfig := &GatewayConfig{} gomaConfig.Version = GatewayConfigVersion @@ -78,12 +78,12 @@ func updateGatewayConfig(r RouteReconciler, ctx context.Context, req ctrl.Reques var routes gomaprojv1beta1.RouteList if err := r.List(ctx, &routes, labelSelector, client.InNamespace(req.Namespace)); err != nil { logger.Error(err, "Failed to list Routes") - return err + return false, err } var middlewares gomaprojv1beta1.MiddlewareList if err := r.List(ctx, &middlewares, labelSelector, client.InNamespace(req.Namespace)); err != nil { logger.Error(err, "Failed to list Middlewares") - return err + return false, err } for _, route := range routes.Items { logger.Info("Found Route", "Name", route.Name) @@ -108,7 +108,7 @@ func updateGatewayConfig(r RouteReconciler, ctx context.Context, req ctrl.Reques yamlContent, err := yaml.Marshal(&gomaConfig) if err != nil { logger.Error(err, "Unable to marshal YAML") - return err + return false, err } // Define the desired ConfigMap configMap := &corev1.ConfigMap{ @@ -129,18 +129,18 @@ func updateGatewayConfig(r RouteReconciler, ctx context.Context, req ctrl.Reques err = r.Get(ctx, types.NamespacedName{Name: configMap.Name, Namespace: configMap.Namespace}, &existingConfigMap) if err != nil && client.IgnoreNotFound(err) != nil { logger.Error(err, "Failed to get ConfigMap") - return err + return false, err } if err != nil && client.IgnoreNotFound(err) == nil { // Create the ConfigMap if it doesn't exist if err = controllerutil.SetControllerReference(&gateway, configMap, r.Scheme); err != nil { logger.Error(err, "Failed to set controller reference") - return err + return false, err } if err = r.Create(ctx, configMap); err != nil { logger.Error(err, "Failed to create ConfigMap") - return err + return false, err } logger.Info("Created ConfigMap", "ConfigMap.Name", configMap.Name) } else { @@ -149,13 +149,13 @@ func updateGatewayConfig(r RouteReconciler, ctx context.Context, req ctrl.Reques existingConfigMap.Data = configMap.Data if err = r.Update(ctx, &existingConfigMap); err != nil { logger.Error(err, "Failed to update ConfigMap") - return err + return false, err } logger.Info("Updated ConfigMap", "ConfigMap.Name", configMap.Name) } } - return nil + return true, nil } @@ -215,3 +215,8 @@ func mapMid(middleware gomaprojv1beta1.Middleware) *Middleware { } return mid } + +// Helper function to return a pointer to an int32 +func int32Ptr(i int32) *int32 { + return &i +} diff --git a/internal/controller/route_controller.go b/internal/controller/route_controller.go index f06289c..ae3f3b3 100644 --- a/internal/controller/route_controller.go +++ b/internal/controller/route_controller.go @@ -65,15 +65,16 @@ func (r *RouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl logger.Error(err, "Failed to fetch Gateway") return ctrl.Result{}, err } - err := updateGatewayConfig(*r, ctx, req, gateway) + ok, err := updateGatewayConfig(*r, ctx, req, gateway) if err != nil { return ctrl.Result{}, err } - // - if err = r.RestartDeployment(ctx, req, gateway); err != nil { - logger.Error(err, "Failed to restart Deployment") - return ctrl.Result{}, err + if ok { + if err = restartDeployment(r.Client, ctx, req, &gateway); err != nil { + logger.Error(err, "Failed to restart Deployment") + return ctrl.Result{}, err + } } return ctrl.Result{}, nil } diff --git a/internal/controller/var.go b/internal/controller/var.go index 87feeab..4190c85 100644 --- a/internal/controller/var.go +++ b/internal/controller/var.go @@ -11,7 +11,7 @@ const ( RateLimit = "rateLimit" BelongsTo = "goma-gateway" GatewayConfigVersion = "1.0" - FinalizerName = "finalizer.gomaproj.jonaskaninda.com" + FinalizerName = "gomaproj.github.io/resources.finalizer" ConfigName = "goma.yml" TLSCertFile = "/etc/goma/certs/tls.crt" TLSKeyFile = "/etc/goma/certs/tls.key"