Adding a func to labels.Selector to add requirement

pull/6/head
Salvatore Dario Minonne 2015-03-25 16:17:22 +01:00
parent 35b2c5ce9d
commit 6ad5c07350
2 changed files with 49 additions and 0 deletions

View File

@ -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 {
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.

View File

@ -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)
}
}
}