diff --git a/pkg/cloudprovider/providers/gce/cloud/mock/mock.go b/pkg/cloudprovider/providers/gce/cloud/mock/mock.go index 7018f352f09..21ba74da706 100644 --- a/pkg/cloudprovider/providers/gce/cloud/mock/mock.go +++ b/pkg/cloudprovider/providers/gce/cloud/mock/mock.go @@ -28,6 +28,7 @@ import ( "fmt" "net/http" + alpha "google.golang.org/api/compute/v0.alpha" ga "google.golang.org/api/compute/v1" "google.golang.org/api/googleapi" cloud "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud" @@ -74,3 +75,21 @@ func RemoveInstanceHook(ctx context.Context, key *meta.Key, req *ga.TargetPoolsR return nil } + +// GetAlphaFwdRuleHook mocks getting an AlphaForwardingRule. ForwardingRules +// are expected to default to Premium tier if no NetworkTier is specified. +func GetAlphaFwdRuleHook(ctx context.Context, key *meta.Key, m *cloud.MockAlphaForwardingRules) (bool, *alpha.ForwardingRule, error) { + if obj, ok := m.Objects[*key]; ok { + typedObj := obj.ToAlpha() + if typedObj.NetworkTier == "" { + typedObj.NetworkTier = "PREMIUM" + } + return true, typedObj, nil + } + + err := &googleapi.Error{ + Code: http.StatusNotFound, + } + + return false, nil, err +} diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go index 07d4e1c11d9..8d034f4b05e 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer_external_test.go @@ -27,6 +27,7 @@ import ( "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud" "k8s.io/kubernetes/pkg/cloudprovider/providers/gce/cloud/mock" @@ -296,6 +297,7 @@ func fakeGCECloud() (*GCECloud, error) { cloud := cloud.NewMockGCE(&gceProjectRouter{gce}) cloud.MockTargetPools.AddInstanceHook = mock.AddInstanceHook cloud.MockTargetPools.RemoveInstanceHook = mock.RemoveInstanceHook + cloud.MockAlphaForwardingRules.GetHook = mock.GetAlphaFwdRuleHook gce.c = cloud @@ -501,3 +503,54 @@ func TestEnsureExternalLoadBalancerDeleted(t *testing.T) { require.Error(t, err) assert.Nil(t, fwdRule) } + +func TestLoadBalancerWrongTierResourceDeletion(t *testing.T) { + gce, err := fakeGCECloud() + require.NoError(t, err) + + // Enable the NetworkTiers feature + gce.AlphaFeatureGate.features[AlphaFeatureNetworkTiers] = true + apiService.Annotations = map[string]string{NetworkTierAnnotationKey: "Premium"} + + // NetworkTier defaults to Premium + desiredTier, err := gce.getServiceNetworkTier(apiService) + require.NoError(t, err) + assert.Equal(t, NetworkTierPremium, desiredTier) + + lbName := cloudprovider.GetLoadBalancerName(apiService) + serviceName := types.NamespacedName{Namespace: apiService.Namespace, Name: apiService.Name} + + // create ForwardingRule and Address with the wrong tier + err = createForwardingRule( + gce, + lbName, + serviceName.String(), + gceRegion, + "", + gce.targetPoolURL(lbName), + apiService.Spec.Ports, + NetworkTierStandard, + ) + require.NoError(t, err) + + addressObj := &computealpha.Address{ + Name: lbName, + Description: serviceName.String(), + NetworkTier: NetworkTierStandard.ToGCEValue(), + } + + err = gce.ReserveAlphaRegionAddress(addressObj, gceRegion) + require.NoError(t, err) + + _, err = createExternalLoadBalancer(gce) + require.NoError(t, err) + + // Expect forwarding rule tier to not be Standard + tier, err := gce.getNetworkTierFromForwardingRule(lbName, gceRegion) + assert.NoError(t, err) + assert.Equal(t, NetworkTierDefault.ToGCEValue(), tier) + + // Expect address to be deleted + _, err = gce.GetRegionAddress(lbName, gceRegion) + assert.True(t, isNotFound(err)) +}