forked from knative/pkg
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.go
81 lines (67 loc) · 2.18 KB
/
index.go
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
Copyright 2019 The Knative 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 requ ired 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.
*/
package psbinding
import "k8s.io/apimachinery/pkg/labels"
// exactKey is the type for keys that match exactly.
type exactKey struct {
Group string
Kind string
Namespace string
Name string
}
// exactMatcher is our reverse index from subjects to the Bindings that apply to
// them.
type exactMatcher map[exactKey]Bindable
// Add writes a key into the reverse index.
func (em exactMatcher) Add(key exactKey, b Bindable) {
em[key] = b
}
// Get fetches the key from the reverse index, if present.
func (em exactMatcher) Get(key exactKey) (bindable Bindable, present bool) {
b, ok := em[key]
return b, ok
}
// inexactKey is the type for keys that match inexactly (via selector)
type inexactKey struct {
Group string
Kind string
Namespace string
}
// pair holds selectors and bindables for a particular inexactKey.
type pair struct {
selector labels.Selector
sb Bindable
}
// inexactMatcher is our reverse index from subjects to the Bindings that apply to
// them.
type inexactMatcher map[inexactKey][]pair
// Add writes a key into the reverse index.
func (im inexactMatcher) Add(key inexactKey, selector labels.Selector, b Bindable) {
pl := im[key]
pl = append(pl, pair{
selector: selector,
sb: b,
})
im[key] = pl
}
// Get fetches the key from the reverse index, if present.
func (im inexactMatcher) Get(key inexactKey, ls labels.Set) (bindable Bindable, present bool) {
// Iterate over the list of pairs matched for this GK + namespace and return the first
// Bindable that matches our selector.
for _, p := range im[key] {
if p.selector.Matches(ls) {
return p.sb, true
}
}
return nil, false
}