Skip to content

Commit

Permalink
Add FilterFuncs for CustomRun
Browse files Browse the repository at this point in the history
We're going to need these for actual custom task controllers watching for `v1beta1.CustomRun`s, so let's add them now.

Signed-off-by: Andrew Bayer <andrew.bayer@gmail.com>
  • Loading branch information
abayer authored and tekton-robot committed Dec 1, 2022
1 parent 8c59d00 commit f83cd1f
Show file tree
Hide file tree
Showing 2 changed files with 521 additions and 0 deletions.
81 changes: 81 additions & 0 deletions pkg/controller/filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1"
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
listersalpha "github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1alpha1"
listersbeta "github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

Expand Down Expand Up @@ -105,3 +106,83 @@ func FilterOwnerRunRef(runLister listersalpha.RunLister, apiVersion, kind string
return result
}
}

// FilterCustomRunRef returns a filter that can be passed to a CustomRun Informer, which
// filters out CustomRuns for apiVersion and kinds that a controller doesn't care
// about.
//
// For example, a controller impl that wants to be notified of updates to CustomRuns
// which reference a Task with apiVersion "example.dev/v0" and kind "Example":
//
// customruninformer.Get(ctx).Informer().AddEventHandler(cache.FilteringResourceEventHandler{
// FilterFunc: FilterCustomRunRef("example.dev/v0", "Example"),
// Handler: controller.HandleAll(impl.Enqueue),
// })
func FilterCustomRunRef(apiVersion, kind string) func(interface{}) bool {
return func(obj interface{}) bool {
r, ok := obj.(*v1beta1.CustomRun)
if !ok {
// Somehow got informed of a non-CustomRun object.
// Ignore.
return false
}
if r == nil || (r.Spec.CustomRef == nil && r.Spec.CustomSpec == nil) {
// These are invalid, but just in case they get
// created somehow, don't panic.
return false
}
result := false
if r.Spec.CustomRef != nil {
result = r.Spec.CustomRef.APIVersion == apiVersion && r.Spec.CustomRef.Kind == v1beta1.TaskKind(kind)
} else if r.Spec.CustomSpec != nil {
result = r.Spec.CustomSpec.APIVersion == apiVersion && r.Spec.CustomSpec.Kind == kind
}
return result
}
}

// FilterOwnerCustomRunRef returns a filter that can be passed to an Informer for any runtime object, which
// filters out objects that aren't controlled by a CustomRun that references a particular apiVersion and kind.
//
// For example, a controller impl that wants to be notified of updates to TaskRuns that are controlled by
// a CustomRun which references a custom task with apiVersion "example.dev/v0" and kind "Example":
//
// taskruninformer.Get(ctx).Informer().AddEventHandler(cache.FilteringResourceEventHandler{
// FilterFunc: FilterOwnerCustomRunRef("example.dev/v0", "Example"),
// Handler: controller.HandleAll(impl.Enqueue),
// })
func FilterOwnerCustomRunRef(customRunLister listersbeta.CustomRunLister, apiVersion, kind string) func(interface{}) bool {
return func(obj interface{}) bool {
object, ok := obj.(metav1.Object)
if !ok {
return false
}
owner := metav1.GetControllerOf(object)
if owner == nil {
return false
}
if owner.APIVersion != v1beta1.SchemeGroupVersion.String() || owner.Kind != pipeline.CustomRunControllerName {
// Not owned by a CustomRun
return false
}
run, err := customRunLister.CustomRuns(object.GetNamespace()).Get(owner.Name)
if err != nil {
return false
}
if run.Spec.CustomRef == nil && run.Spec.CustomSpec == nil {
// These are invalid, but just in case they get created somehow, don't panic.
return false
}
if run.Spec.CustomRef != nil && run.Spec.CustomSpec != nil {
// These are invalid.
return false
}
result := false
if run.Spec.CustomRef != nil {
result = run.Spec.CustomRef.APIVersion == apiVersion && run.Spec.CustomRef.Kind == v1beta1.TaskKind(kind)
} else if run.Spec.CustomSpec != nil {
result = run.Spec.CustomSpec.APIVersion == apiVersion && run.Spec.CustomSpec.Kind == kind
}
return result
}
}
Loading

0 comments on commit f83cd1f

Please sign in to comment.