-
Notifications
You must be signed in to change notification settings - Fork 1
/
invitation_cleanup_controller.go
77 lines (62 loc) · 2.52 KB
/
invitation_cleanup_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package controllers
import (
"context"
"time"
apimeta "k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/tools/record"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/log"
userv1 "github.com/appuio/control-api/apis/user/v1"
)
// InvitationCleanupReconciler reconciles invitations, deleting them if appropriate
type InvitationCleanupReconciler struct {
client.Client
Recorder record.EventRecorder
Scheme *runtime.Scheme
RedeemedInvitationTTL time.Duration
}
//+kubebuilder:rbac:groups="rbac.appuio.io",resources=invitations,verbs=get;list;watch;delete
//+kubebuilder:rbac:groups="user.appuio.io",resources=invitations,verbs=get;list;watch;delete
//+kubebuilder:rbac:groups="rbac.appuio.io",resources=invitations/status,verbs=get
//+kubebuilder:rbac:groups="user.appuio.io",resources=invitations/status,verbs=get
// Reconcile reacts on invitations and removes them if required
func (r *InvitationCleanupReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := log.FromContext(ctx)
log.V(1).WithValues("request", req).Info("Reconciling")
log.V(1).Info("Getting the Invitation...")
inv := userv1.Invitation{}
if err := r.Get(ctx, req.NamespacedName, &inv); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
if !inv.ObjectMeta.DeletionTimestamp.IsZero() {
return ctrl.Result{}, nil
}
if inv.Status.Token == "" {
// Invitation is not yet valid
return ctrl.Result{}, nil
}
now := metav1.NewTime(time.Now())
if inv.IsRedeemed() {
cond := apimeta.FindStatusCondition(inv.Status.Conditions, userv1.ConditionRedeemed)
ttlExpirationTime := cond.LastTransitionTime.Add(r.RedeemedInvitationTTL)
if ttlExpirationTime.Before(now.Time) {
log.V(1).Info("Redeemed Invitation TTL expired - deleting", "ttlExpirationTime", ttlExpirationTime)
return ctrl.Result{}, r.Delete(ctx, &inv)
}
return ctrl.Result{RequeueAfter: ttlExpirationTime.Sub(now.Add(-time.Minute))}, nil
}
if inv.Status.ValidUntil.Before(&now) {
log.V(1).Info("Invitation expired - deleting")
return ctrl.Result{}, r.Delete(ctx, &inv)
}
return ctrl.Result{RequeueAfter: inv.Status.ValidUntil.Sub(now.Add(-time.Minute))}, nil
}
// SetupWithManager sets up the controller with the Manager.
func (r *InvitationCleanupReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&userv1.Invitation{}).
Complete(r)
}