1
16
17 package storage
18
19 import (
20 "testing"
21
22 "github.com/google/go-cmp/cmp"
23 apiequality "k8s.io/apimachinery/pkg/api/equality"
24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25 "k8s.io/apimachinery/pkg/fields"
26 "k8s.io/apimachinery/pkg/labels"
27 "k8s.io/apimachinery/pkg/runtime"
28 genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
29 "k8s.io/apiserver/pkg/registry/generic"
30 genericregistrytest "k8s.io/apiserver/pkg/registry/generic/testing"
31 "k8s.io/apiserver/pkg/registry/rest"
32 etcd3testing "k8s.io/apiserver/pkg/storage/etcd3/testing"
33 "k8s.io/kubernetes/pkg/apis/resource"
34 _ "k8s.io/kubernetes/pkg/apis/resource/install"
35 "k8s.io/kubernetes/pkg/registry/registrytest"
36 )
37
38 func newStorage(t *testing.T) (*REST, *StatusREST, *etcd3testing.EtcdTestServer) {
39 etcdStorage, server := registrytest.NewEtcdStorage(t, resource.GroupName)
40 restOptions := generic.RESTOptions{
41 StorageConfig: etcdStorage,
42 Decorator: generic.UndecoratedStorage,
43 DeleteCollectionWorkers: 1,
44 ResourcePrefix: "podschedulingcontexts",
45 }
46 podSchedulingStorage, statusStorage, err := NewREST(restOptions)
47 if err != nil {
48 t.Fatalf("unexpected error from REST storage: %v", err)
49 }
50 return podSchedulingStorage, statusStorage, server
51 }
52
53 func validNewPodSchedulingContexts(name, ns string) *resource.PodSchedulingContext {
54 schedulingCtx := &resource.PodSchedulingContext{
55 ObjectMeta: metav1.ObjectMeta{
56 Name: name,
57 Namespace: ns,
58 },
59 Spec: resource.PodSchedulingContextSpec{
60 SelectedNode: "worker",
61 },
62 Status: resource.PodSchedulingContextStatus{},
63 }
64 return schedulingCtx
65 }
66
67 func TestCreate(t *testing.T) {
68 storage, _, server := newStorage(t)
69 defer server.Terminate(t)
70 defer storage.Store.DestroyFunc()
71 test := genericregistrytest.New(t, storage.Store)
72 schedulingCtx := validNewPodSchedulingContexts("foo", metav1.NamespaceDefault)
73 schedulingCtx.ObjectMeta = metav1.ObjectMeta{}
74 test.TestCreate(
75
76 schedulingCtx,
77
78 &resource.PodSchedulingContext{
79 ObjectMeta: metav1.ObjectMeta{Name: "*BadName!"},
80 },
81 )
82 }
83
84 func TestUpdate(t *testing.T) {
85 storage, _, server := newStorage(t)
86 defer server.Terminate(t)
87 defer storage.Store.DestroyFunc()
88 test := genericregistrytest.New(t, storage.Store)
89 test.TestUpdate(
90
91 validNewPodSchedulingContexts("foo", metav1.NamespaceDefault),
92
93 func(obj runtime.Object) runtime.Object {
94 object := obj.(*resource.PodSchedulingContext)
95 if object.Labels == nil {
96 object.Labels = map[string]string{}
97 }
98 object.Labels["foo"] = "bar"
99 return object
100 },
101 )
102 }
103
104 func TestDelete(t *testing.T) {
105 storage, _, server := newStorage(t)
106 defer server.Terminate(t)
107 defer storage.Store.DestroyFunc()
108 test := genericregistrytest.New(t, storage.Store).ReturnDeletedObject()
109 test.TestDelete(validNewPodSchedulingContexts("foo", metav1.NamespaceDefault))
110 }
111
112 func TestGet(t *testing.T) {
113 storage, _, server := newStorage(t)
114 defer server.Terminate(t)
115 defer storage.Store.DestroyFunc()
116 test := genericregistrytest.New(t, storage.Store)
117 test.TestGet(validNewPodSchedulingContexts("foo", metav1.NamespaceDefault))
118 }
119
120 func TestList(t *testing.T) {
121 storage, _, server := newStorage(t)
122 defer server.Terminate(t)
123 defer storage.Store.DestroyFunc()
124 test := genericregistrytest.New(t, storage.Store)
125 test.TestList(validNewPodSchedulingContexts("foo", metav1.NamespaceDefault))
126 }
127
128 func TestWatch(t *testing.T) {
129 storage, _, server := newStorage(t)
130 defer server.Terminate(t)
131 defer storage.Store.DestroyFunc()
132 test := genericregistrytest.New(t, storage.Store)
133 test.TestWatch(
134 validNewPodSchedulingContexts("foo", metav1.NamespaceDefault),
135
136 []labels.Set{},
137
138 []labels.Set{
139 {"foo": "bar"},
140 },
141
142 []fields.Set{
143 {"metadata.name": "foo"},
144 },
145
146 []fields.Set{
147 {"metadata.name": "bar"},
148 },
149 )
150 }
151
152 func TestUpdateStatus(t *testing.T) {
153 storage, statusStorage, server := newStorage(t)
154 defer server.Terminate(t)
155 defer storage.Store.DestroyFunc()
156 ctx := genericapirequest.NewDefaultContext()
157
158 key, _ := storage.KeyFunc(ctx, "foo")
159 schedulingStart := validNewPodSchedulingContexts("foo", metav1.NamespaceDefault)
160 err := storage.Storage.Create(ctx, key, schedulingStart, nil, 0, false)
161 if err != nil {
162 t.Fatalf("Unexpected error: %v", err)
163 }
164
165 schedulingCtx := schedulingStart.DeepCopy()
166 schedulingCtx.Status.ResourceClaims = append(schedulingCtx.Status.ResourceClaims,
167 resource.ResourceClaimSchedulingStatus{
168 Name: "my-claim",
169 },
170 )
171 _, _, err = statusStorage.Update(ctx, schedulingCtx.Name, rest.DefaultUpdatedObjectInfo(schedulingCtx), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc, false, &metav1.UpdateOptions{})
172 if err != nil {
173 t.Fatalf("Unexpected error: %v", err)
174 }
175 obj, err := storage.Get(ctx, "foo", &metav1.GetOptions{})
176 if err != nil {
177 t.Errorf("unexpected error: %v", err)
178 }
179 schedulingOut := obj.(*resource.PodSchedulingContext)
180
181 if !apiequality.Semantic.DeepEqual(schedulingCtx.Status, schedulingOut.Status) {
182 t.Errorf("unexpected object: %s", cmp.Diff(schedulingCtx.Status, schedulingOut.Status))
183 }
184 }
185
View as plain text