Skip to content

Commit c059c68

Browse files
pkg/search: unit test karmada search APIServer
In this commit, we unit test karmada search APIServer on creating REST storage and installing the API group. Signed-off-by: Mohamed Awnallah <[email protected]>
1 parent a935aa1 commit c059c68

File tree

2 files changed

+168
-2
lines changed

2 files changed

+168
-2
lines changed

Diff for: pkg/search/apiserver.go

+11-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ limitations under the License.
1717
package search
1818

1919
import (
20+
"k8s.io/apimachinery/pkg/runtime"
2021
"k8s.io/apimachinery/pkg/version"
22+
"k8s.io/apiserver/pkg/registry/generic"
2123
"k8s.io/apiserver/pkg/registry/rest"
2224
genericapiserver "k8s.io/apiserver/pkg/server"
2325
"k8s.io/klog/v2"
@@ -73,6 +75,13 @@ func (cfg *Config) Complete() CompletedConfig {
7375
return CompletedConfig{&c}
7476
}
7577

78+
var resourceRegistryStorageBuilder = func(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) (*searchstorage.ResourceRegistryStorage, error) {
79+
return searchstorage.NewResourceRegistryStorage(scheme, optsGetter)
80+
}
81+
var apiGroupInstaller = func(server *APIServer, apiGroupInfo *genericapiserver.APIGroupInfo) error {
82+
return server.GenericAPIServer.InstallAPIGroup(apiGroupInfo)
83+
}
84+
7685
func (c completedConfig) New() (*APIServer, error) {
7786
genericServer, err := c.GenericConfig.New("karmada-search", genericapiserver.NewEmptyDelegate())
7887
if err != nil {
@@ -85,7 +94,7 @@ func (c completedConfig) New() (*APIServer, error) {
8594

8695
apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(searchapis.GroupName, searchscheme.Scheme, searchscheme.ParameterCodec, searchscheme.Codecs)
8796

88-
resourceRegistryStorage, err := searchstorage.NewResourceRegistryStorage(searchscheme.Scheme, c.GenericConfig.RESTOptionsGetter)
97+
resourceRegistryStorage, err := resourceRegistryStorageBuilder(searchscheme.Scheme, c.GenericConfig.RESTOptionsGetter)
8998
if err != nil {
9099
klog.Errorf("unable to create REST storage for a resource due to %v, will die", err)
91100
return nil, err
@@ -110,7 +119,7 @@ func (c completedConfig) New() (*APIServer, error) {
110119

111120
apiGroupInfo.VersionedResourcesStorageMap["v1alpha1"] = v1alpha1search
112121

113-
if err = server.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil {
122+
if err = apiGroupInstaller(server, &apiGroupInfo); err != nil {
114123
return nil, err
115124
}
116125

Diff for: pkg/search/apiserver_test.go

+157
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
/*
2+
Copyright 2024 The Karmada 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 search
18+
19+
import (
20+
"errors"
21+
"net/http"
22+
"strings"
23+
"testing"
24+
25+
"k8s.io/apimachinery/pkg/runtime"
26+
"k8s.io/apiserver/pkg/registry/generic"
27+
genericapiserver "k8s.io/apiserver/pkg/server"
28+
"k8s.io/client-go/informers"
29+
clientset "k8s.io/client-go/kubernetes"
30+
fakeclientset "k8s.io/client-go/kubernetes/fake"
31+
restclient "k8s.io/client-go/rest"
32+
33+
searchstorage "github.com/karmada-io/karmada/pkg/registry/search/storage"
34+
)
35+
36+
func TestNewKarmadaSearchAPIServer(t *testing.T) {
37+
tests := []struct {
38+
name string
39+
cfg *completedConfig
40+
genericAPIServerConfig *genericapiserver.Config
41+
client clientset.Interface
42+
restConfig *restclient.Config
43+
prep func(*completedConfig, *genericapiserver.Config, clientset.Interface) error
44+
wantErr bool
45+
errMsg string
46+
}{
47+
{
48+
name: "NewKarmadaSearchAPIServer_NetworkIssue_FailedToCreateRESTStorage",
49+
cfg: &completedConfig{
50+
ExtraConfig: &ExtraConfig{},
51+
},
52+
client: fakeclientset.NewSimpleClientset(),
53+
genericAPIServerConfig: &genericapiserver.Config{
54+
RESTOptionsGetter: generic.RESTOptions{},
55+
Serializer: runtime.NewSimpleNegotiatedSerializer(runtime.SerializerInfo{
56+
MediaType: runtime.ContentTypeJSON,
57+
}),
58+
LoopbackClientConfig: &restclient.Config{},
59+
EquivalentResourceRegistry: runtime.NewEquivalentResourceRegistry(),
60+
BuildHandlerChainFunc: func(http.Handler, *genericapiserver.Config) (secure http.Handler) {
61+
return nil
62+
},
63+
ExternalAddress: "10.0.0.0:10000",
64+
},
65+
prep: func(cfg *completedConfig, genericAPIServerCfg *genericapiserver.Config, client clientset.Interface) error {
66+
sharedInformer := informers.NewSharedInformerFactory(client, 0)
67+
cfg.GenericConfig = genericAPIServerCfg.Complete(sharedInformer)
68+
resourceRegistryStorageBuilder = func(*runtime.Scheme, generic.RESTOptionsGetter) (*searchstorage.ResourceRegistryStorage, error) {
69+
return nil, errors.New("unexpected network issue while creating the resource registry storage")
70+
}
71+
return nil
72+
},
73+
wantErr: true,
74+
errMsg: "unexpected network issue while creating the resource registry storage",
75+
},
76+
{
77+
name: "NewKarmadaSearchAPIServer_InstalledAPIGroup_FailedToInstallAPIGroup",
78+
cfg: &completedConfig{
79+
ExtraConfig: &ExtraConfig{},
80+
},
81+
client: fakeclientset.NewSimpleClientset(),
82+
genericAPIServerConfig: &genericapiserver.Config{
83+
RESTOptionsGetter: generic.RESTOptions{},
84+
Serializer: runtime.NewSimpleNegotiatedSerializer(runtime.SerializerInfo{
85+
MediaType: runtime.ContentTypeJSON,
86+
}),
87+
LoopbackClientConfig: &restclient.Config{},
88+
EquivalentResourceRegistry: runtime.NewEquivalentResourceRegistry(),
89+
BuildHandlerChainFunc: func(http.Handler, *genericapiserver.Config) (secure http.Handler) {
90+
return nil
91+
},
92+
ExternalAddress: "10.0.0.0:10000",
93+
},
94+
prep: func(cfg *completedConfig, genericAPIServerCfg *genericapiserver.Config, client clientset.Interface) error {
95+
sharedInformer := informers.NewSharedInformerFactory(client, 0)
96+
cfg.GenericConfig = genericAPIServerCfg.Complete(sharedInformer)
97+
resourceRegistryStorageBuilder = func(*runtime.Scheme, generic.RESTOptionsGetter) (*searchstorage.ResourceRegistryStorage, error) {
98+
return &searchstorage.ResourceRegistryStorage{}, nil
99+
}
100+
apiGroupInstaller = func(*APIServer, *genericapiserver.APIGroupInfo) error {
101+
return errors.New("failed to install api group")
102+
}
103+
return nil
104+
},
105+
wantErr: true,
106+
errMsg: "failed to install api group",
107+
},
108+
{
109+
name: "NewKarmadaSearchAPIServer_InstalledAPIGroup_APIGroupInstalled",
110+
cfg: &completedConfig{
111+
ExtraConfig: &ExtraConfig{},
112+
},
113+
client: fakeclientset.NewSimpleClientset(),
114+
genericAPIServerConfig: &genericapiserver.Config{
115+
RESTOptionsGetter: generic.RESTOptions{},
116+
Serializer: runtime.NewSimpleNegotiatedSerializer(runtime.SerializerInfo{
117+
MediaType: runtime.ContentTypeJSON,
118+
}),
119+
LoopbackClientConfig: &restclient.Config{},
120+
EquivalentResourceRegistry: runtime.NewEquivalentResourceRegistry(),
121+
BuildHandlerChainFunc: func(http.Handler, *genericapiserver.Config) (secure http.Handler) {
122+
return nil
123+
},
124+
ExternalAddress: "10.0.0.0:10000",
125+
},
126+
prep: func(cfg *completedConfig, genericAPIServerCfg *genericapiserver.Config, client clientset.Interface) error {
127+
sharedInformer := informers.NewSharedInformerFactory(client, 0)
128+
cfg.GenericConfig = genericAPIServerCfg.Complete(sharedInformer)
129+
resourceRegistryStorageBuilder = func(*runtime.Scheme, generic.RESTOptionsGetter) (*searchstorage.ResourceRegistryStorage, error) {
130+
return &searchstorage.ResourceRegistryStorage{}, nil
131+
}
132+
apiGroupInstaller = func(*APIServer, *genericapiserver.APIGroupInfo) error {
133+
return nil
134+
}
135+
return nil
136+
},
137+
wantErr: false,
138+
},
139+
}
140+
for _, test := range tests {
141+
t.Run(test.name, func(t *testing.T) {
142+
if err := test.prep(test.cfg, test.genericAPIServerConfig, test.client); err != nil {
143+
t.Fatalf("failed to prep test environment before creating new karmada search apiserver, got: %v", err)
144+
}
145+
_, err := test.cfg.New()
146+
if err == nil && test.wantErr {
147+
t.Fatal("expected an error, but got none")
148+
}
149+
if err != nil && !test.wantErr {
150+
t.Errorf("unexpected error, got: %v", err)
151+
}
152+
if err != nil && test.wantErr && !strings.Contains(err.Error(), test.errMsg) {
153+
t.Errorf("expected error message %s to be in %s", test.errMsg, err.Error())
154+
}
155+
})
156+
}
157+
}

0 commit comments

Comments
 (0)