karmada/pkg/search/apiserver.go

103 lines
3.1 KiB
Go

package search
import (
"k8s.io/apimachinery/pkg/version"
"k8s.io/apiserver/pkg/registry/rest"
genericapiserver "k8s.io/apiserver/pkg/server"
"k8s.io/klog/v2"
searchapis "github.com/karmada-io/karmada/pkg/apis/search"
searchscheme "github.com/karmada-io/karmada/pkg/apis/search/scheme"
informerfactory "github.com/karmada-io/karmada/pkg/generated/informers/externalversions"
searchstorage "github.com/karmada-io/karmada/pkg/registry/search/storage"
"github.com/karmada-io/karmada/pkg/search/proxy"
)
// ExtraConfig holds custom apiserver config
type ExtraConfig struct {
KarmadaSharedInformerFactory informerfactory.SharedInformerFactory
Controller *Controller
ProxyController *proxy.Controller
// Add custom config if necessary.
}
// Config defines the config for the APIServer.
type Config struct {
GenericConfig *genericapiserver.RecommendedConfig
ExtraConfig ExtraConfig
}
// APIServer contains state for karmada-search.
type APIServer struct {
GenericAPIServer *genericapiserver.GenericAPIServer
}
type completedConfig struct {
GenericConfig genericapiserver.CompletedConfig
ExtraConfig *ExtraConfig
}
// CompletedConfig embeds a private pointer that cannot be instantiated outside this package.
type CompletedConfig struct {
*completedConfig
}
// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver.
func (cfg *Config) Complete() CompletedConfig {
c := completedConfig{
cfg.GenericConfig.Complete(),
&cfg.ExtraConfig,
}
c.GenericConfig.Version = &version.Info{
Major: "1",
Minor: "0",
}
return CompletedConfig{&c}
}
func (c completedConfig) New() (*APIServer, error) {
genericServer, err := c.GenericConfig.New("karmada-search", genericapiserver.NewEmptyDelegate())
if err != nil {
return nil, err
}
server := &APIServer{
GenericAPIServer: genericServer,
}
apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(searchapis.GroupName, searchscheme.Scheme, searchscheme.ParameterCodec, searchscheme.Codecs)
resourceRegistryStorage, err := searchstorage.NewResourceRegistryStorage(searchscheme.Scheme, c.GenericConfig.RESTOptionsGetter)
if err != nil {
klog.Errorf("unable to create REST storage for a resource due to %v, will die", err)
return nil, err
}
v1alpha1search := map[string]rest.Storage{}
v1alpha1search["resourceregistries"] = resourceRegistryStorage.ResourceRegistry
v1alpha1search["resourceregistries/status"] = resourceRegistryStorage.Status
if c.ExtraConfig.Controller != nil {
searchREST := searchstorage.NewSearchREST(
c.ExtraConfig.Controller.InformerManager,
c.ExtraConfig.Controller.clusterLister,
c.ExtraConfig.Controller.restMapper)
v1alpha1search["search"] = searchREST
}
if c.ExtraConfig.ProxyController != nil {
proxyingREST := searchstorage.NewProxyingREST(c.ExtraConfig.ProxyController)
v1alpha1search["proxying"] = proxyingREST
}
apiGroupInfo.VersionedResourcesStorageMap["v1alpha1"] = v1alpha1search
if err = server.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil {
return nil, err
}
return server, nil
}