...
1
16
17 package resourceslice
18
19 import (
20 "context"
21 "fmt"
22
23 "k8s.io/apimachinery/pkg/fields"
24 "k8s.io/apimachinery/pkg/labels"
25 "k8s.io/apimachinery/pkg/runtime"
26 "k8s.io/apimachinery/pkg/util/validation/field"
27 "k8s.io/apiserver/pkg/registry/generic"
28 "k8s.io/apiserver/pkg/storage"
29 "k8s.io/apiserver/pkg/storage/names"
30 "k8s.io/client-go/tools/cache"
31 "k8s.io/kubernetes/pkg/api/legacyscheme"
32 "k8s.io/kubernetes/pkg/apis/resource"
33 "k8s.io/kubernetes/pkg/apis/resource/validation"
34 )
35
36
37 type resourceSliceStrategy struct {
38 runtime.ObjectTyper
39 names.NameGenerator
40 }
41
42 var Strategy = resourceSliceStrategy{legacyscheme.Scheme, names.SimpleNameGenerator}
43
44 func (resourceSliceStrategy) NamespaceScoped() bool {
45 return false
46 }
47
48 func (resourceSliceStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) {
49 }
50
51 func (resourceSliceStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList {
52 slice := obj.(*resource.ResourceSlice)
53 return validation.ValidateResourceSlice(slice)
54 }
55
56 func (resourceSliceStrategy) WarningsOnCreate(ctx context.Context, obj runtime.Object) []string {
57 return nil
58 }
59
60 func (resourceSliceStrategy) Canonicalize(obj runtime.Object) {
61 }
62
63 func (resourceSliceStrategy) AllowCreateOnUpdate() bool {
64 return false
65 }
66
67 func (resourceSliceStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) {
68 }
69
70 func (resourceSliceStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList {
71 return validation.ValidateResourceSliceUpdate(obj.(*resource.ResourceSlice), old.(*resource.ResourceSlice))
72 }
73
74 func (resourceSliceStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string {
75 return nil
76 }
77
78 func (resourceSliceStrategy) AllowUnconditionalUpdate() bool {
79 return true
80 }
81
82 var TriggerFunc = map[string]storage.IndexerFunc{
83
84
85 "nodeName": nodeNameTriggerFunc,
86 }
87
88 func nodeNameTriggerFunc(obj runtime.Object) string {
89 return obj.(*resource.ResourceSlice).NodeName
90 }
91
92
93 func Indexers() *cache.Indexers {
94 return &cache.Indexers{
95 storage.FieldIndex("nodeName"): nodeNameIndexFunc,
96 }
97 }
98
99 func nodeNameIndexFunc(obj interface{}) ([]string, error) {
100 slice, ok := obj.(*resource.ResourceSlice)
101 if !ok {
102 return nil, fmt.Errorf("not a ResourceSlice")
103 }
104 return []string{slice.NodeName}, nil
105 }
106
107
108 func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) {
109 slice, ok := obj.(*resource.ResourceSlice)
110 if !ok {
111 return nil, nil, fmt.Errorf("not a ResourceSlice")
112 }
113 return labels.Set(slice.ObjectMeta.Labels), toSelectableFields(slice), nil
114 }
115
116
117 func Match(label labels.Selector, field fields.Selector) storage.SelectionPredicate {
118 return storage.SelectionPredicate{
119 Label: label,
120 Field: field,
121 GetAttrs: GetAttrs,
122 IndexFields: []string{"nodeName"},
123 }
124 }
125
126
127
128 func toSelectableFields(slice *resource.ResourceSlice) fields.Set {
129
130
131
132
133 fields := make(fields.Set, 3)
134 fields["nodeName"] = slice.NodeName
135 fields["driverName"] = slice.DriverName
136
137
138 return generic.AddObjectMetaFieldsSet(fields, &slice.ObjectMeta, false)
139 }
140
View as plain text