/
indexer.go
42 lines (37 loc) · 967 Bytes
/
indexer.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
package indexing
import (
"context"
"fmt"
"reflect"
"github.com/fgrehm/kot/pkg/kotclient"
ctrl "sigs.k8s.io/controller-runtime"
runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
)
type Indexer struct {
GVK kotclient.GVK
Field string
IndexFn func(resource runtimeclient.Object) []string
}
func MustIndexAll(ctx context.Context, mgr ctrl.Manager, indexers ...Indexer) {
err := IndexAll(ctx, mgr, indexers...)
if err != nil {
panic(err)
}
}
func IndexAll(ctx context.Context, mgr ctrl.Manager, indexers ...Indexer) error {
indexer := mgr.GetFieldIndexer()
for _, i := range indexers {
runtimeObj, err := mgr.GetScheme().New(i.GVK)
if err != nil {
return err
}
obj, ok := runtimeObj.(runtimeclient.Object)
if !ok {
return fmt.Errorf("unable to cast %s to runtimeclient.Object", reflect.TypeOf(runtimeObj))
}
if err := indexer.IndexField(ctx, obj, i.Field, i.IndexFn); err != nil {
return err
}
}
return nil
}