Skip to content

Commit f9ab24b

Browse files
Refine test case
1 parent 9ae1fc3 commit f9ab24b

File tree

2 files changed

+57
-72
lines changed

2 files changed

+57
-72
lines changed

staging/src/k8s.io/cloud-provider/controllers/service/controller_test.go

Lines changed: 28 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,13 +1386,9 @@ func TestNeedsCleanup(t *testing.T) {
13861386
// make sure that the slow node sync never removes the Node from LB set because it
13871387
// has stale data.
13881388
func TestSlowNodeSync(t *testing.T) {
1389-
stopCh, updateCallCh := make(chan struct{}), make(chan fakecloud.UpdateBalancerCall)
1389+
stopCh, syncServiceDone, syncService := make(chan struct{}), make(chan string), make(chan string)
13901390
defer close(stopCh)
1391-
defer close(updateCallCh)
1392-
1393-
duration := time.Millisecond
1394-
1395-
syncService := make(chan string)
1391+
defer close(syncService)
13961392

13971393
node1 := makeNode(tweakName("node1"))
13981394
node2 := makeNode(tweakName("node2"))
@@ -1405,14 +1401,16 @@ func TestSlowNodeSync(t *testing.T) {
14051401
serviceKeys := sets.New(sKey1, sKey2)
14061402

14071403
controller, cloudProvider, kubeClient := newController(stopCh, node1, node2, service1, service2)
1408-
cloudProvider.RequestDelay = 4 * duration
14091404
cloudProvider.UpdateCallCb = func(update fakecloud.UpdateBalancerCall) {
1410-
updateCallCh <- update
1405+
key, _ := cache.MetaNamespaceKeyFunc(update.Service)
1406+
impactedService := serviceKeys.Difference(sets.New(key)).UnsortedList()[0]
1407+
syncService <- impactedService
1408+
<-syncServiceDone
1409+
14111410
}
14121411
cloudProvider.EnsureCallCb = func(update fakecloud.UpdateBalancerCall) {
1413-
updateCallCh <- update
1412+
syncServiceDone <- update.Service.Name
14141413
}
1415-
14161414
// Two update calls are expected. This is because this test calls
14171415
// controller.syncNodes once with two existing services, but with one
14181416
// controller.syncService while that is happening. The end result is
@@ -1428,6 +1426,8 @@ func TestSlowNodeSync(t *testing.T) {
14281426
expectedUpdateCalls := []fakecloud.UpdateBalancerCall{
14291427
// First update call for first service from controller.syncNodes
14301428
{Service: service1, Hosts: []*v1.Node{node1, node2}},
1429+
}
1430+
expectedEnsureCalls := []fakecloud.UpdateBalancerCall{
14311431
// Second update call for impacted service from controller.syncService
14321432
{Service: service2, Hosts: []*v1.Node{node1, node2, node3}},
14331433
}
@@ -1439,51 +1439,34 @@ func TestSlowNodeSync(t *testing.T) {
14391439
controller.syncNodes(context.TODO(), 1)
14401440
}()
14411441

1442-
wg.Add(1)
1443-
go func() {
1444-
defer wg.Done()
1445-
updateCallIdx := 0
1446-
impactedService := ""
1447-
for update := range updateCallCh {
1448-
// Validate that the call hosts are what we expect
1449-
if !compareHostSets(t, expectedUpdateCalls[updateCallIdx].Hosts, update.Hosts) {
1450-
t.Errorf("unexpected updated hosts for update: %v, expected: %v, got: %v", updateCallIdx, expectedUpdateCalls[updateCallIdx].Hosts, update.Hosts)
1451-
return
1452-
}
1453-
key, _ := cache.MetaNamespaceKeyFunc(update.Service)
1454-
// For call 0: determine impacted service
1455-
if updateCallIdx == 0 {
1456-
impactedService = serviceKeys.Difference(sets.New(key)).UnsortedList()[0]
1457-
syncService <- impactedService
1458-
}
1459-
// For calls > 0: validate the impacted service
1460-
if updateCallIdx > 0 {
1461-
if key != impactedService {
1462-
t.Error("unexpected impacted service")
1463-
return
1464-
}
1465-
}
1466-
if updateCallIdx == len(expectedUpdateCalls)-1 {
1467-
return
1468-
}
1469-
updateCallIdx++
1470-
}
1471-
}()
1472-
14731442
key := <-syncService
14741443
if _, err := kubeClient.CoreV1().Nodes().Create(context.TODO(), node3, metav1.CreateOptions{}); err != nil {
14751444
t.Fatalf("error creating node3, err: %v", err)
14761445
}
14771446

1478-
// Give it some time to update the informer cache, needs to be lower than
1479-
// cloudProvider.RequestDelay
1480-
time.Sleep(duration)
14811447
// Sync the service
14821448
if err := controller.syncService(context.TODO(), key); err != nil {
1483-
t.Errorf("unexpected service sync error, err: %v", err)
1449+
t.Fatalf("unexpected service sync error, err: %v", err)
14841450
}
14851451

14861452
wg.Wait()
1453+
1454+
if len(expectedUpdateCalls) != len(cloudProvider.UpdateCalls) {
1455+
t.Fatalf("unexpected amount of update calls, expected: %v, got: %v", len(expectedUpdateCalls), len(cloudProvider.UpdateCalls))
1456+
}
1457+
for idx, update := range cloudProvider.UpdateCalls {
1458+
if !compareHostSets(t, expectedUpdateCalls[idx].Hosts, update.Hosts) {
1459+
t.Fatalf("unexpected updated hosts for update: %v, expected: %v, got: %v", idx, expectedUpdateCalls[idx].Hosts, update.Hosts)
1460+
}
1461+
}
1462+
if len(expectedEnsureCalls) != len(cloudProvider.EnsureCalls) {
1463+
t.Fatalf("unexpected amount of ensure calls, expected: %v, got: %v", len(expectedEnsureCalls), len(cloudProvider.EnsureCalls))
1464+
}
1465+
for idx, ensure := range cloudProvider.EnsureCalls {
1466+
if !compareHostSets(t, expectedEnsureCalls[idx].Hosts, ensure.Hosts) {
1467+
t.Fatalf("unexpected updated hosts for ensure: %v, expected: %v, got: %v", idx, expectedEnsureCalls[idx].Hosts, ensure.Hosts)
1468+
}
1469+
}
14871470
}
14881471

14891472
func TestNeedsUpdate(t *testing.T) {

staging/src/k8s.io/cloud-provider/fake/fake.go

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -73,27 +73,29 @@ type Cloud struct {
7373
ErrShutdownByProviderID error
7474
MetadataErr error
7575

76-
Calls []string
77-
Addresses []v1.NodeAddress
78-
addressesMux sync.Mutex
79-
ExtID map[types.NodeName]string
80-
ExtIDErr map[types.NodeName]error
81-
InstanceTypes map[types.NodeName]string
82-
Machines []types.NodeName
83-
NodeResources *v1.NodeResources
84-
ClusterList []string
85-
MasterName string
86-
ExternalIP net.IP
87-
Balancers map[string]Balancer
88-
UpdateCalls []UpdateBalancerCall
89-
EnsureCalls []UpdateBalancerCall
90-
EnsureCallCb func(UpdateBalancerCall)
91-
UpdateCallCb func(UpdateBalancerCall)
92-
RouteMap map[string]*Route
93-
Lock sync.Mutex
94-
Provider string
95-
ProviderID map[types.NodeName]string
96-
addCallLock sync.Mutex
76+
Calls []string
77+
Addresses []v1.NodeAddress
78+
addressesMux sync.Mutex
79+
ExtID map[types.NodeName]string
80+
ExtIDErr map[types.NodeName]error
81+
InstanceTypes map[types.NodeName]string
82+
Machines []types.NodeName
83+
NodeResources *v1.NodeResources
84+
ClusterList []string
85+
MasterName string
86+
ExternalIP net.IP
87+
Balancers map[string]Balancer
88+
updateCallLock sync.Mutex
89+
UpdateCalls []UpdateBalancerCall
90+
ensureCallLock sync.Mutex
91+
EnsureCalls []UpdateBalancerCall
92+
EnsureCallCb func(UpdateBalancerCall)
93+
UpdateCallCb func(UpdateBalancerCall)
94+
RouteMap map[string]*Route
95+
Lock sync.Mutex
96+
Provider string
97+
ProviderID map[types.NodeName]string
98+
addCallLock sync.Mutex
9799
cloudprovider.Zone
98100
VolumeLabelMap map[string]map[string]string
99101

@@ -203,8 +205,8 @@ func (f *Cloud) GetLoadBalancerName(ctx context.Context, clusterName string, ser
203205
// EnsureLoadBalancer is a test-spy implementation of LoadBalancer.EnsureLoadBalancer.
204206
// It adds an entry "create" into the internal method call record.
205207
func (f *Cloud) EnsureLoadBalancer(ctx context.Context, clusterName string, service *v1.Service, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) {
206-
f.markEnsureCall(service, nodes)
207208
f.addCall("create")
209+
f.markEnsureCall(service, nodes)
208210
if f.Balancers == nil {
209211
f.Balancers = make(map[string]Balancer)
210212
}
@@ -227,8 +229,8 @@ func (f *Cloud) EnsureLoadBalancer(ctx context.Context, clusterName string, serv
227229
}
228230

229231
func (f *Cloud) markUpdateCall(service *v1.Service, nodes []*v1.Node) {
230-
f.Lock.Lock()
231-
defer f.Lock.Unlock()
232+
f.updateCallLock.Lock()
233+
defer f.updateCallLock.Unlock()
232234
update := UpdateBalancerCall{service, nodes}
233235
f.UpdateCalls = append(f.UpdateCalls, update)
234236
if f.UpdateCallCb != nil {
@@ -237,8 +239,8 @@ func (f *Cloud) markUpdateCall(service *v1.Service, nodes []*v1.Node) {
237239
}
238240

239241
func (f *Cloud) markEnsureCall(service *v1.Service, nodes []*v1.Node) {
240-
f.Lock.Lock()
241-
defer f.Lock.Unlock()
242+
f.ensureCallLock.Lock()
243+
defer f.ensureCallLock.Unlock()
242244
update := UpdateBalancerCall{service, nodes}
243245
f.EnsureCalls = append(f.EnsureCalls, update)
244246
if f.EnsureCallCb != nil {
@@ -249,8 +251,8 @@ func (f *Cloud) markEnsureCall(service *v1.Service, nodes []*v1.Node) {
249251
// UpdateLoadBalancer is a test-spy implementation of LoadBalancer.UpdateLoadBalancer.
250252
// It adds an entry "update" into the internal method call record.
251253
func (f *Cloud) UpdateLoadBalancer(ctx context.Context, clusterName string, service *v1.Service, nodes []*v1.Node) error {
252-
f.markUpdateCall(service, nodes)
253254
f.addCall("update")
255+
f.markUpdateCall(service, nodes)
254256
return f.Err
255257
}
256258

0 commit comments

Comments
 (0)