Commit 6dd8f732 authored by Brian Grant's avatar Brian Grant

Merge pull request #5919 from sdminonne/labels_req

Adding method to labels.Selector to add Requirement
parents c9ad322b 6ad5c073
...@@ -36,6 +36,9 @@ type Selector interface { ...@@ -36,6 +36,9 @@ type Selector interface {
// String returns a human readable string that represents this selector. // String returns a human readable string that represents this selector.
String() string String() string
// Add add a specific requirement for the selector
Add(key string, operator Operator, values []string) Selector
} }
// Everything returns a selector that matches all labels. // Everything returns a selector that matches all labels.
...@@ -189,6 +192,18 @@ func (r *Requirement) String() string { ...@@ -189,6 +192,18 @@ func (r *Requirement) String() string {
return buffer.String() return buffer.String()
} }
// Add adds a requirement to the selector. It copies the current selector returning a new one
func (lsel LabelSelector) Add(key string, operator Operator, values []string) Selector {
var reqs []Requirement
for _, item := range lsel {
reqs = append(reqs, item)
}
if r, err := NewRequirement(key, operator, util.NewStringSet(values...)); err == nil {
reqs = append(reqs, *r)
}
return LabelSelector(reqs)
}
// Matches for a LabelSelector returns true if all // Matches for a LabelSelector returns true if all
// its Requirements match the input Labels. If any // its Requirements match the input Labels. If any
// Requirement does not match, false is returned. // Requirement does not match, false is returned.
......
...@@ -465,3 +465,37 @@ func getRequirement(key string, op Operator, vals util.StringSet, t *testing.T) ...@@ -465,3 +465,37 @@ func getRequirement(key string, op Operator, vals util.StringSet, t *testing.T)
} }
return *req return *req
} }
func TestAdd(t *testing.T) {
testCases := []struct {
sel Selector
key string
operator Operator
values []string
refSelector Selector
}{
{
LabelSelector{},
"key",
InOperator,
[]string{"value"},
LabelSelector{Requirement{"key", InOperator, util.NewStringSet("value")}},
},
{
LabelSelector{Requirement{"key", InOperator, util.NewStringSet("value")}},
"key2",
EqualsOperator,
[]string{"value2"},
LabelSelector{
Requirement{"key", InOperator, util.NewStringSet("value")},
Requirement{"key2", EqualsOperator, util.NewStringSet("value2")},
},
},
}
for _, ts := range testCases {
ts.sel = ts.sel.Add(ts.key, ts.operator, ts.values)
if !reflect.DeepEqual(ts.sel, ts.refSelector) {
t.Errorf("Expected %t found %t", ts.refSelector, ts.sel)
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment