Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/operator/hierarchy/list.go
4094 views
1
package hierarchy
2
3
import (
4
"context"
5
"fmt"
6
7
"k8s.io/apimachinery/pkg/api/meta"
8
"k8s.io/apimachinery/pkg/runtime"
9
"sigs.k8s.io/controller-runtime/pkg/client"
10
)
11
12
// List will populate list with elements that match sel.
13
func List(ctx context.Context, cli client.Client, list client.ObjectList, sel Selector) error {
14
if err := cli.List(ctx, list, sel); err != nil {
15
return fmt.Errorf("list failed: %w", err)
16
}
17
if err := filterList(ctx, cli, list, sel); err != nil {
18
return fmt.Errorf("filter failed: %w", err)
19
}
20
return nil
21
}
22
23
// filterList updates the provided list to only elements which match sel.
24
func filterList(ctx context.Context, cli client.Client, list client.ObjectList, sel Selector) error {
25
allElements, err := meta.ExtractList(list)
26
if err != nil {
27
return fmt.Errorf("failed to get list: %w", err)
28
}
29
30
filtered := make([]runtime.Object, 0, len(allElements))
31
for _, element := range allElements {
32
obj, ok := element.(client.Object)
33
if !ok {
34
return fmt.Errorf("unexpected object of type %T in list", element)
35
}
36
37
matches, err := sel.Matches(ctx, cli, obj)
38
if err != nil {
39
return fmt.Errorf("failed to validate object: %w", err)
40
}
41
if matches {
42
filtered = append(filtered, obj)
43
}
44
}
45
46
if err := meta.SetList(list, filtered); err != nil {
47
return fmt.Errorf("failed to update list: %w", err)
48
}
49
return nil
50
}
51
52