@@ -10,7 +10,6 @@ import (
1010 "hash"
1111 "hash/fnv"
1212 "io"
13- "maps"
1413 "strconv"
1514 "sync"
1615 "time"
@@ -95,6 +94,18 @@ type chunk struct {
9594 data []byte
9695}
9796
97+ type releaseWrapper struct {
98+ release.Release
99+ Labels map [string ]string `json:"labels"`
100+ }
101+
102+ func wrapRelease (rls * release.Release ) * releaseWrapper {
103+ return & releaseWrapper {
104+ Release : * rls ,
105+ Labels : rls .Labels ,
106+ }
107+ }
108+
98109// encodeRelease encodes a release returning a base64 encoded
99110// gzipped string representation, or error.
100111func (c * chunkedSecrets ) encodeReleaseAsChunks (key string , rls * release.Release ) ([]chunk , error ) {
@@ -106,7 +117,7 @@ func (c *chunkedSecrets) encodeReleaseAsChunks(key string, rls *release.Release)
106117 return err
107118 }
108119 defer gzw .Close ()
109- return json .NewEncoder (gzw ).Encode (rls )
120+ return json .NewEncoder (gzw ).Encode (wrapRelease ( rls ) )
110121 }(); err != nil {
111122 return nil , err
112123 }
@@ -148,13 +159,12 @@ func (c *chunkedSecrets) indexSecretFromChunks(key string, rls *release.Release,
148159 panic (err )
149160 }
150161
151- indexLabels , indexAnnotations := newIndexLabelsAndAnnotations (c .owner , key , rls )
162+ indexLabels := newIndexLabels (c .owner , key , rls )
152163 indexSecret := & corev1.Secret {
153164 Type : SecretTypeChunkedIndex ,
154165 ObjectMeta : metav1.ObjectMeta {
155- Name : key ,
156- Labels : indexLabels ,
157- Annotations : indexAnnotations ,
166+ Name : key ,
167+ Labels : indexLabels ,
158168 },
159169 Immutable : ptr .To (false ),
160170 Data : map [string ][]byte {
@@ -320,29 +330,51 @@ func (c *chunkedSecrets) Query(queryLabels map[string]string) ([]*release.Releas
320330 c .Log ("query: labels=%v" , queryLabels )
321331 defer c .Log ("queried: labels=%v" , queryLabels )
322332
323- selector := newListIndicesLabelSelector (c .owner )
324- if queryRequirements , selectable := labels .Set (queryLabels ).AsSelector ().Requirements (); selectable {
325- selector = selector .Add (queryRequirements ... )
333+ // The only labels that get stored on the index secret are system labels, so we'll do a two-pass
334+ // query. First, we'll request index secrets from the API server that match the query labels that
335+ // are system labels. From there, we decode the releases that match, and then further filter those
336+ // based on the rest of the query labels that are not system labels.
337+ serverSelectorSet := labels.Set {}
338+ clientSelectorSet := labels.Set {}
339+ for k , v := range queryLabels {
340+ if isSystemLabel (k ) {
341+ serverSelectorSet [k ] = v
342+ } else {
343+ clientSelectorSet [k ] = v
344+ }
326345 }
327346
328- indexSecrets , err := c .client .List (context .Background (), metav1.ListOptions {LabelSelector : selector .String ()})
329- if err != nil {
330- return nil , fmt .Errorf ("query: %w" , err )
347+ // Pass 1: build the server selector and query for index secrets
348+ serverSelector := newListIndicesLabelSelector (c .owner )
349+ if queryRequirements , selectable := serverSelectorSet .AsSelector ().Requirements (); selectable {
350+ serverSelector = serverSelector .Add (queryRequirements ... )
331351 }
332352
333- if len (indexSecrets .Items ) == 0 {
334- return nil , driver .ErrReleaseNotFound
353+ indexSecrets , err := c .client .List (context .Background (), metav1.ListOptions {LabelSelector : serverSelector .String ()})
354+ if err != nil {
355+ return nil , fmt .Errorf ("query: %w" , err )
335356 }
336357
358+ // Pass 2: decode the releases that matched the server selector and filter based on the client selector
337359 results := make ([]* release.Release , 0 , len (indexSecrets .Items ))
360+ clientSelector := clientSelectorSet .AsSelector ()
338361 for _ , indexSecret := range indexSecrets .Items {
339362 indexSecret := indexSecret
340363 rls , err := c .decodeRelease (context .Background (), & indexSecret )
341364 if err != nil {
342365 return nil , fmt .Errorf ("query: failed to decode release: %w" , err )
343366 }
367+
368+ if ! clientSelector .Matches (labels .Set (rls .Labels )) {
369+ continue
370+ }
344371 results = append (results , rls )
345372 }
373+
374+ if len (results ) == 0 {
375+ return nil , driver .ErrReleaseNotFound
376+ }
377+
346378 return results , nil
347379}
348380
@@ -400,12 +432,13 @@ func (c *chunkedSecrets) decodeRelease(ctx context.Context, indexSecret *corev1.
400432 return nil , fmt .Errorf ("failed to create gzip reader: %w" , err )
401433 }
402434 releaseDecoder := json .NewDecoder (gzr )
403- var r release. Release
404- if err := releaseDecoder .Decode (& r ); err != nil {
435+ var wrappedRelease releaseWrapper
436+ if err := releaseDecoder .Decode (& wrappedRelease ); err != nil {
405437 return nil , fmt .Errorf ("failed to decode release: %w" , err )
406438 }
407- r .Labels = filterSystemLabels (indexSecret .Labels )
408- maps .Copy (r .Labels , indexSecret .Annotations )
439+
440+ r := wrappedRelease .Release
441+ r .Labels = filterSystemLabels (wrappedRelease .Labels )
409442 return & r , nil
410443}
411444
0 commit comments