Skip to content

Commit 5caf74c

Browse files
author
Kubernetes Submit Queue
authored
Merge pull request kubernetes#30529 from hongchaodeng/r1
Automatic merge from submit-queue change all PredicateFunc to use SelectionPredicate What? - This PR changes all PredicateFunc in registry to return SelectionPredicate instead of Matcher interface. Why? - We want to pass SelectionPredicate to storage layer. Matcher interface did not expose enough information for indexing.
2 parents 65233e4 + eb516fb commit 5caf74c

File tree

58 files changed

+301
-324
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+301
-324
lines changed

examples/apiserver/rest/reststorage.go

+14-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
package rest
1818

1919
import (
20+
"fmt"
21+
2022
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/test_apis/testgroup.k8s.io"
2123
"k8s.io/kubernetes/pkg/api"
2224
"k8s.io/kubernetes/pkg/fields"
@@ -59,8 +61,18 @@ func NewREST(config *storagebackend.Config, storageDecorator generic.StorageDeco
5961
return obj.(*testgroup.TestType).Name, nil
6062
},
6163
// Used to match objects based on labels/fields for list.
62-
PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher {
63-
return generic.MatcherFunc(nil)
64+
PredicateFunc: func(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
65+
return &generic.SelectionPredicate{
66+
Label: label,
67+
Field: field,
68+
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
69+
testType, ok := obj.(*testgroup.TestType)
70+
if !ok {
71+
return nil, nil, fmt.Errorf("unexpected type of given object")
72+
}
73+
return labels.Set(testType.ObjectMeta.Labels), fields.Set{}, nil
74+
},
75+
}
6476
},
6577
Storage: storageInterface,
6678
}

federation/registry/cluster/strategy.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func ClusterToSelectableFields(cluster *federation.Cluster) fields.Set {
4444
return generic.ObjectMetaFieldsSet(cluster.ObjectMeta, false)
4545
}
4646

47-
func MatchCluster(label labels.Selector, field fields.Selector) generic.Matcher {
47+
func MatchCluster(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
4848
return &generic.SelectionPredicate{
4949
Label: label,
5050
Field: field,

federation/registry/cluster/strategy_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
157157
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
158158
testapi.Federation.GroupVersion().String(),
159159
"Cluster",
160-
labels.Set(ClusterToSelectableFields(&federation.Cluster{})),
160+
ClusterToSelectableFields(&federation.Cluster{}),
161161
nil,
162162
)
163163
}

pkg/api/testing/conversion.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ import (
2020
"testing"
2121

2222
"k8s.io/kubernetes/pkg/api"
23-
"k8s.io/kubernetes/pkg/labels"
23+
"k8s.io/kubernetes/pkg/fields"
2424
)
2525

2626
// TestSelectableFieldLabelConversions verifies that given resource have field
2727
// label conversion defined for each its selectable field.
2828
// fields contains selectable fields of the resource.
2929
// labelMap maps deprecated labels to their canonical names.
30-
func TestSelectableFieldLabelConversionsOfKind(t *testing.T, apiVersion string, kind string, fields labels.Set, labelMap map[string]string) {
30+
func TestSelectableFieldLabelConversionsOfKind(t *testing.T, apiVersion string, kind string, fields fields.Set, labelMap map[string]string) {
3131
badFieldLabels := []string{
3232
"name",
3333
".name",

pkg/registry/certificates/etcd/etcd.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *ApprovalREST) {
6262
ObjectNameFunc: func(obj runtime.Object) (string, error) {
6363
return obj.(*certificates.CertificateSigningRequest).Name, nil
6464
},
65-
PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher {
65+
PredicateFunc: func(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
6666
return csrregistry.Matcher(label, field)
6767
},
6868
QualifiedResource: certificates.Resource("certificatesigningrequests"),

pkg/registry/certificates/strategy.go

+17-14
Original file line numberDiff line numberDiff line change
@@ -168,18 +168,21 @@ func (csrApprovalStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Obje
168168
}
169169

170170
// Matcher returns a generic matcher for a given label and field selector.
171-
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
172-
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
173-
sa, ok := obj.(*certificates.CertificateSigningRequest)
174-
if !ok {
175-
return false, fmt.Errorf("not a CertificateSigningRequest")
176-
}
177-
fields := SelectableFields(sa)
178-
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
179-
})
180-
}
181-
182-
// SelectableFields returns a label set that can be used for filter selection
183-
func SelectableFields(obj *certificates.CertificateSigningRequest) labels.Set {
184-
return labels.Set{}
171+
func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
172+
return &generic.SelectionPredicate{
173+
Label: label,
174+
Field: field,
175+
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
176+
sa, ok := obj.(*certificates.CertificateSigningRequest)
177+
if !ok {
178+
return nil, nil, fmt.Errorf("not a CertificateSigningRequest")
179+
}
180+
return labels.Set(sa.Labels), SelectableFields(sa), nil
181+
},
182+
}
183+
}
184+
185+
// SelectableFields returns a field set that can be used for filter selection
186+
func SelectableFields(obj *certificates.CertificateSigningRequest) fields.Set {
187+
return nil
185188
}

pkg/registry/clusterrole/strategy.go

+15-12
Original file line numberDiff line numberDiff line change
@@ -102,18 +102,21 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error
102102
}
103103

