Skip to content

Commit c378e42

Browse files
committed
Further improvements to filtering logic
1 parent 0dc6003 commit c378e42

File tree

1 file changed

+18
-21
lines changed

1 file changed

+18
-21
lines changed

internal/watch/watcher.go

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import (
66
"errors"
77
"fmt"
88
"log/slog"
9+
"slices"
910
"time"
1011

11-
"golang.org/x/exp/maps"
1212
"google.golang.org/genproto/googleapis/cloud/audit"
1313
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1414
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -80,26 +80,35 @@ func (w *Watcher) resolveFluxResourceTypes(ctx context.Context) ([]k8s.ResourceT
8080
return nil, fmt.Errorf("failed to fetch crds: %w", err)
8181
}
8282

83-
uniqueResourceTypes := make(map[string]k8s.ResourceType)
83+
types := make([]k8s.ResourceType, 0, len(crds.Items))
8484
for _, crd := range crds.Items {
8585
for _, version := range crd.Spec.Versions {
86+
// We're only interested in resources that can be suspended
8687
if _, exists := version.Schema.OpenAPIV3Schema.Properties["spec"].Properties["suspend"]; !exists {
8788
continue
8889
}
89-
key := fmt.Sprintf("%s:%s", crd.Spec.Group, crd.Spec.Names.Plural)
90-
uniqueResourceTypes[key] = k8s.ResourceType{
90+
types = append(types, k8s.ResourceType{
9191
Group: crd.Spec.Group,
9292
Version: version.Name,
9393
Kind: crd.Spec.Names.Plural,
94-
}
94+
})
9595
}
9696
}
97-
return maps.Values(uniqueResourceTypes), nil
97+
return types, nil
9898
}
9999

100100
func (w *Watcher) init(ctx context.Context, types []k8s.ResourceType) error {
101101
slog.Info("initializing")
102+
seen := make(map[string]struct{})
102103
for _, t := range types {
104+
// We only need to fetch against one version per group+kind
105+
key := fmt.Sprintf("%s:%s", t.Group, t.Kind)
106+
if _, ok := seen[key]; ok {
107+
continue
108+
}
109+
seen[key] = struct{}{}
110+
111+
// Fetch raw fluxcd resource for this specific type
103112
res, err := w.k8sClient.GetRawResources(ctx, t)
104113
if err != nil {
105114
return err
@@ -139,7 +148,7 @@ func (w *Watcher) watch(ctx context.Context, types []k8s.ResourceType) error {
139148
return err
140149
}
141150

142-
if !isWatchedResource(resourceRef, types) {
151+
if !slices.Contains(types, resourceRef.Type) {
143152
slog.Info("ignoring non-watched resource", slog.String("kind", resourceRef.Type.Kind))
144153
return nil
145154
}
@@ -179,15 +188,12 @@ func (w *Watcher) processResource(
179188
slog.String("resource", resourceRef.Name),
180189
slog.Bool("suspended", resource.Spec.Suspend),
181190
)
182-
if err = w.store.SaveEntry(datastore.Entry{
191+
return w.store.SaveEntry(datastore.Entry{
183192
Resource: resourceRef,
184193
Suspended: resource.Spec.Suspend,
185194
UpdatedBy: updatedBy,
186195
UpdatedAt: time.Now().UTC(),
187-
}); err != nil {
188-
return err
189-
}
190-
return nil
196+
})
191197
}
192198
return fmt.Errorf("failed to fetch entry: %w", err)
193199
}
@@ -220,12 +226,3 @@ func (w *Watcher) processResource(
220226
GoogleCloudProjectID: w.googleCloudProjectID,
221227
})
222228
}
223-
224-
func isWatchedResource(ref k8s.ResourceReference, types []k8s.ResourceType) bool {
225-
for _, t := range types {
226-
if t.Group == ref.Type.Group && t.Kind == ref.Type.Kind {
227-
return true
228-
}
229-
}
230-
return false
231-
}

0 commit comments

Comments
 (0)