From 3dc5223f4f5a48173d3e4c9c0ced01dba4d9a4dd Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Fri, 11 Sep 2015 15:46:18 -0700 Subject: [PATCH] check if experimental is enabled during startup of client and server --- cmd/kube-apiserver/app/server.go | 17 +++++++++++++---- pkg/client/unversioned/experimental.go | 10 ++++++++-- pkg/client/unversioned/helper.go | 5 +++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/cmd/kube-apiserver/app/server.go b/cmd/kube-apiserver/app/server.go index 6c14ad79807..464f6ddf701 100644 --- a/cmd/kube-apiserver/app/server.go +++ b/cmd/kube-apiserver/app/server.go @@ -35,7 +35,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/latest" "k8s.io/kubernetes/pkg/api/meta" - explatest "k8s.io/kubernetes/pkg/apis/experimental/latest" + "k8s.io/kubernetes/pkg/api/registered" "k8s.io/kubernetes/pkg/apiserver" "k8s.io/kubernetes/pkg/capabilities" client "k8s.io/kubernetes/pkg/client/unversioned" @@ -331,6 +331,10 @@ func (s *APIServer) Run(_ []string) error { // This takes preference over api/all, if specified. enableExp := s.getRuntimeConfigValue("experimental/v1", false) + if enableExp && len(registered.GroupVersionsForGroup("experimental")) == 0 { + glog.Fatalf("experimental API is enabled in runtime config, but not registered throught environment variable KUBE_API_VERSIONS") + } + clientConfig := &client.Config{ Host: net.JoinHostPort(s.InsecureBindAddress.String(), strconv.Itoa(s.InsecurePort)), Version: s.StorageVersion, @@ -344,9 +348,14 @@ func (s *APIServer) Run(_ []string) error { if err != nil { glog.Fatalf("Invalid storage version or misconfigured etcd: %v", err) } - expEtcdStorage, err := newEtcd(s.EtcdConfigFile, s.EtcdServerList, latest.GroupOrDie("experimental").InterfacesFor, latest.GroupOrDie("experimental").Version, s.ExpStorageVersion, s.EtcdPathPrefix) - if err != nil { - glog.Fatalf("Invalid experimental storage version or misconfigured etcd: %v", err) + + var expEtcdStorage storage.Interface + if enableExp { + expEtcdStorage, err = newEtcd(s.EtcdConfigFile, s.EtcdServerList, latest.GroupOrDie("experimental").InterfacesFor, latest.GroupOrDie("experimental").Version, s.ExpStorageVersion, s.EtcdPathPrefix) + + if err != nil { + glog.Fatalf("Invalid experimental storage version or misconfigured etcd: %v", err) + } } n := s.ServiceClusterIPRange diff --git a/pkg/client/unversioned/experimental.go b/pkg/client/unversioned/experimental.go index d6fab959de4..68b8ca90b80 100644 --- a/pkg/client/unversioned/experimental.go +++ b/pkg/client/unversioned/experimental.go @@ -119,14 +119,20 @@ func NewExperimentalOrDie(c *Config) *ExperimentalClient { } func setExperimentalDefaults(config *Config) error { + // if experimental group is not registered, return an error + g, err := latest.Group("experimental") + if err != nil { + return err + } config.Prefix = "/experimental" if config.UserAgent == "" { config.UserAgent = DefaultKubernetesUserAgent() } if config.Version == "" { - config.Version = latest.GroupOrDie("experimental").Version + config.Version = g.Version } - versionInterfaces, err := latest.GroupOrDie("experimental").InterfacesFor(config.Version) + + versionInterfaces, err := g.InterfacesFor(config.Version) if err != nil { return fmt.Errorf("Experimental API version '%s' is not recognized (valid values: %s)", config.Version, strings.Join(latest.GroupOrDie("experimental").Versions, ", ")) diff --git a/pkg/client/unversioned/helper.go b/pkg/client/unversioned/helper.go index afe6ef242e3..66a3ef283e8 100644 --- a/pkg/client/unversioned/helper.go +++ b/pkg/client/unversioned/helper.go @@ -33,6 +33,7 @@ import ( "github.com/golang/glog" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/latest" + "k8s.io/kubernetes/pkg/api/registered" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util/sets" @@ -140,6 +141,10 @@ func New(c *Config) (*Client, error) { if err != nil { return nil, err } + + if len(registered.GroupVersionsForGroup("experimental")) == 0 { + return &Client{RESTClient: client, ExperimentalClient: nil}, nil + } experimentalConfig := *c experimentalClient, err := NewExperimental(&experimentalConfig) if err != nil {