Skip to content

Commit 518a846

Browse files
kaden-l-nelsonstefanprodan
authored andcommitted
Add a finalizer to the ImagePolicy and ImageRepository resources
Fixes #225 This PR adds a finalizer to the ImagePolicy and ImageRepository resources. This is to properly record the Deleted reconciliation status when the object is deleted from the cluster. Without this change, the resource would be deleted before the image reflector controller has a chance to properly report the resource's status in the metrics. As a result, end-users may see falsely reported metrics. Signed-off-by: Kaden Nelson <[email protected]>
1 parent 5ab6137 commit 518a846

4 files changed

+44
-0
lines changed

api/v1beta1/imagepolicy_types.go

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
)
2525

2626
const ImagePolicyKind = "ImagePolicy"
27+
const ImagePolicyFinalizer = "finalizers.fluxcd.io"
2728

2829
// ImagePolicySpec defines the parameters for calculating the
2930
// ImagePolicy

api/v1beta1/imagerepository_types.go

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
)
2828

2929
const ImageRepositoryKind = "ImageRepository"
30+
const ImageRepositoryFinalizer = "finalizers.fluxcd.io"
3031

3132
// ImageRepositorySpec defines the parameters for scanning an image
3233
// repository, e.g., `fluxcd/flux`.

controllers/imagepolicy_controller.go

+21
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
ctrl "sigs.k8s.io/controller-runtime"
3131
"sigs.k8s.io/controller-runtime/pkg/client"
3232
"sigs.k8s.io/controller-runtime/pkg/controller"
33+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3334
"sigs.k8s.io/controller-runtime/pkg/handler"
3435
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3536
"sigs.k8s.io/controller-runtime/pkg/source"
@@ -89,6 +90,26 @@ func (r *ImagePolicyReconciler) Reconcile(ctx context.Context, req ctrl.Request)
8990
}
9091
defer r.recordReadinessMetric(ctx, &pol)
9192

93+
// Add our finalizer if it does not exist.
94+
if !controllerutil.ContainsFinalizer(&pol, imagev1.ImagePolicyFinalizer) {
95+
patch := client.MergeFrom(pol.DeepCopy())
96+
controllerutil.AddFinalizer(&pol, imagev1.ImagePolicyFinalizer)
97+
if err := r.Patch(ctx, &pol, patch); err != nil {
98+
log.Error(err, "unable to register finalizer")
99+
return ctrl.Result{}, err
100+
}
101+
}
102+
103+
// If the object is under deletion, record the readiness, and remove our finalizer.
104+
if !pol.ObjectMeta.DeletionTimestamp.IsZero() {
105+
r.recordReadinessMetric(ctx, &pol)
106+
controllerutil.RemoveFinalizer(&pol, imagev1.ImagePolicyFinalizer)
107+
if err := r.Update(ctx, &pol); err != nil {
108+
return ctrl.Result{}, err
109+
}
110+
return ctrl.Result{}, nil
111+
}
112+
92113
var repo imagev1.ImageRepository
93114
repoNamespacedName := types.NamespacedName{
94115
Namespace: pol.Namespace,

controllers/imagerepository_controller.go

+21
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import (
4646
ctrl "sigs.k8s.io/controller-runtime"
4747
"sigs.k8s.io/controller-runtime/pkg/client"
4848
"sigs.k8s.io/controller-runtime/pkg/controller"
49+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
4950
"sigs.k8s.io/controller-runtime/pkg/predicate"
5051

5152
"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
@@ -128,6 +129,26 @@ func (r *ImageRepositoryReconciler) Reconcile(ctx context.Context, req ctrl.Requ
128129

129130
log := ctrl.LoggerFrom(ctx)
130131

132+
// Add our finalizer if it does not exist.
133+
if !controllerutil.ContainsFinalizer(&imageRepo, imagev1.ImageRepositoryFinalizer) {
134+
patch := client.MergeFrom(imageRepo.DeepCopy())
135+
controllerutil.AddFinalizer(&imageRepo, imagev1.ImageRepositoryFinalizer)
136+
if err := r.Patch(ctx, &imageRepo, patch); err != nil {
137+
log.Error(err, "unable to register finalizer")
138+
return ctrl.Result{}, err
139+
}
140+
}
141+
142+
// If the object is under deletion, record the readiness, and remove our finalizer.
143+
if !imageRepo.ObjectMeta.DeletionTimestamp.IsZero() {
144+
r.recordReadinessMetric(ctx, &imageRepo)
145+
controllerutil.RemoveFinalizer(&imageRepo, imagev1.ImageRepositoryFinalizer)
146+
if err := r.Update(ctx, &imageRepo); err != nil {
147+
return ctrl.Result{}, err
148+
}
149+
return ctrl.Result{}, nil
150+
}
151+
131152
if imageRepo.Spec.Suspend {
132153
msg := "ImageRepository is suspended, skipping reconciliation"
133154
imagev1.SetImageRepositoryReadiness(

0 commit comments

Comments
 (0)