Skip to content

Commit 6a60b61

Browse files
committed
render: fix selectors (#394)
Without this patch selectors don't work as expected. This patch fixes selectors such that each --selector flag value configures one selector containing multiple positive or negative label matchers. Result: Render build plans for cluster dev or cluster test. Note the use of two flags indicating logical OR. holos render platform --selector cluster=test --selector cluster=dev rendered external-secrets for cluster test in 299.897542ms rendered external-secrets for cluster dev in 299.9225ms rendered external-secrets-crds for cluster test in 667.6075ms rendered external-secrets-crds for cluster dev in 708.126541ms rendered platform in 708.795625ms Render build plans for prod clusters that are not customer facing. Note the use of one selector with comma separated labels. holos render platform --selector "tier=prod,scope!=customer"
1 parent 5862725 commit 6a60b61

File tree

5 files changed

+39
-19
lines changed

5 files changed

+39
-19
lines changed

internal/builder/platform.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
// platform.
1717
type PlatformOpts struct {
1818
Fn func(context.Context, int, holos.Component) error
19-
Selector holos.Selector
19+
Selectors holos.Selectors
2020
Concurrency int
2121
InfoEnabled bool
2222
}
@@ -31,7 +31,7 @@ type Platform struct {
3131
func (p *Platform) Build(ctx context.Context, opts PlatformOpts) error {
3232
limit := max(opts.Concurrency, 1)
3333
parentStart := time.Now()
34-
components := p.Select(opts.Selector)
34+
components := p.Select(opts.Selectors...)
3535
total := len(components)
3636

3737
g, ctx := errgroup.WithContext(ctx)

internal/cli/render/render.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ func newPlatform(cfg *holos.Config, feature holos.Flagger) *cobra.Command {
4545
cmd.Flags().StringVar(&platform, "platform", "./platform", "platform directory path")
4646
var extractYAMLs holos.StringSlice
4747
cmd.Flags().Var(&extractYAMLs, "extract-yaml", "data file paths to extract and unify with the platform config")
48-
var selector holos.Selector
49-
cmd.Flags().VarP(&selector, "selector", "l", "label selector (e.g. label==string,label!=string)")
48+
var selectors holos.Selectors
49+
cmd.Flags().VarP(&selectors, "selector", "l", "label selector (e.g. label==string,label!=string)")
5050
tagMap := make(holos.TagMap)
5151
cmd.Flags().VarP(&tagMap, "inject", "t", tagHelp)
5252

@@ -75,7 +75,7 @@ func newPlatform(cfg *holos.Config, feature holos.Flagger) *cobra.Command {
7575
}
7676
opts := builder.PlatformOpts{
7777
Fn: makeComponentRenderFunc(cmd.ErrOrStderr(), prefixArgs, tagMap.Tags()),
78-
Selector: selector,
78+
Selectors: selectors,
7979
Concurrency: concurrency,
8080
InfoEnabled: true,
8181
}

internal/cli/show.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ func newShowBuildPlanCmd() (cmd *cobra.Command) {
7070
cmd.Flags().Var(&extractYAMLs, "extract-yaml", "data file paths to extract and unify with the platform config")
7171
var format string
7272
cmd.Flags().StringVar(&format, "format", "yaml", "yaml or json format")
73-
var selector holos.Selector
74-
cmd.Flags().VarP(&selector, "selector", "l", "label selector (e.g. label==string,label!=string)")
73+
var selectors holos.Selectors
74+
cmd.Flags().VarP(&selectors, "selector", "l", "label selector (e.g. label==string,label!=string)")
7575
tagMap := make(holos.TagMap)
7676
cmd.Flags().VarP(&tagMap, "inject", "t", "set the value of a cue @tag field from a key=value pair")
7777
var concurrency int
@@ -102,7 +102,7 @@ func newShowBuildPlanCmd() (cmd *cobra.Command) {
102102

103103
platformOpts := builder.PlatformOpts{
104104
Fn: makeBuildFunc(encoder, buildPlanOpts),
105-
Selector: selector,
105+
Selectors: selectors,
106106
Concurrency: concurrency,
107107
}
108108

internal/holos/types.go

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,28 @@ func (e *EnvFlagger) Flag(name feature) bool {
107107

108108
type Labels map[string]string
109109

110+
type Selectors []Selector
111+
112+
// String implements the flag.Value interface.
113+
func (s *Selectors) String() string {
114+
return fmt.Sprint(*s)
115+
}
116+
117+
// Type implements the pflag.Value interface and describes the type.
118+
func (s *Selectors) Type() string {
119+
return "selectors"
120+
}
121+
122+
// Set implements the flag.Value interface.
123+
func (s *Selectors) Set(value string) error {
124+
selector := Selector{}
125+
if err := selector.Set(value); err != nil {
126+
return err
127+
}
128+
*s = append(*s, selector)
129+
return nil
130+
}
131+
110132
type Selector struct {
111133
Positive map[string]string
112134
Negative map[string]string
@@ -118,14 +140,9 @@ func (s *Selector) IsSelected(labels Labels) bool {
118140
return true // Nil selector selects everything
119141
}
120142

121-
if len(s.Positive) == 0 && len(s.Negative) == 0 {
122-
return true // Empty selector selects everything
123-
}
124-
125143
// Check positive matches
126144
for k, v := range s.Positive {
127-
val, ok := labels[k]
128-
if !ok || v != val {
145+
if val, ok := labels[k]; !ok || v != val {
129146
return false
130147
}
131148
}
@@ -251,15 +268,18 @@ func (y *yamlEncoder) Close() error {
251268
return errors.Wrap(y.enc.Close())
252269
}
253270

254-
// IsSelected returns true if all selectors select the given labels or no
271+
// IsSelected returns true if any one selector selects the given labels or no
255272
// selectors are given.
256273
func IsSelected(labels Labels, selectors ...Selector) bool {
274+
if len(selectors) == 0 {
275+
return true
276+
}
257277
for _, selector := range selectors {
258-
if !selector.IsSelected(labels) {
259-
return false
278+
if selector.IsSelected(labels) {
279+
return true
260280
}
261281
}
262-
return true
282+
return false
263283
}
264284

265285
type orderedEncoder struct {

version/embedded/patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3
1+
4

0 commit comments

Comments
 (0)