104104
// Matcher returns a generic matcher for a given label and field selector.
105-
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
106-
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
107-
sa, ok := obj.(*rbac.ClusterRole)
108-
if !ok {
109-
return false, fmt.Errorf("not a ClusterRole")
110-
}
111-
fields := SelectableFields(sa)
112-
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
113-
})
105+
func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
106+
return &generic.SelectionPredicate{
107+
Label: label,
108+
Field: field,
109+
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
110+
role, ok := obj.(*rbac.ClusterRole)
111+
if !ok {
112+
return nil, nil, fmt.Errorf("not a ClusterRole")
113+
}
114+
return labels.Set(role.Labels), SelectableFields(role), nil
115+
},
116+
}
114117
}
115118

116-
// SelectableFields returns a label set that can be used for filter selection
117-
func SelectableFields(obj *rbac.ClusterRole) labels.Set {
118-
return labels.Set{}
119+
// SelectableFields returns a field set that can be used for filter selection
120+
func SelectableFields(obj *rbac.ClusterRole) fields.Set {
121+
return nil
119122
}

pkg/registry/clusterrolebinding/strategy.go

+15-12
Original file line numberDiff line numberDiff line change
@@ -102,18 +102,21 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error
102102
}
103103

104104
// Matcher returns a generic matcher for a given label and field selector.
105-
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
106-
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
107-
sa, ok := obj.(*rbac.ClusterRoleBinding)
108-
if !ok {
109-
return false, fmt.Errorf("not a ClusterRoleBinding")
110-
}
111-
fields := SelectableFields(sa)
112-
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
113-
})
105+
func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
106+
return &generic.SelectionPredicate{
107+
Label: label,
108+
Field: field,
109+
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
110+
roleBinding, ok := obj.(*rbac.ClusterRoleBinding)
111+
if !ok {
112+
return nil, nil, fmt.Errorf("not a ClusterRoleBinding")
113+
}
114+
return labels.Set(roleBinding.Labels), SelectableFields(roleBinding), nil
115+
},
116+
}
114117
}
115118

