diff --git a/cmd/cloud-controller-manager/app/controllermanager.go b/cmd/cloud-controller-manager/app/controllermanager.go index 5cc76b5b79..e2defbcb91 100644 --- a/cmd/cloud-controller-manager/app/controllermanager.go +++ b/cmd/cloud-controller-manager/app/controllermanager.go @@ -199,6 +199,12 @@ func StartControllers(s *options.CloudControllerManagerServer, kubeconfig *restc client := func(serviceAccountName string) clientset.Interface { return rootClientBuilder.ClientOrDie(serviceAccountName) } + + if cloud != nil { + // Initialize the cloud provider with a reference to the clientBuilder + cloud.Initialize(clientBuilder) + } + versionedClient := client("shared-informers") sharedInformers := informers.NewSharedInformerFactory(versionedClient, resyncPeriod(s)()) diff --git a/cmd/kube-controller-manager/app/controllermanager.go b/cmd/kube-controller-manager/app/controllermanager.go index c6fab913f9..9f347136ee 100644 --- a/cmd/kube-controller-manager/app/controllermanager.go +++ b/cmd/kube-controller-manager/app/controllermanager.go @@ -451,6 +451,11 @@ func StartControllers(controllers map[string]InitFunc, s *options.CMServer, root return fmt.Errorf("cloud provider could not be initialized: %v", err) } + if cloud != nil { + // Initialize the cloud provider with a reference to the clientBuilder + cloud.Initialize(clientBuilder) + } + if ctx.IsControllerEnabled(nodeControllerName) { _, clusterCIDR, err := net.ParseCIDR(s.ClusterCIDR) if err != nil { diff --git a/pkg/cloudprovider/BUILD b/pkg/cloudprovider/BUILD index 134484b5e9..e638a06508 100644 --- a/pkg/cloudprovider/BUILD +++ b/pkg/cloudprovider/BUILD @@ -17,6 +17,7 @@ go_library( tags = ["automanaged"], deps = [ "//pkg/api/v1:go_default_library", + "//pkg/controller:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", ], diff --git a/pkg/cloudprovider/cloud.go b/pkg/cloudprovider/cloud.go index 2810ab3019..a9217e21be 100644 --- a/pkg/cloudprovider/cloud.go +++ b/pkg/cloudprovider/cloud.go @@ -23,10 +23,13 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/api/v1" + "k8s.io/kubernetes/pkg/controller" ) // Interface is an abstract, pluggable interface for cloud providers. type Interface interface { + // Initialize provides the cloud with a kubernetes client builder + Initialize(clientBuilder controller.ControllerClientBuilder) // LoadBalancer returns a balancer interface. Also returns true if the interface is supported, false otherwise. LoadBalancer() (LoadBalancer, bool) // Instances returns an instances interface. Also returns true if the interface is supported, false otherwise. diff --git a/pkg/cloudprovider/providers/aws/BUILD b/pkg/cloudprovider/providers/aws/BUILD index 47e16a82c4..0a0673595c 100644 --- a/pkg/cloudprovider/providers/aws/BUILD +++ b/pkg/cloudprovider/providers/aws/BUILD @@ -30,6 +30,7 @@ go_library( "//pkg/api/v1:go_default_library", "//pkg/api/v1/service:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", "//pkg/credentialprovider/aws:go_default_library", "//pkg/volume:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index 1667ff015a..8d42884e14 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -49,6 +49,7 @@ import ( "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1/service" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/volume" ) @@ -888,6 +889,9 @@ func newAWSCloud(config io.Reader, awsServices Services) (*Cloud, error) { return awsCloud, nil } +// Initialize passes a Kubernetes clientBuilder interface to the cloud provider +func (c *Cloud) Initialize(clientBuilder controller.ControllerClientBuilder) {} + // Clusters returns the list of clusters. func (c *Cloud) Clusters() (cloudprovider.Clusters, bool) { return nil, false diff --git a/pkg/cloudprovider/providers/azure/BUILD b/pkg/cloudprovider/providers/azure/BUILD index 5192a8b5e9..3c7707158c 100644 --- a/pkg/cloudprovider/providers/azure/BUILD +++ b/pkg/cloudprovider/providers/azure/BUILD @@ -29,6 +29,7 @@ go_library( "//pkg/api/v1:go_default_library", "//pkg/api/v1/service:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", "//pkg/version:go_default_library", "//pkg/volume:go_default_library", "//vendor/github.com/Azure/azure-sdk-for-go/arm/compute:go_default_library", diff --git a/pkg/cloudprovider/providers/azure/azure.go b/pkg/cloudprovider/providers/azure/azure.go index cd22f7beb5..7694693e26 100644 --- a/pkg/cloudprovider/providers/azure/azure.go +++ b/pkg/cloudprovider/providers/azure/azure.go @@ -20,8 +20,10 @@ import ( "fmt" "io" "io/ioutil" + "time" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/version" "github.com/Azure/azure-sdk-for-go/arm/compute" @@ -30,7 +32,6 @@ import ( "github.com/Azure/go-autorest/autorest" "github.com/Azure/go-autorest/autorest/azure" "github.com/ghodss/yaml" - "time" ) // CloudProviderName is the value used for the --cloud-provider flag @@ -179,6 +180,9 @@ func NewCloud(configReader io.Reader) (cloudprovider.Interface, error) { return &az, nil } +// Initialize passes a Kubernetes clientBuilder interface to the cloud provider +func (az *Cloud) Initialize(clientBuilder controller.ControllerClientBuilder) {} + // LoadBalancer returns a balancer interface. Also returns true if the interface is supported, false otherwise. func (az *Cloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) { return az, true diff --git a/pkg/cloudprovider/providers/cloudstack/BUILD b/pkg/cloudprovider/providers/cloudstack/BUILD index 10928e0f0a..52428e7e25 100644 --- a/pkg/cloudprovider/providers/cloudstack/BUILD +++ b/pkg/cloudprovider/providers/cloudstack/BUILD @@ -18,6 +18,7 @@ go_library( deps = [ "//pkg/api/v1:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/xanzy/go-cloudstack/cloudstack:go_default_library", "//vendor/gopkg.in/gcfg.v1:go_default_library", diff --git a/pkg/cloudprovider/providers/cloudstack/cloudstack.go b/pkg/cloudprovider/providers/cloudstack/cloudstack.go index 308e6a85f6..f8e2b3ffb6 100644 --- a/pkg/cloudprovider/providers/cloudstack/cloudstack.go +++ b/pkg/cloudprovider/providers/cloudstack/cloudstack.go @@ -24,6 +24,7 @@ import ( "github.com/xanzy/go-cloudstack/cloudstack" "gopkg.in/gcfg.v1" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" ) // ProviderName is the name of this cloud provider. @@ -81,6 +82,9 @@ func newCSCloud(cfg *CSConfig) (*CSCloud, error) { return &CSCloud{client, cfg.Global.ProjectID, cfg.Global.Zone}, nil } +// Initialize passes a Kubernetes clientBuilder interface to the cloud provider +func (cs *CSCloud) Initialize(clientBuilder controller.ControllerClientBuilder) {} + // LoadBalancer returns an implementation of LoadBalancer for CloudStack. func (cs *CSCloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) { return cs, true diff --git a/pkg/cloudprovider/providers/fake/BUILD b/pkg/cloudprovider/providers/fake/BUILD index 5b586ac810..489d7312e7 100644 --- a/pkg/cloudprovider/providers/fake/BUILD +++ b/pkg/cloudprovider/providers/fake/BUILD @@ -17,6 +17,7 @@ go_library( deps = [ "//pkg/api/v1:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", ], ) diff --git a/pkg/cloudprovider/providers/fake/fake.go b/pkg/cloudprovider/providers/fake/fake.go index d7b59ac7ff..dcca77f511 100644 --- a/pkg/cloudprovider/providers/fake/fake.go +++ b/pkg/cloudprovider/providers/fake/fake.go @@ -26,6 +26,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" ) const defaultProviderName = "fake" @@ -82,6 +83,9 @@ func (f *FakeCloud) ClearCalls() { f.Calls = []string{} } +// Initialize passes a Kubernetes clientBuilder interface to the cloud provider +func (f *FakeCloud) Initialize(clientBuilder controller.ControllerClientBuilder) {} + func (f *FakeCloud) ListClusters() ([]string, error) { return f.ClusterList, f.Err } diff --git a/pkg/cloudprovider/providers/gce/BUILD b/pkg/cloudprovider/providers/gce/BUILD index 726e468186..5e12082951 100644 --- a/pkg/cloudprovider/providers/gce/BUILD +++ b/pkg/cloudprovider/providers/gce/BUILD @@ -38,6 +38,7 @@ go_library( "//pkg/api/v1:go_default_library", "//pkg/api/v1/service:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", "//pkg/util/net/sets:go_default_library", "//pkg/volume:go_default_library", "//vendor/cloud.google.com/go/compute/metadata:go_default_library", diff --git a/pkg/cloudprovider/providers/gce/gce.go b/pkg/cloudprovider/providers/gce/gce.go index a878ee2392..a1a026971a 100644 --- a/pkg/cloudprovider/providers/gce/gce.go +++ b/pkg/cloudprovider/providers/gce/gce.go @@ -31,6 +31,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/util/flowcontrol" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" "github.com/golang/glog" "golang.org/x/oauth2" @@ -233,6 +234,9 @@ func CreateGCECloud(projectID, region, zone string, managedZones []string, netwo }, nil } +// Initialize passes a Kubernetes clientBuilder interface to the cloud provider +func (gce *GCECloud) Initialize(clientBuilder controller.ControllerClientBuilder) {} + // LoadBalancer returns an implementation of LoadBalancer for Google Compute Engine. func (gce *GCECloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) { return gce, true diff --git a/pkg/cloudprovider/providers/mesos/BUILD b/pkg/cloudprovider/providers/mesos/BUILD index 8b4b9d7f52..9734416365 100644 --- a/pkg/cloudprovider/providers/mesos/BUILD +++ b/pkg/cloudprovider/providers/mesos/BUILD @@ -20,6 +20,7 @@ go_library( deps = [ "//pkg/api/v1:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/mesos/mesos-go/detector:go_default_library", "//vendor/github.com/mesos/mesos-go/detector/zoo:go_default_library", diff --git a/pkg/cloudprovider/providers/mesos/mesos.go b/pkg/cloudprovider/providers/mesos/mesos.go index 76d80e36c0..9462ff0a05 100644 --- a/pkg/cloudprovider/providers/mesos/mesos.go +++ b/pkg/cloudprovider/providers/mesos/mesos.go @@ -31,6 +31,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" ) const ( @@ -89,6 +90,9 @@ func newMesosCloud(configReader io.Reader) (*MesosCloud, error) { } } +// Initialize passes a Kubernetes clientBuilder interface to the cloud provider +func (c *MesosCloud) Initialize(clientBuilder controller.ControllerClientBuilder) {} + // Implementation of Instances.CurrentNodeName func (c *MesosCloud) CurrentNodeName(hostname string) (types.NodeName, error) { return types.NodeName(hostname), nil diff --git a/pkg/cloudprovider/providers/openstack/BUILD b/pkg/cloudprovider/providers/openstack/BUILD index 53f86b4ee8..e10cb26aa0 100644 --- a/pkg/cloudprovider/providers/openstack/BUILD +++ b/pkg/cloudprovider/providers/openstack/BUILD @@ -24,6 +24,7 @@ go_library( "//pkg/api/v1/helper:go_default_library", "//pkg/api/v1/service:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", "//pkg/util/exec:go_default_library", "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", diff --git a/pkg/cloudprovider/providers/openstack/openstack.go b/pkg/cloudprovider/providers/openstack/openstack.go index 4ad0bfd772..26ce40dcb5 100644 --- a/pkg/cloudprovider/providers/openstack/openstack.go +++ b/pkg/cloudprovider/providers/openstack/openstack.go @@ -45,6 +45,7 @@ import ( "k8s.io/kubernetes/pkg/api/v1" v1helper "k8s.io/kubernetes/pkg/api/v1/helper" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" ) const ProviderName = "openstack" @@ -265,6 +266,9 @@ func newOpenStack(cfg Config) (*OpenStack, error) { return &os, nil } +// Initialize passes a Kubernetes clientBuilder interface to the cloud provider +func (os *OpenStack) Initialize(clientBuilder controller.ControllerClientBuilder) {} + // mapNodeNameToServerName maps a k8s NodeName to an OpenStack Server Name // This is a simple string cast. func mapNodeNameToServerName(nodeName types.NodeName) string { diff --git a/pkg/cloudprovider/providers/ovirt/BUILD b/pkg/cloudprovider/providers/ovirt/BUILD index fcbc3e9f4d..ce90c4e1ed 100644 --- a/pkg/cloudprovider/providers/ovirt/BUILD +++ b/pkg/cloudprovider/providers/ovirt/BUILD @@ -15,6 +15,7 @@ go_library( deps = [ "//pkg/api/v1:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", "//vendor/gopkg.in/gcfg.v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", ], diff --git a/pkg/cloudprovider/providers/ovirt/ovirt.go b/pkg/cloudprovider/providers/ovirt/ovirt.go index b0257cbc83..8273c0b170 100644 --- a/pkg/cloudprovider/providers/ovirt/ovirt.go +++ b/pkg/cloudprovider/providers/ovirt/ovirt.go @@ -34,6 +34,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" ) const ProviderName = "ovirt" @@ -116,7 +117,10 @@ func newOVirtCloud(config io.Reader) (*OVirtCloud, error) { return &OVirtCloud{VmsRequest: request}, nil } -func (aws *OVirtCloud) Clusters() (cloudprovider.Clusters, bool) { +// Initialize passes a Kubernetes clientBuilder interface to the cloud provider +func (v *OVirtCloud) Initialize(clientBuilder controller.ControllerClientBuilder) {} + +func (v *OVirtCloud) Clusters() (cloudprovider.Clusters, bool) { return nil, false } diff --git a/pkg/cloudprovider/providers/photon/BUILD b/pkg/cloudprovider/providers/photon/BUILD index d367e181b4..85c17eb901 100644 --- a/pkg/cloudprovider/providers/photon/BUILD +++ b/pkg/cloudprovider/providers/photon/BUILD @@ -16,6 +16,7 @@ go_library( "//pkg/api/v1:go_default_library", "//pkg/api/v1/helper:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/vmware/photon-controller-go-sdk/photon:go_default_library", "//vendor/gopkg.in/gcfg.v1:go_default_library", diff --git a/pkg/cloudprovider/providers/photon/photon.go b/pkg/cloudprovider/providers/photon/photon.go index c2bb026536..f33e9c27a8 100644 --- a/pkg/cloudprovider/providers/photon/photon.go +++ b/pkg/cloudprovider/providers/photon/photon.go @@ -41,6 +41,7 @@ import ( "k8s.io/kubernetes/pkg/api/v1" v1helper "k8s.io/kubernetes/pkg/api/v1/helper" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" ) const ( @@ -292,6 +293,9 @@ func newPCCloud(cfg PCConfig) (*PCCloud, error) { return &pc, nil } +// Initialize passes a Kubernetes clientBuilder interface to the cloud provider +func (pc *PCCloud) Initialize(clientBuilder controller.ControllerClientBuilder) {} + // Instances returns an implementation of Instances for Photon Controller. func (pc *PCCloud) Instances() (cloudprovider.Instances, bool) { return pc, true diff --git a/pkg/cloudprovider/providers/rackspace/BUILD b/pkg/cloudprovider/providers/rackspace/BUILD index dceda3955c..e9c9aae426 100644 --- a/pkg/cloudprovider/providers/rackspace/BUILD +++ b/pkg/cloudprovider/providers/rackspace/BUILD @@ -15,6 +15,7 @@ go_library( deps = [ "//pkg/api/v1:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/rackspace/gophercloud:go_default_library", "//vendor/github.com/rackspace/gophercloud/openstack/compute/v2/extensions/volumeattach:go_default_library", diff --git a/pkg/cloudprovider/providers/rackspace/rackspace.go b/pkg/cloudprovider/providers/rackspace/rackspace.go index 253b050887..c333b2f41c 100644 --- a/pkg/cloudprovider/providers/rackspace/rackspace.go +++ b/pkg/cloudprovider/providers/rackspace/rackspace.go @@ -43,6 +43,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" ) const ( @@ -218,6 +219,9 @@ func newRackspace(cfg Config) (*Rackspace, error) { return &os, nil } +// Initialize passes a Kubernetes clientBuilder interface to the cloud provider +func (os *Rackspace) Initialize(clientBuilder controller.ControllerClientBuilder) {} + type Instances struct { compute *gophercloud.ServiceClient } diff --git a/pkg/cloudprovider/providers/vsphere/BUILD b/pkg/cloudprovider/providers/vsphere/BUILD index fd29342072..8ff6d52ce4 100644 --- a/pkg/cloudprovider/providers/vsphere/BUILD +++ b/pkg/cloudprovider/providers/vsphere/BUILD @@ -19,6 +19,7 @@ go_library( "//pkg/api/v1:go_default_library", "//pkg/api/v1/helper:go_default_library", "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/vmware/govmomi:go_default_library", "//vendor/github.com/vmware/govmomi/find:go_default_library", diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 14a2628e29..a252e9748b 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -50,6 +50,7 @@ import ( "k8s.io/kubernetes/pkg/api/v1" v1helper "k8s.io/kubernetes/pkg/api/v1/helper" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" ) const ( @@ -229,6 +230,9 @@ func init() { }) } +// Initialize passes a Kubernetes clientBuilder interface to the cloud provider +func (vs *VSphere) Initialize(clientBuilder controller.ControllerClientBuilder) {} + // UUID gets the BIOS UUID via the sys interface. This UUID is known by vsphere func getvmUUID() (string, error) { id, err := ioutil.ReadFile(UUIDPath)