diff --git a/pkg/cloudprovider/cloud.go b/pkg/cloudprovider/cloud.go index a774682247c..4a3b2a48a4e 100644 --- a/pkg/cloudprovider/cloud.go +++ b/pkg/cloudprovider/cloud.go @@ -81,13 +81,13 @@ type LoadBalancer interface { // GetLoadBalancer returns whether the specified load balancer exists, and // if so, what its status is. // Implementations must treat the *api.Service parameter as read-only and not modify it. - GetLoadBalancer(service *api.Service) (status *api.LoadBalancerStatus, exists bool, err error) + GetLoadBalancer(clusterName string, service *api.Service) (status *api.LoadBalancerStatus, exists bool, err error) // EnsureLoadBalancer creates a new load balancer 'name', or updates the existing one. Returns the status of the balancer // Implementations must treat the *api.Service parameter as read-only and not modify it. - EnsureLoadBalancer(service *api.Service, hosts []string) (*api.LoadBalancerStatus, error) + EnsureLoadBalancer(clusterName string, service *api.Service, hosts []string) (*api.LoadBalancerStatus, error) // UpdateLoadBalancer updates hosts under the specified load balancer. // Implementations must treat the *api.Service parameter as read-only and not modify it. - UpdateLoadBalancer(service *api.Service, hosts []string) error + UpdateLoadBalancer(clusterName string, service *api.Service, hosts []string) error // EnsureLoadBalancerDeleted deletes the specified load balancer if it // exists, returning nil if the load balancer specified either didn't exist or // was successfully deleted. @@ -95,7 +95,7 @@ type LoadBalancer interface { // have multiple underlying components, meaning a Get could say that the LB // doesn't exist even if some part of it is still laying around. // Implementations must treat the *api.Service parameter as read-only and not modify it. - EnsureLoadBalancerDeleted(service *api.Service) error + EnsureLoadBalancerDeleted(clusterName string, service *api.Service) error } // Instances is an abstract, pluggable interface for sets of instances. diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index b348a6e560a..e83ddd47593 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -2297,10 +2297,10 @@ func buildListener(port api.ServicePort, annotations map[string]string, sslPorts } // EnsureLoadBalancer implements LoadBalancer.EnsureLoadBalancer -func (c *Cloud) EnsureLoadBalancer(apiService *api.Service, hosts []string) (*api.LoadBalancerStatus, error) { +func (c *Cloud) EnsureLoadBalancer(clusterName string, apiService *api.Service, hosts []string) (*api.LoadBalancerStatus, error) { annotations := apiService.Annotations - glog.V(2).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", - apiService.Namespace, apiService.Name, c.region, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, hosts, annotations) + glog.V(2).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v, %v)", + clusterName, apiService.Namespace, apiService.Name, c.region, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, hosts, annotations) if apiService.Spec.SessionAffinity != api.ServiceAffinityNone { // ELB supports sticky sessions, but only when configured for HTTP/HTTPS @@ -2472,7 +2472,7 @@ func (c *Cloud) EnsureLoadBalancer(apiService *api.Service, hosts []string) (*ap } // GetLoadBalancer is an implementation of LoadBalancer.GetLoadBalancer -func (c *Cloud) GetLoadBalancer(service *api.Service) (*api.LoadBalancerStatus, bool, error) { +func (c *Cloud) GetLoadBalancer(clusterName string, service *api.Service) (*api.LoadBalancerStatus, bool, error) { loadBalancerName := cloudprovider.GetLoadBalancerName(service) lb, err := c.describeLoadBalancer(loadBalancerName) if err != nil { @@ -2688,7 +2688,7 @@ func (c *Cloud) updateInstanceSecurityGroupsForLoadBalancer(lb *elb.LoadBalancer } // EnsureLoadBalancerDeleted implements LoadBalancer.EnsureLoadBalancerDeleted. -func (c *Cloud) EnsureLoadBalancerDeleted(service *api.Service) error { +func (c *Cloud) EnsureLoadBalancerDeleted(clusterName string, service *api.Service) error { loadBalancerName := cloudprovider.GetLoadBalancerName(service) lb, err := c.describeLoadBalancer(loadBalancerName) if err != nil { @@ -2784,7 +2784,7 @@ func (c *Cloud) EnsureLoadBalancerDeleted(service *api.Service) error { } // UpdateLoadBalancer implements LoadBalancer.UpdateLoadBalancer -func (c *Cloud) UpdateLoadBalancer(service *api.Service, hosts []string) error { +func (c *Cloud) UpdateLoadBalancer(clusterName string, service *api.Service, hosts []string) error { hostSet := sets.NewString(hosts...) instances, err := c.getInstancesByNodeNamesCached(hostSet) if err != nil { diff --git a/pkg/cloudprovider/providers/gce/gce.go b/pkg/cloudprovider/providers/gce/gce.go index 8f95ff8f0b0..a7d71a3f7ca 100644 --- a/pkg/cloudprovider/providers/gce/gce.go +++ b/pkg/cloudprovider/providers/gce/gce.go @@ -494,7 +494,7 @@ func (gce *GCECloud) waitForZoneOp(op *compute.Operation, zone string) error { } // GetLoadBalancer is an implementation of LoadBalancer.GetLoadBalancer -func (gce *GCECloud) GetLoadBalancer(service *api.Service) (*api.LoadBalancerStatus, bool, error) { +func (gce *GCECloud) GetLoadBalancer(clusterName string, service *api.Service) (*api.LoadBalancerStatus, bool, error) { loadBalancerName := cloudprovider.GetLoadBalancerName(service) fwd, err := gce.service.ForwardingRules.Get(gce.projectID, gce.region, loadBalancerName).Do() if err == nil { @@ -521,7 +521,7 @@ func isHTTPErrorCode(err error, code int) bool { // Due to an interesting series of design decisions, this handles both creating // new load balancers and updating existing load balancers, recognizing when // each is needed. -func (gce *GCECloud) EnsureLoadBalancer(apiService *api.Service, hostNames []string) (*api.LoadBalancerStatus, error) { +func (gce *GCECloud) EnsureLoadBalancer(clusterName string, apiService *api.Service, hostNames []string) (*api.LoadBalancerStatus, error) { if len(hostNames) == 0 { return nil, fmt.Errorf("Cannot EnsureLoadBalancer() with no hosts") } @@ -1193,7 +1193,7 @@ func (gce *GCECloud) ensureStaticIP(name, serviceName, region, existingIP string } // UpdateLoadBalancer is an implementation of LoadBalancer.UpdateLoadBalancer. -func (gce *GCECloud) UpdateLoadBalancer(service *api.Service, hostNames []string) error { +func (gce *GCECloud) UpdateLoadBalancer(clusterName string, service *api.Service, hostNames []string) error { hosts, err := gce.getInstancesByNames(hostNames) if err != nil { return err @@ -1264,9 +1264,9 @@ func (gce *GCECloud) updateTargetPool(loadBalancerName string, existing sets.Str } // EnsureLoadBalancerDeleted is an implementation of LoadBalancer.EnsureLoadBalancerDeleted. -func (gce *GCECloud) EnsureLoadBalancerDeleted(service *api.Service) error { +func (gce *GCECloud) EnsureLoadBalancerDeleted(clusterName string, service *api.Service) error { loadBalancerName := cloudprovider.GetLoadBalancerName(service) - glog.V(2).Infof("EnsureLoadBalancerDeleted(%v, %v, %v, %v)", service.Namespace, service.Name, loadBalancerName, + glog.V(2).Infof("EnsureLoadBalancerDeleted(%v, %v, %v, %v, %v)", clusterName, service.Namespace, service.Name, loadBalancerName, gce.region) errs := utilerrors.AggregateGoroutines( diff --git a/pkg/cloudprovider/providers/openstack/openstack_loadbalancer.go b/pkg/cloudprovider/providers/openstack/openstack_loadbalancer.go index e3b2ab12b0e..615210b705c 100644 --- a/pkg/cloudprovider/providers/openstack/openstack_loadbalancer.go +++ b/pkg/cloudprovider/providers/openstack/openstack_loadbalancer.go @@ -260,7 +260,7 @@ func waitLoadbalancerDeleted(client *gophercloud.ServiceClient, loadbalancerID s } } -func (lbaas *LbaasV2) GetLoadBalancer(service *api.Service) (*api.LoadBalancerStatus, bool, error) { +func (lbaas *LbaasV2) GetLoadBalancer(clusterName string, service *api.Service) (*api.LoadBalancerStatus, bool, error) { loadBalancerName := cloudprovider.GetLoadBalancerName(service) loadbalancer, err := getLoadbalancerByName(lbaas.network, loadBalancerName) if err == ErrNotFound { @@ -281,8 +281,8 @@ func (lbaas *LbaasV2) GetLoadBalancer(service *api.Service) (*api.LoadBalancerSt // a list of regions (from config) and query/create loadbalancers in // each region. -func (lbaas *LbaasV2) EnsureLoadBalancer(apiService *api.Service, hosts []string) (*api.LoadBalancerStatus, error) { - glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v)", apiService.Namespace, apiService.Name, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, hosts, apiService.Annotations) +func (lbaas *LbaasV2) EnsureLoadBalancer(clusterName string, apiService *api.Service, hosts []string) (*api.LoadBalancerStatus, error) { + glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", clusterName, apiService.Namespace, apiService.Name, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, hosts, apiService.Annotations) ports := apiService.Spec.Ports if len(ports) > 1 { @@ -318,7 +318,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(apiService *api.Service, hosts []string } glog.V(2).Infof("Checking if openstack load balancer already exists: %s", cloudprovider.GetLoadBalancerName(apiService)) - _, exists, err := lbaas.GetLoadBalancer(apiService) + _, exists, err := lbaas.GetLoadBalancer(clusterName, apiService) if err != nil { return nil, fmt.Errorf("error checking if openstack load balancer already exists: %v", err) } @@ -326,7 +326,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(apiService *api.Service, hosts []string // TODO: Implement a more efficient update strategy for common changes than delete & create // In particular, if we implement hosts update, we can get rid of UpdateHosts if exists { - err := lbaas.EnsureLoadBalancerDeleted(apiService) + err := lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) if err != nil { return nil, fmt.Errorf("error deleting existing openstack load balancer: %v", err) } @@ -352,7 +352,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(apiService *api.Service, hosts []string loadbalancer, err := loadbalancers.Create(lbaas.network, createOpts).Extract() if err != nil { // cleanup what was created so far - _ = lbaas.EnsureLoadBalancerDeleted(apiService) + _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } @@ -366,7 +366,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(apiService *api.Service, hosts []string }).Extract() if err != nil { // cleanup what was created so far - _ = lbaas.EnsureLoadBalancerDeleted(apiService) + _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } @@ -381,7 +381,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(apiService *api.Service, hosts []string }).Extract() if err != nil { // cleanup what was created so far - _ = lbaas.EnsureLoadBalancerDeleted(apiService) + _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } @@ -400,7 +400,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(apiService *api.Service, hosts []string }).Extract() if err != nil { // cleanup what was created so far - _ = lbaas.EnsureLoadBalancerDeleted(apiService) + _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } } @@ -417,7 +417,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(apiService *api.Service, hosts []string }).Extract() if err != nil { // cleanup what was created so far - _ = lbaas.EnsureLoadBalancerDeleted(apiService) + _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } } @@ -430,7 +430,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(apiService *api.Service, hosts []string portID, err := getPortIDByIP(lbaas.network, loadbalancer.VipAddress) if err != nil { // cleanup what was created so far - _ = lbaas.EnsureLoadBalancerDeleted(apiService) + _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } @@ -441,7 +441,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(apiService *api.Service, hosts []string floatIP, err := floatingips.Create(lbaas.network, floatIPOpts).Extract() if err != nil { // cleanup what was created so far - _ = lbaas.EnsureLoadBalancerDeleted(apiService) + _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } @@ -451,9 +451,9 @@ func (lbaas *LbaasV2) EnsureLoadBalancer(apiService *api.Service, hosts []string return status, nil } -func (lbaas *LbaasV2) UpdateLoadBalancer(service *api.Service, hosts []string) error { +func (lbaas *LbaasV2) UpdateLoadBalancer(clusterName string, service *api.Service, hosts []string) error { loadBalancerName := cloudprovider.GetLoadBalancerName(service) - glog.V(4).Infof("UpdateLoadBalancer(%v, %v)", loadBalancerName, hosts) + glog.V(4).Infof("UpdateLoadBalancer(%v, %v, %v)", clusterName, loadBalancerName, hosts) ports := service.Spec.Ports if len(ports) > 1 { @@ -538,9 +538,9 @@ func (lbaas *LbaasV2) UpdateLoadBalancer(service *api.Service, hosts []string) e return nil } -func (lbaas *LbaasV2) EnsureLoadBalancerDeleted(service *api.Service) error { +func (lbaas *LbaasV2) EnsureLoadBalancerDeleted(clusterName string, service *api.Service) error { loadBalancerName := cloudprovider.GetLoadBalancerName(service) - glog.V(4).Infof("EnsureLoadBalancerDeleted(%v)", loadBalancerName) + glog.V(4).Infof("EnsureLoadBalancerDeleted(%v, %v)", clusterName, loadBalancerName) loadbalancer, err := getLoadbalancerByName(lbaas.network, loadBalancerName) if err != nil && err != ErrNotFound { @@ -690,7 +690,7 @@ func (lbaas *LbaasV2) EnsureLoadBalancerDeleted(service *api.Service) error { return nil } -func (lb *LbaasV1) GetLoadBalancer(service *api.Service) (*api.LoadBalancerStatus, bool, error) { +func (lb *LbaasV1) GetLoadBalancer(clusterName string, service *api.Service) (*api.LoadBalancerStatus, bool, error) { loadBalancerName := cloudprovider.GetLoadBalancerName(service) vip, err := getVipByName(lb.network, loadBalancerName) if err == ErrNotFound { @@ -711,8 +711,8 @@ func (lb *LbaasV1) GetLoadBalancer(service *api.Service) (*api.LoadBalancerStatu // a list of regions (from config) and query/create loadbalancers in // each region. -func (lb *LbaasV1) EnsureLoadBalancer(apiService *api.Service, hosts []string) (*api.LoadBalancerStatus, error) { - glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v)", apiService.Namespace, apiService.Name, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, hosts, apiService.Annotations) +func (lb *LbaasV1) EnsureLoadBalancer(clusterName string, apiService *api.Service, hosts []string) (*api.LoadBalancerStatus, error) { + glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v, %v)", clusterName, apiService.Namespace, apiService.Name, apiService.Spec.LoadBalancerIP, apiService.Spec.Ports, hosts, apiService.Annotations) ports := apiService.Spec.Ports if len(ports) > 1 { @@ -748,7 +748,7 @@ func (lb *LbaasV1) EnsureLoadBalancer(apiService *api.Service, hosts []string) ( } glog.V(2).Infof("Checking if openstack load balancer already exists: %s", cloudprovider.GetLoadBalancerName(apiService)) - _, exists, err := lb.GetLoadBalancer(apiService) + _, exists, err := lb.GetLoadBalancer(clusterName, apiService) if err != nil { return nil, fmt.Errorf("error checking if openstack load balancer already exists: %v", err) } @@ -756,7 +756,7 @@ func (lb *LbaasV1) EnsureLoadBalancer(apiService *api.Service, hosts []string) ( // TODO: Implement a more efficient update strategy for common changes than delete & create // In particular, if we implement hosts update, we can get rid of UpdateHosts if exists { - err := lb.EnsureLoadBalancerDeleted(apiService) + err := lb.EnsureLoadBalancerDeleted(clusterName, apiService) if err != nil { return nil, fmt.Errorf("error deleting existing openstack load balancer: %v", err) } @@ -860,9 +860,9 @@ func (lb *LbaasV1) EnsureLoadBalancer(apiService *api.Service, hosts []string) ( } -func (lb *LbaasV1) UpdateLoadBalancer(service *api.Service, hosts []string) error { +func (lb *LbaasV1) UpdateLoadBalancer(clusterName string, service *api.Service, hosts []string) error { loadBalancerName := cloudprovider.GetLoadBalancerName(service) - glog.V(4).Infof("UpdateLoadBalancer(%v, %v)", loadBalancerName, hosts) + glog.V(4).Infof("UpdateLoadBalancer(%v, %v, %v)", clusterName, loadBalancerName, hosts) vip, err := getVipByName(lb.network, loadBalancerName) if err != nil { @@ -922,9 +922,9 @@ func (lb *LbaasV1) UpdateLoadBalancer(service *api.Service, hosts []string) erro return nil } -func (lb *LbaasV1) EnsureLoadBalancerDeleted(service *api.Service) error { +func (lb *LbaasV1) EnsureLoadBalancerDeleted(clusterName string, service *api.Service) error { loadBalancerName := cloudprovider.GetLoadBalancerName(service) - glog.V(4).Infof("EnsureLoadBalancerDeleted(%v)", loadBalancerName) + glog.V(4).Infof("EnsureLoadBalancerDeleted(%v, %v)", clusterName, loadBalancerName) vip, err := getVipByName(lb.network, loadBalancerName) if err != nil && err != ErrNotFound { diff --git a/pkg/controller/service/servicecontroller.go b/pkg/controller/service/servicecontroller.go index 682bd92749f..0fcb4160403 100644 --- a/pkg/controller/service/servicecontroller.go +++ b/pkg/controller/service/servicecontroller.go @@ -262,7 +262,7 @@ func (s *ServiceController) processDelta(delta *cache.Delta) (error, time.Durati if errors.IsNotFound(err) { glog.V(2).Infof("Service %v not found, ensuring load balancer is deleted", namespacedName) s.eventRecorder.Event(deltaService, api.EventTypeNormal, "DeletingLoadBalancer", "Deleting load balancer") - err := s.balancer.EnsureLoadBalancerDeleted(deltaService) + err := s.balancer.EnsureLoadBalancerDeleted(s.clusterName, deltaService) if err != nil { message := "Error deleting load balancer (will retry): " + err.Error() s.eventRecorder.Event(deltaService, api.EventTypeWarning, "DeletingLoadBalancerFailed", message) @@ -338,7 +338,7 @@ func (s *ServiceController) createLoadBalancerIfNeeded(namespacedName types.Name // If we don't have any cached memory of the load balancer, we have to ask // the cloud provider for what it knows about it. // Technically EnsureLoadBalancerDeleted can cope, but we want to post meaningful events - _, exists, err := s.balancer.GetLoadBalancer(service) + _, exists, err := s.balancer.GetLoadBalancer(s.clusterName, service) if err != nil { return fmt.Errorf("error getting LB for service %s: %v", namespacedName, err), retryable } @@ -350,7 +350,7 @@ func (s *ServiceController) createLoadBalancerIfNeeded(namespacedName types.Name if needDelete { glog.Infof("Deleting existing load balancer for service %s that no longer needs a load balancer.", namespacedName) s.eventRecorder.Event(service, api.EventTypeNormal, "DeletingLoadBalancer", "Deleting load balancer") - if err := s.balancer.EnsureLoadBalancerDeleted(service); err != nil { + if err := s.balancer.EnsureLoadBalancerDeleted(s.clusterName, service); err != nil { return err, retryable } s.eventRecorder.Event(service, api.EventTypeNormal, "DeletedLoadBalancer", "Deleted load balancer") @@ -412,7 +412,7 @@ func (s *ServiceController) createLoadBalancer(service *api.Service) error { // - Only one protocol supported per service // - Not all cloud providers support all protocols and the next step is expected to return // an error for unsupported protocols - status, err := s.balancer.EnsureLoadBalancer(service, hostsFromNodeList(&nodes)) + status, err := s.balancer.EnsureLoadBalancer(s.clusterName, service, hostsFromNodeList(&nodes)) if err != nil { return err } @@ -745,14 +745,14 @@ func (s *ServiceController) lockedUpdateLoadBalancerHosts(service *api.Service, } // This operation doesn't normally take very long (and happens pretty often), so we only record the final event - err := s.balancer.UpdateLoadBalancer(service, hosts) + err := s.balancer.UpdateLoadBalancer(s.clusterName, service, hosts) if err == nil { s.eventRecorder.Event(service, api.EventTypeNormal, "UpdatedLoadBalancer", "Updated load balancer with new hosts") return nil } // It's only an actual error if the load balancer still exists. - if _, exists, err := s.balancer.GetLoadBalancer(service); err != nil { + if _, exists, err := s.balancer.GetLoadBalancer(s.clusterName, service); err != nil { glog.Errorf("External error while checking if load balancer %q exists: name, %v", cloudprovider.GetLoadBalancerName(service), err) } else if !exists { return nil