-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlabelselector.go-00b6f1e1a1cf5d2f058f0e27cd8c0f78bf5b8812b7021ffc62d7afa2009a0536
67 lines (56 loc) · 1.74 KB
/
labelselector.go-00b6f1e1a1cf5d2f058f0e27cd8c0f78bf5b8812b7021ffc62d7afa2009a0536
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// PUBLISH-CODE
/*
Copyright 2016 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// This code is taken from github.com/kubernetes/apimachinery/pkg/apis/meta/v1/helpers.go
// and modified.
package selector
import (
"fmt"
meta "go.tectonic.network/lib/k8s/meta/v1"
)
func labelSelectorMatchesLabel(labelSelector *meta.LabelSelector, labels map[string]string) (bool, error) {
if labelSelector == nil {
return false, nil
}
if len(labelSelector.MatchLabels) == 0 && len(labelSelector.MatchExpressions) == 0 {
return true, nil
}
for k, v := range labelSelector.MatchLabels {
match, err := selectorMatchesLabels(k, in, []string{v}, labels)
if err != nil {
return false, err
}
if !match {
return false, nil
}
}
for _, expr := range labelSelector.MatchExpressions {
var op operator
switch expr.Operator {
case meta.LabelSelectorOpIn:
op = in
case meta.LabelSelectorOpNotIn:
op = notIn
case meta.LabelSelectorOpExists:
op = exists
case meta.LabelSelectorOpDoesNotExist:
op = doesNotExist
default:
return false, fmt.Errorf("%q is not a valid pod selector operator", expr.Operator)
}
if match, err := selectorMatchesLabels(expr.Key, op, expr.Values, labels); !match {
return false, err
}
}
return true, nil
}