ref(tiller): refactor clientset out of environment

pull/1657/head
Adam Reese 9 years ago
parent ea3be9e3b2
commit 7f44c116a1

@ -25,6 +25,7 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/helm/pkg/kube"
"k8s.io/helm/pkg/proto/hapi/services" "k8s.io/helm/pkg/proto/hapi/services"
"k8s.io/helm/pkg/storage" "k8s.io/helm/pkg/storage"
"k8s.io/helm/pkg/storage/driver" "k8s.io/helm/pkg/storage/driver"
@ -80,15 +81,16 @@ func main() {
} }
func start(c *cobra.Command, args []string) { 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 { switch store {
case storageMemory: case storageMemory:
env.Releases = storage.Init(driver.NewMemory()) env.Releases = storage.Init(driver.NewMemory())
case storageConfigMap: case storageConfigMap:
c, err := env.KubeClient.ClientSet() env.Releases = storage.Init(driver.NewConfigMaps(clientset.Core().ConfigMaps(environment.TillerNamespace)))
if err != nil {
fmt.Fprintf(os.Stderr, "Cannot initialize Kubernetes connection: %s", err)
}
env.Releases = storage.Init(driver.NewConfigMaps(c.Core().ConfigMaps(environment.TillerNamespace)))
} }
lstn, err := net.Listen("tcp", grpcAddr) lstn, err := net.Listen("tcp", grpcAddr)
@ -108,7 +110,7 @@ func start(c *cobra.Command, args []string) {
srvErrCh := make(chan error) srvErrCh := make(chan error)
probeErrCh := make(chan error) probeErrCh := make(chan error)
go func() { go func() {
svc := tiller.NewReleaseServer(env) svc := tiller.NewReleaseServer(env, clientset)
services.RegisterReleaseServiceServer(rootServer, svc) services.RegisterReleaseServiceServer(rootServer, svc)
if err := rootServer.Serve(lstn); err != nil { if err := rootServer.Serve(lstn); err != nil {
srvErrCh <- err srvErrCh <- err

@ -25,8 +25,6 @@ package environment
import ( import (
"io" "io"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/chartutil"
"k8s.io/helm/pkg/engine" "k8s.io/helm/pkg/engine"
"k8s.io/helm/pkg/kube" "k8s.io/helm/pkg/kube"
@ -134,9 +132,6 @@ type KubeClient interface {
// reader must contain a YAML stream (one or more YAML documents separated // reader must contain a YAML stream (one or more YAML documents separated
// by "\n---\n"). // by "\n---\n").
Update(namespace string, originalReader, modifiedReader io.Reader) error 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 // PrintingKubeClient implements KubeClient, but simply prints the reader to
@ -145,14 +140,6 @@ type PrintingKubeClient struct {
Out io.Writer 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. // Create prints the values of what would be created with a real KubeClient.
func (p *PrintingKubeClient) Create(ns string, r io.Reader) error { func (p *PrintingKubeClient) Create(ns string, r io.Reader) error {
_, err := io.Copy(p.Out, r) _, err := io.Copy(p.Out, r)

@ -23,7 +23,6 @@ import (
"k8s.io/helm/pkg/chartutil" "k8s.io/helm/pkg/chartutil"
"k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/chart"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
) )
type mockEngine struct { type mockEngine struct {
@ -36,10 +35,6 @@ func (e *mockEngine) Render(chrt *chart.Chart, v chartutil.Values) (map[string]s
type mockKubeClient struct{} type mockKubeClient struct{}
func (k *mockKubeClient) ClientSet() (*internalclientset.Clientset, error) {
return &internalclientset.Clientset{}, nil
}
func (k *mockKubeClient) Create(ns string, r io.Reader) error { func (k *mockKubeClient) Create(ns string, r io.Reader) error {
return nil return nil
} }

@ -31,6 +31,8 @@ import (
"github.com/technosophos/moniker" "github.com/technosophos/moniker"
ctx "golang.org/x/net/context" ctx "golang.org/x/net/context"
"k8s.io/kubernetes/pkg/api/unversioned" "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/chartutil"
"k8s.io/helm/pkg/kube" "k8s.io/helm/pkg/kube"
@ -95,13 +97,15 @@ func NewServer() *grpc.Server {
// ReleaseServer implements the server-side gRPC endpoint for the HAPI services. // ReleaseServer implements the server-side gRPC endpoint for the HAPI services.
type ReleaseServer struct { type ReleaseServer struct {
env *environment.Environment env *environment.Environment
clientset internalclientset.Interface
} }
// NewReleaseServer creates a new release server. // NewReleaseServer creates a new release server.
func NewReleaseServer(env *environment.Environment) *ReleaseServer { func NewReleaseServer(env *environment.Environment, clientset internalclientset.Interface) *ReleaseServer {
return &ReleaseServer{ return &ReleaseServer{
env: env, env: env,
clientset: clientset,
} }
} }
@ -693,20 +697,10 @@ func (s *ReleaseServer) prepareRelease(req *services.InstallReleaseRequest) (*re
return rel, nil return rel, nil
} }
func (s *ReleaseServer) getVersionSet() (versionSet, error) { func getVersionSet(client discovery.DiscoveryInterface) (versionSet, error) {
defVersions := newVersionSet("v1") 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 { if err != nil {
return defVersions, err 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, // Sort hooks, manifests, and partials. Only hooks and manifests are returned,
// as partials are not used after renderer.Render. Empty manifests are also // as partials are not used after renderer.Render. Empty manifests are also
// removed here. // removed here.
vs, err := s.getVersionSet() vs, err := getVersionSet(s.clientset.Discovery())
if err != nil { if err != nil {
return nil, nil, "", fmt.Errorf("Could not get apiVersions from Kubernetes: %s", err) 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 { if err != nil {
return nil, fmt.Errorf("Could not get apiVersions from Kubernetes: %s", err) return nil, fmt.Errorf("Could not get apiVersions from Kubernetes: %s", err)
} }

@ -28,6 +28,7 @@ import (
"github.com/golang/protobuf/ptypes/timestamp" "github.com/golang/protobuf/ptypes/timestamp"
"golang.org/x/net/context" "golang.org/x/net/context"
"google.golang.org/grpc/metadata" "google.golang.org/grpc/metadata"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
"k8s.io/helm/pkg/helm" "k8s.io/helm/pkg/helm"
"k8s.io/helm/pkg/proto/hapi/chart" "k8s.io/helm/pkg/proto/hapi/chart"
@ -82,7 +83,8 @@ data:
func rsFixture() *ReleaseServer { func rsFixture() *ReleaseServer {
return &ReleaseServer{ return &ReleaseServer{
env: mockEnvironment(), env: mockEnvironment(),
clientset: fake.NewSimpleClientset(),
} }
} }
@ -178,7 +180,7 @@ func TestValidName(t *testing.T) {
func TestGetVersionSet(t *testing.T) { func TestGetVersionSet(t *testing.T) {
rs := rsFixture() rs := rsFixture()
vs, err := rs.getVersionSet() vs, err := getVersionSet(rs.clientset.Discovery())
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }

Loading…
Cancel
Save