Treat selector with multiple conditions an AND (#1478)

Fixes #1477
This commit is contained in:
Yusuke Kuoka 2020-09-15 09:56:05 +09:00 committed by GitHub
parent 5dd65e8d9a
commit 028bcc51dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 100 additions and 1 deletions

View File

@ -747,6 +747,8 @@ func runFilterSubHelmFilesTests(testcases []struct {
expectErr bool expectErr bool
errMsg string errMsg string
}, files map[string]string, t *testing.T, testName string) { }, files map[string]string, t *testing.T, testName string) {
t.Helper()
for _, testcase := range testcases { for _, testcase := range testcases {
actual := []string{} actual := []string{}

View File

@ -38,7 +38,7 @@ func (l LabelFilter) Match(r ReleaseSpec) bool {
k := element[0] k := element[0]
v := element[1] v := element[1]
if rVal, ok := r.Labels[k]; !ok { if rVal, ok := r.Labels[k]; !ok {
return true
} else if rVal == v { } else if rVal == v {
return false return false
} }

View File

@ -0,0 +1,97 @@
package state
import (
"github.com/google/go-cmp/cmp"
"gopkg.in/yaml.v2"
"testing"
)
func TestSelectReleasesWithOverrides(t *testing.T) {
type testcase struct {
subject string
selector []string
want []string
}
testcases := []testcase{
{
subject: "multiple OR selectors (nillable label first)",
selector: []string{"type=bar", "name=nolabel2", "name=nolabel1"},
want: []string{"nolabel1", "nolabel2", "foo"},
},
{
subject: "multiple OR selectors (non-nillable label first)",
selector: []string{"name=foo", "type!=bar"},
want: []string{"nolabel1", "nolabel2", "foo"},
},
{
subject: "multiple AND conditions (nillable label first)",
selector: []string{"type!=bar,name!=nolabel2"},
want: []string{"nolabel1"},
},
{
subject: "multiple AND conditions (non-nillable label first)",
selector: []string{"name!=nolabel2,type!=bar"},
want: []string{"nolabel1"},
},
{
subject: "inequality on nillable label",
selector: []string{"type!=bar"},
want: []string{"nolabel1", "nolabel2"},
},
{
subject: "equality on nillable label",
selector: []string{"type=bar"},
want: []string{"foo"},
},
{
subject: "inequality on non-nillable label",
selector: []string{"name!=nolabel1"},
want: []string{"nolabel2", "foo"},
},
{
subject: "equality on non-nillable label",
selector: []string{"name=nolabel1"},
want: []string{"nolabel1"},
},
}
example := []byte(`releases:
- name: nolabel1
namespace: kube-system
chart: stable/nolabel
- name: nolabel2
namespace: default
chart: stable/nolabel
- name: foo
namespace: kube-system
chart: stable/foo
labels:
type: bar
`)
var state HelmState
if err := yaml.Unmarshal(example, &state); err != nil {
t.Fatal(err)
}
for _, tc := range testcases {
state.Selectors = tc.selector
rs, err := state.GetSelectedReleasesWithOverrides()
if err != nil {
t.Fatalf("%s %s: %v", tc.selector, tc.subject, err)
}
var got []string
for _, r := range rs {
got = append(got, r.Name)
}
if d := cmp.Diff(tc.want, got); d != "" {
t.Errorf("%s %s: %s", tc.selector, tc.subject, d)
}
}
}