chore: use predicte to stop reconcile on status subupdate

This commit is contained in:
Jonas Kaninda
2024-11-28 07:39:43 +01:00
parent 81fc83be09
commit a7162fa72f
5 changed files with 30 additions and 21 deletions

View File

@@ -203,7 +203,7 @@ func equalDeploymentSpec(existing, desired v1.DeploymentSpec, autoScalingEnabled
} }
return true 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) logger := log.FromContext(ctx)
// Fetch the Deployment // Fetch the Deployment
var deployment v1.Deployment var deployment v1.Deployment

View File

@@ -31,6 +31,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/predicate"
"strings" "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") addCondition(&gateway.Status, "ConfigMapReady", metav1.ConditionFalse, "ConfigMapReady", "Failed to update ConfigMap for Gateway")
return ctrl.Result{}, err 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) 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) 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) { func addCondition(status *gomaprojv1beta1.GatewayStatus, condType string, statusType metav1.ConditionStatus, reason, message string) {
for i, existingCondition := range status.Conditions { for i, existingCondition := range status.Conditions {
if existingCondition.Type == condType { 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. // SetupWithManager sets up the controller with the Manager.
func (r *GatewayReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *GatewayReconciler) SetupWithManager(mgr ctrl.Manager) error {
pred := predicate.GenerationChangedPredicate{}
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&gomaprojv1beta1.Gateway{}). For(&gomaprojv1beta1.Gateway{}).
WithEventFilter(pred).
Owns(&corev1.ConfigMap{}). // Watch ConfigMaps created by the controller Owns(&corev1.ConfigMap{}). // Watch ConfigMaps created by the controller
Owns(&v1.Deployment{}). // Watch Deployments created by the controller Owns(&v1.Deployment{}). // Watch Deployments created by the controller
Owns(&corev1.Service{}). // Watch Services created by the controller Owns(&corev1.Service{}). // Watch Services created by the controller

View File

@@ -62,7 +62,7 @@ func gatewayConfig(r GatewayReconciler, ctx context.Context, req ctrl.Request, g
} }
return *gomaConfig 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) logger := log.FromContext(ctx)
gomaConfig := &GatewayConfig{} gomaConfig := &GatewayConfig{}
gomaConfig.Version = GatewayConfigVersion gomaConfig.Version = GatewayConfigVersion
@@ -78,12 +78,12 @@ func updateGatewayConfig(r RouteReconciler, ctx context.Context, req ctrl.Reques
var routes gomaprojv1beta1.RouteList var routes gomaprojv1beta1.RouteList
if err := r.List(ctx, &routes, labelSelector, client.InNamespace(req.Namespace)); err != nil { if err := r.List(ctx, &routes, labelSelector, client.InNamespace(req.Namespace)); err != nil {
logger.Error(err, "Failed to list Routes") logger.Error(err, "Failed to list Routes")
return err return false, err
} }
var middlewares gomaprojv1beta1.MiddlewareList var middlewares gomaprojv1beta1.MiddlewareList
if err := r.List(ctx, &middlewares, labelSelector, client.InNamespace(req.Namespace)); err != nil { if err := r.List(ctx, &middlewares, labelSelector, client.InNamespace(req.Namespace)); err != nil {
logger.Error(err, "Failed to list Middlewares") logger.Error(err, "Failed to list Middlewares")
return err return false, err
} }
for _, route := range routes.Items { for _, route := range routes.Items {
logger.Info("Found Route", "Name", route.Name) 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) yamlContent, err := yaml.Marshal(&gomaConfig)
if err != nil { if err != nil {
logger.Error(err, "Unable to marshal YAML") logger.Error(err, "Unable to marshal YAML")
return err return false, err
} }
// Define the desired ConfigMap // Define the desired ConfigMap
configMap := &corev1.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) err = r.Get(ctx, types.NamespacedName{Name: configMap.Name, Namespace: configMap.Namespace}, &existingConfigMap)
if err != nil && client.IgnoreNotFound(err) != nil { if err != nil && client.IgnoreNotFound(err) != nil {
logger.Error(err, "Failed to get ConfigMap") logger.Error(err, "Failed to get ConfigMap")
return err return false, err
} }
if err != nil && client.IgnoreNotFound(err) == nil { if err != nil && client.IgnoreNotFound(err) == nil {
// Create the ConfigMap if it doesn't exist // Create the ConfigMap if it doesn't exist
if err = controllerutil.SetControllerReference(&gateway, configMap, r.Scheme); err != nil { if err = controllerutil.SetControllerReference(&gateway, configMap, r.Scheme); err != nil {
logger.Error(err, "Failed to set controller reference") logger.Error(err, "Failed to set controller reference")
return err return false, err
} }
if err = r.Create(ctx, configMap); err != nil { if err = r.Create(ctx, configMap); err != nil {
logger.Error(err, "Failed to create ConfigMap") logger.Error(err, "Failed to create ConfigMap")
return err return false, err
} }
logger.Info("Created ConfigMap", "ConfigMap.Name", configMap.Name) logger.Info("Created ConfigMap", "ConfigMap.Name", configMap.Name)
} else { } else {
@@ -149,13 +149,13 @@ func updateGatewayConfig(r RouteReconciler, ctx context.Context, req ctrl.Reques
existingConfigMap.Data = configMap.Data existingConfigMap.Data = configMap.Data
if err = r.Update(ctx, &existingConfigMap); err != nil { if err = r.Update(ctx, &existingConfigMap); err != nil {
logger.Error(err, "Failed to update ConfigMap") logger.Error(err, "Failed to update ConfigMap")
return err return false, err
} }
logger.Info("Updated ConfigMap", "ConfigMap.Name", configMap.Name) 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 return mid
} }
// Helper function to return a pointer to an int32
func int32Ptr(i int32) *int32 {
return &i
}

View File

@@ -65,16 +65,17 @@ func (r *RouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
logger.Error(err, "Failed to fetch Gateway") logger.Error(err, "Failed to fetch Gateway")
return ctrl.Result{}, err return ctrl.Result{}, err
} }
err := updateGatewayConfig(*r, ctx, req, gateway) ok, err := updateGatewayConfig(*r, ctx, req, gateway)
if err != nil { if err != nil {
return ctrl.Result{}, err return ctrl.Result{}, err
} }
// if ok {
if err = r.RestartDeployment(ctx, req, gateway); err != nil { if err = restartDeployment(r.Client, ctx, req, &gateway); err != nil {
logger.Error(err, "Failed to restart Deployment") logger.Error(err, "Failed to restart Deployment")
return ctrl.Result{}, err return ctrl.Result{}, err
} }
}
return ctrl.Result{}, nil return ctrl.Result{}, nil
} }

View File

@@ -11,7 +11,7 @@ const (
RateLimit = "rateLimit" RateLimit = "rateLimit"
BelongsTo = "goma-gateway" BelongsTo = "goma-gateway"
GatewayConfigVersion = "1.0" GatewayConfigVersion = "1.0"
FinalizerName = "finalizer.gomaproj.jonaskaninda.com" FinalizerName = "gomaproj.github.io/resources.finalizer"
ConfigName = "goma.yml" ConfigName = "goma.yml"
TLSCertFile = "/etc/goma/certs/tls.crt" TLSCertFile = "/etc/goma/certs/tls.crt"
TLSKeyFile = "/etc/goma/certs/tls.key" TLSKeyFile = "/etc/goma/certs/tls.key"