diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index b2030d30929..ecb5e5a841e 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -330,7 +330,7 @@ func Run(s *options.APIServer) error { cachesize.SetWatchCacheSizes(s.WatchCacheSizes) } - m, err := config.New() + m, err := config.Complete().New() if err != nil { return err } diff --git a/examples/apiserver/apiserver.go b/examples/apiserver/apiserver.go index 3be89254f32..fd8b174a957 100644 --- a/examples/apiserver/apiserver.go +++ b/examples/apiserver/apiserver.go @@ -70,7 +70,7 @@ func Run(serverOptions *genericoptions.ServerRunOptions) error { config := genericapiserver.NewConfig(serverOptions) config.Authorizer = authorizer.NewAlwaysAllowAuthorizer() config.Serializer = api.Codecs - s, err := config.New() + s, err := config.Complete().New() if err != nil { return fmt.Errorf("Error in bringing up the server: %v", err) } diff --git a/federation/cmd/federation-apiserver/app/server.go b/federation/cmd/federation-apiserver/app/server.go index 1565648c3ef..44d92d60d7d 100644 --- a/federation/cmd/federation-apiserver/app/server.go +++ b/federation/cmd/federation-apiserver/app/server.go @@ -219,7 +219,7 @@ func Run(s *options.ServerRunOptions) error { cachesize.SetWatchCacheSizes(s.WatchCacheSizes) } - m, err := genericConfig.New() + m, err := genericConfig.Complete().New() if err != nil { return err } diff --git a/pkg/genericapiserver/config.go b/pkg/genericapiserver/config.go index 64cd48a8ac9..433d89cea1d 100644 --- a/pkg/genericapiserver/config.go +++ b/pkg/genericapiserver/config.go @@ -210,8 +210,8 @@ func NewConfig(options *options.ServerRunOptions) *Config { } } -// setDefaults fills in any fields not set that are required to have valid data. -func (c *Config) setDefaults() { +// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver. +func (c *Config) Complete() *Config { if c.ServiceClusterIPRange == nil { defaultNet := "10.0.0.0/24" glog.Warningf("Network range for service cluster IPs is unspecified. Defaulting to %v.", defaultNet) @@ -264,6 +264,7 @@ func (c *Config) setDefaults() { } c.ExternalHost = hostAndPort } + return c } // New returns a new instance of GenericAPIServer from the given config. @@ -288,13 +289,11 @@ func (c *Config) setDefaults() { // If the caller wants to add additional endpoints not using the GenericAPIServer's // auth, then the caller should create a handler for those endpoints, which delegates the // any unhandled paths to "Handler". -func (c Config) New() (*GenericAPIServer, error) { +func (c *Config) New() (*GenericAPIServer, error) { if c.Serializer == nil { return nil, fmt.Errorf("Genericapiserver.New() called with config.Serializer == nil") } - c.setDefaults() - s := &GenericAPIServer{ ServiceClusterIPRange: c.ServiceClusterIPRange, ServiceNodePortRange: c.ServiceNodePortRange, @@ -342,8 +341,8 @@ func (c Config) New() (*GenericAPIServer, error) { }) } - s.installAPI(&c) - s.Handler, s.InsecureHandler = s.buildHandlerChains(&c, http.Handler(s.Mux.BaseMux().(*http.ServeMux))) + s.installAPI(c) + s.Handler, s.InsecureHandler = s.buildHandlerChains(c, http.Handler(s.Mux.BaseMux().(*http.ServeMux))) return s, nil } diff --git a/pkg/genericapiserver/genericapiserver_test.go b/pkg/genericapiserver/genericapiserver_test.go index 5b1e4106f9d..c6f841c58a7 100644 --- a/pkg/genericapiserver/genericapiserver_test.go +++ b/pkg/genericapiserver/genericapiserver_test.go @@ -64,7 +64,7 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion func newMaster(t *testing.T) (*GenericAPIServer, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) { etcdserver, config, assert := setUp(t) - s, err := config.New() + s, err := config.Complete().New() if err != nil { t.Fatalf("Error in bringing up the server: %v", err) } @@ -109,7 +109,7 @@ func TestInstallAPIGroups(t *testing.T) { config.APIPrefix = "/apiPrefix" config.APIGroupPrefix = "/apiGroupPrefix" - s, err := config.New() + s, err := config.Complete().New() if err != nil { t.Fatalf("Error in bringing up the server: %v", err) } @@ -212,7 +212,7 @@ func TestNotRestRoutesHaveAuth(t *testing.T) { config.EnableSwaggerSupport = true config.EnableVersion = true - s, err := config.New() + s, err := config.Complete().New() if err != nil { t.Fatalf("Error in bringing up the server: %v", err) } diff --git a/pkg/master/master.go b/pkg/master/master.go index 0ccc97ad41c..01e8aad0db6 100644 --- a/pkg/master/master.go +++ b/pkg/master/master.go @@ -190,6 +190,16 @@ type RESTStorageProvider interface { NewRESTStorage(apiResourceConfigSource genericapiserver.APIResourceConfigSource, restOptionsGetter RESTOptionsGetter) (groupInfo genericapiserver.APIGroupInfo, enabled bool) } +// Complete fills in any fields not set that are required to have valid data. It's mutating the receiver. +func (c *Config) Complete() *Config { + c.Config.Complete() + + // enable swagger UI only if general UI support is on + c.Config.EnableSwaggerUI = c.Config.EnableSwaggerUI && c.EnableUISupport + + return c +} + // New returns a new instance of Master from the given config. // Certain config fields will be set to a default value if unset. // Certain config fields must be specified, including: @@ -199,9 +209,7 @@ func (c *Config) New() (*Master, error) { return nil, fmt.Errorf("Master.New() called with config.KubeletClient == nil") } - gc := *c.Config // copy before mutations - gc.EnableSwaggerUI = gc.EnableSwaggerUI && c.EnableUISupport // disable swagger UI if general UI supports it - s, err := gc.New() + s, err := c.Config.New() if err != nil { return nil, err } diff --git a/pkg/master/master_test.go b/pkg/master/master_test.go index aa757b616c5..bdca48e91c0 100644 --- a/pkg/master/master_test.go +++ b/pkg/master/master_test.go @@ -125,7 +125,7 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert. func newMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) { _, etcdserver, config, assert := setUp(t) - master, err := config.New() + master, err := config.Complete().New() if err != nil { t.Fatalf("Error in bringing up the master: %v", err) } @@ -151,7 +151,7 @@ func limitedAPIResourceConfigSource() *genericapiserver.ResourceConfig { func newLimitedMaster(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.Assertions) { _, etcdserver, config, assert := setUp(t) config.APIResourceConfigSource = limitedAPIResourceConfigSource() - master, err := config.New() + master, err := config.Complete().New() if err != nil { t.Fatalf("Error in bringing up the master: %v", err) } @@ -1262,7 +1262,7 @@ func TestValidOpenAPISpec(t *testing.T) { Version: "unversioned", }, } - master, err := config.New() + master, err := config.Complete().New() if err != nil { t.Fatalf("Error in bringing up the master: %v", err) } diff --git a/test/integration/framework/master_utils.go b/test/integration/framework/master_utils.go index e8ffeb2e014..2bc98eaa370 100644 --- a/test/integration/framework/master_utils.go +++ b/test/integration/framework/master_utils.go @@ -149,7 +149,7 @@ func startMasterOrDie(masterConfig *master.Config) (*master.Master, *httptest.Se }, } } - m, err := masterConfig.New() + m, err := masterConfig.Complete().New() if err != nil { glog.Fatalf("error in bringing up the master: %v", err) } diff --git a/test/integration/quota/quota_test.go b/test/integration/quota/quota_test.go index 32668f72146..82ead85da02 100644 --- a/test/integration/quota/quota_test.go +++ b/test/integration/quota/quota_test.go @@ -73,7 +73,7 @@ func TestQuota(t *testing.T) { masterConfig := framework.NewIntegrationTestMasterConfig() masterConfig.AdmissionControl = admission - m, err = masterConfig.New() + m, err = masterConfig.Complete().New() if err != nil { t.Fatalf("Error in bringing up the master: %v", err) } diff --git a/test/integration/scheduler_perf/util.go b/test/integration/scheduler_perf/util.go index 5f79c70d0ff..a7041b8b441 100644 --- a/test/integration/scheduler_perf/util.go +++ b/test/integration/scheduler_perf/util.go @@ -48,7 +48,7 @@ func mustSetupScheduler() (schedulerConfigFactory *factory.ConfigFactory, destro var m *master.Master masterConfig := framework.NewIntegrationTestMasterConfig() - m, err := masterConfig.New() + m, err := masterConfig.Complete().New() if err != nil { panic("error in brining up the master: " + err.Error()) } diff --git a/test/integration/serviceaccount/service_account_test.go b/test/integration/serviceaccount/service_account_test.go index 7817f5bf1ed..ed994b0a9e7 100644 --- a/test/integration/serviceaccount/service_account_test.go +++ b/test/integration/serviceaccount/service_account_test.go @@ -412,7 +412,7 @@ func startServiceAccountTestServer(t *testing.T) (*clientset.Clientset, restclie masterConfig.AdmissionControl = serviceAccountAdmission // Create a master and install handlers into mux. - m, err := masterConfig.New() + m, err := masterConfig.Complete().New() if err != nil { t.Fatalf("Error in bringing up the master: %v", err) }