Move artifact gc to delete event predicate

This commit is contained in:
Hidde Beydals 2020-04-13 01:35:44 +02:00
parent 629da726c6
commit 1b391f4896
4 changed files with 37 additions and 67 deletions

View File

@ -38,9 +38,6 @@ import (
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate"
sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1" sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1"
) )
@ -102,25 +99,7 @@ func (r *GitRepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&sourcev1.GitRepository{}). For(&sourcev1.GitRepository{}).
WithEventFilter(SourceChangePredicate{}). WithEventFilter(SourceChangePredicate{}).
WithEventFilter(predicate.Funcs{ WithEventFilter(GarbageCollectPredicate{Scheme: r.Scheme, Log: r.Log, Storage: r.Storage}).
DeleteFunc: func(e event.DeleteEvent) bool {
gvk, err := apiutil.GVKForObject(e.Object, r.Scheme)
if err != nil {
r.Log.Error(err, "unable to get GroupVersionKind for deleted object")
return false
}
// delete artifacts
artifact := r.Storage.ArtifactFor(gvk.Kind, e.Meta, "*", "")
if err := r.Storage.RemoveAll(artifact); err != nil {
r.Log.Error(err, "unable to delete artifacts",
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
} else {
r.Log.Info("Git repository artifacts deleted",
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
}
return true
},
}).
Complete(r) Complete(r)
} }

View File

@ -33,9 +33,6 @@ import (
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate"
"sigs.k8s.io/yaml" "sigs.k8s.io/yaml"
sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1" sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1"
@ -110,25 +107,7 @@ func (r *HelmChartReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&sourcev1.HelmChart{}). For(&sourcev1.HelmChart{}).
WithEventFilter(SourceChangePredicate{}). WithEventFilter(SourceChangePredicate{}).
WithEventFilter(predicate.Funcs{ WithEventFilter(GarbageCollectPredicate{Scheme: r.Scheme, Log: r.Log, Storage: r.Storage}).
DeleteFunc: func(e event.DeleteEvent) bool {
gvk, err := apiutil.GVKForObject(e.Object, r.Scheme)
if err != nil {
r.Log.Error(err, "unable to get GroupVersionKind for deleted object")
return false
}
// delete artifacts
artifact := r.Storage.ArtifactFor(gvk.Kind, e.Meta, "*", "")
if err := r.Storage.RemoveAll(artifact); err != nil {
r.Log.Error(err, "unable to delete artifacts",
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
} else {
r.Log.Info("Helm chart artifacts deleted",
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
}
return true
},
}).
Complete(r) Complete(r)
} }

View File

@ -32,9 +32,6 @@ import (
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime" ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate"
"sigs.k8s.io/yaml" "sigs.k8s.io/yaml"
sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1" sourcev1 "github.com/fluxcd/source-controller/api/v1alpha1"
@ -98,25 +95,7 @@ func (r *HelmRepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&sourcev1.HelmRepository{}). For(&sourcev1.HelmRepository{}).
WithEventFilter(SourceChangePredicate{}). WithEventFilter(SourceChangePredicate{}).
WithEventFilter(predicate.Funcs{ WithEventFilter(GarbageCollectPredicate{Scheme: r.Scheme, Log: r.Log, Storage: r.Storage}).
DeleteFunc: func(e event.DeleteEvent) bool {
gvk, err := apiutil.GVKForObject(e.Object, r.Scheme)
if err != nil {
r.Log.Error(err, "unable to get GroupVersionKind for deleted object")
return false
}
// delete artifacts
artifact := r.Storage.ArtifactFor(gvk.Kind, e.Meta, "*", "")
if err := r.Storage.RemoveAll(artifact); err != nil {
r.Log.Error(err, "unable to delete artifacts",
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
} else {
r.Log.Info("Helm repository artifacts deleted",
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
}
return true
},
}).
Complete(r) Complete(r)
} }

View File

@ -17,6 +17,11 @@ limitations under the License.
package controllers package controllers
import ( import (
"fmt"
"github.com/go-logr/logr"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
"sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate" "sigs.k8s.io/controller-runtime/pkg/predicate"
) )
@ -25,7 +30,8 @@ type SourceChangePredicate struct {
predicate.Funcs predicate.Funcs
} }
// Update implements default UpdateEvent filter for validating repository change // Update implements the default UpdateEvent filter for validating
// source changes.
func (SourceChangePredicate) Update(e event.UpdateEvent) bool { func (SourceChangePredicate) Update(e event.UpdateEvent) bool {
if e.MetaOld == nil || e.MetaNew == nil { if e.MetaOld == nil || e.MetaNew == nil {
// ignore objects without metadata // ignore objects without metadata
@ -53,3 +59,30 @@ func (SourceChangePredicate) Update(e event.UpdateEvent) bool {
const ( const (
ForceSyncAnnotation string = "source.fluxcd.io/syncAt" ForceSyncAnnotation string = "source.fluxcd.io/syncAt"
) )
type GarbageCollectPredicate struct {
predicate.Funcs
Scheme *runtime.Scheme
Log logr.Logger
Storage *Storage
}
// Delete removes all artifacts from storage that belong to the
// referenced object.
func (gc GarbageCollectPredicate) Delete(e event.DeleteEvent) bool {
gvk, err := apiutil.GVKForObject(e.Object, gc.Scheme)
if err != nil {
gc.Log.Error(err, "unable to get GroupVersionKind for deleted object")
return false
}
// delete artifacts
artifact := gc.Storage.ArtifactFor(gvk.Kind, e.Meta, "*", "")
if err := gc.Storage.RemoveAll(artifact); err != nil {
gc.Log.Error(err, "unable to delete artifacts",
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
} else {
gc.Log.Info(gvk.Kind+" artifacts deleted",
gvk.Kind, fmt.Sprintf("%s/%s", e.Meta.GetNamespace(), e.Meta.GetName()))
}
return true
}