mirror of https://github.com/k3s-io/k3s
change all PredicateFunc to use SelectionPredicate
parent
e39d7f71e6
commit
d4afb781c3
|
@ -17,6 +17,8 @@ limitations under the License.
|
|||
package rest
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/test_apis/testgroup.k8s.io"
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/fields"
|
||||
|
@ -60,7 +62,17 @@ func NewREST(config *storagebackend.Config, storageDecorator generic.StorageDeco
|
|||
},
|
||||
// Used to match objects based on labels/fields for list.
|
||||
PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(nil)
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
testType, ok := obj.(*testgroup.TestType)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("unexpected type of given object")
|
||||
}
|
||||
return labels.Set(testType.ObjectMeta.Labels), fields.Set{}, nil
|
||||
},
|
||||
}
|
||||
},
|
||||
Storage: storageInterface,
|
||||
}
|
||||
|
|
|
@ -157,7 +157,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Federation.GroupVersion().String(),
|
||||
"Cluster",
|
||||
labels.Set(ClusterToSelectableFields(&federation.Cluster{})),
|
||||
ClusterToSelectableFields(&federation.Cluster{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -20,14 +20,14 @@ import (
|
|||
"testing"
|
||||
|
||||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
"k8s.io/kubernetes/pkg/fields"
|
||||
)
|
||||
|
||||
// TestSelectableFieldLabelConversions verifies that given resource have field
|
||||
// label conversion defined for each its selectable field.
|
||||
// fields contains selectable fields of the resource.
|
||||
// labelMap maps deprecated labels to their canonical names.
|
||||
func TestSelectableFieldLabelConversionsOfKind(t *testing.T, apiVersion string, kind string, fields labels.Set, labelMap map[string]string) {
|
||||
func TestSelectableFieldLabelConversionsOfKind(t *testing.T, apiVersion string, kind string, fields fields.Set, labelMap map[string]string) {
|
||||
badFieldLabels := []string{
|
||||
"name",
|
||||
".name",
|
||||
|
|
|
@ -169,17 +169,20 @@ func (csrApprovalStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Obje
|
|||
|
||||
// Matcher returns a generic matcher for a given label and field selector.
|
||||
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
sa, ok := obj.(*certificates.CertificateSigningRequest)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a CertificateSigningRequest")
|
||||
}
|
||||
fields := SelectableFields(sa)
|
||||
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
sa, ok := obj.(*certificates.CertificateSigningRequest)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a CertificateSigningRequest")
|
||||
}
|
||||
return labels.Set(sa.Labels), SelectableFields(sa), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// SelectableFields returns a label set that can be used for filter selection
|
||||
func SelectableFields(obj *certificates.CertificateSigningRequest) labels.Set {
|
||||
return labels.Set{}
|
||||
// SelectableFields returns a field set that can be used for filter selection
|
||||
func SelectableFields(obj *certificates.CertificateSigningRequest) fields.Set {
|
||||
return fields.Set{}
|
||||
}
|
||||
|
|
|
@ -103,17 +103,20 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error
|
|||
|
||||
// Matcher returns a generic matcher for a given label and field selector.
|
||||
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
sa, ok := obj.(*rbac.ClusterRole)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a ClusterRole")
|
||||
}
|
||||
fields := SelectableFields(sa)
|
||||
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
role, ok := obj.(*rbac.ClusterRole)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a ClusterRole")
|
||||
}
|
||||
return labels.Set(role.Labels), SelectableFields(role), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// SelectableFields returns a label set that can be used for filter selection
|
||||
func SelectableFields(obj *rbac.ClusterRole) labels.Set {
|
||||
return labels.Set{}
|
||||
// SelectableFields returns a field set that can be used for filter selection
|
||||
func SelectableFields(obj *rbac.ClusterRole) fields.Set {
|
||||
return fields.Set{}
|
||||
}
|
||||
|
|
|
@ -103,17 +103,20 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error
|
|||
|
||||
// Matcher returns a generic matcher for a given label and field selector.
|
||||
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
sa, ok := obj.(*rbac.ClusterRoleBinding)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a ClusterRoleBinding")
|
||||
}
|
||||
fields := SelectableFields(sa)
|
||||
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
roleBinding, ok := obj.(*rbac.ClusterRoleBinding)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a ClusterRoleBinding")
|
||||
}
|
||||
return labels.Set(roleBinding.Labels), SelectableFields(roleBinding), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// SelectableFields returns a label set that can be used for filter selection
|
||||
func SelectableFields(obj *rbac.ClusterRoleBinding) labels.Set {
|
||||
return labels.Set{}
|
||||
// SelectableFields returns a field set that can be used for filter selection
|
||||
func SelectableFields(obj *rbac.ClusterRoleBinding) fields.Set {
|
||||
return fields.Set{}
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
)
|
||||
|
||||
func TestConfigMapStrategy(t *testing.T) {
|
||||
|
@ -74,7 +73,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Default.GroupVersion().String(),
|
||||
"ConfigMap",
|
||||
labels.Set(ConfigMapToSelectableFields(&api.ConfigMap{})),
|
||||
ConfigMapToSelectableFields(&api.ConfigMap{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
)
|
||||
|
||||
func TestControllerStrategy(t *testing.T) {
|
||||
|
@ -146,7 +145,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Default.GroupVersion().String(),
|
||||
"ReplicationController",
|
||||
labels.Set(ControllerToSelectableFields(&api.ReplicationController{})),
|
||||
ControllerToSelectableFields(&api.ReplicationController{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -23,14 +23,13 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
)
|
||||
|
||||
func TestSelectableFieldLabelConversions(t *testing.T) {
|
||||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Extensions.GroupVersion().String(),
|
||||
"DaemonSet",
|
||||
labels.Set(DaemonSetToSelectableFields(&extensions.DaemonSet{})),
|
||||
DaemonSetToSelectableFields(&extensions.DaemonSet{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
"k8s.io/kubernetes/pkg/runtime"
|
||||
)
|
||||
|
||||
|
@ -32,7 +31,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Extensions.GroupVersion().String(),
|
||||
"Deployment",
|
||||
labels.Set(DeploymentToSelectableFields(&extensions.Deployment{})),
|
||||
DeploymentToSelectableFields(&extensions.Deployment{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
)
|
||||
|
||||
func TestSelectableFieldLabelConversions(t *testing.T) {
|
||||
|
@ -33,7 +32,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Default.GroupVersion().String(),
|
||||
"Endpoints",
|
||||
labels.Set(fieldsSet),
|
||||
fieldsSet,
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -94,7 +94,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Default.GroupVersion().String(),
|
||||
"Event",
|
||||
labels.Set(fset),
|
||||
fset,
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -115,50 +115,7 @@ type Matcher interface {
|
|||
MatcherIndex() []storage.MatchValue
|
||||
}
|
||||
|
||||
// MatcherFunc makes a matcher from the provided function. For easy definition
|
||||
// of matchers for testing. Note: use SelectionPredicate above for real code!
|
||||
func MatcherFunc(f func(obj runtime.Object) (bool, error)) Matcher {
|
||||
return matcherFunc(f)
|
||||
}
|
||||
|
||||
type matcherFunc func(obj runtime.Object) (bool, error)
|
||||
|
||||
// Matches calls the embedded function.
|
||||
func (m matcherFunc) Matches(obj runtime.Object) (bool, error) {
|
||||
return m(obj)
|
||||
}
|
||||
|
||||
// MatchesSingle always returns "", false-- because this is a predicate
|
||||
// implementation of Matcher.
|
||||
func (m matcherFunc) MatchesSingle() (string, bool) {
|
||||
return "", false
|
||||
}
|
||||
|
||||
// MatcherIndex always returns empty list.
|
||||
func (m matcherFunc) MatcherIndex() []storage.MatchValue {
|
||||
return nil
|
||||
}
|
||||
|
||||
// MatchOnKey returns a matcher that will send only the object matching key
|
||||
// through the matching function f. For testing!
|
||||
// Note: use SelectionPredicate above for real code!
|
||||
func MatchOnKey(key string, f func(obj runtime.Object) (bool, error)) Matcher {
|
||||
return matchKey{key, f}
|
||||
}
|
||||
|
||||
type matchKey struct {
|
||||
key string
|
||||
matcherFunc
|
||||
}
|
||||
|
||||
// MatchesSingle always returns its key, true.
|
||||
func (m matchKey) MatchesSingle() (string, bool) {
|
||||
return m.key, true
|
||||
}
|
||||
|
||||
var (
|
||||
// Assert implementations match the interface.
|
||||
_ = Matcher(matchKey{})
|
||||
_ = Matcher(&SelectionPredicate{})
|
||||
_ = Matcher(matcherFunc(nil))
|
||||
)
|
||||
|
|
|
@ -117,14 +117,3 @@ func TestSelectionPredicate(t *testing.T) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSingleMatch(t *testing.T) {
|
||||
m := MatchOnKey("pod-name-here", func(obj runtime.Object) (bool, error) { return true, nil })
|
||||
got, ok := m.MatchesSingle()
|
||||
if !ok {
|
||||
t.Errorf("Expected MatchesSingle to return true")
|
||||
}
|
||||
if e, a := "pod-name-here", got; e != a {
|
||||
t.Errorf("Expected %#v, got %#v", e, a)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,14 +23,13 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/apis/autoscaling"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
)
|
||||
|
||||
func TestSelectableFieldLabelConversions(t *testing.T) {
|
||||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Autoscaling.GroupVersion().String(),
|
||||
"Autoscaler",
|
||||
labels.Set(AutoscalerToSelectableFields(&autoscaling.HorizontalPodAutoscaler{})),
|
||||
AutoscalerToSelectableFields(&autoscaling.HorizontalPodAutoscaler{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -23,7 +23,6 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
"k8s.io/kubernetes/pkg/util/intstr"
|
||||
)
|
||||
|
||||
|
@ -136,7 +135,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Extensions.GroupVersion().String(),
|
||||
"Ingress",
|
||||
labels.Set(IngressToSelectableFields(&extensions.Ingress{})),
|
||||
IngressToSelectableFields(&extensions.Ingress{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -25,7 +25,6 @@ import (
|
|||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||
"k8s.io/kubernetes/pkg/apis/batch"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
"k8s.io/kubernetes/pkg/types"
|
||||
)
|
||||
|
||||
|
@ -226,7 +225,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Extensions.GroupVersion().String(),
|
||||
"Job",
|
||||
labels.Set(JobToSelectableFields(&batch.Job{})),
|
||||
JobToSelectableFields(&batch.Job{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -22,14 +22,13 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
)
|
||||
|
||||
func TestSelectableFieldLabelConversions(t *testing.T) {
|
||||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Default.GroupVersion().String(),
|
||||
"LimitRange",
|
||||
labels.Set(LimitRangeToSelectableFields(&api.LimitRange{})),
|
||||
LimitRangeToSelectableFields(&api.LimitRange{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -136,23 +136,26 @@ func (namespaceFinalizeStrategy) PrepareForUpdate(ctx api.Context, obj, old runt
|
|||
|
||||
// MatchNamespace returns a generic matcher for a given label and field selector.
|
||||
func MatchNamespace(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
namespaceObj, ok := obj.(*api.Namespace)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a namespace")
|
||||
}
|
||||
fields := NamespaceToSelectableFields(namespaceObj)
|
||||
return label.Matches(labels.Set(namespaceObj.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
namespaceObj, ok := obj.(*api.Namespace)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a namespace")
|
||||
}
|
||||
return labels.Set(namespaceObj.Labels), NamespaceToSelectableFields(namespaceObj), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NamespaceToSelectableFields returns a label set that represents the object
|
||||
func NamespaceToSelectableFields(namespace *api.Namespace) labels.Set {
|
||||
// NamespaceToSelectableFields returns a field set that represents the object
|
||||
func NamespaceToSelectableFields(namespace *api.Namespace) fields.Set {
|
||||
objectMetaFieldsSet := generic.ObjectMetaFieldsSet(namespace.ObjectMeta, false)
|
||||
specificFieldsSet := fields.Set{
|
||||
"status.phase": string(namespace.Status.Phase),
|
||||
// This is a bug, but we need to support it for backward compatibility.
|
||||
"name": namespace.Name,
|
||||
}
|
||||
return labels.Set(generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet))
|
||||
return generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet)
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Default.GroupVersion().String(),
|
||||
"Node",
|
||||
labels.Set(NodeToSelectableFields(&api.Node{})),
|
||||
NodeToSelectableFields(&api.Node{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -96,22 +96,25 @@ func (persistentvolumeStatusStrategy) ValidateUpdate(ctx api.Context, obj, old r
|
|||
|
||||
// MatchPersistentVolume returns a generic matcher for a given label and field selector.
|
||||
func MatchPersistentVolumes(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
persistentvolumeObj, ok := obj.(*api.PersistentVolume)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a persistentvolume")
|
||||
}
|
||||
fields := PersistentVolumeToSelectableFields(persistentvolumeObj)
|
||||
return label.Matches(labels.Set(persistentvolumeObj.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
persistentvolumeObj, ok := obj.(*api.PersistentVolume)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a persistentvolume")
|
||||
}
|
||||
return labels.Set(persistentvolumeObj.Labels), PersistentVolumeToSelectableFields(persistentvolumeObj), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// PersistentVolumeToSelectableFields returns a label set that represents the object
|
||||
func PersistentVolumeToSelectableFields(persistentvolume *api.PersistentVolume) labels.Set {
|
||||
// PersistentVolumeToSelectableFields returns a field set that represents the object
|
||||
func PersistentVolumeToSelectableFields(persistentvolume *api.PersistentVolume) fields.Set {
|
||||
objectMetaFieldsSet := generic.ObjectMetaFieldsSet(persistentvolume.ObjectMeta, false)
|
||||
specificFieldsSet := fields.Set{
|
||||
// This is a bug, but we need to support it for backward compatibility.
|
||||
"name": persistentvolume.Name,
|
||||
}
|
||||
return labels.Set(generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet))
|
||||
return generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet)
|
||||
}
|
||||
|
|
|
@ -96,22 +96,25 @@ func (persistentvolumeclaimStatusStrategy) ValidateUpdate(ctx api.Context, obj,
|
|||
|
||||
// MatchPersistentVolumeClaim returns a generic matcher for a given label and field selector.
|
||||
func MatchPersistentVolumeClaim(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
persistentvolumeclaimObj, ok := obj.(*api.PersistentVolumeClaim)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a persistentvolumeclaim")
|
||||
}
|
||||
fields := PersistentVolumeClaimToSelectableFields(persistentvolumeclaimObj)
|
||||
return label.Matches(labels.Set(persistentvolumeclaimObj.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
persistentvolumeclaimObj, ok := obj.(*api.PersistentVolumeClaim)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a persistentvolumeclaim")
|
||||
}
|
||||
return labels.Set(persistentvolumeclaimObj.Labels), PersistentVolumeClaimToSelectableFields(persistentvolumeclaimObj), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// PersistentVolumeClaimToSelectableFields returns a label set that represents the object
|
||||
func PersistentVolumeClaimToSelectableFields(persistentvolumeclaim *api.PersistentVolumeClaim) labels.Set {
|
||||
// PersistentVolumeClaimToSelectableFields returns a field set that represents the object
|
||||
func PersistentVolumeClaimToSelectableFields(persistentvolumeclaim *api.PersistentVolumeClaim) fields.Set {
|
||||
objectMetaFieldsSet := generic.ObjectMetaFieldsSet(persistentvolumeclaim.ObjectMeta, true)
|
||||
specificFieldsSet := fields.Set{
|
||||
// This is a bug, but we need to support it for backward compatibility.
|
||||
"name": persistentvolumeclaim.Name,
|
||||
}
|
||||
return labels.Set(generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet))
|
||||
return generic.MergeFieldsSets(objectMetaFieldsSet, specificFieldsSet)
|
||||
}
|
||||
|
|
|
@ -252,7 +252,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Default.GroupVersion().String(),
|
||||
"Pod",
|
||||
labels.Set(PodToSelectableFields(&api.Pod{})),
|
||||
PodToSelectableFields(&api.Pod{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -22,14 +22,13 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api"
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
)
|
||||
|
||||
func TestSelectableFieldLabelConversions(t *testing.T) {
|
||||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Default.GroupVersion().String(),
|
||||
"PodTemplate",
|
||||
labels.Set(PodTemplateToSelectableFields(&api.PodTemplate{})),
|
||||
PodTemplateToSelectableFields(&api.PodTemplate{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -99,17 +99,20 @@ func (resourcequotaStatusStrategy) ValidateUpdate(ctx api.Context, obj, old runt
|
|||
|
||||
// MatchResourceQuota returns a generic matcher for a given label and field selector.
|
||||
func MatchResourceQuota(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
resourcequotaObj, ok := obj.(*api.ResourceQuota)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a resourcequota")
|
||||
}
|
||||
fields := ResourceQuotaToSelectableFields(resourcequotaObj)
|
||||
return label.Matches(labels.Set(resourcequotaObj.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
resourcequotaObj, ok := obj.(*api.ResourceQuota)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a resourcequota")
|
||||
}
|
||||
return labels.Set(resourcequotaObj.Labels), ResourceQuotaToSelectableFields(resourcequotaObj), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// ResourceQuotaToSelectableFields returns a label set that represents the object
|
||||
func ResourceQuotaToSelectableFields(resourcequota *api.ResourceQuota) labels.Set {
|
||||
return labels.Set(generic.ObjectMetaFieldsSet(resourcequota.ObjectMeta, true))
|
||||
// ResourceQuotaToSelectableFields returns a field set that represents the object
|
||||
func ResourceQuotaToSelectableFields(resourcequota *api.ResourceQuota) fields.Set {
|
||||
return generic.ObjectMetaFieldsSet(resourcequota.ObjectMeta, true)
|
||||
}
|
||||
|
|
|
@ -103,17 +103,20 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error
|
|||
|
||||
// Matcher returns a generic matcher for a given label and field selector.
|
||||
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
sa, ok := obj.(*rbac.Role)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a Role")
|
||||
}
|
||||
fields := SelectableFields(sa)
|
||||
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
role, ok := obj.(*rbac.Role)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a Role")
|
||||
}
|
||||
return labels.Set(role.Labels), SelectableFields(role), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// SelectableFields returns a label set that can be used for filter selection
|
||||
func SelectableFields(obj *rbac.Role) labels.Set {
|
||||
return labels.Set{}
|
||||
// SelectableFields returns a field set that can be used for filter selection
|
||||
func SelectableFields(obj *rbac.Role) fields.Set {
|
||||
return fields.Set{}
|
||||
}
|
||||
|
|
|
@ -103,17 +103,20 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error
|
|||
|
||||
// Matcher returns a generic matcher for a given label and field selector.
|
||||
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
sa, ok := obj.(*rbac.RoleBinding)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a RoleBinding")
|
||||
}
|
||||
fields := SelectableFields(sa)
|
||||
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
roleBinding, ok := obj.(*rbac.RoleBinding)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a RoleBinding")
|
||||
}
|
||||
return labels.Set(roleBinding.Labels), SelectableFields(roleBinding), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// SelectableFields returns a label set that can be used for filter selection
|
||||
func SelectableFields(obj *rbac.RoleBinding) labels.Set {
|
||||
return labels.Set{}
|
||||
// SelectableFields returns a field set that can be used for filter selection
|
||||
func SelectableFields(obj *rbac.RoleBinding) fields.Set {
|
||||
return fields.Set{}
|
||||
}
|
||||
|
|
|
@ -23,7 +23,6 @@ import (
|
|||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/api/unversioned"
|
||||
"k8s.io/kubernetes/pkg/apis/batch"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
)
|
||||
|
||||
func newBool(a bool) *bool {
|
||||
|
@ -168,7 +167,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
"batch/v2alpha1",
|
||||
"ScheduledJob",
|
||||
labels.Set(ScheduledJobToSelectableFields(&batch.ScheduledJob{})),
|
||||
ScheduledJobToSelectableFields(&batch.ScheduledJob{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -95,21 +95,24 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error
|
|||
|
||||
// Matcher returns a generic matcher for a given label and field selector.
|
||||
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
sa, ok := obj.(*api.Secret)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a secret")
|
||||
}
|
||||
fields := SelectableFields(sa)
|
||||
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
secret, ok := obj.(*api.Secret)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a secret")
|
||||
}
|
||||
return labels.Set(secret.Labels), SelectableFields(secret), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// SelectableFields returns a label set that can be used for filter selection
|
||||
func SelectableFields(obj *api.Secret) labels.Set {
|
||||
// SelectableFields returns a field set that can be used for filter selection
|
||||
func SelectableFields(obj *api.Secret) fields.Set {
|
||||
objectMetaFieldsSet := generic.ObjectMetaFieldsSet(obj.ObjectMeta, true)
|
||||
secretSpecificFieldsSet := fields.Set{
|
||||
"type": string(obj.Type),
|
||||
}
|
||||
return labels.Set(generic.MergeFieldsSets(objectMetaFieldsSet, secretSpecificFieldsSet))
|
||||
return generic.MergeFieldsSets(objectMetaFieldsSet, secretSpecificFieldsSet)
|
||||
}
|
||||
|
|
|
@ -25,7 +25,6 @@ import (
|
|||
"k8s.io/kubernetes/pkg/api/rest"
|
||||
"k8s.io/kubernetes/pkg/api/testapi"
|
||||
apitesting "k8s.io/kubernetes/pkg/api/testing"
|
||||
"k8s.io/kubernetes/pkg/labels"
|
||||
"k8s.io/kubernetes/pkg/runtime"
|
||||
"k8s.io/kubernetes/pkg/util/intstr"
|
||||
)
|
||||
|
@ -216,7 +215,7 @@ func TestSelectableFieldLabelConversions(t *testing.T) {
|
|||
apitesting.TestSelectableFieldLabelConversionsOfKind(t,
|
||||
testapi.Default.GroupVersion().String(),
|
||||
"Service",
|
||||
labels.Set(ServiceToSelectableFields(&api.Service{})),
|
||||
ServiceToSelectableFields(&api.Service{}),
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -78,17 +78,20 @@ func (strategy) AllowUnconditionalUpdate() bool {
|
|||
|
||||
// Matcher returns a generic matcher for a given label and field selector.
|
||||
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
sa, ok := obj.(*api.ServiceAccount)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a serviceaccount")
|
||||
}
|
||||
fields := SelectableFields(sa)
|
||||
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
sa, ok := obj.(*api.ServiceAccount)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a serviceaccount")
|
||||
}
|
||||
return labels.Set(sa.Labels), SelectableFields(sa), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// SelectableFields returns a label set that represents the object
|
||||
func SelectableFields(obj *api.ServiceAccount) labels.Set {
|
||||
return labels.Set(generic.ObjectMetaFieldsSet(obj.ObjectMeta, true))
|
||||
// SelectableFields returns a field set that represents the object
|
||||
func SelectableFields(obj *api.ServiceAccount) fields.Set {
|
||||
return generic.ObjectMetaFieldsSet(obj.ObjectMeta, true)
|
||||
}
|
||||
|
|
|
@ -79,17 +79,20 @@ func (strategy) AllowUnconditionalUpdate() bool {
|
|||
|
||||
// Matcher returns a generic matcher for a given label and field selector.
|
||||
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
sa, ok := obj.(*extensions.ThirdPartyResource)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a ThirdPartyResource")
|
||||
}
|
||||
fields := SelectableFields(sa)
|
||||
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
tpr, ok := obj.(*extensions.ThirdPartyResource)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a ThirdPartyResource")
|
||||
}
|
||||
return labels.Set(tpr.Labels), SelectableFields(tpr), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// SelectableFields returns a label set that can be used for filter selection
|
||||
func SelectableFields(obj *extensions.ThirdPartyResource) labels.Set {
|
||||
return labels.Set{}
|
||||
// SelectableFields returns a field set that can be used for filter selection
|
||||
func SelectableFields(obj *extensions.ThirdPartyResource) fields.Set {
|
||||
return fields.Set{}
|
||||
}
|
||||
|
|
|
@ -76,17 +76,20 @@ func (strategy) AllowUnconditionalUpdate() bool {
|
|||
|
||||
// Matcher returns a generic matcher for a given label and field selector.
|
||||
func Matcher(label labels.Selector, field fields.Selector) generic.Matcher {
|
||||
return generic.MatcherFunc(func(obj runtime.Object) (bool, error) {
|
||||
sa, ok := obj.(*extensions.ThirdPartyResourceData)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("not a ThirdPartyResourceData")
|
||||
}
|
||||
fields := SelectableFields(sa)
|
||||
return label.Matches(labels.Set(sa.Labels)) && field.Matches(fields), nil
|
||||
})
|
||||
return &generic.SelectionPredicate{
|
||||
Label: label,
|
||||
Field: field,
|
||||
GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) {
|
||||
tprd, ok := obj.(*extensions.ThirdPartyResourceData)
|
||||
if !ok {
|
||||
return nil, nil, fmt.Errorf("not a ThirdPartyResourceData")
|
||||
}
|
||||
return labels.Set(tprd.Labels), SelectableFields(tprd), nil
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// SelectableFields returns a label set that can be used for filter selection
|
||||
func SelectableFields(obj *extensions.ThirdPartyResourceData) labels.Set {
|
||||
return labels.Set{}
|
||||
// SelectableFields returns a field set that can be used for filter selection
|
||||
func SelectableFields(obj *extensions.ThirdPartyResourceData) fields.Set {
|
||||
return fields.Set{}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue