Skip to content

Commit 580574d

Browse files
authored
Merge pull request #12 from fluxcd/gc-predicate
Move artifact gc to delete event predicate
2 parents 657b592 + 1b391f4 commit 580574d

File tree

4 files changed

+44
-72
lines changed

4 files changed

+44
-72
lines changed

controllers/gitrepository_controller.go

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,6 @@ import (
3838
"k8s.io/apimachinery/pkg/types"
3939
ctrl "sigs.k8s.io/controller-runtime"
4040
"sigs.k8s.io/controller-runtime/pkg/client"
41-
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
42-
"sigs.k8s.io/controller-runtime/pkg/event"
43-
"sigs.k8s.io/controller-runtime/pkg/predicate"
4441

4542
sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1"
4643
)
@@ -101,26 +98,8 @@ func (r *GitRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, erro
10198
func (r *GitRepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error {
10299
return ctrl.NewControllerManagedBy(mgr).
103100
For(&sourcev1.GitRepository{}).
104-
WithEventFilter(RepositoryChangePredicate{}).
105-
WithEventFilter(predicate.Funcs{
106-
DeleteFunc: func(e event.DeleteEvent) bool {
107-
gvk, err := apiutil.GVKForObject(e.Object, r.Scheme)
108-
if err != nil {
109-
r.Log.Error(err, "unable to get GroupVersionKind for deleted object")
110-
return false
111-
}
112-
// delete artifacts
113-
artifact := r.Storage.ArtifactFor(gvk.Kind, e.Meta, "*", "")
114-
if err := r.Storage.RemoveAll(artifact); err != nil {
115-
r.Log.Error(err, "unable to delete artifacts",
116-
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
117-
} else {
118-
r.Log.Info("Git repository artifacts deleted",
119-
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
120-
}
121-
return true
122-
},
123-
}).
101+
WithEventFilter(SourceChangePredicate{}).
102+
WithEventFilter(GarbageCollectPredicate{Scheme: r.Scheme, Log: r.Log, Storage: r.Storage}).
124103
Complete(r)
125104
}
126105

controllers/helmchart_controller.go

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@ import (
3333
"k8s.io/apimachinery/pkg/types"
3434
ctrl "sigs.k8s.io/controller-runtime"
3535
"sigs.k8s.io/controller-runtime/pkg/client"
36-
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
37-
"sigs.k8s.io/controller-runtime/pkg/event"
38-
"sigs.k8s.io/controller-runtime/pkg/predicate"
3936
"sigs.k8s.io/yaml"
4037

4138
sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1"
@@ -77,6 +74,7 @@ func (r *HelmChartReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
7774
// try to remove old artifacts
7875
r.gc(chart)
7976

77+
// get referenced chart repository
8078
repository, err := r.chartRepository(ctx, chart)
8179
if err != nil {
8280
chart = sourcev1.HelmChartNotReady(*chart.DeepCopy(), sourcev1.ChartPullFailedReason, err.Error())
@@ -108,26 +106,8 @@ func (r *HelmChartReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
108106
func (r *HelmChartReconciler) SetupWithManager(mgr ctrl.Manager) error {
109107
return ctrl.NewControllerManagedBy(mgr).
110108
For(&sourcev1.HelmChart{}).
111-
WithEventFilter(RepositoryChangePredicate{}).
112-
WithEventFilter(predicate.Funcs{
113-
DeleteFunc: func(e event.DeleteEvent) bool {
114-
gvk, err := apiutil.GVKForObject(e.Object, r.Scheme)
115-
if err != nil {
116-
r.Log.Error(err, "unable to get GroupVersionKind for deleted object")
117-
return false
118-
}
119-
// delete artifacts
120-
artifact := r.Storage.ArtifactFor(gvk.Kind, e.Meta, "*", "")
121-
if err := r.Storage.RemoveAll(artifact); err != nil {
122-
r.Log.Error(err, "unable to delete artifacts",
123-
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
124-
} else {
125-
r.Log.Info("Helm chart artifacts deleted",
126-
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
127-
}
128-
return true
129-
},
130-
}).
109+
WithEventFilter(SourceChangePredicate{}).
110+
WithEventFilter(GarbageCollectPredicate{Scheme: r.Scheme, Log: r.Log, Storage: r.Storage}).
131111
Complete(r)
132112
}
133113

@@ -236,6 +216,7 @@ func (r *HelmChartReconciler) chartRepository(ctx context.Context, chart sourcev
236216
err := r.Client.Get(ctx, name, &repository)
237217
if err != nil {
238218
err = fmt.Errorf("failed to get HelmRepository '%s': %w", name, err)
219+
return repository, err
239220
}
240221

241222
if repository.Status.Artifact == nil {

controllers/helmrepository_controller.go

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@ import (
3232
"k8s.io/apimachinery/pkg/runtime"
3333
ctrl "sigs.k8s.io/controller-runtime"
3434
"sigs.k8s.io/controller-runtime/pkg/client"
35-
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
36-
"sigs.k8s.io/controller-runtime/pkg/event"
37-
"sigs.k8s.io/controller-runtime/pkg/predicate"
3835
"sigs.k8s.io/yaml"
3936

4037
sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1"
@@ -97,26 +94,8 @@ func (r *HelmRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, err
9794
func (r *HelmRepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error {
9895
return ctrl.NewControllerManagedBy(mgr).
9996
For(&sourcev1.HelmRepository{}).
100-
WithEventFilter(RepositoryChangePredicate{}).
101-
WithEventFilter(predicate.Funcs{
102-
DeleteFunc: func(e event.DeleteEvent) bool {
103-
gvk, err := apiutil.GVKForObject(e.Object, r.Scheme)
104-
if err != nil {
105-
r.Log.Error(err, "unable to get GroupVersionKind for deleted object")
106-
return false
107-
}
108-
// delete artifacts
109-
artifact := r.Storage.ArtifactFor(gvk.Kind, e.Meta, "*", "")
110-
if err := r.Storage.RemoveAll(artifact); err != nil {
111-
r.Log.Error(err, "unable to delete artifacts",
112-
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
113-
} else {
114-
r.Log.Info("Helm repository artifacts deleted",
115-
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
116-
}
117-
return true
118-
},
119-
}).
97+
WithEventFilter(SourceChangePredicate{}).
98+
WithEventFilter(GarbageCollectPredicate{Scheme: r.Scheme, Log: r.Log, Storage: r.Storage}).
12099
Complete(r)
121100
}
122101

controllers/predicate.go

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,22 @@ limitations under the License.
1717
package controllers
1818

1919
import (
20+
"fmt"
21+
22+
"github.com/go-logr/logr"
23+
"k8s.io/apimachinery/pkg/runtime"
24+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
2025
"sigs.k8s.io/controller-runtime/pkg/event"
2126
"sigs.k8s.io/controller-runtime/pkg/predicate"
2227
)
2328

24-
type RepositoryChangePredicate struct {
29+
type SourceChangePredicate struct {
2530
predicate.Funcs
2631
}
2732

28-
// Update implements default UpdateEvent filter for validating repository change
29-
func (RepositoryChangePredicate) Update(e event.UpdateEvent) bool {
33+
// Update implements the default UpdateEvent filter for validating
34+
// source changes.
35+
func (SourceChangePredicate) Update(e event.UpdateEvent) bool {
3036
if e.MetaOld == nil || e.MetaNew == nil {
3137
// ignore objects without metadata
3238
return false
@@ -53,3 +59,30 @@ func (RepositoryChangePredicate) Update(e event.UpdateEvent) bool {
5359
const (
5460
ForceSyncAnnotation string = "source.fluxcd.io/syncAt"
5561
)
62+
63+
type GarbageCollectPredicate struct {
64+
predicate.Funcs
65+
Scheme *runtime.Scheme
66+
Log logr.Logger
67+
Storage *Storage
68+
}
69+
70+
// Delete removes all artifacts from storage that belong to the
71+
// referenced object.
72+
func (gc GarbageCollectPredicate) Delete(e event.DeleteEvent) bool {
73+
gvk, err := apiutil.GVKForObject(e.Object, gc.Scheme)
74+
if err != nil {
75+
gc.Log.Error(err, "unable to get GroupVersionKind for deleted object")
76+
return false
77+
}
78+
// delete artifacts
79+
artifact := gc.Storage.ArtifactFor(gvk.Kind, e.Meta, "*", "")
80+
if err := gc.Storage.RemoveAll(artifact); err != nil {
81+
gc.Log.Error(err, "unable to delete artifacts",
82+
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
83+
} else {
84+
gc.Log.Info(gvk.Kind+" artifacts deleted",
85+
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
86+
}
87+
return true
88+
}

0 commit comments

Comments
 (0)