func TestPodSelectorAsSelector(t *testing.T) { matchLabels := map[string]string{"foo": "bar"} matchExpressions := []PodSelectorRequirement{{ Key: "baz", Operator: PodSelectorOpIn, Values: []string{"qux", "norf"}, }} mustParse := func(s string) labels.Selector { out, e := labels.Parse(s) if e != nil { panic(e) } return out } tc := []struct { in *PodSelector out labels.Selector expectErr bool }{ {in: nil, out: labels.Nothing()}, {in: &PodSelector{}, out: labels.Everything()}, { in: &PodSelector{MatchLabels: matchLabels}, out: mustParse("foo in (bar)"), }, { in: &PodSelector{MatchExpressions: matchExpressions}, out: mustParse("baz in (norf,qux)"), }, { in: &PodSelector{MatchLabels: matchLabels, MatchExpressions: matchExpressions}, out: mustParse("foo in (bar),baz in (norf,qux)"), }, { in: &PodSelector{ MatchExpressions: []PodSelectorRequirement{{ Key: "baz", Operator: PodSelectorOpExists, Values: []string{"qux", "norf"}, }}, }, expectErr: true, }, } for i, tc := range tc { out, err := PodSelectorAsSelector(tc.in) if err == nil && tc.expectErr { t.Errorf("[%v]expected error but got none.", i) } if err != nil && !tc.expectErr { t.Errorf("[%v]did not expect error but got: %v", i, err) } if !reflect.DeepEqual(out, tc.out) { t.Errorf("[%v]expected:\n\t%+v\nbut got:\n\t%+v", i, tc.out, out) } } }
// PodSelectorAsSelector converts the PodSelector api type into a struct that implements // labels.Selector func PodSelectorAsSelector(ps *PodSelector) (labels.Selector, error) { if ps == nil { return labels.Nothing(), nil } if len(ps.MatchLabels)+len(ps.MatchExpressions) == 0 { return labels.Everything(), nil } selector := labels.LabelSelector{} for k, v := range ps.MatchLabels { req, err := labels.NewRequirement(k, labels.InOperator, sets.NewString(v)) if err != nil { return nil, err } selector = append(selector, *req) } for _, expr := range ps.MatchExpressions { var op labels.Operator switch expr.Operator { case PodSelectorOpIn: op = labels.InOperator case PodSelectorOpNotIn: op = labels.NotInOperator case PodSelectorOpExists: op = labels.ExistsOperator case PodSelectorOpDoesNotExist: op = labels.DoesNotExistOperator default: return nil, fmt.Errorf("%q is not a valid pod selector operator", expr.Operator) } req, err := labels.NewRequirement(expr.Key, op, sets.NewString(expr.Values...)) if err != nil { return nil, err } selector = append(selector, *req) } sort.Sort(labels.ByKey(selector)) return selector, nil }