From aabf1c3573322c2644c9ef8104093829be401570 Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Thu, 13 Nov 2014 12:35:03 -0800 Subject: [PATCH] Add a clusters interface and GCE implementation. --- pkg/cloudprovider/aws/aws.go | 4 +++ pkg/cloudprovider/cloud.go | 10 ++++++ pkg/cloudprovider/fake/fake.go | 5 ++- pkg/cloudprovider/gce/gce.go | 43 +++++++++++++++++++----- pkg/cloudprovider/openstack/openstack.go | 4 +++ pkg/cloudprovider/ovirt/ovirt.go | 4 +++ pkg/cloudprovider/vagrant/vagrant.go | 4 +++ 7 files changed, 65 insertions(+), 9 deletions(-) diff --git a/pkg/cloudprovider/aws/aws.go b/pkg/cloudprovider/aws/aws.go index b69feaae253..8a9cefa7111 100644 --- a/pkg/cloudprovider/aws/aws.go +++ b/pkg/cloudprovider/aws/aws.go @@ -101,6 +101,10 @@ func newAWSCloud(config io.Reader, authFunc AuthFunc) (*AWSCloud, error) { }, nil } +func (aws *AWSCloud) Clusters() (cloudprovider.Clusters, bool) { + return nil, false +} + // TCPLoadBalancer returns an implementation of TCPLoadBalancer for Amazon Web Services. func (aws *AWSCloud) TCPLoadBalancer() (cloudprovider.TCPLoadBalancer, bool) { return nil, false diff --git a/pkg/cloudprovider/cloud.go b/pkg/cloudprovider/cloud.go index 4dfd79d4177..5ad76caf4d8 100644 --- a/pkg/cloudprovider/cloud.go +++ b/pkg/cloudprovider/cloud.go @@ -30,6 +30,16 @@ type Interface interface { Instances() (Instances, bool) // Zones returns a zones interface. Also returns true if the interface is supported, false otherwise. Zones() (Zones, bool) + // Clusters returns a clusters interface. Also returns true if the interface is supported, false otherwise. + Clusters() (Clusters, bool) +} + +// Clusters is an abstract, pluggable interface for clusters of containers. +type Clusters interface { + // List lists the names of the available clusters. + ListClusters() ([]string, error) + // Master gets back the address (either DNS name or IP address) of the master node for the cluster. + Master(clusterName string) (string, error) } // TCPLoadBalancer is an abstract, pluggable interface for TCP load balancers. diff --git a/pkg/cloudprovider/fake/fake.go b/pkg/cloudprovider/fake/fake.go index 196e3f48735..4af88bf4f28 100644 --- a/pkg/cloudprovider/fake/fake.go +++ b/pkg/cloudprovider/fake/fake.go @@ -45,8 +45,11 @@ func (f *FakeCloud) ClearCalls() { f.Calls = []string{} } +func (f *FakeCloud) Clusters() (cloudprovider.Clusters, bool) { + return f, true +} + // TCPLoadBalancer returns a fake implementation of TCPLoadBalancer. -// // Actually it just returns f itself. func (f *FakeCloud) TCPLoadBalancer() (cloudprovider.TCPLoadBalancer, bool) { return f, true diff --git a/pkg/cloudprovider/gce/gce.go b/pkg/cloudprovider/gce/gce.go index 2a90a4dfbd5..5c0c44fcac7 100644 --- a/pkg/cloudprovider/gce/gce.go +++ b/pkg/cloudprovider/gce/gce.go @@ -30,6 +30,7 @@ import ( "code.google.com/p/goauth2/compute/serviceaccount" compute "code.google.com/p/google-api-go-client/compute/v1" + container "code.google.com/p/google-api-go-client/container/v1beta1" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/GoogleCloudPlatform/kubernetes/pkg/cloudprovider" "github.com/GoogleCloudPlatform/kubernetes/pkg/resources" @@ -39,10 +40,11 @@ import ( // GCECloud is an implementation of Interface, TCPLoadBalancer and Instances for Google Compute Engine. type GCECloud struct { - service *compute.Service - projectID string - zone string - instanceID string + service *compute.Service + containerService *container.Service + projectID string + zone string + instanceID string } func init() { @@ -115,14 +117,23 @@ func newGCECloud() (*GCECloud, error) { if err != nil { return nil, err } + containerSvc, err := container.New(client) + if err != nil { + return nil, err + } return &GCECloud{ - service: svc, - projectID: projectID, - zone: zone, - instanceID: instanceID, + service: svc, + containerService: containerSvc, + projectID: projectID, + zone: zone, + instanceID: instanceID, }, nil } +func (gce *GCECloud) Clusters() (cloudprovider.Clusters, bool) { + return gce, true +} + // TCPLoadBalancer returns an implementation of TCPLoadBalancer for Google Compute Engine. func (gce *GCECloud) TCPLoadBalancer() (cloudprovider.TCPLoadBalancer, bool) { return gce, true @@ -385,3 +396,19 @@ func (gce *GCECloud) convertDiskToAttachedDisk(disk *compute.Disk, readWrite str Type: "PERSISTENT", } } + +func (gce *GCECloud) ListClusters() ([]string, error) { + list, err := gce.containerService.Projects.Clusters.List(gce.projectID).Do() + if err != nil { + return nil, err + } + result := []string{} + for _, cluster := range list.Clusters { + result = append(result, cluster.Name) + } + return result, nil +} + +func (gce *GCECloud) Master(clusterName string) (string, error) { + return "k8s-" + clusterName + "-master.internal", nil +} diff --git a/pkg/cloudprovider/openstack/openstack.go b/pkg/cloudprovider/openstack/openstack.go index b1615bee39a..06bd07ddd43 100644 --- a/pkg/cloudprovider/openstack/openstack.go +++ b/pkg/cloudprovider/openstack/openstack.go @@ -208,6 +208,10 @@ func (i *Instances) GetNodeResources(name string) (*api.NodeResources, error) { return rsrc, nil } +func (aws *OpenStack) Clusters() (cloudprovider.Clusters, bool) { + return nil, false +} + func (os *OpenStack) TCPLoadBalancer() (cloudprovider.TCPLoadBalancer, bool) { return nil, false } diff --git a/pkg/cloudprovider/ovirt/ovirt.go b/pkg/cloudprovider/ovirt/ovirt.go index 99b0ec0cf68..ae25d662a21 100644 --- a/pkg/cloudprovider/ovirt/ovirt.go +++ b/pkg/cloudprovider/ovirt/ovirt.go @@ -95,6 +95,10 @@ func newOVirtCloud(config io.Reader) (*OVirtCloud, error) { return &OVirtCloud{VmsRequest: request}, nil } +func (aws *OVirtCloud) Clusters() (cloudprovider.Clusters, bool) { + return nil, false +} + // TCPLoadBalancer returns an implementation of TCPLoadBalancer for oVirt cloud func (v *OVirtCloud) TCPLoadBalancer() (cloudprovider.TCPLoadBalancer, bool) { return nil, false diff --git a/pkg/cloudprovider/vagrant/vagrant.go b/pkg/cloudprovider/vagrant/vagrant.go index f8cd2772d31..29cb8fa4a63 100644 --- a/pkg/cloudprovider/vagrant/vagrant.go +++ b/pkg/cloudprovider/vagrant/vagrant.go @@ -80,6 +80,10 @@ func newVagrantCloud() (*VagrantCloud, error) { }, nil } +func (aws *VagrantCloud) Clusters() (cloudprovider.Clusters, bool) { + return nil, false +} + // TCPLoadBalancer returns an implementation of TCPLoadBalancer for Vagrant cloud. func (v *VagrantCloud) TCPLoadBalancer() (cloudprovider.TCPLoadBalancer, bool) { return nil, false