diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go index c69bca631..4009c2a24 100644 --- a/cmd/tiller/tiller.go +++ b/cmd/tiller/tiller.go @@ -25,6 +25,7 @@ import ( "github.com/spf13/cobra" + "k8s.io/helm/pkg/kube" "k8s.io/helm/pkg/proto/hapi/services" "k8s.io/helm/pkg/storage" "k8s.io/helm/pkg/storage/driver" @@ -80,15 +81,16 @@ func main() { } func start(c *cobra.Command, args []string) { + clientset, err := kube.New(nil).ClientSet() + if err != nil { + fmt.Fprintf(os.Stderr, "Cannot initialize Kubernetes connection: %s", err) + } + switch store { case storageMemory: env.Releases = storage.Init(driver.NewMemory()) case storageConfigMap: - 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.Core().ConfigMaps(environment.TillerNamespace))) + env.Releases = storage.Init(driver.NewConfigMaps(clientset.Core().ConfigMaps(environment.TillerNamespace))) } lstn, err := net.Listen("tcp", grpcAddr) @@ -108,7 +110,7 @@ func start(c *cobra.Command, args []string) { srvErrCh := make(chan error) probeErrCh := make(chan error) go func() { - svc := tiller.NewReleaseServer(env) + svc := tiller.NewReleaseServer(env, clientset) services.RegisterReleaseServiceServer(rootServer, svc) if err := rootServer.Serve(lstn); err != nil { srvErrCh <- err diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index 64013b2a1..1b2aa4e6d 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -25,8 +25,6 @@ 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" @@ -134,9 +132,6 @@ type KubeClient interface { // reader must contain a YAML stream (one or more YAML documents separated // by "\n---\n"). Update(namespace string, originalReader, modifiedReader io.Reader) error - - // Client gets a raw API client for Kubernetes. - ClientSet() (*internalclientset.Clientset, error) } // PrintingKubeClient implements KubeClient, but simply prints the reader to @@ -145,14 +140,6 @@ type PrintingKubeClient struct { Out io.Writer } -// 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) ClientSet() (*internalclientset.Clientset, error) { - return new(internalclientset.Clientset), nil -} - // Create prints the values of what would be created with a real KubeClient. func (p *PrintingKubeClient) Create(ns string, r io.Reader) error { _, err := io.Copy(p.Out, r) diff --git a/pkg/tiller/environment/environment_test.go b/pkg/tiller/environment/environment_test.go index 8e1d8258e..f547c75a9 100644 --- a/pkg/tiller/environment/environment_test.go +++ b/pkg/tiller/environment/environment_test.go @@ -23,7 +23,6 @@ import ( "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/proto/hapi/chart" - "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" ) type mockEngine struct { @@ -36,10 +35,6 @@ func (e *mockEngine) Render(chrt *chart.Chart, v chartutil.Values) (map[string]s type mockKubeClient struct{} -func (k *mockKubeClient) ClientSet() (*internalclientset.Clientset, error) { - return &internalclientset.Clientset{}, nil -} - func (k *mockKubeClient) Create(ns string, r io.Reader) error { return nil } diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index b3504500d..ee36d322e 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -31,6 +31,8 @@ import ( "github.com/technosophos/moniker" ctx "golang.org/x/net/context" "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" + "k8s.io/kubernetes/pkg/client/typed/discovery" "k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/kube" @@ -95,13 +97,15 @@ func NewServer() *grpc.Server { // ReleaseServer implements the server-side gRPC endpoint for the HAPI services. type ReleaseServer struct { - env *environment.Environment + env *environment.Environment + clientset internalclientset.Interface } // NewReleaseServer creates a new release server. -func NewReleaseServer(env *environment.Environment) *ReleaseServer { +func NewReleaseServer(env *environment.Environment, clientset internalclientset.Interface) *ReleaseServer { return &ReleaseServer{ - env: env, + env: env, + clientset: clientset, } } @@ -693,20 +697,10 @@ func (s *ReleaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re return rel, nil } -func (s *ReleaseServer) getVersionSet() (versionSet, error) { +func getVersionSet(client discovery.DiscoveryInterface) (versionSet, error) { defVersions := newVersionSet("v1") - cli, err := s.env.KubeClient.ClientSet() - if err != nil { - log.Printf("discovery client for Kubernetes is missing: %s.", err) - return defVersions, err - } - - dc := cli.Discovery() - if dc.RESTClient() == nil { - return defVersions, nil - } - groups, err := dc.ServerGroups() + groups, err := client.ServerGroups() if err != nil { return defVersions, err } @@ -750,7 +744,7 @@ func (s *ReleaseServer) renderResources(ch *chart.Chart, values chartutil.Values // Sort hooks, manifests, and partials. Only hooks and manifests are returned, // as partials are not used after renderer.Render. Empty manifests are also // removed here. - vs, err := s.getVersionSet() + vs, err := getVersionSet(s.clientset.Discovery()) if err != nil { return nil, nil, "", fmt.Errorf("Could not get apiVersions from Kubernetes: %s", err) } @@ -963,7 +957,7 @@ func (s *ReleaseServer) UninstallRelease(c ctx.Context, req *services.UninstallR } } - vs, err := s.getVersionSet() + vs, err := getVersionSet(s.clientset.Discovery()) if err != nil { return nil, fmt.Errorf("Could not get apiVersions from Kubernetes: %s", err) } diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index 6c5d8909d..95caac4e4 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -28,6 +28,7 @@ import ( "github.com/golang/protobuf/ptypes/timestamp" "golang.org/x/net/context" "google.golang.org/grpc/metadata" + "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" "k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/proto/hapi/chart" @@ -82,7 +83,8 @@ data: func rsFixture() *ReleaseServer { return &ReleaseServer{ - env: mockEnvironment(), + env: mockEnvironment(), + clientset: fake.NewSimpleClientset(), } } @@ -178,7 +180,7 @@ func TestValidName(t *testing.T) { func TestGetVersionSet(t *testing.T) { rs := rsFixture() - vs, err := rs.getVersionSet() + vs, err := getVersionSet(rs.clientset.Discovery()) if err != nil { t.Error(err) }