k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/pkg/registry/resource/resourceslice/storage/storage_test.go (about) 1 /* 2 Copyright 2022 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package storage 18 19 import ( 20 "testing" 21 22 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 23 "k8s.io/apimachinery/pkg/fields" 24 "k8s.io/apimachinery/pkg/labels" 25 "k8s.io/apimachinery/pkg/runtime" 26 "k8s.io/apiserver/pkg/registry/generic" 27 genericregistrytest "k8s.io/apiserver/pkg/registry/generic/testing" 28 etcd3testing "k8s.io/apiserver/pkg/storage/etcd3/testing" 29 "k8s.io/kubernetes/pkg/apis/resource" 30 _ "k8s.io/kubernetes/pkg/apis/resource/install" 31 "k8s.io/kubernetes/pkg/registry/registrytest" 32 ) 33 34 func newStorage(t *testing.T) (*REST, *etcd3testing.EtcdTestServer) { 35 etcdStorage, server := registrytest.NewEtcdStorage(t, resource.GroupName) 36 restOptions := generic.RESTOptions{ 37 StorageConfig: etcdStorage, 38 Decorator: generic.UndecoratedStorage, 39 DeleteCollectionWorkers: 1, 40 ResourcePrefix: "resourceslices", 41 } 42 resourceClassStorage, err := NewREST(restOptions) 43 if err != nil { 44 t.Fatalf("unexpected error from REST storage: %v", err) 45 } 46 return resourceClassStorage, server 47 } 48 49 func validNewResourceSlice(name string) *resource.ResourceSlice { 50 return &resource.ResourceSlice{ 51 ObjectMeta: metav1.ObjectMeta{ 52 Name: name, 53 }, 54 NodeName: name, 55 DriverName: "cdi.example.com", 56 ResourceModel: resource.ResourceModel{ 57 NamedResources: &resource.NamedResourcesResources{}, 58 }, 59 } 60 } 61 62 func TestCreate(t *testing.T) { 63 storage, server := newStorage(t) 64 defer server.Terminate(t) 65 defer storage.Store.DestroyFunc() 66 test := genericregistrytest.New(t, storage.Store).ClusterScope() 67 resourceClass := validNewResourceSlice("foo") 68 resourceClass.ObjectMeta = metav1.ObjectMeta{GenerateName: "foo"} 69 test.TestCreate( 70 // valid 71 resourceClass, 72 // invalid 73 &resource.ResourceSlice{ 74 ObjectMeta: metav1.ObjectMeta{Name: "*BadName!"}, 75 }, 76 ) 77 } 78 79 func TestUpdate(t *testing.T) { 80 storage, server := newStorage(t) 81 defer server.Terminate(t) 82 defer storage.Store.DestroyFunc() 83 test := genericregistrytest.New(t, storage.Store).ClusterScope() 84 test.TestUpdate( 85 // valid 86 validNewResourceSlice("foo"), 87 // updateFunc 88 func(obj runtime.Object) runtime.Object { 89 object := obj.(*resource.ResourceSlice) 90 object.Labels = map[string]string{"foo": "bar"} 91 return object 92 }, 93 // invalid update 94 func(obj runtime.Object) runtime.Object { 95 object := obj.(*resource.ResourceSlice) 96 object.DriverName = "" 97 return object 98 }, 99 ) 100 101 } 102 103 func TestDelete(t *testing.T) { 104 storage, server := newStorage(t) 105 defer server.Terminate(t) 106 defer storage.Store.DestroyFunc() 107 test := genericregistrytest.New(t, storage.Store).ClusterScope().ReturnDeletedObject() 108 test.TestDelete(validNewResourceSlice("foo")) 109 } 110 111 func TestGet(t *testing.T) { 112 storage, server := newStorage(t) 113 defer server.Terminate(t) 114 defer storage.Store.DestroyFunc() 115 test := genericregistrytest.New(t, storage.Store).ClusterScope() 116 test.TestGet(validNewResourceSlice("foo")) 117 } 118 119 func TestList(t *testing.T) { 120 storage, server := newStorage(t) 121 defer server.Terminate(t) 122 defer storage.Store.DestroyFunc() 123 test := genericregistrytest.New(t, storage.Store).ClusterScope() 124 test.TestList(validNewResourceSlice("foo")) 125 } 126 127 func TestWatch(t *testing.T) { 128 storage, server := newStorage(t) 129 defer server.Terminate(t) 130 defer storage.Store.DestroyFunc() 131 test := genericregistrytest.New(t, storage.Store).ClusterScope() 132 test.TestWatch( 133 validNewResourceSlice("foo"), 134 // matching labels 135 []labels.Set{}, 136 // not matching labels 137 []labels.Set{ 138 {"foo": "bar"}, 139 }, 140 // matching fields 141 []fields.Set{ 142 {"metadata.name": "foo"}, 143 }, 144 // not matching fields 145 []fields.Set{ 146 {"metadata.name": "bar"}, 147 }, 148 ) 149 }