diff --git a/pkg/cloudprovider/providers/gce/cloud/constants.go b/pkg/cloudprovider/providers/gce/cloud/constants.go index 3dc6f423d56..5b6fa08b4e7 100644 --- a/pkg/cloudprovider/providers/gce/cloud/constants.go +++ b/pkg/cloudprovider/providers/gce/cloud/constants.go @@ -21,11 +21,15 @@ import ( ) type NetworkTier string +type LbScheme string const ( NetworkTierStandard NetworkTier = "Standard" NetworkTierPremium NetworkTier = "Premium" NetworkTierDefault NetworkTier = NetworkTierPremium + + SchemeExternal LbScheme = "EXTERNAL" + SchemeInternal LbScheme = "INTERNAL" ) // ToGCEValue converts NetworkTier to a string that we can populate the diff --git a/pkg/cloudprovider/providers/gce/gce_address_manager.go b/pkg/cloudprovider/providers/gce/gce_address_manager.go index ad7c38b89d2..4f642a92ccf 100644 --- a/pkg/cloudprovider/providers/gce/gce_address_manager.go +++ b/pkg/cloudprovider/providers/gce/gce_address_manager.go @@ -23,6 +23,7 @@ import ( compute "google.golang.org/api/compute/v1" "github.com/golang/glog" + "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud" ) type addressManager struct { @@ -31,13 +32,13 @@ type addressManager struct { name string serviceName string targetIP string - addressType lbScheme + addressType cloud.LbScheme region string subnetURL string tryRelease bool } -func newAddressManager(svc CloudAddressService, serviceName, region, subnetURL, name, targetIP string, addressType lbScheme) *addressManager { +func newAddressManager(svc CloudAddressService, serviceName, region, subnetURL, name, targetIP string, addressType cloud.LbScheme) *addressManager { return &addressManager{ svc: svc, logPrefix: fmt.Sprintf("AddressManager(%q)", name), diff --git a/pkg/cloudprovider/providers/gce/gce_address_manager_test.go b/pkg/cloudprovider/providers/gce/gce_address_manager_test.go index 1eee47cae93..3c7d60dc564 100644 --- a/pkg/cloudprovider/providers/gce/gce_address_manager_test.go +++ b/pkg/cloudprovider/providers/gce/gce_address_manager_test.go @@ -22,6 +22,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" compute "google.golang.org/api/compute/v1" + "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud" ) const testSvcName = "my-service" @@ -34,8 +35,8 @@ func TestAddressManagerNoRequestedIP(t *testing.T) { svc := NewFakeCloudAddressService() targetIP := "" - mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, schemeInternal) - testHoldAddress(t, mgr, svc, testLBName, testRegion, targetIP, string(schemeInternal)) + mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, cloud.SchemeInternal) + testHoldAddress(t, mgr, svc, testLBName, testRegion, targetIP, string(cloud.SchemeInternal)) testReleaseAddress(t, mgr, svc, testLBName, testRegion) } @@ -44,8 +45,8 @@ func TestAddressManagerBasic(t *testing.T) { svc := NewFakeCloudAddressService() targetIP := "1.1.1.1" - mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, schemeInternal) - testHoldAddress(t, mgr, svc, testLBName, testRegion, targetIP, string(schemeInternal)) + mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, cloud.SchemeInternal) + testHoldAddress(t, mgr, svc, testLBName, testRegion, targetIP, string(cloud.SchemeInternal)) testReleaseAddress(t, mgr, svc, testLBName, testRegion) } @@ -55,12 +56,12 @@ func TestAddressManagerOrphaned(t *testing.T) { svc := NewFakeCloudAddressService() targetIP := "1.1.1.1" - addr := &compute.Address{Name: testLBName, Address: targetIP, AddressType: string(schemeInternal)} + addr := &compute.Address{Name: testLBName, Address: targetIP, AddressType: string(cloud.SchemeInternal)} err := svc.ReserveRegionAddress(addr, testRegion) require.NoError(t, err) - mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, schemeInternal) - testHoldAddress(t, mgr, svc, testLBName, testRegion, targetIP, string(schemeInternal)) + mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, cloud.SchemeInternal) + testHoldAddress(t, mgr, svc, testLBName, testRegion, targetIP, string(cloud.SchemeInternal)) testReleaseAddress(t, mgr, svc, testLBName, testRegion) } @@ -71,12 +72,12 @@ func TestAddressManagerOutdatedOrphan(t *testing.T) { previousAddress := "1.1.0.0" targetIP := "1.1.1.1" - addr := &compute.Address{Name: testLBName, Address: previousAddress, AddressType: string(schemeExternal)} + addr := &compute.Address{Name: testLBName, Address: previousAddress, AddressType: string(cloud.SchemeExternal)} err := svc.ReserveRegionAddress(addr, testRegion) require.NoError(t, err) - mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, schemeInternal) - testHoldAddress(t, mgr, svc, testLBName, testRegion, targetIP, string(schemeInternal)) + mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, cloud.SchemeInternal) + testHoldAddress(t, mgr, svc, testLBName, testRegion, targetIP, string(cloud.SchemeInternal)) testReleaseAddress(t, mgr, svc, testLBName, testRegion) } @@ -86,11 +87,11 @@ func TestAddressManagerExternallyOwned(t *testing.T) { svc := NewFakeCloudAddressService() targetIP := "1.1.1.1" - addr := &compute.Address{Name: "my-important-address", Address: targetIP, AddressType: string(schemeInternal)} + addr := &compute.Address{Name: "my-important-address", Address: targetIP, AddressType: string(cloud.SchemeInternal)} err := svc.ReserveRegionAddress(addr, testRegion) require.NoError(t, err) - mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, schemeInternal) + mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, cloud.SchemeInternal) ipToUse, err := mgr.HoldAddress() require.NoError(t, err) assert.NotEmpty(t, ipToUse) @@ -107,11 +108,11 @@ func TestAddressManagerBadExternallyOwned(t *testing.T) { svc := NewFakeCloudAddressService() targetIP := "1.1.1.1" - addr := &compute.Address{Name: "my-important-address", Address: targetIP, AddressType: string(schemeExternal)} + addr := &compute.Address{Name: "my-important-address", Address: targetIP, AddressType: string(cloud.SchemeExternal)} err := svc.ReserveRegionAddress(addr, testRegion) require.NoError(t, err) - mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, schemeInternal) + mgr := newAddressManager(svc, testSvcName, testRegion, testSubnet, testLBName, targetIP, cloud.SchemeInternal) _, err = mgr.HoldAddress() assert.NotNil(t, err) } diff --git a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go index e9ed209e4f4..75dfa571c9c 100644 --- a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go +++ b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go @@ -25,6 +25,8 @@ import ( computealpha "google.golang.org/api/compute/v0.alpha" computebeta "google.golang.org/api/compute/v0.beta" compute "google.golang.org/api/compute/v1" + + "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud" ) // test @@ -68,7 +70,7 @@ func (cas *FakeCloudAddressService) ReserveAlphaRegionAddress(addr *computealpha } if addr.AddressType == "" { - addr.AddressType = string(schemeExternal) + addr.AddressType = string(cloud.SchemeExternal) } if cas.reservedAddrs[addr.Address] { @@ -76,8 +78,8 @@ func (cas *FakeCloudAddressService) ReserveAlphaRegionAddress(addr *computealpha // When the IP is already in use, this call returns an error code based // on the type (internal vs external) of the address. This is to be // consistent with actual GCE API. - switch lbScheme(addr.AddressType) { - case schemeExternal: + switch cloud.LbScheme(addr.AddressType) { + case cloud.SchemeExternal: return makeGoogleAPIError(http.StatusBadRequest, msg) default: return makeGoogleAPIError(http.StatusConflict, msg) @@ -209,7 +211,7 @@ func convertToAlphaAddress(object gceObject) *computealpha.Address { panic(fmt.Sprintf("Failed to convert GCE apiObject %v to alpha address: %v", object, err)) } // Set the default values for the Alpha fields. - addr.NetworkTier = NetworkTierDefault.ToGCEValue() + addr.NetworkTier = cloud.NetworkTierDefault.ToGCEValue() return &addr } diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer.go index 34f22de34d9..4cb66234661 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer.go @@ -28,6 +28,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud" netsets "k8s.io/kubernetes/pkg/util/net/sets" ) @@ -44,13 +45,6 @@ func newLoadBalancerMetricContext(request, region string) *metricContext { return newGenericMetricContext("loadbalancer", request, region, unusedMetricLabel, computeV1Version) } -type lbScheme string - -const ( - schemeExternal lbScheme = "EXTERNAL" - schemeInternal lbScheme = "INTERNAL" -) - func init() { var err error // LB L7 proxies and all L3/4/7 health checkers have client addresses within these known CIDRs. @@ -126,13 +120,13 @@ func (gce *GCECloud) EnsureLoadBalancer(ctx context.Context, clusterName string, } if existingFwdRule != nil { - existingScheme := lbScheme(strings.ToUpper(existingFwdRule.LoadBalancingScheme)) + existingScheme := cloud.LbScheme(strings.ToUpper(existingFwdRule.LoadBalancingScheme)) // If the loadbalancer type changes between INTERNAL and EXTERNAL, the old load balancer should be deleted. if existingScheme != desiredScheme { glog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v): deleting existing %v loadbalancer", clusterName, svc.Namespace, svc.Name, loadBalancerName, gce.region, existingScheme) switch existingScheme { - case schemeInternal: + case cloud.SchemeInternal: err = gce.ensureInternalLoadBalancerDeleted(clusterName, clusterID, svc) default: err = gce.ensureExternalLoadBalancerDeleted(clusterName, clusterID, svc) @@ -149,7 +143,7 @@ func (gce *GCECloud) EnsureLoadBalancer(ctx context.Context, clusterName string, var status *v1.LoadBalancerStatus switch desiredScheme { - case schemeInternal: + case cloud.SchemeInternal: status, err = gce.ensureInternalLoadBalancer(clusterName, clusterID, svc, existingFwdRule, nodes) default: status, err = gce.ensureExternalLoadBalancer(clusterName, clusterID, svc, existingFwdRule, nodes) @@ -170,7 +164,7 @@ func (gce *GCECloud) UpdateLoadBalancer(ctx context.Context, clusterName string, glog.V(4).Infof("UpdateLoadBalancer(%v, %v, %v, %v, %v): updating with %d nodes", clusterName, svc.Namespace, svc.Name, loadBalancerName, gce.region, len(nodes)) switch scheme { - case schemeInternal: + case cloud.SchemeInternal: err = gce.updateInternalLoadBalancer(clusterName, clusterID, svc, nodes) default: err = gce.updateExternalLoadBalancer(clusterName, svc, nodes) @@ -191,7 +185,7 @@ func (gce *GCECloud) EnsureLoadBalancerDeleted(ctx context.Context, clusterName glog.V(4).Infof("EnsureLoadBalancerDeleted(%v, %v, %v, %v, %v): deleting loadbalancer", clusterName, svc.Namespace, svc.Name, loadBalancerName, gce.region) switch scheme { - case schemeInternal: + case cloud.SchemeInternal: err = gce.ensureInternalLoadBalancerDeleted(clusterName, clusterID, svc) default: err = gce.ensureExternalLoadBalancerDeleted(clusterName, clusterID, svc) @@ -200,9 +194,9 @@ func (gce *GCECloud) EnsureLoadBalancerDeleted(ctx context.Context, clusterName return err } -func getSvcScheme(svc *v1.Service) lbScheme { +func getSvcScheme(svc *v1.Service) cloud.LbScheme { if typ, ok := GetLoadBalancerAnnotationType(svc); ok && typ == LBTypeInternal { - return schemeInternal + return cloud.SchemeInternal } - return schemeExternal + return cloud.SchemeExternal } diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go index 64f9e2e9ae4..51251fe26d2 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_internal.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/util/sets" v1_service "k8s.io/kubernetes/pkg/api/v1/service" "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud" ) const ( @@ -37,7 +38,7 @@ const ( func (gce *GCECloud) ensureInternalLoadBalancer(clusterName, clusterID string, svc *v1.Service, existingFwdRule *compute.ForwardingRule, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) { nm := types.NamespacedName{Name: svc.Name, Namespace: svc.Namespace} ports, protocol := getPortsAndProtocol(svc.Spec.Ports) - scheme := schemeInternal + scheme := cloud.SchemeInternal loadBalancerName := cloudprovider.GetLoadBalancerName(svc) sharedBackend := shareBackendService(svc) backendServiceName := makeBackendServiceName(loadBalancerName, clusterID, sharedBackend, scheme, protocol, svc.Spec.SessionAffinity) @@ -93,7 +94,7 @@ func (gce *GCECloud) ensureInternalLoadBalancer(clusterName, clusterID string, s var addrMgr *addressManager // If the network is not a legacy network, use the address manager if !gce.IsLegacyNetwork() { - addrMgr = newAddressManager(gce, nm.String(), gce.Region(), subnetworkURL, loadBalancerName, requestedIP, schemeInternal) + addrMgr = newAddressManager(gce, nm.String(), gce.Region(), subnetworkURL, loadBalancerName, requestedIP, cloud.SchemeInternal) ipToUse, err = addrMgr.HoldAddress() if err != nil { return nil, err @@ -208,7 +209,7 @@ func (gce *GCECloud) updateInternalLoadBalancer(clusterName, clusterID string, s // Generate the backend service name _, protocol := getPortsAndProtocol(svc.Spec.Ports) - scheme := schemeInternal + scheme := cloud.SchemeInternal loadBalancerName := cloudprovider.GetLoadBalancerName(svc) backendServiceName := makeBackendServiceName(loadBalancerName, clusterID, shareBackendService(svc), scheme, protocol, svc.Spec.SessionAffinity) // Ensure the backend service has the proper backend/instance-group links @@ -218,7 +219,7 @@ func (gce *GCECloud) updateInternalLoadBalancer(clusterName, clusterID string, s func (gce *GCECloud) ensureInternalLoadBalancerDeleted(clusterName, clusterID string, svc *v1.Service) error { loadBalancerName := cloudprovider.GetLoadBalancerName(svc) _, protocol := getPortsAndProtocol(svc.Spec.Ports) - scheme := schemeInternal + scheme := cloud.SchemeInternal sharedBackend := shareBackendService(svc) sharedHealthCheck := !v1_service.RequestsOnlyLocalTraffic(svc) @@ -506,7 +507,7 @@ func (gce *GCECloud) ensureInternalInstanceGroupsDeleted(name string) error { return nil } -func (gce *GCECloud) ensureInternalBackendService(name, description string, affinityType v1.ServiceAffinity, scheme lbScheme, protocol v1.Protocol, igLinks []string, hcLink string) error { +func (gce *GCECloud) ensureInternalBackendService(name, description string, affinityType v1.ServiceAffinity, scheme cloud.LbScheme, protocol v1.Protocol, igLinks []string, hcLink string) error { glog.V(2).Infof("ensureInternalBackendService(%v, %v, %v): checking existing backend service with %d groups", name, scheme, protocol, len(igLinks)) bs, err := gce.GetRegionBackendService(name, gce.region) if err != nil && !isNotFound(err) { diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_naming.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_naming.go index 7fee340a629..1e1feeff53b 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_naming.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_naming.go @@ -24,6 +24,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud" ) // Internal Load Balancer @@ -33,7 +34,7 @@ func makeInstanceGroupName(clusterID string) string { return fmt.Sprintf("k8s-ig--%s", clusterID) } -func makeBackendServiceName(loadBalancerName, clusterID string, shared bool, scheme lbScheme, protocol v1.Protocol, svcAffinity v1.ServiceAffinity) string { +func makeBackendServiceName(loadBalancerName, clusterID string, shared bool, scheme cloud.LbScheme, protocol v1.Protocol, svcAffinity v1.ServiceAffinity) string { if shared { hash := sha1.New()