From 1d5e5532ed70001cfde986ce873fc6d18ef550fe Mon Sep 17 00:00:00 2001 From: deads2k Date: Tue, 6 Sep 2016 14:23:54 -0400 Subject: [PATCH] add ClientSet to factory to remove non-generated client --- pkg/kubectl/cmd/attach.go | 22 +++++++++++++--------- pkg/kubectl/cmd/attach_test.go | 6 +++--- pkg/kubectl/cmd/cmd_test.go | 9 +++++++++ pkg/kubectl/cmd/run.go | 15 +++++++++++++-- pkg/kubectl/cmd/util/factory.go | 12 ++++++++++++ 5 files changed, 50 insertions(+), 14 deletions(-) diff --git a/pkg/kubectl/cmd/attach.go b/pkg/kubectl/cmd/attach.go index a5e9005cde0..de21a0d636b 100644 --- a/pkg/kubectl/cmd/attach.go +++ b/pkg/kubectl/cmd/attach.go @@ -26,8 +26,8 @@ import ( "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" @@ -107,9 +107,9 @@ type AttachOptions struct { Pod *api.Pod - Attach RemoteAttach - Client *client.Client - Config *restclient.Config + Attach RemoteAttach + PodClient coreclient.PodsGetter + Config *restclient.Config } // Complete verifies command line arguments and loads data from the command environment @@ -134,11 +134,11 @@ func (p *AttachOptions) 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() if p.CommandName == "" { p.CommandName = cmd.CommandPath() @@ -156,7 +156,7 @@ func (p *AttachOptions) Validate() error { if p.Out == nil || p.Err == nil { allErrs = append(allErrs, fmt.Errorf("both output and error output must be provided")) } - if p.Attach == nil || p.Client == nil || p.Config == nil { + if p.Attach == nil || p.PodClient == nil || p.Config == nil { allErrs = append(allErrs, fmt.Errorf("client, client config, and attach must be provided")) } return utilerrors.NewAggregate(allErrs) @@ -165,7 +165,7 @@ func (p *AttachOptions) Validate() error { // Run executes a validated remote execution against a pod. func (p *AttachOptions) Run() error { if p.Pod == nil { - 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 } @@ -225,8 +225,12 @@ func (p *AttachOptions) Run() error { fmt.Fprintln(stderr, "If you don't see a command prompt, try pressing enter.") } + 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/attach_test.go b/pkg/kubectl/cmd/attach_test.go index fe43e90788e..7676aa23167 100644 --- a/pkg/kubectl/cmd/attach_test.go +++ b/pkg/kubectl/cmd/attach_test.go @@ -178,7 +178,7 @@ func TestAttach(t *testing.T) { }), } tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} + tf.ClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs, GroupVersion: &unversioned.GroupVersion{Version: test.version}}} bufOut := bytes.NewBuffer([]byte{}) bufErr := bytes.NewBuffer([]byte{}) bufIn := bytes.NewBuffer([]byte{}) @@ -212,7 +212,7 @@ func TestAttach(t *testing.T) { continue } if remoteAttach.url.Path != test.attachPath { - t.Errorf("%s: Did not get expected path for exec request", test.name) + t.Errorf("%s: Did not get expected path for exec request: %q %q", test.name, test.attachPath, remoteAttach.url.Path) continue } if remoteAttach.method != "POST" { @@ -257,7 +257,7 @@ func TestAttachWarnings(t *testing.T) { }), } tf.Namespace = "test" - tf.ClientConfig = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &unversioned.GroupVersion{Version: test.version}}} + tf.ClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs, GroupVersion: &unversioned.GroupVersion{Version: test.version}}} bufOut := bytes.NewBuffer([]byte{}) bufErr := bytes.NewBuffer([]byte{}) bufIn := bytes.NewBuffer([]byte{}) diff --git a/pkg/kubectl/cmd/cmd_test.go b/pkg/kubectl/cmd/cmd_test.go index cf7d1af6488..b3f3d4af13a 100644 --- a/pkg/kubectl/cmd/cmd_test.go +++ b/pkg/kubectl/cmd/cmd_test.go @@ -33,9 +33,11 @@ import ( "k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/validation" + "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "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" @@ -295,6 +297,13 @@ func NewAPIFactory() (*cmdutil.Factory, *testFactory, runtime.Codec, runtime.Neg c.ExtensionsClient.Client = fakeClient.Client return c, t.Err }, + ClientSet: func() (*internalclientset.Clientset, error) { + fakeClient := t.Client.(*fake.RESTClient) + c := client.NewOrDie(t.ClientConfig) + c.Client = fakeClient.Client + c.ExtensionsClient.Client = fakeClient.Client + return clientset.FromUnversionedClient(c), nil + }, ClientForMapping: func(*meta.RESTMapping) (resource.RESTClient, error) { return t.Client, t.Err }, diff --git a/pkg/kubectl/cmd/run.go b/pkg/kubectl/cmd/run.go index a07eba94408..2827d07b755 100644 --- a/pkg/kubectl/cmd/run.go +++ b/pkg/kubectl/cmd/run.go @@ -274,7 +274,12 @@ func Run(f *cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cob if err != nil { return err } - opts.Client = client + + clientset, err := f.ClientSet() + if err != nil { + return err + } + opts.PodClient = clientset.Core() attachablePod, err := f.AttachablePodForObject(obj) if err != nil { @@ -475,7 +480,13 @@ func handleAttachPod(f *cmdutil.Factory, c *client.Client, ns, name string, opts _, err = io.Copy(opts.Out, readCloser) return err } - opts.Client = c + + clientset, err := f.ClientSet() + if err != nil { + return nil + } + opts.PodClient = clientset.Core() + opts.PodName = name opts.Namespace = ns if err := opts.Run(); err != nil { diff --git a/pkg/kubectl/cmd/util/factory.go b/pkg/kubectl/cmd/util/factory.go index 4e7401f6fff..0e3cd93dd05 100644 --- a/pkg/kubectl/cmd/util/factory.go +++ b/pkg/kubectl/cmd/util/factory.go @@ -54,6 +54,7 @@ import ( "k8s.io/kubernetes/pkg/apis/policy" "k8s.io/kubernetes/pkg/apis/rbac" "k8s.io/kubernetes/pkg/apis/storage" + "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/typed/discovery" "k8s.io/kubernetes/pkg/client/typed/dynamic" @@ -98,6 +99,8 @@ type Factory struct { JSONEncoder func() runtime.Encoder // Returns a client for accessing Kubernetes resources or an error. Client func() (*client.Client, error) + // ClientSet gives you back an internal, generated clientset + ClientSet func() (*internalclientset.Clientset, 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 @@ -406,6 +409,15 @@ func NewFactory(optionalClientConfig clientcmd.ClientConfig) *Factory { Client: func() (*client.Client, error) { return clients.ClientForVersion(nil) }, + + ClientSet: func() (*internalclientset.Clientset, error) { + cfg, err := clients.ClientConfigForVersion(nil) + if err != nil { + return nil, err + } + + return internalclientset.NewForConfig(cfg) + }, ClientConfig: func() (*restclient.Config, error) { return clients.ClientConfigForVersion(nil) },