chore: use predicte to stop reconcile on status subupdate
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user