From 9d43f7e52c5230ce483f1e7e4bd5b1ed5baee46b Mon Sep 17 00:00:00 2001 From: deads2k Date: Wed, 7 Sep 2016 16:29:57 -0400 Subject: [PATCH] convert more command to use a generated clientset --- pkg/kubectl/cmd/apiversions.go | 4 +-- pkg/kubectl/cmd/attach_test.go | 2 +- pkg/kubectl/cmd/clusterinfo_dump.go | 25 +++++++++--------- pkg/kubectl/cmd/cmd_test.go | 39 +++++++++++++++++++++++------ pkg/kubectl/cmd/drain.go | 29 +++++++++++++-------- pkg/kubectl/cmd/drain_test.go | 5 +++- pkg/kubectl/cmd/exec.go | 20 +++++++++------ pkg/kubectl/cmd/exec_test.go | 13 ++++------ pkg/kubectl/cmd/get.go | 5 ++-- pkg/kubectl/cmd/portforward.go | 21 ++++++++++------ pkg/kubectl/cmd/portforward_test.go | 23 +++++++---------- pkg/kubectl/cmd/util/factory.go | 10 +++++++- pkg/kubectl/cmd/version.go | 10 ++++++-- pkg/kubectl/version.go | 12 --------- 14 files changed, 130 insertions(+), 88 deletions(-) diff --git a/pkg/kubectl/cmd/apiversions.go b/pkg/kubectl/cmd/apiversions.go index d39665aad5b..db57693df11 100644 --- a/pkg/kubectl/cmd/apiversions.go +++ b/pkg/kubectl/cmd/apiversions.go @@ -47,12 +47,12 @@ func RunApiVersions(f *cmdutil.Factory, w io.Writer) error { printDeprecationWarning("api-versions", "apiversions") } - client, err := f.Client() + clientset, err := f.ClientSet() if err != nil { return err } - groupList, err := client.Discovery().ServerGroups() + groupList, err := clientset.Discovery().ServerGroups() if err != nil { return fmt.Errorf("Couldn't get available api versions from server: %v\n", err) } diff --git a/pkg/kubectl/cmd/attach_test.go b/pkg/kubectl/cmd/attach_test.go index 7676aa23167..458cdba133a 100644 --- a/pkg/kubectl/cmd/attach_test.go +++ b/pkg/kubectl/cmd/attach_test.go @@ -102,7 +102,7 @@ func TestPodAndContainerAttach(t *testing.T) { Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { return nil, nil }), } tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{} + tf.ClientConfig = defaultClientConfig() cmd := &cobra.Command{} options := test.p diff --git a/pkg/kubectl/cmd/clusterinfo_dump.go b/pkg/kubectl/cmd/clusterinfo_dump.go index 895f178c835..2d04da52333 100644 --- a/pkg/kubectl/cmd/clusterinfo_dump.go +++ b/pkg/kubectl/cmd/clusterinfo_dump.go @@ -25,7 +25,6 @@ import ( "github.com/spf13/cobra" "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" ) @@ -86,17 +85,17 @@ func setupOutputWriter(cmd *cobra.Command, defaultWriter io.Writer, filename str } func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out io.Writer) error { - var c *unversioned.Client - var err error - if c, err = f.Client(); err != nil { + clientset, err := f.ClientSet() + if err != nil { return err } + printer, _, err := kubectl.GetPrinter("json", "", false) if err != nil { return err } - nodes, err := c.Nodes().List(api.ListOptions{}) + nodes, err := clientset.Core().Nodes().List(api.ListOptions{}) if err != nil { return err } @@ -107,7 +106,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out var namespaces []string if cmdutil.GetFlagBool(cmd, "all-namespaces") { - namespaceList, err := c.Namespaces().List(api.ListOptions{}) + namespaceList, err := clientset.Core().Namespaces().List(api.ListOptions{}) if err != nil { return err } @@ -130,7 +129,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out for _, namespace := range namespaces { // TODO: this is repetitive in the extreme. Use reflection or // something to make this a for loop. - events, err := c.Events(namespace).List(api.ListOptions{}) + events, err := clientset.Core().Events(namespace).List(api.ListOptions{}) if err != nil { return err } @@ -138,7 +137,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out return err } - rcs, err := c.ReplicationControllers(namespace).List(api.ListOptions{}) + rcs, err := clientset.Core().ReplicationControllers(namespace).List(api.ListOptions{}) if err != nil { return err } @@ -146,7 +145,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out return err } - svcs, err := c.Services(namespace).List(api.ListOptions{}) + svcs, err := clientset.Core().Services(namespace).List(api.ListOptions{}) if err != nil { return err } @@ -154,7 +153,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out return err } - sets, err := c.DaemonSets(namespace).List(api.ListOptions{}) + sets, err := clientset.Extensions().DaemonSets(namespace).List(api.ListOptions{}) if err != nil { return err } @@ -162,7 +161,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out return err } - deps, err := c.Deployments(namespace).List(api.ListOptions{}) + deps, err := clientset.Extensions().Deployments(namespace).List(api.ListOptions{}) if err != nil { return err } @@ -170,7 +169,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out return err } - rps, err := c.ReplicaSets(namespace).List(api.ListOptions{}) + rps, err := clientset.Extensions().ReplicaSets(namespace).List(api.ListOptions{}) if err != nil { return err } @@ -178,7 +177,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out return err } - pods, err := c.Pods(namespace).List(api.ListOptions{}) + pods, err := clientset.Core().Pods(namespace).List(api.ListOptions{}) if err != nil { return err } diff --git a/pkg/kubectl/cmd/cmd_test.go b/pkg/kubectl/cmd/cmd_test.go index aa890bc21c6..4b7cd047aaf 100644 --- a/pkg/kubectl/cmd/cmd_test.go +++ b/pkg/kubectl/cmd/cmd_test.go @@ -37,7 +37,6 @@ import ( "k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/typed/discovery" client "k8s.io/kubernetes/pkg/client/unversioned" - clientset "k8s.io/kubernetes/pkg/client/unversioned/adapters/internalclientset" "k8s.io/kubernetes/pkg/client/unversioned/fake" "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -61,9 +60,22 @@ func defaultHeader() http.Header { func defaultClientConfig() *restclient.Config { return &restclient.Config{ + APIPath: "/api", ContentConfig: restclient.ContentConfig{ - ContentType: runtime.ContentTypeJSON, - GroupVersion: testapi.Default.GroupVersion(), + NegotiatedSerializer: api.Codecs, + ContentType: runtime.ContentTypeJSON, + GroupVersion: testapi.Default.GroupVersion(), + }, + } +} + +func defaultClientConfigForVersion(version *unversioned.GroupVersion) *restclient.Config { + return &restclient.Config{ + APIPath: "/api", + ContentConfig: restclient.ContentConfig{ + NegotiatedSerializer: api.Codecs, + ContentType: runtime.ContentTypeJSON, + GroupVersion: version, }, } } @@ -298,11 +310,24 @@ func NewAPIFactory() (*cmdutil.Factory, *testFactory, runtime.Codec, runtime.Neg return c, t.Err }, ClientSet: func() (*internalclientset.Clientset, error) { + // Swap out the HTTP client out of the client with the fake's version. fakeClient := t.Client.(*fake.RESTClient) - c := client.NewOrDie(t.ClientConfig) - c.Client = fakeClient.Client - c.ExtensionsClient.Client = fakeClient.Client - return clientset.FromUnversionedClient(c), nil + restClient, err := restclient.RESTClientFor(t.ClientConfig) + if err != nil { + panic(err) + } + restClient.Client = fakeClient.Client + return internalclientset.New(restClient), t.Err + }, + RESTClient: func() (*restclient.RESTClient, error) { + // Swap out the HTTP client out of the client with the fake's version. + fakeClient := t.Client.(*fake.RESTClient) + restClient, err := restclient.RESTClientFor(t.ClientConfig) + if err != nil { + panic(err) + } + restClient.Client = fakeClient.Client + return restClient, t.Err }, ClientForMapping: func(*meta.RESTMapping) (resource.RESTClient, error) { return t.Client, t.Err diff --git a/pkg/kubectl/cmd/drain.go b/pkg/kubectl/cmd/drain.go index 19d5e7bca2f..f21ac9c649b 100644 --- a/pkg/kubectl/cmd/drain.go +++ b/pkg/kubectl/cmd/drain.go @@ -28,7 +28,8 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/meta" - client "k8s.io/kubernetes/pkg/client/unversioned" + "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" + "k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/fields" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/resource" @@ -37,7 +38,8 @@ import ( ) type DrainOptions struct { - client *client.Client + client *internalclientset.Clientset + restClient *restclient.RESTClient factory *cmdutil.Factory Force bool GracePeriodSeconds int @@ -177,7 +179,12 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error { return cmdutil.UsageError(cmd, fmt.Sprintf("USAGE: %s [flags]", cmd.Use)) } - if o.client, err = o.factory.Client(); err != nil { + if o.client, err = o.factory.ClientSet(); err != nil { + return err + } + + o.restClient, err = o.factory.RESTClient() + if err != nil { return err } @@ -227,13 +234,13 @@ func (o *DrainOptions) RunDrain() error { func (o *DrainOptions) getController(sr *api.SerializedReference) (interface{}, error) { switch sr.Reference.Kind { case "ReplicationController": - return o.client.ReplicationControllers(sr.Reference.Namespace).Get(sr.Reference.Name) + return o.client.Core().ReplicationControllers(sr.Reference.Namespace).Get(sr.Reference.Name) case "DaemonSet": - return o.client.DaemonSets(sr.Reference.Namespace).Get(sr.Reference.Name) + return o.client.Extensions().DaemonSets(sr.Reference.Namespace).Get(sr.Reference.Name) case "Job": - return o.client.ExtensionsClient.Jobs(sr.Reference.Namespace).Get(sr.Reference.Name) + return o.client.Batch().Jobs(sr.Reference.Namespace).Get(sr.Reference.Name) case "ReplicaSet": - return o.client.ExtensionsClient.ReplicaSets(sr.Reference.Namespace).Get(sr.Reference.Name) + return o.client.Extensions().ReplicaSets(sr.Reference.Namespace).Get(sr.Reference.Name) } return nil, fmt.Errorf("Unknown controller kind %q", sr.Reference.Kind) } @@ -284,7 +291,7 @@ func (o *DrainOptions) daemonsetFilter(pod api.Pod) (bool, *warning, *fatal) { if sr == nil || sr.Reference.Kind != "DaemonSet" { return true, nil, nil } - if _, err := o.client.DaemonSets(sr.Reference.Namespace).Get(sr.Reference.Name); err != nil { + if _, err := o.client.Extensions().DaemonSets(sr.Reference.Namespace).Get(sr.Reference.Name); err != nil { return false, nil, &fatal{err.Error()} } if !o.IgnoreDaemonsets { @@ -335,7 +342,7 @@ func (ps podStatuses) Message() string { // getPodsForDeletion returns all the pods we're going to delete. If there are // any pods preventing us from deleting, we return that list in an error. func (o *DrainOptions) getPodsForDeletion() (pods []api.Pod, err error) { - podList, err := o.client.Pods(api.NamespaceAll).List(api.ListOptions{ + podList, err := o.client.Core().Pods(api.NamespaceAll).List(api.ListOptions{ FieldSelector: fields.SelectorFromSet(fields.Set{"spec.nodeName": o.nodeInfo.Name})}) if err != nil { return pods, err @@ -380,7 +387,7 @@ func (o *DrainOptions) deletePods(pods []api.Pod) error { } for _, pod := range pods { - err := o.client.Pods(pod.Namespace).Delete(pod.Name, &deleteOptions) + err := o.client.Core().Pods(pod.Namespace).Delete(pod.Name, &deleteOptions) if err != nil { return err } @@ -403,7 +410,7 @@ func (o *DrainOptions) RunCordonOrUncordon(desired bool) error { if unsched.Bool() == desired { cmdutil.PrintSuccess(o.mapper, false, o.out, o.nodeInfo.Mapping.Resource, o.nodeInfo.Name, already(desired)) } else { - helper := resource.NewHelper(o.client, o.nodeInfo.Mapping) + helper := resource.NewHelper(o.restClient, o.nodeInfo.Mapping) unsched.SetBool(desired) _, err := helper.Replace(cmdNamespace, o.nodeInfo.Name, true, o.nodeInfo.Object) if err != nil { diff --git a/pkg/kubectl/cmd/drain_test.go b/pkg/kubectl/cmd/drain_test.go index a1261b689a1..fd285c8cdf4 100644 --- a/pkg/kubectl/cmd/drain_test.go +++ b/pkg/kubectl/cmd/drain_test.go @@ -552,7 +552,10 @@ type MyReq struct { func (m *MyReq) isFor(method string, path string) bool { req := m.Request - return method == req.Method && (req.URL.Path == path || req.URL.Path == strings.Join([]string{"/api/v1", path}, "") || req.URL.Path == strings.Join([]string{"/apis/extensions/v1beta1", path}, "")) + return method == req.Method && (req.URL.Path == path || + req.URL.Path == strings.Join([]string{"/api/v1", path}, "") || + req.URL.Path == strings.Join([]string{"/apis/extensions/v1beta1", path}, "") || + req.URL.Path == strings.Join([]string{"/apis/batch/v1", path}, "")) } func refJson(t *testing.T, o runtime.Object) string { diff --git a/pkg/kubectl/cmd/exec.go b/pkg/kubectl/cmd/exec.go index baf8377e286..62c1f92f814 100644 --- a/pkg/kubectl/cmd/exec.go +++ b/pkg/kubectl/cmd/exec.go @@ -24,9 +24,10 @@ import ( dockerterm "github.com/docker/docker/pkg/term" "github.com/renstrom/dedent" "github.com/spf13/cobra" + "k8s.io/kubernetes/pkg/api" + coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" "k8s.io/kubernetes/pkg/client/restclient" - client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/client/unversioned/remotecommand" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" remotecommandserver "k8s.io/kubernetes/pkg/kubelet/server/remotecommand" @@ -132,7 +133,7 @@ type ExecOptions struct { FullCmdName string Executor RemoteExecutor - Client *client.Client + PodClient coreclient.PodsGetter Config *restclient.Config } @@ -172,11 +173,11 @@ func (p *ExecOptions) Complete(f *cmdutil.Factory, cmd *cobra.Command, argsIn [] } p.Config = config - client, err := f.Client() + clientset, err := f.ClientSet() if err != nil { return err } - p.Client = client + p.PodClient = clientset.Core() return nil } @@ -192,7 +193,7 @@ func (p *ExecOptions) Validate() error { if p.Out == nil || p.Err == nil { return fmt.Errorf("both output and error output must be provided") } - if p.Executor == nil || p.Client == nil || p.Config == nil { + if p.Executor == nil || p.PodClient == nil || p.Config == nil { return fmt.Errorf("client, client config, and executor must be provided") } return nil @@ -252,7 +253,7 @@ func (o *StreamOptions) setupTTY() term.TTY { // Run executes a validated remote execution against a pod. func (p *ExecOptions) Run() error { - pod, err := p.Client.Pods(p.Namespace).Get(p.PodName) + pod, err := p.PodClient.Pods(p.Namespace).Get(p.PodName) if err != nil { return err } @@ -283,8 +284,13 @@ func (p *ExecOptions) Run() error { } fn := func() error { + restClient, err := restclient.RESTClientFor(p.Config) + if err != nil { + return err + } + // TODO: consider abstracting into a client invocation or client helper - req := p.Client.RESTClient.Post(). + req := restClient.Post(). Resource("pods"). Name(pod.Name). Namespace(pod.Namespace). diff --git a/pkg/kubectl/cmd/exec_test.go b/pkg/kubectl/cmd/exec_test.go index 3340aef0294..3cf3c695b40 100644 --- a/pkg/kubectl/cmd/exec_test.go +++ b/pkg/kubectl/cmd/exec_test.go @@ -31,7 +31,6 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/unversioned/fake" "k8s.io/kubernetes/pkg/util/term" @@ -133,7 +132,7 @@ func TestPodAndContainer(t *testing.T) { Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { return nil, nil }), } tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{} + tf.ClientConfig = defaultClientConfig() cmd := &cobra.Command{} options := test.p @@ -162,20 +161,18 @@ func TestPodAndContainer(t *testing.T) { func TestExec(t *testing.T) { version := testapi.Default.GroupVersion().Version tests := []struct { - name, version, podPath, execPath, container string - pod *api.Pod - execErr bool + name, podPath, execPath, container string + pod *api.Pod + execErr bool }{ { name: "pod exec", - version: version, podPath: "/api/" + version + "/namespaces/test/pods/foo", execPath: "/api/" + version + "/namespaces/test/pods/foo/exec", pod: execPod(), }, { name: "pod exec error", - version: version, podPath: "/api/" + version + "/namespaces/test/pods/foo", execPath: "/api/" + version + "/namespaces/test/pods/foo/exec", pod: execPod(), @@ -199,7 +196,7 @@ func TestExec(t *testing.T) { }), } tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} + tf.ClientConfig = defaultClientConfig() bufOut := bytes.NewBuffer([]byte{}) bufErr := bytes.NewBuffer([]byte{}) bufIn := bytes.NewBuffer([]byte{}) diff --git a/pkg/kubectl/cmd/get.go b/pkg/kubectl/cmd/get.go index 620750b85fb..18434ea0fd6 100644 --- a/pkg/kubectl/cmd/get.go +++ b/pkg/kubectl/cmd/get.go @@ -22,6 +22,7 @@ import ( "github.com/renstrom/dedent" "github.com/spf13/cobra" + "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/kubectl" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -126,12 +127,12 @@ func NewCmdGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer) *cobra.Comma // TODO: convert all direct flag accessors to a struct and pass that instead of cmd func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Command, args []string, options *GetOptions) error { if len(options.Raw) > 0 { - client, err := f.Client() + restClient, err := f.RESTClient() if err != nil { return err } - stream, err := client.RESTClient.Get().RequestURI(options.Raw).Stream() + stream, err := restClient.Get().RequestURI(options.Raw).Stream() if err != nil { return err } diff --git a/pkg/kubectl/cmd/portforward.go b/pkg/kubectl/cmd/portforward.go index fae37584740..c78411464bd 100644 --- a/pkg/kubectl/cmd/portforward.go +++ b/pkg/kubectl/cmd/portforward.go @@ -25,9 +25,10 @@ import ( "github.com/renstrom/dedent" "github.com/spf13/cobra" + "k8s.io/kubernetes/pkg/api" + coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned" "k8s.io/kubernetes/pkg/client/restclient" - client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/client/unversioned/portforward" "k8s.io/kubernetes/pkg/client/unversioned/remotecommand" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -37,8 +38,9 @@ import ( type PortForwardOptions struct { Namespace string PodName string + RESTClient *restclient.RESTClient Config *restclient.Config - Client *client.Client + PodClient coreclient.PodsGetter Ports []string PortForwarder portForwarder StopChannel chan struct{} @@ -130,15 +132,20 @@ func (o *PortForwardOptions) Complete(f *cmdutil.Factory, cmd *cobra.Command, ar return err } - o.Client, err = f.Client() + clientset, err := f.ClientSet() if err != nil { return err } + o.PodClient = clientset.Core() o.Config, err = f.ClientConfig() if err != nil { return err } + o.RESTClient, err = f.RESTClient() + if err != nil { + return err + } o.StopChannel = make(chan struct{}, 1) o.ReadyChannel = make(chan struct{}) @@ -155,15 +162,15 @@ func (o PortForwardOptions) Validate() error { return fmt.Errorf("at least 1 PORT is required for port-forward") } - if o.PortForwarder == nil || o.Client == nil || o.Config == nil { - return fmt.Errorf("client, client config, and portforwarder must be provided") + if o.PortForwarder == nil || o.PodClient == nil || o.RESTClient == nil || o.Config == nil { + return fmt.Errorf("client, client config, restClient, and portforwarder must be provided") } return nil } // RunPortForward implements all the necessary functionality for port-forward cmd. func (o PortForwardOptions) RunPortForward() error { - pod, err := o.Client.Pods(o.Namespace).Get(o.PodName) + pod, err := o.PodClient.Pods(o.Namespace).Get(o.PodName) if err != nil { return err } @@ -183,7 +190,7 @@ func (o PortForwardOptions) RunPortForward() error { } }() - req := o.Client.RESTClient.Post(). + req := o.RESTClient.Post(). Resource("pods"). Namespace(o.Namespace). Name(pod.Name). diff --git a/pkg/kubectl/cmd/portforward_test.go b/pkg/kubectl/cmd/portforward_test.go index 45c4597367b..37ce5a4be26 100644 --- a/pkg/kubectl/cmd/portforward_test.go +++ b/pkg/kubectl/cmd/portforward_test.go @@ -27,8 +27,6 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/api/unversioned" - "k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/unversioned/fake" ) @@ -48,20 +46,19 @@ func TestPortForward(t *testing.T) { version := testapi.Default.GroupVersion().Version tests := []struct { - name, version, podPath, pfPath, container string - pod *api.Pod - pfErr bool + name string + podPath, pfPath, container string + pod *api.Pod + pfErr bool }{ { name: "pod portforward", - version: version, podPath: "/api/" + version + "/namespaces/test/pods/foo", pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", pod: execPod(), }, { name: "pod portforward error", - version: version, podPath: "/api/" + version + "/namespaces/test/pods/foo", pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", pod: execPod(), @@ -86,7 +83,7 @@ func TestPortForward(t *testing.T) { }), } tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} + tf.ClientConfig = defaultClientConfig() ff := &fakePortForwarder{} if test.pfErr { ff.pfErr = fmt.Errorf("pf error") @@ -130,20 +127,18 @@ func TestPortForwardWithPFlag(t *testing.T) { version := testapi.Default.GroupVersion().Version tests := []struct { - name, version, podPath, pfPath, container string - pod *api.Pod - pfErr bool + name, podPath, pfPath, container string + pod *api.Pod + pfErr bool }{ { name: "pod portforward", - version: version, podPath: "/api/" + version + "/namespaces/test/pods/foo", pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", pod: execPod(), }, { name: "pod portforward error", - version: version, podPath: "/api/" + version + "/namespaces/test/pods/foo", pfPath: "/api/" + version + "/namespaces/test/pods/foo/portforward", pod: execPod(), @@ -168,7 +163,7 @@ func TestPortForwardWithPFlag(t *testing.T) { }), } tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} + tf.ClientConfig = defaultClientConfig() ff := &fakePortForwarder{} if test.pfErr { ff.pfErr = fmt.Errorf("pf error") diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index b5b76d931b7..dc2d1bf1d1a 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -101,6 +101,8 @@ type Factory struct { Client func() (*client.Client, error) // ClientSet gives you back an internal, generated clientset ClientSet func() (*internalclientset.Clientset, error) + // Returns a RESTClient for accessing Kubernetes resources or an error. + RESTClient func() (*restclient.RESTClient, error) // Returns a client.Config for accessing the Kubernetes server. ClientConfig func() (*restclient.Config, error) // Returns a RESTClient for working with the specified RESTMapping or an error. This is intended @@ -421,7 +423,13 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { Client: func() (*client.Client, error) { return clients.ClientForVersion(nil) }, - + RESTClient: func() (*restclient.RESTClient, error) { + clientConfig, err := clients.ClientConfigForVersion(nil) + if err != nil { + return nil, err + } + return restclient.RESTClientFor(clientConfig) + }, ClientSet: func() (*internalclientset.Clientset, error) { cfg, err := clients.ClientConfigForVersion(nil) if err != nil { diff --git a/pkg/kubectl/cmd/version.go b/pkg/kubectl/cmd/version.go index c4ec598fea7..eb785330dab 100644 --- a/pkg/kubectl/cmd/version.go +++ b/pkg/kubectl/cmd/version.go @@ -17,6 +17,7 @@ limitations under the License. package cmd import ( + "fmt" "io" "github.com/spf13/cobra" @@ -45,11 +46,16 @@ func RunVersion(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command) error { return nil } - client, err := f.Client() + clientset, err := f.ClientSet() if err != nil { return err } - kubectl.GetServerVersion(out, client) + serverVersion, err := clientset.Discovery().ServerVersion() + if err != nil { + return err + } + + fmt.Fprintf(out, "Server Version: %#v\n", *serverVersion) return nil } diff --git a/pkg/kubectl/version.go b/pkg/kubectl/version.go index 8e32c2dcc54..d015df727fc 100644 --- a/pkg/kubectl/version.go +++ b/pkg/kubectl/version.go @@ -19,22 +19,10 @@ package kubectl import ( "fmt" "io" - "os" - client "k8s.io/kubernetes/pkg/client/unversioned" "k8s.io/kubernetes/pkg/version" ) -func GetServerVersion(w io.Writer, kubeClient client.Interface) { - serverVersion, err := kubeClient.Discovery().ServerVersion() - if err != nil { - fmt.Printf("Couldn't read server version from server: %v\n", err) - os.Exit(1) - } - - fmt.Fprintf(w, "Server Version: %#v\n", *serverVersion) -} - func GetClientVersion(w io.Writer) { fmt.Fprintf(w, "Client Version: %#v\n", version.Get()) }