@@ -94,6 +94,18 @@ type chunk struct {
94
94
data []byte
95
95
}
96
96
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
+
97
109
// encodeRelease encodes a release returning a base64 encoded
98
110
// gzipped string representation, or error.
99
111
func (c * chunkedSecrets ) encodeReleaseAsChunks (key string , rls * release.Release ) ([]chunk , error ) {
@@ -105,7 +117,7 @@ func (c *chunkedSecrets) encodeReleaseAsChunks(key string, rls *release.Release)
105
117
return err
106
118
}
107
119
defer gzw .Close ()
108
- return json .NewEncoder (gzw ).Encode (rls )
120
+ return json .NewEncoder (gzw ).Encode (wrapRelease ( rls ) )
109
121
}(); err != nil {
110
122
return nil , err
111
123
}
@@ -318,29 +330,51 @@ func (c *chunkedSecrets) Query(queryLabels map[string]string) ([]*release.Releas
318
330
c .Log ("query: labels=%v" , queryLabels )
319
331
defer c .Log ("queried: labels=%v" , queryLabels )
320
332
321
- selector := newListIndicesLabelSelector (c .owner )
322
- if queryRequirements , selectable := labels .Set (queryLabels ).AsSelector ().Requirements (); selectable {
323
- 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
+ }
324
345
}
325
346
326
- indexSecrets , err := c .client .List (context .Background (), metav1.ListOptions {LabelSelector : selector .String ()})
327
- if err != nil {
328
- 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 ... )
329
351
}
330
352
331
- if len (indexSecrets .Items ) == 0 {
332
- 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 )
333
356
}
334
357
358
+ // Pass 2: decode the releases that matched the server selector and filter based on the client selector
335
359
results := make ([]* release.Release , 0 , len (indexSecrets .Items ))
360
+ clientSelector := clientSelectorSet .AsSelector ()
336
361
for _ , indexSecret := range indexSecrets .Items {
337
362
indexSecret := indexSecret
338
363
rls , err := c .decodeRelease (context .Background (), & indexSecret )
339
364
if err != nil {
340
365
return nil , fmt .Errorf ("query: failed to decode release: %w" , err )
341
366
}
367
+
368
+ if ! clientSelector .Matches (labels .Set (rls .Labels )) {
369
+ continue
370
+ }
342
371
results = append (results , rls )
343
372
}
373
+
374
+ if len (results ) == 0 {
375
+ return nil , driver .ErrReleaseNotFound
376
+ }
377
+
344
378
return results , nil
345
379
}
346
380
@@ -398,11 +432,13 @@ func (c *chunkedSecrets) decodeRelease(ctx context.Context, indexSecret *corev1.
398
432
return nil , fmt .Errorf ("failed to create gzip reader: %w" , err )
399
433
}
400
434
releaseDecoder := json .NewDecoder (gzr )
401
- var r release. Release
402
- if err := releaseDecoder .Decode (& r ); err != nil {
435
+ var wrappedRelease releaseWrapper
436
+ if err := releaseDecoder .Decode (& wrappedRelease ); err != nil {
403
437
return nil , fmt .Errorf ("failed to decode release: %w" , err )
404
438
}
405
- r .Labels = filterSystemLabels (indexSecret .Labels )
439
+
440
+ r := wrappedRelease .Release
441
+ r .Labels = filterSystemLabels (wrappedRelease .Labels )
406
442
return & r , nil
407
443
}
408
444
0 commit comments