From 40549dc083ed31be959a4d252461aa989d943139 Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Thu, 30 Apr 2015 17:47:34 -0700 Subject: [PATCH] Truncate GCE load balancer names to 63 chars --- pkg/cloudprovider/gce/gce.go | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/pkg/cloudprovider/gce/gce.go b/pkg/cloudprovider/gce/gce.go index a0826ae7fee..f3ac5b1736c 100644 --- a/pkg/cloudprovider/gce/gce.go +++ b/pkg/cloudprovider/gce/gce.go @@ -17,6 +17,7 @@ limitations under the License. package gce_cloud import ( + "crypto/md5" "fmt" "io" "io/ioutil" @@ -42,6 +43,8 @@ import ( "google.golang.org/cloud/compute/metadata" ) +const LOAD_BALANCER_NAME_MAX_LENGTH = 63 + // GCECloud is an implementation of Interface, TCPLoadBalancer and Instances for Google Compute Engine. type GCECloud struct { service *compute.Service @@ -266,10 +269,23 @@ func translateAffinityType(affinityType api.AffinityType) GCEAffinityType { } } +func normalizeName(name string) string { + // If it's short enough, just leave it. + if len(name) < LOAD_BALANCER_NAME_MAX_LENGTH-6 { + return name + } + // Hash and truncate + hash := md5.Sum([]byte(name)) + truncated := name[0 : LOAD_BALANCER_NAME_MAX_LENGTH-6] + shortHash := hash[0:6] + return fmt.Sprintf("%s%s", truncated, string(shortHash)) +} + // CreateTCPLoadBalancer is an implementation of TCPLoadBalancer.CreateTCPLoadBalancer. // TODO(a-robinson): Don't just ignore specified IP addresses. Check if they're // owned by the project and available to be used, and use them if they are. -func (gce *GCECloud) CreateTCPLoadBalancer(name, region string, externalIP net.IP, ports []int, hosts []string, affinityType api.AffinityType) (string, error) { +func (gce *GCECloud) CreateTCPLoadBalancer(origName, region string, externalIP net.IP, ports []int, hosts []string, affinityType api.AffinityType) (string, error) { + name := normalizeName(origName) err := gce.makeTargetPool(name, region, hosts, translateAffinityType(affinityType)) if err != nil { if !isHTTPErrorCode(err, http.StatusConflict) { @@ -315,7 +331,8 @@ func (gce *GCECloud) CreateTCPLoadBalancer(name, region string, externalIP net.I } // UpdateTCPLoadBalancer is an implementation of TCPLoadBalancer.UpdateTCPLoadBalancer. -func (gce *GCECloud) UpdateTCPLoadBalancer(name, region string, hosts []string) error { +func (gce *GCECloud) UpdateTCPLoadBalancer(origName, region string, hosts []string) error { + name := normalizeName(origName) pool, err := gce.service.TargetPools.Get(gce.projectID, region, name).Do() if err != nil { return err @@ -360,7 +377,8 @@ func (gce *GCECloud) UpdateTCPLoadBalancer(name, region string, hosts []string) } // DeleteTCPLoadBalancer is an implementation of TCPLoadBalancer.DeleteTCPLoadBalancer. -func (gce *GCECloud) DeleteTCPLoadBalancer(name, region string) error { +func (gce *GCECloud) DeleteTCPLoadBalancer(origName, region string) error { + name := normalizeName(origName) op, err := gce.service.ForwardingRules.Delete(gce.projectID, region, name).Do() if err != nil && isHTTPErrorCode(err, http.StatusNotFound) { glog.Infof("Forwarding rule %s already deleted. Continuing to delete target pool.", name)