116-
// SelectableFields returns a label set that can be used for filter selection
117-
func SelectableFields(obj *rbac.ClusterRoleBinding) labels.Set {
118-
return labels.Set{}
119+
// SelectableFields returns a field set that can be used for filter selection
120+
func SelectableFields(obj *rbac.ClusterRoleBinding) fields.Set {
121+
return nil
119122
}

pkg/registry/configmap/strategy.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func ConfigMapToSelectableFields(cfg *api.ConfigMap) fields.Set {
8888
}
8989

9090
// MatchConfigMap returns a generic matcher for a given label and field selector.
91-
func MatchConfigMap(label labels.Selector, field fields.Selector) generic.Matcher {
91+
func MatchConfigMap(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
9292
return &generic.SelectionPredicate{
9393
Label: label,
9494
Field: field,

pkg/registry/configmap/strategy_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"k8s.io/kubernetes/pkg/api"
2323
"k8s.io/kubernetes/pkg/api/testapi"
2424
apitesting "k8s.io/kubernetes/pkg/api/testing"
25-
"k8s.io/kubernetes/pkg/labels"
2625
)
2726

2827
func TestConfigMapStrategy(t *testing.T) {
@@ -74,7 +73,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
7473
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
7574
testapi.Default.GroupVersion().String(),
7675
"ConfigMap",
77-
labels.Set(ConfigMapToSelectableFields(&api.ConfigMap{})),
76+
ConfigMapToSelectableFields(&api.ConfigMap{}),
7877
nil,
7978
)
8079
}

pkg/registry/controller/strategy.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func ControllerToSelectableFields(controller *api.ReplicationController) fields.
113113
// MatchController is the filter used by the generic etcd backend to route
114114
// watch events from etcd to clients of the apiserver only interested in specific
115115
// labels/fields.
116-
func MatchController(label labels.Selector, field fields.Selector) generic.Matcher {
116+
func MatchController(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
117117
return &generic.SelectionPredicate{
118118
Label: label,
119119
Field: field,

pkg/registry/controller/strategy_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"k8s.io/kubernetes/pkg/api"
2323
"k8s.io/kubernetes/pkg/api/testapi"
2424
apitesting "k8s.io/kubernetes/pkg/api/testing"
25-
"k8s.io/kubernetes/pkg/labels"
2625
)
2726

2827
func TestControllerStrategy(t *testing.T) {
@@ -146,7 +145,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
146145
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
147146
testapi.Default.GroupVersion().String(),
148147
"ReplicationController",
149-
labels.Set(ControllerToSelectableFields(&api.ReplicationController{})),
148+
ControllerToSelectableFields(&api.ReplicationController{}),
150149
nil,
151150
)
152151
}

pkg/registry/daemonset/strategy.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func DaemonSetToSelectableFields(daemon *extensions.DaemonSet) fields.Set {
112112
// MatchSetDaemon is the filter used by the generic etcd backend to route
113113
// watch events from etcd to clients of the apiserver only interested in specific
114114
// labels/fields.
115-
func MatchDaemonSet(label labels.Selector, field fields.Selector) generic.Matcher {
115+
func MatchDaemonSet(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
116116
return &generic.SelectionPredicate{
117117
Label: label,
118118
Field: field,

pkg/registry/daemonset/strategy_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,13 @@ import (
2323
"k8s.io/kubernetes/pkg/api/testapi"
2424
apitesting "k8s.io/kubernetes/pkg/api/testing"
2525
"k8s.io/kubernetes/pkg/apis/extensions"
26-
"k8s.io/kubernetes/pkg/labels"
2726
)
2827

2928
func TestSelectableFieldLabelConversions(t *testing.T) {
3029
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
3130
testapi.Extensions.GroupVersion().String(),
3231
"DaemonSet",
33-
labels.Set(DaemonSetToSelectableFields(&extensions.DaemonSet{})),
32+
DaemonSetToSelectableFields(&extensions.DaemonSet{}),
3433
nil,
3534
)
3635
}

pkg/registry/deployment/strategy.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func DeploymentToSelectableFields(deployment *extensions.Deployment) fields.Set
118118
// MatchDeployment is the filter used by the generic etcd backend to route
119119
// watch events from etcd to clients of the apiserver only interested in specific
120120
// labels/fields.
121-
func MatchDeployment(label labels.Selector, field fields.Selector) generic.Matcher {
121+
func MatchDeployment(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
122122
return &generic.SelectionPredicate{
123123
Label: label,
124124
Field: field,

pkg/registry/deployment/strategy_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,14 @@ import (
2424
"k8s.io/kubernetes/pkg/api/testapi"
2525
apitesting "k8s.io/kubernetes/pkg/api/testing"
2626
"k8s.io/kubernetes/pkg/apis/extensions"
27-
"k8s.io/kubernetes/pkg/labels"
2827
"k8s.io/kubernetes/pkg/runtime"
2928
)
3029

3130
func TestSelectableFieldLabelConversions(t *testing.T) {
3231
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
3332
testapi.Extensions.GroupVersion().String(),
3433
"Deployment",
35-
labels.Set(DeploymentToSelectableFields(&extensions.Deployment{})),
34+
DeploymentToSelectableFields(&extensions.Deployment{}),
3635
nil,
3736
)
3837
}

pkg/registry/endpoint/strategy.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func (endpointsStrategy) AllowUnconditionalUpdate() bool {
7979
}
8080

8181
// MatchEndpoints returns a generic matcher for a given label and field selector.
82-
func MatchEndpoints(label labels.Selector, field fields.Selector) generic.Matcher {
82+
func MatchEndpoints(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
8383
return &generic.SelectionPredicate{Label: label, Field: field, GetAttrs: EndpointsAttributes}
8484
}
8585

pkg/registry/endpoint/strategy_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"k8s.io/kubernetes/pkg/api"
2323
"k8s.io/kubernetes/pkg/api/testapi"
2424
apitesting "k8s.io/kubernetes/pkg/api/testing"
25-
"k8s.io/kubernetes/pkg/labels"
2625
)
2726

2827
func TestSelectableFieldLabelConversions(t *testing.T) {
@@ -33,7 +32,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
3332
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
3433
testapi.Default.GroupVersion().String(),
3534
"Endpoints",
36-
labels.Set(fieldsSet),
35+
fieldsSet,
3736
nil,
3837
)
3938
}

pkg/registry/event/strategy.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func (eventStrategy) AllowUnconditionalUpdate() bool {
7070
return true
7171
}
7272

73-
func MatchEvent(label labels.Selector, field fields.Selector) generic.Matcher {
73+
func MatchEvent(label labels.Selector, field fields.Selector) *generic.SelectionPredicate {
7474
return &generic.SelectionPredicate{Label: label, Field: field, GetAttrs: getAttrs}
7575
}
7676

pkg/registry/event/strategy_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
9494
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
9595
testapi.Default.GroupVersion().String(),
9696
"Event",
97-
labels.Set(fset),
97+
fset,
9898
nil,
9999
)
100100
}

pkg/registry/generic/matcher.go

+5-44
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,11 @@ func (s *SelectionPredicate) Matches(obj runtime.Object) (bool, error) {
6868
if err != nil {
6969
return false, err
7070
}
71-
return s.Label.Matches(labels) && s.Field.Matches(fields), nil
71+
matched := s.Label.Matches(labels)
72+
if s.Field != nil {
73+
matched = (matched && s.Field.Matches(fields))
74+
}
75+
return matched, nil
7276
}
7377

7478
// MatchesSingle will return (name, true) if and only if s.Field matches on the object's
@@ -115,50 +119,7 @@ type Matcher interface {
115119
MatcherIndex() []storage.MatchValue
116120
}
117121

118-
// MatcherFunc makes a matcher from the provided function. For easy definition
119-
// of matchers for testing. Note: use SelectionPredicate above for real code!
120-
func MatcherFunc(f func(obj runtime.Object) (bool, error)) Matcher {
121-
return matcherFunc(f)
122-
}
123-
124-
type matcherFunc func(obj runtime.Object) (bool, error)
125-
126-
// Matches calls the embedded function.
127-
func (m matcherFunc) Matches(obj runtime.Object) (bool, error) {
128-
return m(obj)
129-
}
130-
131-
// MatchesSingle always returns "", false-- because this is a predicate
132-
// implementation of Matcher.
133-
func (m matcherFunc) MatchesSingle() (string, bool) {
134-
return "", false
135-
}
136-
137-
// MatcherIndex always returns empty list.
138-
func (m matcherFunc) MatcherIndex() []storage.MatchValue {
139-
return nil
140-
}
141-
142-
// MatchOnKey returns a matcher that will send only the object matching key
143-
// through the matching function f. For testing!
144-
// Note: use SelectionPredicate above for real code!
145-
func MatchOnKey(key string, f func(obj runtime.Object) (bool, error)) Matcher {
146-
return matchKey{key, f}
147-
}
148-
149-
type matchKey struct {
150-
key string
151-
matcherFunc
152-
}
153-
154-
// MatchesSingle always returns its key, true.
155-
func (m matchKey) MatchesSingle() (string, bool) {
156-
return m.key, true
157-
}
158-
159122
var (
160123
// Assert implementations match the interface.
161-
_ = Matcher(matchKey{})
162124
_ = Matcher(&SelectionPredicate{})
163-
_ = Matcher(matcherFunc(nil))
164125
)

0 commit comments

Comments
 (0)