diff --git a/controllers/gce/backends/backends_test.go b/controllers/gce/backends/backends_test.go index 951cbb1cd..08afd35f6 100644 --- a/controllers/gce/backends/backends_test.go +++ b/controllers/gce/backends/backends_test.go @@ -17,6 +17,7 @@ limitations under the License. package backends import ( + "net/http" "testing" compute "google.golang.org/api/compute/v1" @@ -25,10 +26,14 @@ import ( "k8s.io/ingress/controllers/gce/storage" "k8s.io/ingress/controllers/gce/utils" "k8s.io/kubernetes/pkg/util/sets" + + "google.golang.org/api/googleapi" ) const defaultZone = "zone-a" +var noOpErrFunc = func(op int, be *compute.BackendService) error { return nil } + func newBackendPool(f BackendServices, fakeIGs instances.InstanceGroups, syncWithCloud bool) BackendPool { namer := &utils.Namer{} nodePool := instances.NewNodePool(fakeIGs) @@ -40,7 +45,7 @@ func newBackendPool(f BackendServices, fakeIGs instances.InstanceGroups, syncWit } func TestBackendPoolAdd(t *testing.T) { - f := NewFakeBackendServices() + f := NewFakeBackendServices(noOpErrFunc) fakeIGs := instances.NewFakeInstanceGroups(sets.NewString()) pool := newBackendPool(f, fakeIGs, false) namer := utils.Namer{} @@ -110,7 +115,7 @@ func TestBackendPoolSync(t *testing.T) { // Call sync on a backend pool with a list of ports, make sure the pool // creates/deletes required ports. svcNodePorts := []int64{81, 82, 83} - f := NewFakeBackendServices() + f := NewFakeBackendServices(noOpErrFunc) fakeIGs := instances.NewFakeInstanceGroups(sets.NewString()) pool := newBackendPool(f, fakeIGs, true) pool.Add(81) @@ -174,7 +179,7 @@ func TestBackendPoolSync(t *testing.T) { } func TestBackendPoolShutdown(t *testing.T) { - f := NewFakeBackendServices() + f := NewFakeBackendServices(noOpErrFunc) fakeIGs := instances.NewFakeInstanceGroups(sets.NewString()) pool := newBackendPool(f, fakeIGs, false) namer := utils.Namer{} @@ -187,7 +192,7 @@ func TestBackendPoolShutdown(t *testing.T) { } func TestBackendInstanceGroupClobbering(t *testing.T) { - f := NewFakeBackendServices() + f := NewFakeBackendServices(noOpErrFunc) fakeIGs := instances.NewFakeInstanceGroups(sets.NewString()) pool := newBackendPool(f, fakeIGs, false) namer := utils.Namer{} @@ -230,3 +235,40 @@ func TestBackendInstanceGroupClobbering(t *testing.T) { t.Fatalf("Expected %v Got %v", expectedGroups, gotGroups) } } + +func TestBackendCreateBalancingMode(t *testing.T) { + f := NewFakeBackendServices(noOpErrFunc) + + fakeIGs := instances.NewFakeInstanceGroups(sets.NewString()) + pool := newBackendPool(f, fakeIGs, false) + namer := utils.Namer{} + nodePort := int64(8080) + modes := []BalancingMode{Rate, Utilization} + + // block the creation of Backends with the given balancingMode + // and verify that a backend with the other balancingMode is + // created + for i, bm := range modes { + f.errFunc = func(op int, be *compute.BackendService) error { + for _, b := range be.Backends { + if b.BalancingMode == string(bm) { + return &googleapi.Error{Code: http.StatusBadRequest} + } + } + return nil + } + + pool.Add(nodePort) + be, err := f.GetBackendService(namer.BeName(nodePort)) + if err != nil { + t.Fatalf("%v", err) + } + + for _, b := range be.Backends { + if b.BalancingMode != string(modes[(i+1)%len(modes)]) { + t.Fatalf("Wrong balancing mode, expected %v got %v", modes[(i+1)%len(modes)], b.BalancingMode) + } + } + pool.GC([]int64{}) + } +} diff --git a/controllers/gce/backends/fakes.go b/controllers/gce/backends/fakes.go index a5eb1d006..bb2b031f0 100644 --- a/controllers/gce/backends/fakes.go +++ b/controllers/gce/backends/fakes.go @@ -25,8 +25,9 @@ import ( ) // NewFakeBackendServices creates a new fake backend services manager. -func NewFakeBackendServices() *FakeBackendServices { +func NewFakeBackendServices(ef func(op int, be *compute.BackendService) error) *FakeBackendServices { return &FakeBackendServices{ + errFunc: ef, backendServices: cache.NewStore(func(obj interface{}) (string, error) { svc := obj.(*compute.BackendService) return svc.Name, nil @@ -38,6 +39,7 @@ func NewFakeBackendServices() *FakeBackendServices { type FakeBackendServices struct { backendServices cache.Store calls []int + errFunc func(op int, be *compute.BackendService) error } // GetBackendService fakes getting a backend service from the cloud. @@ -60,6 +62,11 @@ func (f *FakeBackendServices) GetBackendService(name string) (*compute.BackendSe // CreateBackendService fakes backend service creation. func (f *FakeBackendServices) CreateBackendService(be *compute.BackendService) error { + if f.errFunc != nil { + if err := f.errFunc(utils.Create, be); err != nil { + return err + } + } f.calls = append(f.calls, utils.Create) be.SelfLink = be.Name return f.backendServices.Update(be) diff --git a/controllers/gce/controller/fakes.go b/controllers/gce/controller/fakes.go index cfa3ed08f..ae97f0d9c 100644 --- a/controllers/gce/controller/fakes.go +++ b/controllers/gce/controller/fakes.go @@ -20,6 +20,7 @@ import ( "k8s.io/kubernetes/pkg/util/intstr" "k8s.io/kubernetes/pkg/util/sets" + compute "google.golang.org/api/compute/v1" "k8s.io/ingress/controllers/gce/backends" "k8s.io/ingress/controllers/gce/firewalls" "k8s.io/ingress/controllers/gce/healthchecks" @@ -45,7 +46,7 @@ type fakeClusterManager struct { // NewFakeClusterManager creates a new fake ClusterManager. func NewFakeClusterManager(clusterName string) *fakeClusterManager { fakeLbs := loadbalancers.NewFakeLoadBalancers(clusterName) - fakeBackends := backends.NewFakeBackendServices() + fakeBackends := backends.NewFakeBackendServices(func(op int, be *compute.BackendService) error { return nil }) fakeIGs := instances.NewFakeInstanceGroups(sets.NewString()) fakeHCs := healthchecks.NewFakeHealthChecks() namer := utils.NewNamer(clusterName) diff --git a/controllers/gce/loadbalancers/loadbalancers_test.go b/controllers/gce/loadbalancers/loadbalancers_test.go index 4d6fe133b..f1373a933 100644 --- a/controllers/gce/loadbalancers/loadbalancers_test.go +++ b/controllers/gce/loadbalancers/loadbalancers_test.go @@ -34,7 +34,7 @@ const ( ) func newFakeLoadBalancerPool(f LoadBalancers, t *testing.T) LoadBalancerPool { - fakeBackends := backends.NewFakeBackendServices() + fakeBackends := backends.NewFakeBackendServices(func(op int, be *compute.BackendService) error { return nil }) fakeIGs := instances.NewFakeInstanceGroups(sets.NewString()) fakeHCs := healthchecks.NewFakeHealthChecks() namer := &utils.Namer{}