From ea3be9e3b24191bdefabc87e8f2fe445d071c1f3 Mon Sep 17 00:00:00 2001
From: Adam Reese <adam@reese.io>
Date: Wed, 7 Dec 2016 15:55:54 -0800
Subject: [PATCH] feat(*): migrate to kubernetes 1.5

---
 cmd/helm/helm.go                           |  10 +-
 cmd/helm/init.go                           |  13 +-
 cmd/helm/init_test.go                      |  54 ++--
 cmd/helm/installer/install.go              |  23 +-
 cmd/helm/installer/install_test.go         |  27 +-
 cmd/helm/tunnel.go                         |  10 +-
 cmd/helm/tunnel_test.go                    |   6 +-
 cmd/tiller/tiller.go                       |   4 +-
 glide.lock                                 | 273 ++++++++++-----------
 glide.yaml                                 |  27 +-
 pkg/kube/client.go                         |  17 +-
 pkg/kube/client_test.go                    |  21 +-
 pkg/kube/tunnel.go                         |   4 +-
 pkg/storage/driver/cfgmaps.go              |  13 +-
 pkg/storage/driver/mock_test.go            |   6 +-
 pkg/tiller/environment/environment.go      |  14 +-
 pkg/tiller/environment/environment_test.go |  10 +-
 pkg/tiller/release_server.go               |  11 +-
 18 files changed, 259 insertions(+), 284 deletions(-)

