Use shared variable names. Define hooks on mock objects

This commit is contained in:
Ashley Gau 2018-02-20 13:17:09 -08:00
parent d62200bb6c
commit 6d9409a692

View File

@ -87,6 +87,9 @@ func fakeGCECloud() (*GCECloud, error) {
cloud := cloud.NewMockGCE(&gceProjectRouter{gce}) cloud := cloud.NewMockGCE(&gceProjectRouter{gce})
cloud.MockTargetPools.AddInstanceHook = mock.AddInstanceHook cloud.MockTargetPools.AddInstanceHook = mock.AddInstanceHook
cloud.MockTargetPools.RemoveInstanceHook = mock.RemoveInstanceHook cloud.MockTargetPools.RemoveInstanceHook = mock.RemoveInstanceHook
cloud.MockForwardingRules.InsertHook = mock.InsertFwdRuleHook
cloud.MockAddresses.InsertHook = mock.InsertAddressHook
cloud.MockAlphaAddresses.InsertHook = mock.InsertAlphaAddressHook
gce.c = cloud gce.c = cloud
@ -94,43 +97,42 @@ func fakeGCECloud() (*GCECloud, error) {
} }
func TestEnsureStaticIP(t *testing.T) { func TestEnsureStaticIP(t *testing.T) {
fcas := NewFakeCloudAddressService() gce, err := fakeGCECloud()
require.NoError(t, err)
ipName := "some-static-ip" ipName := "some-static-ip"
serviceName := ""
region := "us-central1"
// First ensure call // First ensure call
ip, existed, err := ensureStaticIP(fcas, ipName, serviceName, region, "", NetworkTierDefault) ip, existed, err := ensureStaticIP(gce, ipName, serviceName, region, "", cloud.NetworkTierDefault)
if err != nil || existed || ip == "" { if err != nil || existed {
t.Fatalf(`ensureStaticIP(%v, %v, %v, %v, "") = %v, %v, %v; want valid ip, false, nil`, fcas, ipName, serviceName, region, ip, existed, err) t.Fatalf(`ensureStaticIP(%v, %v, %v, %v, "") = %v, %v, %v; want valid ip, false, nil`, gce, ipName, serviceName, region, ip, existed, err)
} }
// Second ensure call // Second ensure call
var ipPrime string var ipPrime string
ipPrime, existed, err = ensureStaticIP(fcas, ipName, serviceName, region, ip, NetworkTierDefault) ipPrime, existed, err = ensureStaticIP(gce, ipName, serviceName, region, ip, cloud.NetworkTierDefault)
if err != nil || !existed || ip != ipPrime { if err != nil || !existed || ip != ipPrime {
t.Fatalf(`ensureStaticIP(%v, %v, %v, %v, %v) = %v, %v, %v; want %v, true, nil`, fcas, ipName, serviceName, region, ip, ipPrime, existed, err, ip) t.Fatalf(`ensureStaticIP(%v, %v, %v, %v, %v) = %v, %v, %v; want %v, true, nil`, gce, ipName, serviceName, region, ip, ipPrime, existed, err, ip)
} }
} }
func TestEnsureStaticIPWithTier(t *testing.T) { func TestEnsureStaticIPWithTier(t *testing.T) {
s := NewFakeCloudAddressService() s, err := fakeGCECloud()
serviceName := "" require.NoError(t, err)
region := "us-east1"
for desc, tc := range map[string]struct { for desc, tc := range map[string]struct {
name string name string
netTier NetworkTier netTier cloud.NetworkTier
expected string expected string
}{ }{
"Premium (default)": { "Premium (default)": {
name: "foo-1", name: "foo-1",
netTier: NetworkTierPremium, netTier: cloud.NetworkTierPremium,
expected: "PREMIUM", expected: "PREMIUM",
}, },
"Standard": { "Standard": {
name: "foo-2", name: "foo-2",
netTier: NetworkTierStandard, netTier: cloud.NetworkTierStandard,
expected: "STANDARD", expected: "STANDARD",
}, },
} { } {
@ -138,7 +140,7 @@ func TestEnsureStaticIPWithTier(t *testing.T) {
ip, existed, err := ensureStaticIP(s, tc.name, serviceName, region, "", tc.netTier) ip, existed, err := ensureStaticIP(s, tc.name, serviceName, region, "", tc.netTier)
assert.NoError(t, err) assert.NoError(t, err)
assert.False(t, existed) assert.False(t, existed)
assert.NotEqual(t, "", ip) assert.NotEqual(t, ip, "")
// Get the Address from the fake address service and verify that the tier // Get the Address from the fake address service and verify that the tier
// is set correctly. // is set correctly.
alphaAddr, err := s.GetAlphaRegionAddress(tc.name, region) alphaAddr, err := s.GetAlphaRegionAddress(tc.name, region)
@ -149,21 +151,19 @@ func TestEnsureStaticIPWithTier(t *testing.T) {
} }
func TestVerifyRequestedIP(t *testing.T) { func TestVerifyRequestedIP(t *testing.T) {
region := "test-region"
lbRef := "test-lb" lbRef := "test-lb"
s := NewFakeCloudAddressService()
for desc, tc := range map[string]struct { for desc, tc := range map[string]struct {
requestedIP string requestedIP string
fwdRuleIP string fwdRuleIP string
netTier NetworkTier netTier cloud.NetworkTier
addrList []*computealpha.Address addrList []*computealpha.Address
expectErr bool expectErr bool
expectUserOwned bool expectUserOwned bool
}{ }{
"requested IP exists": { "requested IP exists": {
requestedIP: "1.1.1.1", requestedIP: "1.1.1.1",
netTier: NetworkTierPremium, netTier: cloud.NetworkTierPremium,
addrList: []*computealpha.Address{{Name: "foo", Address: "1.1.1.1", NetworkTier: "PREMIUM"}}, addrList: []*computealpha.Address{{Name: "foo", Address: "1.1.1.1", NetworkTier: "PREMIUM"}},
expectErr: false, expectErr: false,
expectUserOwned: true, expectUserOwned: true,
@ -171,28 +171,33 @@ func TestVerifyRequestedIP(t *testing.T) {
"requested IP is not static, but is in use by the fwd rule": { "requested IP is not static, but is in use by the fwd rule": {
requestedIP: "1.1.1.1", requestedIP: "1.1.1.1",
fwdRuleIP: "1.1.1.1", fwdRuleIP: "1.1.1.1",
netTier: NetworkTierPremium, netTier: cloud.NetworkTierPremium,
expectErr: false, expectErr: false,
}, },
"requested IP is not static and is not used by the fwd rule": { "requested IP is not static and is not used by the fwd rule": {
requestedIP: "1.1.1.1", requestedIP: "1.1.1.1",
fwdRuleIP: "2.2.2.2", fwdRuleIP: "2.2.2.2",
netTier: NetworkTierPremium, netTier: cloud.NetworkTierPremium,
expectErr: true, expectErr: true,
}, },
"no requested IP": { "no requested IP": {
netTier: NetworkTierPremium, netTier: cloud.NetworkTierPremium,
expectErr: false, expectErr: false,
}, },
"requested IP exists, but network tier does not match": { "requested IP exists, but network tier does not match": {
requestedIP: "1.1.1.1", requestedIP: "1.1.1.1",
netTier: NetworkTierStandard, netTier: cloud.NetworkTierStandard,
addrList: []*computealpha.Address{{Name: "foo", Address: "1.1.1.1", NetworkTier: "PREMIUM"}}, addrList: []*computealpha.Address{{Name: "foo", Address: "1.1.1.1", NetworkTier: "PREMIUM"}},
expectErr: true, expectErr: true,
}, },
} { } {
t.Run(desc, func(t *testing.T) { t.Run(desc, func(t *testing.T) {
s.SetRegionalAddresses(region, tc.addrList) s, err := fakeGCECloud()
require.NoError(t, err)
for _, addr := range tc.addrList {
s.ReserveAlphaRegionAddress(addr, region)
}
isUserOwnedIP, err := verifyUserRequestedIP(s, region, tc.requestedIP, tc.fwdRuleIP, lbRef, tc.netTier) isUserOwnedIP, err := verifyUserRequestedIP(s, region, tc.requestedIP, tc.fwdRuleIP, lbRef, tc.netTier)
assert.Equal(t, tc.expectErr, err != nil, fmt.Sprintf("err: %v", err)) assert.Equal(t, tc.expectErr, err != nil, fmt.Sprintf("err: %v", err))
assert.Equal(t, tc.expectUserOwned, isUserOwnedIP) assert.Equal(t, tc.expectUserOwned, isUserOwnedIP)
@ -201,19 +206,18 @@ func TestVerifyRequestedIP(t *testing.T) {
} }
func TestCreateForwardingRuleWithTier(t *testing.T) { func TestCreateForwardingRuleWithTier(t *testing.T) {
s := NewFakeCloudForwardingRuleService()
// Common variables among the tests. // Common variables among the tests.
ports := []v1.ServicePort{{Name: "foo", Protocol: v1.ProtocolTCP, Port: int32(123)}} ports := []v1.ServicePort{{Name: "foo", Protocol: v1.ProtocolTCP, Port: int32(123)}}
region := "test-region"
target := "test-target-pool" target := "test-target-pool"
svcName := "foo-svc" svcName := "foo-svc"
baseLinkUrl := "https://www.googleapis.com/compute/%v/projects/%v/regions/%v/forwardingRules/%v"
for desc, tc := range map[string]struct { for desc, tc := range map[string]struct {
netTier NetworkTier netTier cloud.NetworkTier
expectedRule *computealpha.ForwardingRule expectedRule *computealpha.ForwardingRule
}{ }{
"Premium tier": { "Premium tier": {
netTier: NetworkTierPremium, netTier: cloud.NetworkTierPremium,
expectedRule: &computealpha.ForwardingRule{ expectedRule: &computealpha.ForwardingRule{
Name: "lb-1", Name: "lb-1",
Description: `{"kubernetes.io/service-name":"foo-svc"}`, Description: `{"kubernetes.io/service-name":"foo-svc"}`,
@ -222,10 +226,11 @@ func TestCreateForwardingRuleWithTier(t *testing.T) {
PortRange: "123-123", PortRange: "123-123",
Target: target, Target: target,
NetworkTier: "PREMIUM", NetworkTier: "PREMIUM",
SelfLink: fmt.Sprintf(baseLinkUrl, "v1", projectID, region, "lb-1"),
}, },
}, },
"Standard tier": { "Standard tier": {
netTier: NetworkTierStandard, netTier: cloud.NetworkTierStandard,
expectedRule: &computealpha.ForwardingRule{ expectedRule: &computealpha.ForwardingRule{
Name: "lb-2", Name: "lb-2",
Description: `{"kubernetes.io/service-name":"foo-svc"}`, Description: `{"kubernetes.io/service-name":"foo-svc"}`,
@ -234,14 +239,18 @@ func TestCreateForwardingRuleWithTier(t *testing.T) {
PortRange: "123-123", PortRange: "123-123",
Target: target, Target: target,
NetworkTier: "STANDARD", NetworkTier: "STANDARD",
SelfLink: fmt.Sprintf(baseLinkUrl, "alpha", projectID, region, "lb-2"),
}, },
}, },
} { } {
t.Run(desc, func(t *testing.T) { t.Run(desc, func(t *testing.T) {
s, err := fakeGCECloud()
require.NoError(t, err)
lbName := tc.expectedRule.Name lbName := tc.expectedRule.Name
ipAddr := tc.expectedRule.IPAddress ipAddr := tc.expectedRule.IPAddress
err := createForwardingRule(s, lbName, svcName, region, ipAddr, target, ports, tc.netTier) err = createForwardingRule(s, lbName, svcName, region, ipAddr, target, ports, tc.netTier)
assert.NoError(t, err) assert.NoError(t, err)
alphaRule, err := s.GetAlphaRegionForwardingRule(lbName, region) alphaRule, err := s.GetAlphaRegionForwardingRule(lbName, region)
@ -252,43 +261,50 @@ func TestCreateForwardingRuleWithTier(t *testing.T) {
} }
func TestDeleteAddressWithWrongTier(t *testing.T) { func TestDeleteAddressWithWrongTier(t *testing.T) {
region := "test-region"
lbRef := "test-lb" lbRef := "test-lb"
s := NewFakeCloudAddressService()
s, err := fakeGCECloud()
require.NoError(t, err)
// Enable the cloud.NetworkTiers feature
s.AlphaFeatureGate.features[AlphaFeatureNetworkTiers] = true
for desc, tc := range map[string]struct { for desc, tc := range map[string]struct {
addrName string addrName string
netTier NetworkTier netTier cloud.NetworkTier
addrList []*computealpha.Address addrList []*computealpha.Address
expectDelete bool expectDelete bool
}{ }{
"Network tiers (premium) match; do nothing": { "Network tiers (premium) match; do nothing": {
addrName: "foo1", addrName: "foo1",
netTier: NetworkTierPremium, netTier: cloud.NetworkTierPremium,
addrList: []*computealpha.Address{{Name: "foo1", Address: "1.1.1.1", NetworkTier: "PREMIUM"}}, addrList: []*computealpha.Address{{Name: "foo1", Address: "1.1.1.1", NetworkTier: "PREMIUM"}},
}, },
"Network tiers (standard) match; do nothing": { "Network tiers (standard) match; do nothing": {
addrName: "foo2", addrName: "foo2",
netTier: NetworkTierStandard, netTier: cloud.NetworkTierStandard,
addrList: []*computealpha.Address{{Name: "foo2", Address: "1.1.1.2", NetworkTier: "STANDARD"}}, addrList: []*computealpha.Address{{Name: "foo2", Address: "1.1.1.2", NetworkTier: "STANDARD"}},
}, },
"Wrong network tier (standard); delete address": { "Wrong network tier (standard); delete address": {
addrName: "foo3", addrName: "foo3",
netTier: NetworkTierPremium, netTier: cloud.NetworkTierPremium,
addrList: []*computealpha.Address{{Name: "foo3", Address: "1.1.1.3", NetworkTier: "STANDARD"}}, addrList: []*computealpha.Address{{Name: "foo3", Address: "1.1.1.3", NetworkTier: "STANDARD"}},
expectDelete: true, expectDelete: true,
}, },
"Wrong network tier (preimium); delete address": { "Wrong network tier (premium); delete address": {
addrName: "foo4", addrName: "foo4",
netTier: NetworkTierStandard, netTier: cloud.NetworkTierStandard,
addrList: []*computealpha.Address{{Name: "foo4", Address: "1.1.1.4", NetworkTier: "PREMIUM"}}, addrList: []*computealpha.Address{{Name: "foo4", Address: "1.1.1.4", NetworkTier: "PREMIUM"}},
expectDelete: true, expectDelete: true,
}, },
} { } {
t.Run(desc, func(t *testing.T) { t.Run(desc, func(t *testing.T) {
s.SetRegionalAddresses(region, tc.addrList) for _, addr := range tc.addrList {
s.ReserveAlphaRegionAddress(addr, region)
}
// Sanity check to ensure we inject the right address. // Sanity check to ensure we inject the right address.
_, err := s.GetRegionAddress(tc.addrName, region) _, err = s.GetRegionAddress(tc.addrName, region)
require.NoError(t, err) require.NoError(t, err)
err = deleteAddressWithWrongTier(s, region, tc.addrName, lbRef, tc.netTier) err = deleteAddressWithWrongTier(s, region, tc.addrName, lbRef, tc.netTier)
@ -316,7 +332,7 @@ func createAndInsertNodes(gce *GCECloud, nodeNames []string) ([]*v1.Node, error)
if instance == nil { if instance == nil {
err := gce.InsertInstance( err := gce.InsertInstance(
gceProjectId, projectID,
zoneName, zoneName,
&compute.Instance{ &compute.Instance{
Name: name, Name: name,
@ -392,7 +408,7 @@ func TestEnsureExternalLoadBalancer(t *testing.T) {
} }
// Check that TargetPool is Created // Check that TargetPool is Created
pool, err := gce.GetTargetPool(lbName, gceRegion) pool, err := gce.GetTargetPool(lbName, region)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, lbName, pool.Name) assert.Equal(t, lbName, pool.Name)
assert.NotEmpty(t, pool.HealthChecks) assert.NotEmpty(t, pool.HealthChecks)
@ -404,7 +420,7 @@ func TestEnsureExternalLoadBalancer(t *testing.T) {
assert.Equal(t, hcName, healthcheck.Name) assert.Equal(t, hcName, healthcheck.Name)
// Check that ForwardingRule is created // Check that ForwardingRule is created
fwdRule, err := gce.GetRegionForwardingRule(lbName, gceRegion) fwdRule, err := gce.GetRegionForwardingRule(lbName, region)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, lbName, fwdRule.Name) assert.Equal(t, lbName, fwdRule.Name)
assert.Equal(t, "TCP", fwdRule.IPProtocol) assert.Equal(t, "TCP", fwdRule.IPProtocol)
@ -428,7 +444,7 @@ func TestUpdateExternalLoadBalancer(t *testing.T) {
lbName := cloudprovider.GetLoadBalancerName(apiService) lbName := cloudprovider.GetLoadBalancerName(apiService)
pool, err := gce.GetTargetPool(lbName, gceRegion) pool, err := gce.GetTargetPool(lbName, region)
require.NoError(t, err) require.NoError(t, err)
// TODO: when testify is updated to v1.2.0+, use ElementsMatch instead // TODO: when testify is updated to v1.2.0+, use ElementsMatch instead
@ -453,7 +469,7 @@ func TestUpdateExternalLoadBalancer(t *testing.T) {
err = gce.updateExternalLoadBalancer(clusterName, apiService, newNodes) err = gce.updateExternalLoadBalancer(clusterName, apiService, newNodes)
assert.NoError(t, err) assert.NoError(t, err)
pool, err = gce.GetTargetPool(lbName, gceRegion) pool, err = gce.GetTargetPool(lbName, region)
require.NoError(t, err) require.NoError(t, err)
assert.Equal( assert.Equal(
@ -489,7 +505,7 @@ func TestEnsureExternalLoadBalancerDeleted(t *testing.T) {
} }
// Check that TargetPool is deleted // Check that TargetPool is deleted
pool, err := gce.GetTargetPool(lbName, gceRegion) pool, err := gce.GetTargetPool(lbName, region)
require.Error(t, err) require.Error(t, err)
assert.Nil(t, pool) assert.Nil(t, pool)
@ -499,7 +515,7 @@ func TestEnsureExternalLoadBalancerDeleted(t *testing.T) {
assert.Nil(t, healthcheck) assert.Nil(t, healthcheck)
// Check forwarding rule is deleted // Check forwarding rule is deleted
fwdRule, err := gce.GetRegionForwardingRule(lbName, gceRegion) fwdRule, err := gce.GetRegionForwardingRule(lbName, region)
require.Error(t, err) require.Error(t, err)
assert.Nil(t, fwdRule) assert.Nil(t, fwdRule)
} }
@ -508,14 +524,14 @@ func TestLoadBalancerWrongTierResourceDeletion(t *testing.T) {
gce, err := fakeGCECloud() gce, err := fakeGCECloud()
require.NoError(t, err) require.NoError(t, err)
// Enable the NetworkTiers feature // Enable the cloud.NetworkTiers feature
gce.AlphaFeatureGate.features[AlphaFeatureNetworkTiers] = true gce.AlphaFeatureGate.features[AlphaFeatureNetworkTiers] = true
apiService.Annotations = map[string]string{NetworkTierAnnotationKey: "Premium"} apiService.Annotations = map[string]string{NetworkTierAnnotationKey: "Premium"}
// NetworkTier defaults to Premium // cloud.NetworkTier defaults to Premium
desiredTier, err := gce.getServiceNetworkTier(apiService) desiredTier, err := gce.getServiceNetworkTier(apiService)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, NetworkTierPremium, desiredTier) assert.Equal(t, cloud.NetworkTierPremium, desiredTier)
lbName := cloudprovider.GetLoadBalancerName(apiService) lbName := cloudprovider.GetLoadBalancerName(apiService)
serviceName := types.NamespacedName{Namespace: apiService.Namespace, Name: apiService.Name} serviceName := types.NamespacedName{Namespace: apiService.Namespace, Name: apiService.Name}
@ -525,32 +541,32 @@ func TestLoadBalancerWrongTierResourceDeletion(t *testing.T) {
gce, gce,
lbName, lbName,
serviceName.String(), serviceName.String(),
gceRegion, region,
"", "",
gce.targetPoolURL(lbName), gce.targetPoolURL(lbName),
apiService.Spec.Ports, apiService.Spec.Ports,
NetworkTierStandard, cloud.NetworkTierStandard,
) )
require.NoError(t, err) require.NoError(t, err)
addressObj := &computealpha.Address{ addressObj := &computealpha.Address{
Name: lbName, Name: lbName,
Description: serviceName.String(), Description: serviceName.String(),
NetworkTier: NetworkTierStandard.ToGCEValue(), NetworkTier: cloud.NetworkTierStandard.ToGCEValue(),
} }
err = gce.ReserveAlphaRegionAddress(addressObj, gceRegion) err = gce.ReserveAlphaRegionAddress(addressObj, region)
require.NoError(t, err) require.NoError(t, err)
_, err = createExternalLoadBalancer(gce) _, err = createExternalLoadBalancer(gce)
require.NoError(t, err) require.NoError(t, err)
// Expect forwarding rule tier to not be Standard // Expect forwarding rule tier to not be Standard
tier, err := gce.getNetworkTierFromForwardingRule(lbName, gceRegion) tier, err := gce.getNetworkTierFromForwardingRule(lbName, region)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, NetworkTierDefault.ToGCEValue(), tier) assert.Equal(t, cloud.NetworkTierDefault.ToGCEValue(), tier)
// Expect address to be deleted // Expect address to be deleted
_, err = gce.GetRegionAddress(lbName, gceRegion) _, err = gce.GetRegionAddress(lbName, region)
assert.True(t, isNotFound(err)) assert.True(t, isNotFound(err))
} }