From f27791c35b465b6e7a31c68fb13c0d31da7d45dd Mon Sep 17 00:00:00 2001 From: Matt Butcher Date: Thu, 27 Oct 2016 16:20:55 -0600 Subject: [PATCH] fix(tiller): allow 3rd party APIs This feature has been disabled in the past because simply enabling the feature causes the Kubernetes library to make requests to a server. Thus, running any tests that use the 'pkg/kube' library has required running a kube API server. This patch makes it possible to selectively activate 3rdParty API support, and then disables that support during testing. Future versions of the Kubernetes library appear to make it easier to configure and mock this behavior, so this is most likely a stop-gap measure. (Famous last words.) Closes #1472 --- pkg/kube/client.go | 18 ++++++++++++------ pkg/kube/client_test.go | 8 ++++++-- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 9e54930ed..17a4a1759 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -44,12 +44,20 @@ import ( // Client represents a client capable of communicating with the Kubernetes API. type Client struct { *cmdutil.Factory + // IncludeThirdPartyAPIs indicates whether to load "dynamic" APIs. + // + // This requires additional calls to the Kubernetes API server, and these calls + // are not supported by all versions. Additionally, during testing, initializing + // a client will still attempt to contact a live server. In these situations, + // this flag may need to be disabled. + IncludeThirdPartyAPIs bool } // New create a new Client func New(config clientcmd.ClientConfig) *Client { return &Client{ - Factory: cmdutil.NewFactory(config), + Factory: cmdutil.NewFactory(config), + IncludeThirdPartyAPIs: true, } } @@ -145,7 +153,7 @@ func (c *Client) Get(namespace string, reader io.Reader) (string, error) { // // Namespace will set the namespaces func (c *Client) Update(namespace string, currentReader, targetReader io.Reader) error { - current := c.NewBuilder(includeThirdPartyAPIs). + current := c.NewBuilder(c.IncludeThirdPartyAPIs). ContinueOnError(). NamespaceParam(namespace). DefaultNamespace(). @@ -153,7 +161,7 @@ func (c *Client) Update(namespace string, currentReader, targetReader io.Reader) Flatten(). Do() - target := c.NewBuilder(includeThirdPartyAPIs). + target := c.NewBuilder(c.IncludeThirdPartyAPIs). ContinueOnError(). NamespaceParam(namespace). DefaultNamespace(). @@ -275,10 +283,8 @@ func (c *Client) WatchUntilReady(namespace string, reader io.Reader) error { return perform(c, namespace, reader, watchUntilReady) } -const includeThirdPartyAPIs = false - func perform(c *Client, namespace string, reader io.Reader, fn ResourceActorFunc) error { - r := c.NewBuilder(includeThirdPartyAPIs). + r := c.NewBuilder(c.IncludeThirdPartyAPIs). ContinueOnError(). NamespaceParam(namespace). DefaultNamespace(). diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index 168488d82..7cf5b8246 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -101,6 +101,7 @@ func TestPerform(t *testing.T) { } c := New(nil) + c.IncludeThirdPartyAPIs = false c.ClientForMapping = func(mapping *meta.RESTMapping) (resource.RESTClient, error) { return &fake.RESTClient{}, nil } @@ -121,12 +122,15 @@ func TestPerform(t *testing.T) { func TestReal(t *testing.T) { t.Skip("This is a live test, comment this line to run") - if err := New(nil).Create("test", strings.NewReader(guestbookManifest)); err != nil { + c := New(nil) + c.IncludeThirdPartyAPIs = false + if err := c.Create("test", strings.NewReader(guestbookManifest)); err != nil { t.Fatal(err) } testSvcEndpointManifest := testServiceManifest + "\n---\n" + testEndpointManifest - c := New(nil) + c = New(nil) + c.IncludeThirdPartyAPIs = false if err := c.Create("test-delete", strings.NewReader(testSvcEndpointManifest)); err != nil { t.Fatal(err) }