Skip to content

Commit 17a6248

Browse files
authored
Merge pull request kubernetes#87939 from shaloulcy/pod_storage_indexer
add indexer for pod storage
2 parents fd0b34d + fe312ed commit 17a6248

File tree

5 files changed

+74
-0
lines changed

5 files changed

+74
-0
lines changed

pkg/registry/core/pod/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@ go_library(
3030
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
3131
"//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library",
3232
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
33+
"//staging/src/k8s.io/apiserver/pkg/features:go_default_library",
3334
"//staging/src/k8s.io/apiserver/pkg/registry/generic:go_default_library",
3435
"//staging/src/k8s.io/apiserver/pkg/storage:go_default_library",
3536
"//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library",
3637
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
38+
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
3739
],
3840
)
3941

@@ -54,6 +56,7 @@ go_test(
5456
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
5557
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",
5658
"//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
59+
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
5760
],
5861
)
5962

pkg/registry/core/pod/storage/storage.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ func NewStorage(optsGetter generic.RESTOptionsGetter, k client.ConnectionInfoGet
8787
RESTOptions: optsGetter,
8888
AttrFunc: registrypod.GetAttrs,
8989
TriggerFunc: map[string]storage.IndexerFunc{"spec.nodeName": registrypod.NodeNameTriggerFunc},
90+
Indexers: registrypod.Indexers(),
9091
}
9192
if err := store.CompleteWithOptions(options); err != nil {
9293
return PodStorage{}, err

pkg/registry/core/pod/strategy.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,12 @@ import (
3434
"k8s.io/apimachinery/pkg/types"
3535
utilnet "k8s.io/apimachinery/pkg/util/net"
3636
"k8s.io/apimachinery/pkg/util/validation/field"
37+
genericfeatures "k8s.io/apiserver/pkg/features"
3738
"k8s.io/apiserver/pkg/registry/generic"
3839
"k8s.io/apiserver/pkg/storage"
3940
"k8s.io/apiserver/pkg/storage/names"
4041
utilfeature "k8s.io/apiserver/pkg/util/feature"
42+
"k8s.io/client-go/tools/cache"
4143
"k8s.io/kubernetes/pkg/api/legacyscheme"
4244
podutil "k8s.io/kubernetes/pkg/api/pod"
4345
api "k8s.io/kubernetes/pkg/apis/core"
@@ -200,6 +202,25 @@ func NodeNameTriggerFunc(obj runtime.Object) string {
200202
return obj.(*api.Pod).Spec.NodeName
201203
}
202204

205+
// NodeNameIndexFunc return value spec.nodename of given object.
206+
func NodeNameIndexFunc(obj interface{}) ([]string, error) {
207+
pod, ok := obj.(*api.Pod)
208+
if !ok {
209+
return nil, fmt.Errorf("not a pod")
210+
}
211+
return []string{pod.Spec.NodeName}, nil
212+
}
213+
214+
// Indexers returns the indexers for pod storage.
215+
func Indexers() *cache.Indexers {
216+
if utilfeature.DefaultFeatureGate.Enabled(genericfeatures.SelectorIndex) {
217+
return &cache.Indexers{
218+
storage.FieldIndex("spec.nodeName"): NodeNameIndexFunc,
219+
}
220+
}
221+
return nil
222+
}
223+
203224
// ToSelectableFields returns a field set that represents the object
204225
// TODO: fields are not labels, and the validation rules for them do not apply.
205226
func ToSelectableFields(pod *api.Pod) fields.Set {

pkg/registry/core/pod/strategy_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package pod
1818

1919
import (
2020
"context"
21+
"fmt"
2122
"net/http"
2223
"net/url"
2324
"reflect"
@@ -31,6 +32,7 @@ import (
3132
"k8s.io/apimachinery/pkg/runtime"
3233
"k8s.io/apimachinery/pkg/types"
3334
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
35+
"k8s.io/client-go/tools/cache"
3436
apitesting "k8s.io/kubernetes/pkg/api/testing"
3537
api "k8s.io/kubernetes/pkg/apis/core"
3638
"k8s.io/kubernetes/pkg/kubelet/client"
@@ -629,3 +631,43 @@ var (
629631
fakeSecureRoundTripper = fakeTransport{val: "secure"}
630632
fakeInsecureRoundTripper = fakeTransport{val: "insecure"}
631633
)
634+
635+
func TestPodIndexFunc(t *testing.T) {
636+
tcs := []struct {
637+
name string
638+
indexFunc cache.IndexFunc
639+
pod interface{}
640+
expectedValue string
641+
expectedErr error
642+
}{
643+
{
644+
name: "node name index",
645+
indexFunc: NodeNameIndexFunc,
646+
pod: &api.Pod{
647+
Spec: api.PodSpec{
648+
NodeName: "test-pod",
649+
},
650+
},
651+
expectedValue: "test-pod",
652+
expectedErr: nil,
653+
},
654+
{
655+
name: "not a pod failed",
656+
indexFunc: NodeNameIndexFunc,
657+
pod: "not a pod object",
658+
expectedValue: "test-pod",
659+
expectedErr: fmt.Errorf("not a pod"),
660+
},
661+
}
662+
663+
for _, tc := range tcs {
664+
indexValues, err := tc.indexFunc(tc.pod)
665+
if !reflect.DeepEqual(err, tc.expectedErr) {
666+
t.Errorf("name %v, expected %v, got %v", tc.name, tc.expectedErr, err)
667+
}
668+
if err == nil && len(indexValues) != 1 && indexValues[0] != tc.expectedValue {
669+
t.Errorf("name %v, expected %v, got %v", tc.name, tc.expectedValue, indexValues)
670+
}
671+
672+
}
673+
}

staging/src/k8s.io/apiserver/pkg/features/kube_features.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,12 @@ const (
140140
//
141141
// Deprecates and removes SelfLink from ObjectMeta and ListMeta.
142142
RemoveSelfLink featuregate.Feature = "RemoveSelfLink"
143+
144+
// owner: @shaloulcy
145+
// alpha: v1.18
146+
//
147+
// Allows label and field based indexes in apiserver watch cache to accelerate list operations.
148+
SelectorIndex featuregate.Feature = "SelectorIndex"
143149
)
144150

145151
func init() {
@@ -165,4 +171,5 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
165171
WatchBookmark: {Default: true, PreRelease: featuregate.GA, LockToDefault: true},
166172
APIPriorityAndFairness: {Default: false, PreRelease: featuregate.Alpha},
167173
RemoveSelfLink: {Default: false, PreRelease: featuregate.Alpha},
174+
SelectorIndex: {Default: false, PreRelease: featuregate.Alpha},
168175
}

0 commit comments

Comments
 (0)