Commit 5fb94395 authored by Nikhil Jindal's avatar Nikhil Jindal

Merge pull request #18113 from nikhiljindal/serverLibrary

Extracting api server code into a library: part 1
parents 20b4fa6f 2d952aaa
...@@ -6,6 +6,10 @@ ...@@ -6,6 +6,10 @@
"description": "API at /api/v1" "description": "API at /api/v1"
}, },
{ {
"path": "/version",
"description": "git code version from which this is built"
},
{
"path": "/api", "path": "/api",
"description": "get available API versions" "description": "get available API versions"
}, },
...@@ -20,10 +24,6 @@ ...@@ -20,10 +24,6 @@
{ {
"path": "/apis", "path": "/apis",
"description": "get available API versions" "description": "get available API versions"
},
{
"path": "/version",
"description": "git code version from which this is built"
} }
], ],
"apiVersion": "", "apiVersion": "",
......
...@@ -44,6 +44,7 @@ import ( ...@@ -44,6 +44,7 @@ import (
"k8s.io/kubernetes/pkg/capabilities" "k8s.io/kubernetes/pkg/capabilities"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/cloudprovider"
"k8s.io/kubernetes/pkg/genericapiserver"
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
"k8s.io/kubernetes/pkg/master" "k8s.io/kubernetes/pkg/master"
"k8s.io/kubernetes/pkg/master/ports" "k8s.io/kubernetes/pkg/master/ports"
...@@ -130,7 +131,7 @@ func NewAPIServer() *APIServer { ...@@ -130,7 +131,7 @@ func NewAPIServer() *APIServer {
EventTTL: 1 * time.Hour, EventTTL: 1 * time.Hour,
AuthorizationMode: "AlwaysAllow", AuthorizationMode: "AlwaysAllow",
AdmissionControl: "AlwaysAdmit", AdmissionControl: "AlwaysAdmit",
EtcdPathPrefix: master.DefaultEtcdPathPrefix, EtcdPathPrefix: genericapiserver.DefaultEtcdPathPrefix,
EnableLogsSupport: true, EnableLogsSupport: true,
MasterServiceNamespace: api.NamespaceDefault, MasterServiceNamespace: api.NamespaceDefault,
CertDirectory: "/var/run/kubernetes", CertDirectory: "/var/run/kubernetes",
...@@ -314,7 +315,7 @@ func generateStorageVersionMap(legacyVersion string, storageVersions string) map ...@@ -314,7 +315,7 @@ func generateStorageVersionMap(legacyVersion string, storageVersions string) map
} }
// parse the value of --etcd-servers-overrides and update given storageDestinations. // parse the value of --etcd-servers-overrides and update given storageDestinations.
func updateEtcdOverrides(overrides []string, storageVersions map[string]string, prefix string, storageDestinations *master.StorageDestinations, newEtcdFn newEtcdFunc) { func updateEtcdOverrides(overrides []string, storageVersions map[string]string, prefix string, storageDestinations *genericapiserver.StorageDestinations, newEtcdFn newEtcdFunc) {
if len(overrides) == 0 { if len(overrides) == 0 {
return return
} }
...@@ -448,7 +449,7 @@ func (s *APIServer) Run(_ []string) error { ...@@ -448,7 +449,7 @@ func (s *APIServer) Run(_ []string) error {
return err return err
} }
storageDestinations := master.NewStorageDestinations() storageDestinations := genericapiserver.NewStorageDestinations()
storageVersions := generateStorageVersionMap(s.DeprecatedStorageVersion, s.StorageVersions) storageVersions := generateStorageVersionMap(s.DeprecatedStorageVersion, s.StorageVersions)
if _, found := storageVersions[legacyV1Group.GroupVersion.Group]; !found { if _, found := storageVersions[legacyV1Group.GroupVersion.Group]; !found {
...@@ -539,36 +540,39 @@ func (s *APIServer) Run(_ []string) error { ...@@ -539,36 +540,39 @@ func (s *APIServer) Run(_ []string) error {
} }
config := &master.Config{ config := &master.Config{
StorageDestinations: storageDestinations, Config: &genericapiserver.Config{
StorageVersions: storageVersions, StorageDestinations: storageDestinations,
EventTTL: s.EventTTL, StorageVersions: storageVersions,
KubeletClient: kubeletClient, ServiceClusterIPRange: &n,
ServiceClusterIPRange: &n, EnableLogsSupport: s.EnableLogsSupport,
EnableCoreControllers: true, EnableUISupport: true,
EnableLogsSupport: s.EnableLogsSupport, EnableSwaggerSupport: true,
EnableUISupport: true, EnableProfiling: s.EnableProfiling,
EnableSwaggerSupport: true, EnableWatchCache: s.EnableWatchCache,
EnableProfiling: s.EnableProfiling, EnableIndex: true,
EnableWatchCache: s.EnableWatchCache, APIPrefix: s.APIPrefix,
EnableIndex: true, APIGroupPrefix: s.APIGroupPrefix,
APIPrefix: s.APIPrefix, CorsAllowedOriginList: s.CorsAllowedOriginList,
APIGroupPrefix: s.APIGroupPrefix, ReadWritePort: s.SecurePort,
CorsAllowedOriginList: s.CorsAllowedOriginList, PublicAddress: s.AdvertiseAddress,
ReadWritePort: s.SecurePort, Authenticator: authenticator,
PublicAddress: s.AdvertiseAddress, SupportsBasicAuth: len(s.BasicAuthFile) > 0,
Authenticator: authenticator, Authorizer: authorizer,
SupportsBasicAuth: len(s.BasicAuthFile) > 0, AdmissionControl: admissionController,
Authorizer: authorizer, APIGroupVersionOverrides: apiGroupVersionOverrides,
AdmissionControl: admissionController, MasterServiceNamespace: s.MasterServiceNamespace,
APIGroupVersionOverrides: apiGroupVersionOverrides, ExternalHost: s.ExternalHost,
MasterServiceNamespace: s.MasterServiceNamespace, MinRequestTimeout: s.MinRequestTimeout,
ExternalHost: s.ExternalHost, ProxyDialer: proxyDialerFn,
MinRequestTimeout: s.MinRequestTimeout, ProxyTLSClientConfig: proxyTLSClientConfig,
ProxyDialer: proxyDialerFn, ServiceNodePortRange: s.ServiceNodePortRange,
ProxyTLSClientConfig: proxyTLSClientConfig, KubernetesServiceNodePort: s.KubernetesServiceNodePort,
Tunneler: tunneler, },
ServiceNodePortRange: s.ServiceNodePortRange, EnableCoreControllers: true,
KubernetesServiceNodePort: s.KubernetesServiceNodePort, EventTTL: s.EventTTL,
KubeletClient: kubeletClient,
Tunneler: tunneler,
} }
m := master.New(config) m := master.New(config)
...@@ -682,7 +686,7 @@ func (s *APIServer) getRuntimeConfigValue(apiKey string, defaultValue bool) bool ...@@ -682,7 +686,7 @@ func (s *APIServer) getRuntimeConfigValue(apiKey string, defaultValue bool) bool
} }
// Parses the given runtime-config and formats it into map[string]ApiGroupVersionOverride // Parses the given runtime-config and formats it into map[string]ApiGroupVersionOverride
func (s *APIServer) parseRuntimeConfig() (map[string]master.APIGroupVersionOverride, error) { func (s *APIServer) parseRuntimeConfig() (map[string]genericapiserver.APIGroupVersionOverride, error) {
// "api/all=false" allows users to selectively enable specific api versions. // "api/all=false" allows users to selectively enable specific api versions.
disableAllAPIs := false disableAllAPIs := false
allAPIFlagValue, ok := s.RuntimeConfig["api/all"] allAPIFlagValue, ok := s.RuntimeConfig["api/all"]
...@@ -703,9 +707,9 @@ func (s *APIServer) parseRuntimeConfig() (map[string]master.APIGroupVersionOverr ...@@ -703,9 +707,9 @@ func (s *APIServer) parseRuntimeConfig() (map[string]master.APIGroupVersionOverr
disableV1 := disableAllAPIs disableV1 := disableAllAPIs
v1GroupVersion := "api/v1" v1GroupVersion := "api/v1"
disableV1 = !s.getRuntimeConfigValue(v1GroupVersion, !disableV1) disableV1 = !s.getRuntimeConfigValue(v1GroupVersion, !disableV1)
apiGroupVersionOverrides := map[string]master.APIGroupVersionOverride{} apiGroupVersionOverrides := map[string]genericapiserver.APIGroupVersionOverride{}
if disableV1 { if disableV1 {
apiGroupVersionOverrides[v1GroupVersion] = master.APIGroupVersionOverride{ apiGroupVersionOverrides[v1GroupVersion] = genericapiserver.APIGroupVersionOverride{
Disable: true, Disable: true,
} }
} }
...@@ -717,7 +721,7 @@ func (s *APIServer) parseRuntimeConfig() (map[string]master.APIGroupVersionOverr ...@@ -717,7 +721,7 @@ func (s *APIServer) parseRuntimeConfig() (map[string]master.APIGroupVersionOverr
// TODO: Make this a loop over all group/versions when there are more of them. // TODO: Make this a loop over all group/versions when there are more of them.
disableExtensions = !s.getRuntimeConfigValue(extensionsGroupVersion, !disableExtensions) disableExtensions = !s.getRuntimeConfigValue(extensionsGroupVersion, !disableExtensions)
if disableExtensions { if disableExtensions {
apiGroupVersionOverrides[extensionsGroupVersion] = master.APIGroupVersionOverride{ apiGroupVersionOverrides[extensionsGroupVersion] = genericapiserver.APIGroupVersionOverride{
Disable: true, Disable: true,
} }
} }
......
...@@ -25,7 +25,7 @@ import ( ...@@ -25,7 +25,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/master" "k8s.io/kubernetes/pkg/genericapiserver"
"k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/storage"
) )
...@@ -138,7 +138,7 @@ func TestUpdateEtcdOverrides(t *testing.T) { ...@@ -138,7 +138,7 @@ func TestUpdateEtcdOverrides(t *testing.T) {
} }
return nil, nil return nil, nil
} }
storageDestinations := master.NewStorageDestinations() storageDestinations := genericapiserver.NewStorageDestinations()
override := test.apigroup + "/" + test.resource + "#" + strings.Join(test.servers, ";") override := test.apigroup + "/" + test.resource + "#" + strings.Join(test.servers, ";")
updateEtcdOverrides([]string{override}, storageVersions, "", &storageDestinations, newEtcd) updateEtcdOverrides([]string{override}, storageVersions, "", &storageDestinations, newEtcd)
apigroup, ok := storageDestinations.APIGroups[test.apigroup] apigroup, ok := storageDestinations.APIGroups[test.apigroup]
...@@ -160,12 +160,12 @@ func TestUpdateEtcdOverrides(t *testing.T) { ...@@ -160,12 +160,12 @@ func TestUpdateEtcdOverrides(t *testing.T) {
func TestParseRuntimeConfig(t *testing.T) { func TestParseRuntimeConfig(t *testing.T) {
testCases := []struct { testCases := []struct {
runtimeConfig map[string]string runtimeConfig map[string]string
apiGroupVersionOverrides map[string]master.APIGroupVersionOverride apiGroupVersionOverrides map[string]genericapiserver.APIGroupVersionOverride
err bool err bool
}{ }{
{ {
runtimeConfig: map[string]string{}, runtimeConfig: map[string]string{},
apiGroupVersionOverrides: map[string]master.APIGroupVersionOverride{}, apiGroupVersionOverrides: map[string]genericapiserver.APIGroupVersionOverride{},
err: false, err: false,
}, },
{ {
...@@ -173,7 +173,7 @@ func TestParseRuntimeConfig(t *testing.T) { ...@@ -173,7 +173,7 @@ func TestParseRuntimeConfig(t *testing.T) {
runtimeConfig: map[string]string{ runtimeConfig: map[string]string{
"api/v1/pods": "false", "api/v1/pods": "false",
}, },
apiGroupVersionOverrides: map[string]master.APIGroupVersionOverride{}, apiGroupVersionOverrides: map[string]genericapiserver.APIGroupVersionOverride{},
err: true, err: true,
}, },
{ {
...@@ -181,7 +181,7 @@ func TestParseRuntimeConfig(t *testing.T) { ...@@ -181,7 +181,7 @@ func TestParseRuntimeConfig(t *testing.T) {
runtimeConfig: map[string]string{ runtimeConfig: map[string]string{
"api/v1": "false", "api/v1": "false",
}, },
apiGroupVersionOverrides: map[string]master.APIGroupVersionOverride{ apiGroupVersionOverrides: map[string]genericapiserver.APIGroupVersionOverride{
"api/v1": { "api/v1": {
Disable: true, Disable: true,
}, },
...@@ -193,7 +193,7 @@ func TestParseRuntimeConfig(t *testing.T) { ...@@ -193,7 +193,7 @@ func TestParseRuntimeConfig(t *testing.T) {
runtimeConfig: map[string]string{ runtimeConfig: map[string]string{
"extensions/v1beta1": "false", "extensions/v1beta1": "false",
}, },
apiGroupVersionOverrides: map[string]master.APIGroupVersionOverride{ apiGroupVersionOverrides: map[string]genericapiserver.APIGroupVersionOverride{
"extensions/v1beta1": { "extensions/v1beta1": {
Disable: true, Disable: true,
}, },
...@@ -205,7 +205,7 @@ func TestParseRuntimeConfig(t *testing.T) { ...@@ -205,7 +205,7 @@ func TestParseRuntimeConfig(t *testing.T) {
runtimeConfig: map[string]string{ runtimeConfig: map[string]string{
"extensions/v1beta1/deployments": "false", "extensions/v1beta1/deployments": "false",
}, },
apiGroupVersionOverrides: map[string]master.APIGroupVersionOverride{ apiGroupVersionOverrides: map[string]genericapiserver.APIGroupVersionOverride{
"extensions/v1beta1": { "extensions/v1beta1": {
ResourceOverrides: map[string]bool{ ResourceOverrides: map[string]bool{
"deployments": false, "deployments": false,
...@@ -220,7 +220,7 @@ func TestParseRuntimeConfig(t *testing.T) { ...@@ -220,7 +220,7 @@ func TestParseRuntimeConfig(t *testing.T) {
"extensions/v1beta1/deployments": "true", "extensions/v1beta1/deployments": "true",
"extensions/v1beta1/jobs": "false", "extensions/v1beta1/jobs": "false",
}, },
apiGroupVersionOverrides: map[string]master.APIGroupVersionOverride{ apiGroupVersionOverrides: map[string]genericapiserver.APIGroupVersionOverride{
"extensions/v1beta1": { "extensions/v1beta1": {
ResourceOverrides: map[string]bool{ ResourceOverrides: map[string]bool{
"deployments": true, "deployments": true,
......
...@@ -105,7 +105,7 @@ kube-apiserver ...@@ -105,7 +105,7 @@ kube-apiserver
--watch-cache[=true]: Enable watch caching in the apiserver --watch-cache[=true]: Enable watch caching in the apiserver
``` ```
###### Auto generated by spf13/cobra on 9-Dec-2015 ###### Auto generated by spf13/cobra on 15-Dec-2015
<!-- BEGIN MUNGE: GENERATED_ANALYTICS --> <!-- BEGIN MUNGE: GENERATED_ANALYTICS -->
......
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package genericapiserver contains code to setup a generic kubernetes-like API server.
// This does not contain any kubernetes API specific code.
// Note that this is a work in progress. We are pulling out generic code (specifically from
// pkg/master and pkg/apiserver) here.
// We plan to move this package into a separate repo on github once it is done.
// For more details: https://github.com/kubernetes/kubernetes/issues/2742
package genericapiserver
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package genericapiserver
import (
"crypto/tls"
"fmt"
"net"
"net/http"
"testing"
"k8s.io/kubernetes/pkg/apiserver"
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
"k8s.io/kubernetes/pkg/util"
"github.com/stretchr/testify/assert"
)
// setUp is a convience function for setting up for (most) tests.
func setUp(t *testing.T) (GenericAPIServer, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) {
etcdServer := etcdtesting.NewEtcdTestClientServer(t)
genericapiserver := GenericAPIServer{}
config := Config{}
config.PublicAddress = net.ParseIP("192.168.10.4")
return genericapiserver, etcdServer, config, assert.New(t)
}
// TestNew verifies that the New function returns a GenericAPIServer
// using the configuration properly.
func TestNew(t *testing.T) {
_, etcdserver, config, assert := setUp(t)
defer etcdserver.Terminate(t)
config.ProxyDialer = func(network, addr string) (net.Conn, error) { return nil, nil }
config.ProxyTLSClientConfig = &tls.Config{}
s := New(&config)
// Verify many of the variables match their config counterparts
assert.Equal(s.enableLogsSupport, config.EnableLogsSupport)
assert.Equal(s.enableUISupport, config.EnableUISupport)
assert.Equal(s.enableSwaggerSupport, config.EnableSwaggerSupport)
assert.Equal(s.enableProfiling, config.EnableProfiling)
assert.Equal(s.ApiPrefix, config.APIPrefix)
assert.Equal(s.ApiGroupPrefix, config.APIGroupPrefix)
assert.Equal(s.corsAllowedOriginList, config.CorsAllowedOriginList)
assert.Equal(s.authenticator, config.Authenticator)
assert.Equal(s.authorizer, config.Authorizer)
assert.Equal(s.AdmissionControl, config.AdmissionControl)
assert.Equal(s.ApiGroupVersionOverrides, config.APIGroupVersionOverrides)
assert.Equal(s.RequestContextMapper, config.RequestContextMapper)
assert.Equal(s.cacheTimeout, config.CacheTimeout)
assert.Equal(s.externalHost, config.ExternalHost)
assert.Equal(s.ClusterIP, config.PublicAddress)
assert.Equal(s.PublicReadWritePort, config.ReadWritePort)
assert.Equal(s.ServiceReadWriteIP, config.ServiceReadWriteIP)
// These functions should point to the same memory location
serverDialer, _ := util.Dialer(s.ProxyTransport)
serverDialerFunc := fmt.Sprintf("%p", serverDialer)
configDialerFunc := fmt.Sprintf("%p", config.ProxyDialer)
assert.Equal(serverDialerFunc, configDialerFunc)
assert.Equal(s.ProxyTransport.(*http.Transport).TLSClientConfig, config.ProxyTLSClientConfig)
}
// TestNewHandlerContainer verifies that NewHandlerContainer uses the
// mux provided
func TestNewHandlerContainer(t *testing.T) {
assert := assert.New(t)
mux := http.NewServeMux()
container := NewHandlerContainer(mux)
assert.Equal(mux, container.ServeMux, "ServerMux's do not match")
}
// TestHandleWithAuth verifies HandleWithAuth adds the path
// to the MuxHelper.RegisteredPaths.
func TestHandleWithAuth(t *testing.T) {
server, etcdserver, _, assert := setUp(t)
defer etcdserver.Terminate(t)
mh := apiserver.MuxHelper{Mux: http.NewServeMux()}
server.MuxHelper = &mh
handler := func(r http.ResponseWriter, w *http.Request) { w.Write(nil) }
server.HandleWithAuth("/test", http.HandlerFunc(handler))
assert.Contains(server.MuxHelper.RegisteredPaths, "/test", "Path not found in MuxHelper")
}
// TestHandleFuncWithAuth verifies HandleFuncWithAuth adds the path
// to the MuxHelper.RegisteredPaths.
func TestHandleFuncWithAuth(t *testing.T) {
server, etcdserver, _, assert := setUp(t)
defer etcdserver.Terminate(t)
mh := apiserver.MuxHelper{Mux: http.NewServeMux()}
server.MuxHelper = &mh
handler := func(r http.ResponseWriter, w *http.Request) { w.Write(nil) }
server.HandleFuncWithAuth("/test", handler)
assert.Contains(server.MuxHelper.RegisteredPaths, "/test", "Path not found in MuxHelper")
}
// TestInstallSwaggerAPI verifies that the swagger api is added
// at the proper endpoint.
func TestInstallSwaggerAPI(t *testing.T) {
server, etcdserver, _, assert := setUp(t)
defer etcdserver.Terminate(t)
mux := http.NewServeMux()
server.HandlerContainer = NewHandlerContainer(mux)
// Ensure swagger isn't installed without the call
ws := server.HandlerContainer.RegisteredWebServices()
if !assert.Equal(len(ws), 0) {
for x := range ws {
assert.NotEqual("/swaggerapi", ws[x].RootPath(), "SwaggerAPI was installed without a call to InstallSwaggerAPI()")
}
}
// Install swagger and test
server.InstallSwaggerAPI()
ws = server.HandlerContainer.RegisteredWebServices()
if assert.NotEqual(0, len(ws), "SwaggerAPI not installed.") {
assert.Equal("/swaggerapi/", ws[0].RootPath(), "SwaggerAPI did not install to the proper path. %s != /swaggerapi", ws[0].RootPath())
}
// Empty externalHost verification
mux = http.NewServeMux()
server.HandlerContainer = NewHandlerContainer(mux)
server.externalHost = ""
server.ClusterIP = net.IPv4(10, 10, 10, 10)
server.PublicReadWritePort = 1010
server.InstallSwaggerAPI()
if assert.NotEqual(0, len(ws), "SwaggerAPI not installed.") {
assert.Equal("/swaggerapi/", ws[0].RootPath(), "SwaggerAPI did not install to the proper path. %s != /swaggerapi", ws[0].RootPath())
}
}
...@@ -31,6 +31,8 @@ import ( ...@@ -31,6 +31,8 @@ import (
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
type InstallSSHKey func(user string, data []byte) error
type AddressFunc func() (addresses []string, err error) type AddressFunc func() (addresses []string, err error)
type Tunneler interface { type Tunneler interface {
......
...@@ -36,6 +36,7 @@ import ( ...@@ -36,6 +36,7 @@ import (
"k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller"
replicationcontroller "k8s.io/kubernetes/pkg/controller/replication" replicationcontroller "k8s.io/kubernetes/pkg/controller/replication"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/genericapiserver"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
"k8s.io/kubernetes/pkg/master" "k8s.io/kubernetes/pkg/master"
...@@ -138,22 +139,26 @@ func startMasterOrDie(masterConfig *master.Config) (*master.Master, *httptest.Se ...@@ -138,22 +139,26 @@ func startMasterOrDie(masterConfig *master.Config) (*master.Master, *httptest.Se
func NewMasterConfig() *master.Config { func NewMasterConfig() *master.Config {
etcdClient := NewEtcdClient() etcdClient := NewEtcdClient()
storageVersions := make(map[string]string) storageVersions := make(map[string]string)
etcdStorage := etcdstorage.NewEtcdStorage(etcdClient, testapi.Default.Codec(), etcdtest.PathPrefix()) etcdStorage := etcdstorage.NewEtcdStorage(etcdClient, testapi.Default.Codec(), etcdtest.PathPrefix())
storageVersions[api.GroupName] = testapi.Default.GroupVersion().String() storageVersions[api.GroupName] = testapi.Default.GroupVersion().String()
expEtcdStorage := NewExtensionsEtcdStorage(etcdClient) expEtcdStorage := NewExtensionsEtcdStorage(etcdClient)
storageVersions[extensions.GroupName] = testapi.Extensions.GroupVersion().String() storageVersions[extensions.GroupName] = testapi.Extensions.GroupVersion().String()
storageDestinations := master.NewStorageDestinations()
storageDestinations := genericapiserver.NewStorageDestinations()
storageDestinations.AddAPIGroup(api.GroupName, etcdStorage) storageDestinations.AddAPIGroup(api.GroupName, etcdStorage)
storageDestinations.AddAPIGroup(extensions.GroupName, expEtcdStorage) storageDestinations.AddAPIGroup(extensions.GroupName, expEtcdStorage)
return &master.Config{ return &master.Config{
StorageDestinations: storageDestinations, Config: &genericapiserver.Config{
StorageVersions: storageVersions, StorageDestinations: storageDestinations,
KubeletClient: kubeletclient.FakeKubeletClient{}, StorageVersions: storageVersions,
APIPrefix: "/api", APIPrefix: "/api",
APIGroupPrefix: "/apis", APIGroupPrefix: "/apis",
Authorizer: apiserver.NewAlwaysAllowAuthorizer(), Authorizer: apiserver.NewAlwaysAllowAuthorizer(),
AdmissionControl: admit.NewAlwaysAdmit(), AdmissionControl: admit.NewAlwaysAdmit(),
},
KubeletClient: kubeletclient.FakeKubeletClient{},
} }
} }
......
...@@ -19,6 +19,7 @@ package integration ...@@ -19,6 +19,7 @@ package integration
import ( import (
"testing" "testing"
"k8s.io/kubernetes/pkg/genericapiserver"
"k8s.io/kubernetes/pkg/master" "k8s.io/kubernetes/pkg/master"
) )
...@@ -26,10 +27,15 @@ import ( ...@@ -26,10 +27,15 @@ import (
// are not referenced directly by a master. // are not referenced directly by a master.
func TestMasterExportsSymbols(t *testing.T) { func TestMasterExportsSymbols(t *testing.T) {
_ = &master.Config{ _ = &master.Config{
Config: &genericapiserver.Config{
EnableUISupport: false,
EnableSwaggerSupport: false,
RestfulContainer: nil,
},
EnableCoreControllers: false, EnableCoreControllers: false,
EnableUISupport: false,
EnableSwaggerSupport: false,
RestfulContainer: nil,
} }
_ = (&master.Master{}).NewBootstrapController() m := &master.Master{
GenericAPIServer: &genericapiserver.GenericAPIServer{},
}
_ = (m).NewBootstrapController()
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment