Skip to content

Commit

Permalink
fix: trigger reconcile if the secret changed, fix ready condition (#3)
Browse files Browse the repository at this point in the history
  • Loading branch information
raffis authored Dec 13, 2023
1 parent 694a4a4 commit d1a4269
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 4 deletions.
35 changes: 33 additions & 2 deletions internal/controllers/awsrdsinstance_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package controllers
import (
"context"
"errors"
"fmt"
"net/http"
"time"

Expand All @@ -42,6 +43,10 @@ import (
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)

const (
secretIndexKey = ".metadata.secret"
)

//+kubebuilder:rbac:groups=cloudautoscale.infra.doodle.com,resources=awsrdsinstances,verbs=get;list;watch;create;update;patch;delete
//+kubebuilder:rbac:groups=cloudautoscale.infra.doodle.com,resources=awsrdsinstances/status,verbs=get;update;patch
//+kubebuilder:rbac:groups=cloudautoscale.infra.doodle.com,resources=awsrdsinstances/finalizers,verbs=update
Expand Down Expand Up @@ -70,10 +75,36 @@ func (r *AWSRDSInstanceReconciler) SetupWithManager(mgr ctrl.Manager, opts AWSRD
&corev1.Pod{},
handler.EnqueueRequestsFromMapFunc(r.requestsForChangeBySelector),
).
Watches(
&corev1.Secret{},
handler.EnqueueRequestsFromMapFunc(r.requestsForSecretChange),
).
WithOptions(controller.Options{MaxConcurrentReconciles: opts.MaxConcurrentReconciles}).
Complete(r)
}

func (r *AWSRDSInstanceReconciler) requestsForSecretChange(ctx context.Context, o client.Object) []reconcile.Request {
sectet, ok := o.(*corev1.Secret)
if !ok {
panic(fmt.Sprintf("expected a Secret, got %T", o))
}

var list infrav1beta1.AWSRDSInstanceList
if err := r.List(ctx, &list, client.MatchingFields{
secretIndexKey: objectKey(sectet).String(),
}); err != nil {
return nil
}

var reqs []reconcile.Request
for _, instance := range list.Items {
r.Log.V(1).Info("referenced secret from a AWSRDSInstance changed detected", "namespace", instance.GetNamespace(), "name", instance.GetName())
reqs = append(reqs, reconcile.Request{NamespacedName: objectKey(&instance)})
}

return reqs
}

func (r *AWSRDSInstanceReconciler) requestsForChangeBySelector(ctx context.Context, o client.Object) []reconcile.Request {
var list infrav1beta1.AWSRDSInstanceList
if err := r.List(ctx, &list, client.InNamespace(o.GetNamespace())); err != nil {
Expand Down Expand Up @@ -209,14 +240,14 @@ func (r *AWSRDSInstanceReconciler) reconcile(ctx context.Context, instance infra
logger.Info("make sure RDS instances are suspended", "instance", opts.instanceName)
res, err = r.suspend(ctx, logger, opts)

if err != nil {
if err == nil {
instance = infrav1beta1.AWSRDSInstanceReady(instance, metav1.ConditionTrue, "ReconciliationSuccessful", "rds instance suspended")
}
} else {
logger.Info("make sure RDS instances are resumed", "instance", opts.instanceName)
res, err = r.resume(ctx, logger, opts)

if err != nil {
if err == nil {
instance = infrav1beta1.AWSRDSInstanceReady(instance, metav1.ConditionTrue, "ReconciliationSuccessful", "rds instance suspended")
}
}
Expand Down
31 changes: 29 additions & 2 deletions internal/controllers/mongodbatlascluster_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package controllers
import (
"context"
"errors"
"fmt"
"net/http"
"time"

Expand Down Expand Up @@ -66,10 +67,36 @@ func (r *MongoDBAtlasClusterReconciler) SetupWithManager(mgr ctrl.Manager, opts
&corev1.Pod{},
handler.EnqueueRequestsFromMapFunc(r.requestsForChangeBySelector),
).
Watches(
&corev1.Secret{},
handler.EnqueueRequestsFromMapFunc(r.requestsForSecretChange),
).
WithOptions(controller.Options{MaxConcurrentReconciles: opts.MaxConcurrentReconciles}).
Complete(r)
}

func (r *MongoDBAtlasClusterReconciler) requestsForSecretChange(ctx context.Context, o client.Object) []reconcile.Request {
sectet, ok := o.(*corev1.Secret)
if !ok {
panic(fmt.Sprintf("expected a Secret, got %T", o))
}

var list infrav1beta1.MongoDBAtlasClusterList
if err := r.List(ctx, &list, client.MatchingFields{
secretIndexKey: objectKey(sectet).String(),
}); err != nil {
return nil
}

var reqs []reconcile.Request
for _, cluster := range list.Items {
r.Log.V(1).Info("referenced secret from a MongoDBAtlasCluster changed detected", "namespace", cluster.GetNamespace(), "name", cluster.GetName())
reqs = append(reqs, reconcile.Request{NamespacedName: objectKey(&cluster)})
}

return reqs
}

func (r *MongoDBAtlasClusterReconciler) requestsForChangeBySelector(ctx context.Context, o client.Object) []reconcile.Request {
var list infrav1beta1.MongoDBAtlasClusterList
if err := r.List(ctx, &list, client.InNamespace(o.GetNamespace())); err != nil {
Expand Down Expand Up @@ -206,14 +233,14 @@ func (r *MongoDBAtlasClusterReconciler) reconcile(ctx context.Context, cluster i
logger.Info("make sure RDS clusters are suspended", "cluster", opts.ClusterName)
res, err = r.suspend(ctx, logger, opts)

if err != nil {
if err == nil {
cluster = infrav1beta1.MongoDBAtlasClusterReady(cluster, metav1.ConditionTrue, "ReconciliationSuccessful", "atlas cluster suspended")
}
} else {
logger.Info("make sure RDS clusters are resumed", "cluster", opts.ClusterName)
res, err = r.resume(ctx, logger, opts)

if err != nil {
if err == nil {
cluster = infrav1beta1.MongoDBAtlasClusterReady(cluster, metav1.ConditionTrue, "ReconciliationSuccessful", "atlas cluster resumed")
}
}
Expand Down

0 comments on commit d1a4269

Please sign in to comment.