diff --git a/cmd/helm/helm.go b/cmd/helm/helm.go
index a283c8aba..64212dcc7 100644
--- a/cmd/helm/helm.go
+++ b/cmd/helm/helm.go
@@ -28,18 +28,18 @@ import (
 	"github.com/spf13/cobra"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/grpclog"
+	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
 	"k8s.io/kubernetes/pkg/client/restclient"
-	"k8s.io/kubernetes/pkg/client/unversioned"
 
 	"k8s.io/helm/cmd/helm/helmpath"
 	"k8s.io/helm/pkg/kube"
+	"k8s.io/helm/pkg/tiller/environment"
 )
 
 const (
 	localRepoIndexFilePath = "index.yaml"
 	homeEnvVar             = "HELM_HOME"
 	hostEnvVar             = "HELM_HOST"
-	tillerNamespace        = "kube-system"
 )
 
 var (
@@ -145,7 +145,7 @@ func main() {
 
 func setupConnection(c *cobra.Command, args []string) error {
 	if tillerHost == "" {
-		tunnel, err := newTillerPortForwarder(tillerNamespace, kubeContext)
+		tunnel, err := newTillerPortForwarder(environment.TillerNamespace, kubeContext)
 		if err != nil {
 			return err
 		}
@@ -199,12 +199,12 @@ func homePath() string {
 
 // getKubeClient is a convenience method for creating kubernetes config and client
 // for a given kubeconfig context
-func getKubeClient(context string) (*restclient.Config, *unversioned.Client, error) {
+func getKubeClient(context string) (*restclient.Config, *internalclientset.Clientset, error) {
 	config, err := kube.GetConfig(context).ClientConfig()
 	if err != nil {
 		return nil, nil, fmt.Errorf("could not get kubernetes config for context '%s': %s", context, err)
 	}
-	client, err := unversioned.New(config)
+	client, err := internalclientset.NewForConfig(config)
 	if err != nil {
 		return nil, nil, fmt.Errorf("could not get kubernetes client: %s", err)
 	}
diff --git a/cmd/helm/init.go b/cmd/helm/init.go
index d3e60f629..c7a9b24c8 100644
--- a/cmd/helm/init.go
+++ b/cmd/helm/init.go
@@ -24,11 +24,12 @@ import (
 
 	"github.com/spf13/cobra"
 	kerrors "k8s.io/kubernetes/pkg/api/errors"
-	"k8s.io/kubernetes/pkg/client/unversioned"
+	extensionsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion"
 
 	"k8s.io/helm/cmd/helm/helmpath"
 	"k8s.io/helm/cmd/helm/installer"
 	"k8s.io/helm/pkg/repo"
+	"k8s.io/helm/pkg/tiller/environment"
 )
 
 const initDesc = `
@@ -65,15 +66,17 @@ type initCmd struct {
 	image      string
 	clientOnly bool
 	canary     bool
+	namespace  string
 	dryRun     bool
 	out        io.Writer
 	home       helmpath.Home
-	kubeClient unversioned.DeploymentsNamespacer
+	kubeClient extensionsclient.DeploymentsGetter
 }
 
 func newInitCmd(out io.Writer) *cobra.Command {
 	i := &initCmd{
-		out: out,
+		out:       out,
+		namespace: environment.TillerNamespace,
 	}
 
 	cmd := &cobra.Command{
@@ -102,7 +105,7 @@ func newInitCmd(out io.Writer) *cobra.Command {
 func (i *initCmd) run() error {
 
 	if flagDebug {
-		m, err := installer.DeploymentManifest(i.image, i.canary)
+		m, err := installer.DeploymentManifest(i.namespace, i.image, i.canary)
 		if err != nil {
 			return err
 		}
@@ -124,7 +127,7 @@ func (i *initCmd) run() error {
 			}
 			i.kubeClient = c
 		}
-		if err := installer.Install(i.kubeClient, tillerNamespace, i.image, i.canary, flagDebug); err != nil {
+		if err := installer.Install(i.kubeClient, i.namespace, i.image, i.canary, flagDebug); err != nil {
 			if !kerrors.IsAlreadyExists(err) {
 				return fmt.Errorf("error installing: %s", err)
 			}
diff --git a/cmd/helm/init_test.go b/cmd/helm/init_test.go
index f341d8745..7ad617570 100644
--- a/cmd/helm/init_test.go
+++ b/cmd/helm/init_test.go
@@ -27,7 +27,9 @@ import (
 
 	"k8s.io/kubernetes/pkg/api"
 	"k8s.io/kubernetes/pkg/api/errors"
-	"k8s.io/kubernetes/pkg/client/unversioned/testclient"
+	"k8s.io/kubernetes/pkg/apis/extensions"
+	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
+	testcore "k8s.io/kubernetes/pkg/client/testing/core"
 	"k8s.io/kubernetes/pkg/runtime"
 
 	"k8s.io/helm/cmd/helm/helmpath"
@@ -41,14 +43,19 @@ func TestInitCmd(t *testing.T) {
 	defer os.Remove(home)
 
 	var buf bytes.Buffer
-	fake := testclient.Fake{}
-	cmd := &initCmd{out: &buf, home: helmpath.Home(home), kubeClient: fake.Extensions()}
+	fc := fake.NewSimpleClientset()
+	cmd := &initCmd{
+		out:        &buf,
+		home:       helmpath.Home(home),
+		kubeClient: fc.Extensions(),
+		namespace:  api.NamespaceDefault,
+	}
 	if err := cmd.run(); err != nil {
 		t.Errorf("expected error: %v", err)
 	}
-	actions := fake.Actions()
-	if action, ok := actions[0].(testclient.CreateAction); !ok || action.GetResource() != "deployments" {
-		t.Errorf("unexpected action: %v, expected create deployment", actions[0])
+	action := fc.Actions()[0]
+	if !action.Matches("create", "deployments") {
+		t.Errorf("unexpected action: %v, expected create deployment", action)
 	}
 	expected := "Tiller (the helm server side component) has been installed into your Kubernetes Cluster."
 	if !strings.Contains(buf.String(), expected) {
@@ -64,11 +71,21 @@ func TestInitCmd_exsits(t *testing.T) {
 	defer os.Remove(home)
 
 	var buf bytes.Buffer
-	fake := testclient.Fake{}
-	fake.AddReactor("*", "*", func(action testclient.Action) (bool, runtime.Object, error) {
+	fc := fake.NewSimpleClientset(&extensions.Deployment{
+		ObjectMeta: api.ObjectMeta{
+			Namespace: api.NamespaceDefault,
+			Name:      "tiller-deploy",
+		},
+	})
+	fc.AddReactor("*", "*", func(action testcore.Action) (bool, runtime.Object, error) {
 		return true, nil, errors.NewAlreadyExists(api.Resource("deployments"), "1")
 	})
-	cmd := &initCmd{out: &buf, home: helmpath.Home(home), kubeClient: fake.Extensions()}
+	cmd := &initCmd{
+		out:        &buf,
+		home:       helmpath.Home(home),
+		kubeClient: fc.Extensions(),
+		namespace:  api.NamespaceDefault,
+	}
 	if err := cmd.run(); err != nil {
 		t.Errorf("expected error: %v", err)
 	}
@@ -86,12 +103,18 @@ func TestInitCmd_clientOnly(t *testing.T) {
 	defer os.Remove(home)
 
 	var buf bytes.Buffer
-	fake := testclient.Fake{}
-	cmd := &initCmd{out: &buf, home: helmpath.Home(home), kubeClient: fake.Extensions(), clientOnly: true}
+	fc := fake.NewSimpleClientset()
+	cmd := &initCmd{
+		out:        &buf,
+		home:       helmpath.Home(home),
+		kubeClient: fc.Extensions(),
+		clientOnly: true,
+		namespace:  api.NamespaceDefault,
+	}
 	if err := cmd.run(); err != nil {
 		t.Errorf("unexpected error: %v", err)
 	}
-	if len(fake.Actions()) != 0 {
+	if len(fc.Actions()) != 0 {
 		t.Error("expected client call")
 	}
 	expected := "Not installing tiller due to 'client-only' flag having been set"
@@ -114,18 +137,19 @@ func TestInitCmd_dryRun(t *testing.T) {
 	}()
 
 	var buf bytes.Buffer
-	fake := testclient.Fake{}
+	fc := fake.NewSimpleClientset()
 	cmd := &initCmd{
 		out:        &buf,
 		home:       helmpath.Home(home),
-		kubeClient: fake.Extensions(),
+		kubeClient: fc.Extensions(),
 		clientOnly: true,
 		dryRun:     true,
+		namespace:  api.NamespaceDefault,
 	}
 	if err := cmd.run(); err != nil {
 		t.Fatal(err)
 	}
-	if len(fake.Actions()) != 0 {
+	if len(fc.Actions()) != 0 {
 		t.Error("expected no server calls")
 	}
 
diff --git a/cmd/helm/installer/install.go b/cmd/helm/installer/install.go
index e84aece71..f82a9cb7d 100644
--- a/cmd/helm/installer/install.go
+++ b/cmd/helm/installer/install.go
@@ -23,7 +23,7 @@ import (
 
 	"k8s.io/kubernetes/pkg/api"
 	"k8s.io/kubernetes/pkg/apis/extensions"
-	"k8s.io/kubernetes/pkg/client/unversioned"
+	extensionsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion"
 	"k8s.io/kubernetes/pkg/util/intstr"
 
 	"k8s.io/helm/pkg/version"
@@ -37,27 +37,27 @@ const defaultImage = "gcr.io/kubernetes-helm/tiller"
 // command failed.
 //
 // If verbose is true, this will print the manifest to stdout.
-func Install(client unversioned.DeploymentsNamespacer, namespace, image string, canary, verbose bool) error {
-	obj := deployment(image, canary)
-	_, err := client.Deployments(namespace).Create(obj)
+func Install(client extensionsclient.DeploymentsGetter, namespace, image string, canary, verbose bool) error {
+	obj := deployment(namespace, image, canary)
+	_, err := client.Deployments(obj.Namespace).Create(obj)
 	return err
 }
 
 // deployment gets the deployment object that installs Tiller.
-func deployment(image string, canary bool) *extensions.Deployment {
+func deployment(namespace, image string, canary bool) *extensions.Deployment {
 	switch {
 	case canary:
 		image = defaultImage + ":canary"
 	case image == "":
 		image = fmt.Sprintf("%s:%s", defaultImage, version.Version)
 	}
-	return generateDeployment(image)
+	return generateDeployment(namespace, image)
 }
 
 // DeploymentManifest gets the manifest (as a string) that describes the Tiller Deployment
 // resource.
-func DeploymentManifest(image string, canary bool) (string, error) {
-	obj := deployment(image, canary)
+func DeploymentManifest(namespace, image string, canary bool) (string, error) {
+	obj := deployment(namespace, image, canary)
 
 	buf, err := yaml.Marshal(obj)
 	return string(buf), err
@@ -68,12 +68,13 @@ func generateLabels(labels map[string]string) map[string]string {
 	return labels
 }
 
-func generateDeployment(image string) *extensions.Deployment {
+func generateDeployment(namespace, image string) *extensions.Deployment {
 	labels := generateLabels(map[string]string{"name": "tiller"})
 	d := &extensions.Deployment{
 		ObjectMeta: api.ObjectMeta{
-			Name:   "tiller-deploy",
-			Labels: labels,
+			Namespace: namespace,
+			Name:      "tiller-deploy",
+			Labels:    labels,
 		},
 		Spec: extensions.DeploymentSpec{
 			Replicas: 1,
diff --git a/cmd/helm/installer/install_test.go b/cmd/helm/installer/install_test.go
index 00a02eb64..7a43660ac 100644
--- a/cmd/helm/installer/install_test.go
+++ b/cmd/helm/installer/install_test.go
@@ -21,12 +21,13 @@ import (
 	"testing"
 
 	"github.com/ghodss/yaml"
-
-	"k8s.io/helm/pkg/version"
-
+	"k8s.io/kubernetes/pkg/api"
 	"k8s.io/kubernetes/pkg/apis/extensions"
-	"k8s.io/kubernetes/pkg/client/unversioned/testclient"
+	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
+	testcore "k8s.io/kubernetes/pkg/client/testing/core"
 	"k8s.io/kubernetes/pkg/runtime"
+
+	"k8s.io/helm/pkg/version"
 )
 
 func TestDeploymentManifest(t *testing.T) {
@@ -44,7 +45,7 @@ func TestDeploymentManifest(t *testing.T) {
 
 	for _, tt := range tests {
 
-		o, err := DeploymentManifest(tt.image, tt.canary)
+		o, err := DeploymentManifest(api.NamespaceDefault, tt.image, tt.canary)
 		if err != nil {
 			t.Fatalf("%s: error %q", tt.name, err)
 		}
@@ -62,9 +63,9 @@ func TestDeploymentManifest(t *testing.T) {
 func TestInstall(t *testing.T) {
 	image := "gcr.io/kubernetes-helm/tiller:v2.0.0"
 
-	fake := testclient.Fake{}
-	fake.AddReactor("create", "deployments", func(action testclient.Action) (bool, runtime.Object, error) {
-		obj := action.(testclient.CreateAction).GetObject().(*extensions.Deployment)
+	fake := fake.NewSimpleClientset()
+	fake.AddReactor("create", "deployments", func(action testcore.Action) (bool, runtime.Object, error) {
+		obj := action.(testcore.CreateAction).GetObject().(*extensions.Deployment)
 		l := obj.GetLabels()
 		if reflect.DeepEqual(l, map[string]string{"app": "helm"}) {
 			t.Errorf("expected labels = '', got '%s'", l)
@@ -76,16 +77,16 @@ func TestInstall(t *testing.T) {
 		return true, obj, nil
 	})
 
-	err := Install(fake.Extensions(), "default", image, false, false)
+	err := Install(fake.Extensions(), api.NamespaceDefault, image, false, false)
 	if err != nil {
 		t.Errorf("unexpected error: %#+v", err)
 	}
 }
 
 func TestInstall_canary(t *testing.T) {
-	fake := testclient.Fake{}
-	fake.AddReactor("create", "deployments", func(action testclient.Action) (bool, runtime.Object, error) {
-		obj := action.(testclient.CreateAction).GetObject().(*extensions.Deployment)
+	fake := fake.NewSimpleClientset()
+	fake.AddReactor("create", "deployments", func(action testcore.Action) (bool, runtime.Object, error) {
+		obj := action.(testcore.CreateAction).GetObject().(*extensions.Deployment)
 		i := obj.Spec.Template.Spec.Containers[0].Image
 		if i != "gcr.io/kubernetes-helm/tiller:canary" {
 			t.Errorf("expected canary image, got '%s'", i)
@@ -93,7 +94,7 @@ func TestInstall_canary(t *testing.T) {
 		return true, obj, nil
 	})
 
-	err := Install(fake.Extensions(), "default", "", true, false)
+	err := Install(fake.Extensions(), api.NamespaceDefault, "", true, false)
 	if err != nil {
 		t.Errorf("unexpected error: %#+v", err)
 	}
diff --git a/cmd/helm/tunnel.go b/cmd/helm/tunnel.go
index 6b5142397..67dad1007 100644
--- a/cmd/helm/tunnel.go
+++ b/cmd/helm/tunnel.go
@@ -20,7 +20,7 @@ import (
 	"fmt"
 
 	"k8s.io/kubernetes/pkg/api"
-	"k8s.io/kubernetes/pkg/client/unversioned"
+	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
 	"k8s.io/kubernetes/pkg/labels"
 
 	"k8s.io/helm/pkg/kube"
@@ -35,16 +35,16 @@ func newTillerPortForwarder(namespace, context string) (*kube.Tunnel, error) {
 		return nil, err
 	}
 
-	podName, err := getTillerPodName(client, namespace)
+	podName, err := getTillerPodName(client.Core(), namespace)
 	if err != nil {
 		return nil, err
 	}
 	const tillerPort = 44134
-	t := kube.NewTunnel(client.RESTClient, config, namespace, podName, tillerPort)
+	t := kube.NewTunnel(client.Core().RESTClient(), config, namespace, podName, tillerPort)
 	return t, t.ForwardPort()
 }
 
-func getTillerPodName(client unversioned.PodsNamespacer, namespace string) (string, error) {
+func getTillerPodName(client internalversion.PodsGetter, namespace string) (string, error) {
 	// TODO use a const for labels
 	selector := labels.Set{"app": "helm", "name": "tiller"}.AsSelector()
 	pod, err := getFirstRunningPod(client, namespace, selector)
@@ -54,7 +54,7 @@ func getTillerPodName(client unversioned.PodsNamespacer, namespace string) (stri
 	return pod.ObjectMeta.GetName(), nil
 }
 
-func getFirstRunningPod(client unversioned.PodsNamespacer, namespace string, selector labels.Selector) (*api.Pod, error) {
+func getFirstRunningPod(client internalversion.PodsGetter, namespace string, selector labels.Selector) (*api.Pod, error) {
 	options := api.ListOptions{LabelSelector: selector}
 	pods, err := client.Pods(namespace).List(options)
 	if err != nil {
diff --git a/cmd/helm/tunnel_test.go b/cmd/helm/tunnel_test.go
index 511a67a74..e7e862b51 100644
--- a/cmd/helm/tunnel_test.go
+++ b/cmd/helm/tunnel_test.go
@@ -20,7 +20,7 @@ import (
 	"testing"
 
 	"k8s.io/kubernetes/pkg/api"
-	"k8s.io/kubernetes/pkg/client/unversioned/testclient"
+	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
 )
 
 func mockTillerPod() api.Pod {
@@ -74,8 +74,8 @@ func TestGetFirstPod(t *testing.T) {
 	}
 
 	for _, tt := range tests {
-		client := testclient.NewSimpleFake(&api.PodList{Items: tt.pods})
-		name, err := getTillerPodName(client, api.NamespaceDefault)
+		client := fake.NewSimpleClientset(&api.PodList{Items: tt.pods})
+		name, err := getTillerPodName(client.Core(), api.NamespaceDefault)
 		if (err != nil) != tt.err {
 			t.Errorf("%q. expected error: %v, got %v", tt.name, tt.err, err)
 		}
diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go
index 188eddfec..c69bca631 100644
--- a/cmd/tiller/tiller.go
+++ b/cmd/tiller/tiller.go
@@ -84,11 +84,11 @@ func start(c *cobra.Command, args []string) {
 	case storageMemory:
 		env.Releases = storage.Init(driver.NewMemory())
 	case storageConfigMap:
-		c, err := env.KubeClient.APIClient()
+		c, err := env.KubeClient.ClientSet()
 		if err != nil {
 			fmt.Fprintf(os.Stderr, "Cannot initialize Kubernetes connection: %s", err)
 		}
-		env.Releases = storage.Init(driver.NewConfigMaps(c.ConfigMaps(environment.TillerNamespace)))
+		env.Releases = storage.Init(driver.NewConfigMaps(c.Core().ConfigMaps(environment.TillerNamespace)))
 	}
 
 	lstn, err := net.Listen("tcp", grpcAddr)
diff --git a/glide.lock b/glide.lock
index 0f309e1c6..941e52084 100644
--- a/glide.lock
+++ b/glide.lock
@@ -1,5 +1,5 @@
-hash: 8ae84a3225f6cc31f91cc42dc8cf816792a989838254964cdcaaa57c75c37cdc
-updated: 2016-12-01T17:35:05.940550036-07:00
+hash: 6dbe387bb0b38607db6406c3b0aed26e2b13a7f76d7dbe6820fbc667284a3980
+updated: 2016-12-06T14:33:22.004573524-08:00
 imports:
 - name: cloud.google.com/go
   version: 3b1ae45394a234c385be014e9a488f2bb6eef821
@@ -17,22 +17,13 @@ imports:
 - name: github.com/blang/semver
   version: 31b736133b98f26d5e078ec9eb591666edfd091f
 - name: github.com/coreos/go-oidc
-  version: 5cf2aa52da8c574d3aa4458f471ad6ae2240fe6b
+  version: 5644a2f50e2d2d5ba0b474bc5bc55fea1925936d
   subpackages:
   - http
   - jose
   - key
   - oauth2
   - oidc
-- name: github.com/coreos/go-systemd
-  version: 4484981625c1a6a2ecb40a390fcb6a9bcfee76e3
-  subpackages:
-  - activation
-  - daemon
-  - dbus
-  - journal
-  - unit
-  - util
 - name: github.com/coreos/pkg
   version: fa29b1d70f0beaddd4c7021607cc3c3be8ce94b8
   subpackages:
@@ -49,6 +40,8 @@ imports:
   version: 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d
   subpackages:
   - spew
+- name: github.com/dgrijalva/jwt-go
+  version: 01aeca54ebda6e0fbfafd0a524d234159c05ec20
 - name: github.com/docker/distribution
   version: cd27f179f2c10c5d300e6d09025b538c475b0d51
   subpackages:
@@ -101,8 +94,18 @@ imports:
   - swagger
 - name: github.com/evanphx/json-patch
   version: 465937c80b3c07a7c7ad20cc934898646a91c1de
+- name: github.com/exponent-io/jsonpath
+  version: d6023ce2651d8eafb5c75bb0c7167536102ec9f5
 - name: github.com/ghodss/yaml
   version: 73d445a93680fa1a78ae23a5839bad48f32ba1ee
+- name: github.com/go-openapi/jsonpointer
+  version: 46af16f9f7b149af66e5d1bd010e3574dc06de98
+- name: github.com/go-openapi/jsonreference
+  version: 13c6e3589ad90f49bd3e3bbe2c2cb3d7a4142272
+- name: github.com/go-openapi/spec
+  version: 6aced65f8501fe1217321abf0749d354824ba2ff
+- name: github.com/go-openapi/swag
+  version: 1d0bd113de87027671077d3c71eb3ac5d7dbba72
 - name: github.com/gobwas/glob
   version: 0354991b92587e2742549d3036f3b5bae5ab03f2
   subpackages:
@@ -153,50 +156,6 @@ imports:
   - proto
   - ptypes/any
   - ptypes/timestamp
-- name: github.com/google/cadvisor
-  version: a726d13de8cb32860e73d72a78dc8e0124267709
-  subpackages:
-  - api
-  - cache/memory
-  - client/v2
-  - collector
-  - container
-  - container/common
-  - container/docker
-  - container/libcontainer
-  - container/raw
-  - container/rkt
-  - container/systemd
-  - devicemapper
-  - events
-  - fs
-  - healthz
-  - http
-  - http/mux
-  - info/v1
-  - info/v1/test
-  - info/v2
-  - machine
-  - manager
-  - manager/watcher
-  - manager/watcher/raw
-  - manager/watcher/rkt
-  - metrics
-  - pages
-  - pages/static
-  - storage
-  - summary
-  - utils
-  - utils/cloudinfo
-  - utils/cpuload
-  - utils/cpuload/netlink
-  - utils/docker
-  - utils/oomparser
-  - utils/sysfs
-  - utils/sysinfo
-  - utils/tail
-  - validate
-  - version
 - name: github.com/google/gofuzz
   version: bbcb9da2d746f8bdbd6a936686a0a6067ada0ec5
 - name: github.com/gosuri/uitable
@@ -204,22 +163,34 @@ imports:
   subpackages:
   - util/strutil
   - util/wordwrap
+- name: github.com/howeyc/gopass
+  version: 3ca23474a7c7203e0a0a070fd33508f6efdb9b3d
 - name: github.com/imdario/mergo
   version: 6633656539c1639d9d78127b7d47c622b5d7b6dc
 - name: github.com/inconshreveable/mousetrap
   version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75
 - name: github.com/jonboulle/clockwork
   version: 72f9bd7c4e0c2a40055ab3d0f09654f730cce982
-- name: github.com/juju/ratelimit
-  version: 77ed1c8a01217656d2080ad51981f6e99adaa177
+- name: github.com/mailru/easyjson
+  version: d5b7844b561a7bc640052f1b935f7b800330d7e0
+  subpackages:
+  - buffer
+  - jlexer
+  - jwriter
 - name: github.com/Masterminds/semver
   version: 52edfc04e184ecf0962489d167b511b27aeebd61
 - name: github.com/Masterminds/sprig
   version: 1e60e4ce482a1e2c7b9c9be667535ef152e04300
 - name: github.com/mattn/go-runewidth
   version: d6bea18f789704b5f83375793155289da36a3c7f
+- name: github.com/mitchellh/go-wordwrap
+  version: ad45545899c7b13c020ea92b2072220eefad42b8
 - name: github.com/pborman/uuid
   version: ca53cad383cad2479bbba7f7a1a05797ec1386e4
+- name: github.com/PuerkitoBio/purell
+  version: 8a290539e2e8629dbc4e6bad948158f790ec31f4
+- name: github.com/PuerkitoBio/urlesc
+  version: 5bd2802263f21d8788851d5305584c82a5c75d7e
 - name: github.com/russross/blackfriday
   version: 300106c228d52c8941d4b3de6054a6062a86dda3
 - name: github.com/satori/go.uuid
@@ -229,11 +200,11 @@ imports:
 - name: github.com/Sirupsen/logrus
   version: 51fe59aca108dc5680109e7b2051cbdcfa5a253c
 - name: github.com/spf13/cobra
-  version: 6a8bd97bdb1fc0d08a83459940498ea49d3e8c93
+  version: f62e98d28ab7ad31d707ba837a966378465c7b57
   subpackages:
   - doc
 - name: github.com/spf13/pflag
-  version: 367864438f1b1a3c7db4da06a2f55b144e6784e0
+  version: 5ccb023bc27df288a957c5e994cd44fd19619465
 - name: github.com/technosophos/moniker
   version: 9f956786b91d9786ca11aa5be6104542fa911546
 - name: github.com/ugorji/go
@@ -260,6 +231,7 @@ imports:
   - context/ctxhttp
   - http2
   - http2/hpack
+  - idna
   - internal/timeseries
   - trace
   - websocket
@@ -270,6 +242,23 @@ imports:
   - internal
   - jws
   - jwt
+- name: golang.org/x/sys
+  version: 8f0908ab3b2457e2e15403d3697c9ef5cb4b57a9
+  subpackages:
+  - unix
+- name: golang.org/x/text
+  version: 2910a502d2bf9e43193af9d68ca516529614eed3
+  subpackages:
+  - cases
+  - internal/tag
+  - language
+  - runes
+  - secure/bidirule
+  - secure/precis
+  - transform
+  - unicode/bidi
+  - unicode/norm
+  - width
 - name: google.golang.org/appengine
   version: 4f7eeb5305a4ba1966344836ba4af9996b7b4e05
   subpackages:
@@ -297,88 +286,24 @@ imports:
   version: 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4
 - name: gopkg.in/yaml.v2
   version: a83829b6f1293c91addabc89d0571c246397bbf4
-- name: k8s.io/client-go
-  version: 0b62e254fe853d89b1d8d3445bbdab11bcc11bc3
-  subpackages:
-  - 1.4/pkg/api
-  - 1.4/pkg/api/endpoints
-  - 1.4/pkg/api/errors
-  - 1.4/pkg/api/meta
-  - 1.4/pkg/api/meta/metatypes
-  - 1.4/pkg/api/pod
-  - 1.4/pkg/api/resource
-  - 1.4/pkg/api/service
-  - 1.4/pkg/api/unversioned
-  - 1.4/pkg/api/unversioned/validation
-  - 1.4/pkg/api/util
-  - 1.4/pkg/api/v1
-  - 1.4/pkg/api/validation
-  - 1.4/pkg/apimachinery
-  - 1.4/pkg/apimachinery/registered
-  - 1.4/pkg/apis/autoscaling
-  - 1.4/pkg/apis/batch
-  - 1.4/pkg/apis/extensions
-  - 1.4/pkg/auth/user
-  - 1.4/pkg/capabilities
-  - 1.4/pkg/conversion
-  - 1.4/pkg/conversion/queryparams
-  - 1.4/pkg/fields
-  - 1.4/pkg/labels
-  - 1.4/pkg/runtime
-  - 1.4/pkg/runtime/serializer
-  - 1.4/pkg/runtime/serializer/json
-  - 1.4/pkg/runtime/serializer/protobuf
-  - 1.4/pkg/runtime/serializer/recognizer
-  - 1.4/pkg/runtime/serializer/streaming
-  - 1.4/pkg/runtime/serializer/versioning
-  - 1.4/pkg/security/apparmor
-  - 1.4/pkg/selection
-  - 1.4/pkg/third_party/forked/golang/reflect
-  - 1.4/pkg/types
-  - 1.4/pkg/util
-  - 1.4/pkg/util/clock
-  - 1.4/pkg/util/config
-  - 1.4/pkg/util/crypto
-  - 1.4/pkg/util/errors
-  - 1.4/pkg/util/flowcontrol
-  - 1.4/pkg/util/framer
-  - 1.4/pkg/util/hash
-  - 1.4/pkg/util/integer
-  - 1.4/pkg/util/intstr
-  - 1.4/pkg/util/json
-  - 1.4/pkg/util/labels
-  - 1.4/pkg/util/net
-  - 1.4/pkg/util/net/sets
-  - 1.4/pkg/util/parsers
-  - 1.4/pkg/util/rand
-  - 1.4/pkg/util/runtime
-  - 1.4/pkg/util/sets
-  - 1.4/pkg/util/uuid
-  - 1.4/pkg/util/validation
-  - 1.4/pkg/util/validation/field
-  - 1.4/pkg/util/wait
-  - 1.4/pkg/util/yaml
-  - 1.4/pkg/version
-  - 1.4/pkg/watch
-  - 1.4/pkg/watch/versioned
-  - 1.4/rest
-  - 1.4/tools/clientcmd/api
-  - 1.4/tools/metrics
-  - 1.4/transport
 - name: k8s.io/kubernetes
-  version: fd8fac83034df346529c6e11aabceea2db48d663
+  version: 0776eab45fe28f02bbeac0f05ae1a203051a21eb
   subpackages:
+  - cmd/kubeadm/app/apis/kubeadm
+  - cmd/kubeadm/app/apis/kubeadm/install
+  - cmd/kubeadm/app/apis/kubeadm/v1alpha1
   - federation/apis/federation
   - federation/apis/federation/install
   - federation/apis/federation/v1beta1
   - federation/client/clientset_generated/federation_internalclientset
-  - federation/client/clientset_generated/federation_internalclientset/typed/core/unversioned
-  - federation/client/clientset_generated/federation_internalclientset/typed/extensions/unversioned
-  - federation/client/clientset_generated/federation_internalclientset/typed/federation/unversioned
+  - federation/client/clientset_generated/federation_internalclientset/typed/core/internalversion
+  - federation/client/clientset_generated/federation_internalclientset/typed/extensions/internalversion
+  - federation/client/clientset_generated/federation_internalclientset/typed/federation/internalversion
   - pkg/api
   - pkg/api/annotations
   - pkg/api/endpoints
   - pkg/api/errors
+  - pkg/api/events
   - pkg/api/install
   - pkg/api/meta
   - pkg/api/meta/metatypes
@@ -392,11 +317,13 @@ imports:
   - pkg/api/util
   - pkg/api/v1
   - pkg/api/validation
+  - pkg/api/validation/path
   - pkg/apimachinery
+  - pkg/apimachinery/announced
   - pkg/apimachinery/registered
   - pkg/apis/apps
   - pkg/apis/apps/install
-  - pkg/apis/apps/v1alpha1
+  - pkg/apis/apps/v1beta1
   - pkg/apis/authentication
   - pkg/apis/authentication/install
   - pkg/apis/authentication/v1beta1
@@ -425,40 +352,84 @@ imports:
   - pkg/apis/imagepolicy/v1alpha1
   - pkg/apis/policy
   - pkg/apis/policy/install
-  - pkg/apis/policy/v1alpha1
+  - pkg/apis/policy/v1beta1
   - pkg/apis/rbac
   - pkg/apis/rbac/install
   - pkg/apis/rbac/v1alpha1
   - pkg/apis/storage
   - pkg/apis/storage/install
+  - pkg/apis/storage/util
   - pkg/apis/storage/v1beta1
+  - pkg/auth/authenticator
   - pkg/auth/user
   - pkg/capabilities
   - pkg/client/cache
   - pkg/client/clientset_generated/internalclientset
-  - pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned
-  - pkg/client/clientset_generated/internalclientset/typed/authorization/unversioned
-  - pkg/client/clientset_generated/internalclientset/typed/autoscaling/unversioned
-  - pkg/client/clientset_generated/internalclientset/typed/batch/unversioned
-  - pkg/client/clientset_generated/internalclientset/typed/certificates/unversioned
-  - pkg/client/clientset_generated/internalclientset/typed/core/unversioned
-  - pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned
-  - pkg/client/clientset_generated/internalclientset/typed/rbac/unversioned
-  - pkg/client/clientset_generated/internalclientset/typed/storage/unversioned
+  - pkg/client/clientset_generated/internalclientset/fake
+  - pkg/client/clientset_generated/internalclientset/typed/apps/internalversion
+  - pkg/client/clientset_generated/internalclientset/typed/apps/internalversion/fake
+  - pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion
+  - pkg/client/clientset_generated/internalclientset/typed/authentication/internalversion/fake
+  - pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion
+  - pkg/client/clientset_generated/internalclientset/typed/authorization/internalversion/fake
+  - pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion
+  - pkg/client/clientset_generated/internalclientset/typed/autoscaling/internalversion/fake
+  - pkg/client/clientset_generated/internalclientset/typed/batch/internalversion
+  - pkg/client/clientset_generated/internalclientset/typed/batch/internalversion/fake
+  - pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion
+  - pkg/client/clientset_generated/internalclientset/typed/certificates/internalversion/fake
+  - pkg/client/clientset_generated/internalclientset/typed/core/internalversion
+  - pkg/client/clientset_generated/internalclientset/typed/core/internalversion/fake
+  - pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion
+  - pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion/fake
+  - pkg/client/clientset_generated/internalclientset/typed/policy/internalversion
+  - pkg/client/clientset_generated/internalclientset/typed/policy/internalversion/fake
+  - pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion
+  - pkg/client/clientset_generated/internalclientset/typed/rbac/internalversion/fake
+  - pkg/client/clientset_generated/internalclientset/typed/storage/internalversion
+  - pkg/client/clientset_generated/internalclientset/typed/storage/internalversion/fake
+  - pkg/client/clientset_generated/release_1_5
+  - pkg/client/clientset_generated/release_1_5/fake
+  - pkg/client/clientset_generated/release_1_5/typed/apps/v1beta1
+  - pkg/client/clientset_generated/release_1_5/typed/apps/v1beta1/fake
+  - pkg/client/clientset_generated/release_1_5/typed/authentication/v1beta1
+  - pkg/client/clientset_generated/release_1_5/typed/authentication/v1beta1/fake
+  - pkg/client/clientset_generated/release_1_5/typed/authorization/v1beta1
+  - pkg/client/clientset_generated/release_1_5/typed/authorization/v1beta1/fake
+  - pkg/client/clientset_generated/release_1_5/typed/autoscaling/v1
+  - pkg/client/clientset_generated/release_1_5/typed/autoscaling/v1/fake
+  - pkg/client/clientset_generated/release_1_5/typed/batch/v1
+  - pkg/client/clientset_generated/release_1_5/typed/batch/v1/fake
+  - pkg/client/clientset_generated/release_1_5/typed/batch/v2alpha1
+  - pkg/client/clientset_generated/release_1_5/typed/batch/v2alpha1/fake
+  - pkg/client/clientset_generated/release_1_5/typed/certificates/v1alpha1
+  - pkg/client/clientset_generated/release_1_5/typed/certificates/v1alpha1/fake
+  - pkg/client/clientset_generated/release_1_5/typed/core/v1
+  - pkg/client/clientset_generated/release_1_5/typed/core/v1/fake
+  - pkg/client/clientset_generated/release_1_5/typed/extensions/v1beta1
+  - pkg/client/clientset_generated/release_1_5/typed/extensions/v1beta1/fake
+  - pkg/client/clientset_generated/release_1_5/typed/policy/v1beta1
+  - pkg/client/clientset_generated/release_1_5/typed/policy/v1beta1/fake
+  - pkg/client/clientset_generated/release_1_5/typed/rbac/v1alpha1
+  - pkg/client/clientset_generated/release_1_5/typed/rbac/v1alpha1/fake
+  - pkg/client/clientset_generated/release_1_5/typed/storage/v1beta1
+  - pkg/client/clientset_generated/release_1_5/typed/storage/v1beta1/fake
   - pkg/client/metrics
   - pkg/client/record
   - pkg/client/restclient
+  - pkg/client/restclient/fake
+  - pkg/client/retry
+  - pkg/client/testing/core
   - pkg/client/transport
   - pkg/client/typed/discovery
+  - pkg/client/typed/discovery/fake
   - pkg/client/typed/dynamic
   - pkg/client/unversioned
-  - pkg/client/unversioned/adapters/internalclientset
   - pkg/client/unversioned/auth
   - pkg/client/unversioned/clientcmd
   - pkg/client/unversioned/clientcmd/api
   - pkg/client/unversioned/clientcmd/api/latest
   - pkg/client/unversioned/clientcmd/api/v1
-  - pkg/client/unversioned/fake
   - pkg/client/unversioned/portforward
   - pkg/client/unversioned/remotecommand
   - pkg/client/unversioned/testclient
@@ -469,6 +440,7 @@ imports:
   - pkg/credentialprovider
   - pkg/fieldpath
   - pkg/fields
+  - pkg/genericapiserver/openapi/common
   - pkg/httplog
   - pkg/kubectl
   - pkg/kubectl/cmd/util
@@ -479,7 +451,7 @@ imports:
   - pkg/kubelet/types
   - pkg/labels
   - pkg/master/ports
-  - pkg/registry/thirdpartyresourcedata
+  - pkg/registry/extensions/thirdpartyresourcedata
   - pkg/runtime
   - pkg/runtime/serializer
   - pkg/runtime/serializer/json
@@ -488,15 +460,17 @@ imports:
   - pkg/runtime/serializer/streaming
   - pkg/runtime/serializer/versioning
   - pkg/security/apparmor
+  - pkg/security/podsecuritypolicy/seccomp
   - pkg/security/podsecuritypolicy/util
   - pkg/selection
+  - pkg/serviceaccount
   - pkg/storage
   - pkg/types
   - pkg/util
-  - pkg/util/certificates
+  - pkg/util/cert
   - pkg/util/clock
   - pkg/util/config
-  - pkg/util/crypto
+  - pkg/util/diff
   - pkg/util/errors
   - pkg/util/exec
   - pkg/util/flag
@@ -514,10 +488,11 @@ imports:
   - pkg/util/labels
   - pkg/util/net
   - pkg/util/net/sets
+  - pkg/util/node
   - pkg/util/parsers
   - pkg/util/pod
   - pkg/util/rand
-  - pkg/util/replicaset
+  - pkg/util/ratelimit
   - pkg/util/runtime
   - pkg/util/sets
   - pkg/util/slice
diff --git a/glide.yaml b/glide.yaml
index f3e3a4b3e..5051afc59 100644
--- a/glide.yaml
+++ b/glide.yaml
@@ -5,6 +5,9 @@ import:
   subpackages:
   - context
 - package: github.com/spf13/cobra
+  version: f62e98d28ab7ad31d707ba837a966378465c7b57
+- package: github.com/spf13/pflag
+  version: 5ccb023bc27df288a957c5e994cd44fd19619465
 - package: github.com/Masterminds/sprig
   version: ^2.7
 - package: github.com/ghodss/yaml
@@ -20,29 +23,7 @@ import:
 - package: google.golang.org/grpc
   version: 1.0.3
 - package: k8s.io/kubernetes
-  version: ~1.4.1
-  subpackages:
-  - pkg/api
-  - pkg/api/errors
-  - pkg/api/unversioned
-  - pkg/apimachinery/registered
-  - pkg/apis/batch
-  - pkg/apis/extensions
-  - pkg/client/restclient
-  - pkg/client/unversioned
-  - pkg/client/unversioned/clientcmd
-  - pkg/client/unversioned/portforward
-  - pkg/client/unversioned/remotecommand
-  - pkg/client/unversioned/testclient
-  - pkg/kubectl
-  - pkg/kubectl/cmd/util
-  - pkg/kubectl/resource
-  - pkg/labels
-  - pkg/runtime
-  - pkg/util/intstr
-  - pkg/util/strategicpatch
-  - pkg/util/yaml
-  - pkg/watch
+  version: 1.5.0-beta.2
 - package: github.com/gosuri/uitable
 - package: github.com/asaskevich/govalidator
   version: ^4.0.0
diff --git a/pkg/kube/client.go b/pkg/kube/client.go
index e76ed5180..1cdf6a2da 100644
--- a/pkg/kube/client.go
+++ b/pkg/kube/client.go
@@ -30,7 +30,6 @@ import (
 	"k8s.io/kubernetes/pkg/api/errors"
 	"k8s.io/kubernetes/pkg/apimachinery/registered"
 	"k8s.io/kubernetes/pkg/apis/batch"
-	"k8s.io/kubernetes/pkg/client/unversioned"
 	"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
 	"k8s.io/kubernetes/pkg/kubectl"
 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
@@ -46,7 +45,7 @@ var ErrNoObjectsVisited = goerrors.New("no objects visited")
 
 // Client represents a client capable of communicating with the Kubernetes API.
 type Client struct {
-	*cmdutil.Factory
+	cmdutil.Factory
 	// IncludeThirdPartyAPIs indicates whether to load "dynamic" APIs.
 	//
 	// This requires additional calls to the Kubernetes API server, and these calls
@@ -82,16 +81,6 @@ func (e ErrAlreadyExists) Error() string {
 	return fmt.Sprintf("Looks like there are no changes for %s", e.errorMsg)
 }
 
-// APIClient returns a Kubernetes API client.
-//
-// This is necessary because cmdutil.Client is a field, not a method, which
-// means it can't satisfy an interface's method requirement. In order to ensure
-// that an implementation of environment.KubeClient can access the raw API client,
-// it is necessary to add this method.
-func (c *Client) APIClient() (unversioned.Interface, error) {
-	return c.Client()
-}
-
 // Create creates kubernetes resources from an io.reader
 //
 // Namespace will set the namespace
@@ -107,7 +96,7 @@ func (c *Client) newBuilder(namespace string, reader io.Reader) *resource.Builde
 	if err != nil {
 		log.Printf("warning: failed to load schema: %s", err)
 	}
-	return c.NewBuilder(c.IncludeThirdPartyAPIs).
+	return c.NewBuilder().
 		ContinueOnError().
 		Schema(schema).
 		NamespaceParam(namespace).
@@ -414,7 +403,7 @@ func waitForJob(e watch.Event, name string) (bool, error) {
 }
 
 func (c *Client) ensureNamespace(namespace string) error {
-	client, err := c.Client()
+	client, err := c.ClientSet()
 	if err != nil {
 		return err
 	}
diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go
index afd95a5a0..71a43636e 100644
--- a/pkg/kube/client_test.go
+++ b/pkg/kube/client_test.go
@@ -30,7 +30,8 @@ import (
 	"k8s.io/kubernetes/pkg/api/unversioned"
 	api "k8s.io/kubernetes/pkg/api/v1"
 	"k8s.io/kubernetes/pkg/api/validation"
-	"k8s.io/kubernetes/pkg/client/unversioned/fake"
+	"k8s.io/kubernetes/pkg/client/restclient/fake"
+	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
 	"k8s.io/kubernetes/pkg/kubectl/resource"
 	"k8s.io/kubernetes/pkg/runtime"
 )
@@ -110,20 +111,18 @@ func TestPerform(t *testing.T) {
 			return nil
 		}
 
-		c := New(nil)
-		c.IncludeThirdPartyAPIs = false
-		c.ClientForMapping = func(mapping *meta.RESTMapping) (resource.RESTClient, error) {
-			return &fake.RESTClient{}, nil
-		}
-		c.Validator = func(validate bool, cacheDir string) (validation.Schema, error) {
-			if tt.swaggerFile == "" {
-				return validation.NullSchema{}, nil
-			}
+		f, tf, _, _ := cmdtesting.NewAPIFactory()
+		c := &Client{Factory: f}
+		if tt.swaggerFile != "" {
 			data, err := ioutil.ReadFile(tt.swaggerFile)
+			if err != nil {
+				t.Fatalf("could not read swagger spec: %s", err)
+			}
+			validator, err := validation.NewSwaggerSchemaFromBytes(data, nil)
 			if err != nil {
 				t.Fatalf("could not load swagger spec: %s", err)
 			}
-			return validation.NewSwaggerSchemaFromBytes(data, nil)
+			tf.Validator = validator
 		}
 
 		err := perform(c, tt.namespace, tt.reader, fn)
diff --git a/pkg/kube/tunnel.go b/pkg/kube/tunnel.go
index a93c0384b..5a5b68235 100644
--- a/pkg/kube/tunnel.go
+++ b/pkg/kube/tunnel.go
@@ -38,11 +38,11 @@ type Tunnel struct {
 	stopChan  chan struct{}
 	readyChan chan struct{}
 	config    *restclient.Config
-	client    *restclient.RESTClient
+	client    restclient.Interface
 }
 
 // NewTunnel creates a new tunnel
-func NewTunnel(client *restclient.RESTClient, config *restclient.Config, namespace, podName string, remote int) *Tunnel {
+func NewTunnel(client restclient.Interface, config *restclient.Config, namespace, podName string, remote int) *Tunnel {
 	return &Tunnel{
 		config:    config,
 		client:    client,
diff --git a/pkg/storage/driver/cfgmaps.go b/pkg/storage/driver/cfgmaps.go
index 722e2b144..79a562b17 100644
--- a/pkg/storage/driver/cfgmaps.go
+++ b/pkg/storage/driver/cfgmaps.go
@@ -27,13 +27,12 @@ import (
 	"time"
 
 	"github.com/golang/protobuf/proto"
-
-	rspb "k8s.io/helm/pkg/proto/hapi/release"
-
 	"k8s.io/kubernetes/pkg/api"
 	kberrs "k8s.io/kubernetes/pkg/api/errors"
-	client "k8s.io/kubernetes/pkg/client/unversioned"
+	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
 	kblabels "k8s.io/kubernetes/pkg/labels"
+
+	rspb "k8s.io/helm/pkg/proto/hapi/release"
 )
 
 var _ Driver = (*ConfigMaps)(nil)
@@ -48,12 +47,12 @@ var magicGzip = []byte{0x1f, 0x8b, 0x08}
 // ConfigMaps is a wrapper around an implementation of a kubernetes
 // ConfigMapsInterface.
 type ConfigMaps struct {
-	impl client.ConfigMapsInterface
+	impl internalversion.ConfigMapInterface
 }
 
 // NewConfigMaps initializes a new ConfigMaps wrapping an implmenetation of
 // the kubernetes ConfigMapsInterface.
-func NewConfigMaps(impl client.ConfigMapsInterface) *ConfigMaps {
+func NewConfigMaps(impl internalversion.ConfigMapInterface) *ConfigMaps {
 	return &ConfigMaps{impl: impl}
 }
 
@@ -210,7 +209,7 @@ func (cfgmaps *ConfigMaps) Delete(key string) (rls *rspb.Release, err error) {
 		return nil, err
 	}
 	// delete the release
-	if err = cfgmaps.impl.Delete(key); err != nil {
+	if err = cfgmaps.impl.Delete(key, &api.DeleteOptions{}); err != nil {
 		return rls, err
 	}
 	return rls, nil
diff --git a/pkg/storage/driver/mock_test.go b/pkg/storage/driver/mock_test.go
index d21cd0f2f..3bb5f804c 100644
--- a/pkg/storage/driver/mock_test.go
+++ b/pkg/storage/driver/mock_test.go
@@ -23,7 +23,7 @@ import (
 	rspb "k8s.io/helm/pkg/proto/hapi/release"
 	"k8s.io/kubernetes/pkg/api"
 	kberrs "k8s.io/kubernetes/pkg/api/errors"
-	"k8s.io/kubernetes/pkg/client/unversioned"
+	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
 )
 
 func releaseStub(name string, vers int32, code rspb.Status_Code) *rspb.Release {
@@ -73,7 +73,7 @@ func newTestFixtureCfgMaps(t *testing.T, releases ...*rspb.Release) *ConfigMaps
 
 // MockConfigMapsInterface mocks a kubernetes ConfigMapsInterface
 type MockConfigMapsInterface struct {
-	unversioned.ConfigMapsInterface
+	internalversion.ConfigMapInterface
 
 	objects map[string]*api.ConfigMap
 }
@@ -132,7 +132,7 @@ func (mock *MockConfigMapsInterface) Update(cfgmap *api.ConfigMap) (*api.ConfigM
 }
 
 // Delete deletes a ConfigMap by name.
-func (mock *MockConfigMapsInterface) Delete(name string) error {
+func (mock *MockConfigMapsInterface) Delete(name string, opts *api.DeleteOptions) error {
 	if _, ok := mock.objects[name]; !ok {
 		return kberrs.NewNotFound(api.Resource("tests"), name)
 	}
diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go
index 72fd510be..64013b2a1 100644
--- a/pkg/tiller/environment/environment.go
+++ b/pkg/tiller/environment/environment.go
@@ -25,14 +25,14 @@ package environment
 import (
 	"io"
 
+	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
+
 	"k8s.io/helm/pkg/chartutil"
 	"k8s.io/helm/pkg/engine"
 	"k8s.io/helm/pkg/kube"
 	"k8s.io/helm/pkg/proto/hapi/chart"
 	"k8s.io/helm/pkg/storage"
 	"k8s.io/helm/pkg/storage/driver"
-	"k8s.io/kubernetes/pkg/client/unversioned"
-	"k8s.io/kubernetes/pkg/client/unversioned/testclient"
 )
 
 // TillerNamespace is the namespace tiller is running in.
@@ -135,8 +135,8 @@ type KubeClient interface {
 	// by "\n---\n").
 	Update(namespace string, originalReader, modifiedReader io.Reader) error
 
-	// APIClient gets a raw API client for Kubernetes.
-	APIClient() (unversioned.Interface, error)
+	// Client gets a raw API client for Kubernetes.
+	ClientSet() (*internalclientset.Clientset, error)
 }
 
 // PrintingKubeClient implements KubeClient, but simply prints the reader to
@@ -145,12 +145,12 @@ type PrintingKubeClient struct {
 	Out io.Writer
 }
 
-// APIClient always returns an error.
+// ClientSet always returns an error.
 //
 // The printing client does not have access to a Kubernetes client at all. So it
 // will always return an error if the client is accessed.
-func (p *PrintingKubeClient) APIClient() (unversioned.Interface, error) {
-	return testclient.NewSimpleFake(), nil
+func (p *PrintingKubeClient) ClientSet() (*internalclientset.Clientset, error) {
+	return new(internalclientset.Clientset), nil
 }
 
 // Create prints the values of what would be created with a real KubeClient.
diff --git a/pkg/tiller/environment/environment_test.go b/pkg/tiller/environment/environment_test.go
index 68cc5d63c..8e1d8258e 100644
--- a/pkg/tiller/environment/environment_test.go
+++ b/pkg/tiller/environment/environment_test.go
@@ -23,8 +23,7 @@ import (
 
 	"k8s.io/helm/pkg/chartutil"
 	"k8s.io/helm/pkg/proto/hapi/chart"
-	unversionedclient "k8s.io/kubernetes/pkg/client/unversioned"
-	"k8s.io/kubernetes/pkg/client/unversioned/testclient"
+	"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
 )
 
 type mockEngine struct {
@@ -35,11 +34,10 @@ func (e *mockEngine) Render(chrt *chart.Chart, v chartutil.Values) (map[string]s
 	return e.out, nil
 }
 
-type mockKubeClient struct {
-}
+type mockKubeClient struct{}
 
-func (k *mockKubeClient) APIClient() (unversionedclient.Interface, error) {
-	return testclient.NewSimpleFake(), nil
+func (k *mockKubeClient) ClientSet() (*internalclientset.Clientset, error) {
+	return &internalclientset.Clientset{}, nil
 }
 
 func (k *mockKubeClient) Create(ns string, r io.Reader) error {
diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go
index f3ad0252f..b3504500d 100644
--- a/pkg/tiller/release_server.go
+++ b/pkg/tiller/release_server.go
@@ -695,13 +695,18 @@ func (s *ReleaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re
 
 func (s *ReleaseServer) getVersionSet() (versionSet, error) {
 	defVersions := newVersionSet("v1")
-	cli, err := s.env.KubeClient.APIClient()
+	cli, err := s.env.KubeClient.ClientSet()
 	if err != nil {
-		log.Printf("API Client for Kubernetes is missing: %s.", err)
+		log.Printf("discovery client for Kubernetes is missing: %s.", err)
 		return defVersions, err
 	}
 
-	groups, err := cli.Discovery().ServerGroups()
+	dc := cli.Discovery()
+	if dc.RESTClient() == nil {
+		return defVersions, nil
+	}
+
+	groups, err := dc.ServerGroups()
 	if err != nil {
 		return defVersions, err
 	}
-- 
GitLab