Skip to content

Commit 9f410da

Browse files
committed
lbconfig
1 parent 8de4b4e commit 9f410da

File tree

5 files changed

+68
-161
lines changed

5 files changed

+68
-161
lines changed

Diff for: balancer/balancer.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -300,9 +300,9 @@ type SubConnState struct {
300300
// balancer.
301301
type ClientConnState struct {
302302
ResolverState resolver.State
303-
// The parsed load balancer configuration returned by the builder's
303+
// The parsed load balancing configuration returned by the builder's
304304
// ParseConfig method, if implemented.
305-
BalancerConfig interface{}
305+
BalancerConfig serviceconfig.LoadBalancingConfig
306306
}
307307

308308
// V2Balancer is defined for documentation purposes. If a Balancer also

Diff for: balancer/xds/xds_lrs_test.go

+3-9
Original file line numberDiff line numberDiff line change
@@ -114,17 +114,11 @@ func (s) TestXdsLoadReporting(t *testing.T) {
114114
Nanos: intervalNano,
115115
}
116116

117-
cfg := &testBalancerConfig{
117+
cfg := &xdsConfig{
118118
BalancerName: addr,
119-
ChildPolicy: []lbPolicy{fakeBalancerA}, // Set this to skip cds.
119+
ChildPolicy: &loadBalancingConfig{Name: fakeBalancerA}, // Set this to skip cds.
120120
}
121-
sc, lbc := constructServiceConfigFromXdsConfig(cfg)
122-
lb.UpdateClientConnState(balancer.ClientConnState{
123-
ResolverState: resolver.State{
124-
ServiceConfig: sc,
125-
},
126-
BalancerConfig: lbc,
127-
})
121+
lb.UpdateClientConnState(balancer.ClientConnState{BalancerConfig: cfg})
128122
td.sendResp(&response{resp: testEDSRespWithoutEndpoints})
129123
var (
130124
i int

Diff for: balancer/xds/xds_test.go

+60-148
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ package xds
2222

2323
import (
2424
"encoding/json"
25-
"fmt"
2625
"reflect"
2726
"sync"
2827
"testing"
@@ -37,19 +36,13 @@ import (
3736
"google.golang.org/grpc/internal/grpctest"
3837
"google.golang.org/grpc/internal/leakcheck"
3938
"google.golang.org/grpc/resolver"
40-
"google.golang.org/grpc/serviceconfig"
4139
)
4240

4341
var lbABuilder = &balancerABuilder{}
4442

4543
func init() {
4644
balancer.Register(lbABuilder)
4745
balancer.Register(&balancerBBuilder{})
48-
testServiceConfigFooBar, testLBConfigFooBar = constructServiceConfigFromXdsConfig(&testBalancerConfig{
49-
BalancerName: testBalancerNameFooBar,
50-
ChildPolicy: []lbPolicy{fakeBalancerA},
51-
FallbackPolicy: []lbPolicy{fakeBalancerA},
52-
})
5346
}
5447

5548
type s struct{}
@@ -62,18 +55,19 @@ func Test(t *testing.T) {
6255
grpctest.RunSubTests(t, s{})
6356
}
6457

65-
type lbPolicy string
66-
6758
const (
68-
fakeBalancerA lbPolicy = "fake_balancer_A"
69-
fakeBalancerB lbPolicy = "fake_balancer_B"
70-
fakeBalancerC lbPolicy = "fake_balancer_C"
59+
fakeBalancerA = "fake_balancer_A"
60+
fakeBalancerB = "fake_balancer_B"
61+
fakeBalancerC = "fake_balancer_C"
7162
)
7263

7364
var (
74-
testBalancerNameFooBar = "foo.bar"
75-
testServiceConfigFooBar serviceconfig.Config
76-
testLBConfigFooBar serviceconfig.LoadBalancingConfig
65+
testBalancerNameFooBar = "foo.bar"
66+
testLBConfigFooBar = &xdsConfig{
67+
BalancerName: testBalancerNameFooBar,
68+
ChildPolicy: &loadBalancingConfig{Name: fakeBalancerA},
69+
FallBackPolicy: &loadBalancingConfig{Name: fakeBalancerA},
70+
}
7771

7872
specialAddrForBalancerA = resolver.Address{Addr: "this.is.balancer.A"}
7973
specialAddrForBalancerB = resolver.Address{Addr: "this.is.balancer.B"}
@@ -83,55 +77,6 @@ var (
8377
latestFakeEdsBalancer *fakeEDSBalancer
8478
)
8579

86-
type testBalancerConfig struct {
87-
BalancerName string `json:"balancerName,omitempty"`
88-
ChildPolicy []lbPolicy `json:"childPolicy,omitempty"`
89-
FallbackPolicy []lbPolicy `json:"fallbackPolicy,omitempty"`
90-
}
91-
92-
func (l *lbPolicy) UnmarshalJSON(b []byte) error {
93-
// no need to implement, not used.
94-
return nil
95-
}
96-
97-
func (l lbPolicy) MarshalJSON() ([]byte, error) {
98-
m := make(map[string]struct{})
99-
m[string(l)] = struct{}{}
100-
return json.Marshal(m)
101-
}
102-
103-
type serviceConfig struct {
104-
LoadBalancingConfig []*loadBalancingConfig
105-
}
106-
107-
func constructServiceConfigFromXdsConfig(xdsCfg *testBalancerConfig) (serviceconfig.Config, serviceconfig.LoadBalancingConfig) {
108-
cfgRaw, err := json.Marshal(xdsCfg)
109-
if err != nil {
110-
panic(fmt.Sprintf("Error from json.Marshal(%+v): %v", xdsCfg, err))
111-
}
112-
sc := &serviceConfig{
113-
LoadBalancingConfig: []*loadBalancingConfig{
114-
{
115-
Name: xdsName,
116-
Config: cfgRaw,
117-
},
118-
},
119-
}
120-
jsonSC, err := json.Marshal(sc)
121-
if err != nil {
122-
panic(fmt.Sprintf("Error from json.Marshal(%+v): %v", sc, err))
123-
}
124-
parsedSC, err := serviceconfig.Parse(string(jsonSC))
125-
if err != nil {
126-
panic(fmt.Sprintf("Error from serviceconfig.Parse(%q): %v", jsonSC, err))
127-
}
128-
parsedLBC, err := (&xdsBalancerBuilder{}).ParseConfig(cfgRaw)
129-
if err != nil {
130-
panic(fmt.Sprintf("Error from xdsBalancerBuilder.Parse(%q): %v", cfgRaw, err))
131-
}
132-
return parsedSC, parsedLBC
133-
}
134-
13580
type balancerABuilder struct {
13681
mu sync.Mutex
13782
lastBalancer *balancerA
@@ -306,10 +251,7 @@ func (s) TestXdsBalanceHandleResolvedAddrs(t *testing.T) {
306251
addrs := []resolver.Address{{Addr: "1.1.1.1:10001"}, {Addr: "2.2.2.2:10002"}, {Addr: "3.3.3.3:10003"}}
307252
for i := 0; i < 3; i++ {
308253
lb.UpdateClientConnState(balancer.ClientConnState{
309-
ResolverState: resolver.State{
310-
Addresses: addrs,
311-
ServiceConfig: testServiceConfigFooBar,
312-
},
254+
ResolverState: resolver.State{Addresses: addrs},
313255
BalancerConfig: testLBConfigFooBar,
314256
})
315257
select {
@@ -342,10 +284,7 @@ func (s) TestXdsBalanceHandleBalancerConfigBalancerNameUpdate(t *testing.T) {
342284
defer lb.Close()
343285
addrs := []resolver.Address{{Addr: "1.1.1.1:10001"}, {Addr: "2.2.2.2:10002"}, {Addr: "3.3.3.3:10003"}}
344286
lb.UpdateClientConnState(balancer.ClientConnState{
345-
ResolverState: resolver.State{
346-
Addresses: addrs,
347-
ServiceConfig: testServiceConfigFooBar,
348-
},
287+
ResolverState: resolver.State{Addresses: addrs},
349288
BalancerConfig: testLBConfigFooBar,
350289
})
351290

@@ -370,16 +309,13 @@ func (s) TestXdsBalanceHandleBalancerConfigBalancerNameUpdate(t *testing.T) {
370309
for i := 0; i < 2; i++ {
371310
addr, td, _, cleanup := setupServer(t)
372311
cleanups = append(cleanups, cleanup)
373-
workingServiceConfig, workingLBConfig := constructServiceConfigFromXdsConfig(&testBalancerConfig{
312+
workingLBConfig := &xdsConfig{
374313
BalancerName: addr,
375-
ChildPolicy: []lbPolicy{fakeBalancerA},
376-
FallbackPolicy: []lbPolicy{fakeBalancerA},
377-
})
314+
ChildPolicy: &loadBalancingConfig{Name: fakeBalancerA},
315+
FallBackPolicy: &loadBalancingConfig{Name: fakeBalancerA},
316+
}
378317
lb.UpdateClientConnState(balancer.ClientConnState{
379-
ResolverState: resolver.State{
380-
Addresses: addrs,
381-
ServiceConfig: workingServiceConfig,
382-
},
318+
ResolverState: resolver.State{Addresses: addrs},
383319
BalancerConfig: workingLBConfig,
384320
})
385321
td.sendResp(&response{resp: testEDSRespWithoutEndpoints})
@@ -429,13 +365,16 @@ func (s) TestXdsBalanceHandleBalancerConfigChildPolicyUpdate(t *testing.T) {
429365
}
430366
}()
431367
for _, test := range []struct {
432-
cfg *testBalancerConfig
368+
cfg *xdsConfig
433369
responseToSend *discoverypb.DiscoveryResponse
434370
expectedChildPolicy *loadBalancingConfig
435371
}{
436372
{
437-
cfg: &testBalancerConfig{
438-
ChildPolicy: []lbPolicy{fakeBalancerA},
373+
cfg: &xdsConfig{
374+
ChildPolicy: &loadBalancingConfig{
375+
Name: fakeBalancerA,
376+
Config: json.RawMessage("{}"),
377+
},
439378
},
440379
responseToSend: testEDSRespWithoutEndpoints,
441380
expectedChildPolicy: &loadBalancingConfig{
@@ -444,16 +383,19 @@ func (s) TestXdsBalanceHandleBalancerConfigChildPolicyUpdate(t *testing.T) {
444383
},
445384
},
446385
{
447-
cfg: &testBalancerConfig{
448-
ChildPolicy: []lbPolicy{fakeBalancerB},
386+
cfg: &xdsConfig{
387+
ChildPolicy: &loadBalancingConfig{
388+
Name: fakeBalancerB,
389+
Config: json.RawMessage("{}"),
390+
},
449391
},
450392
expectedChildPolicy: &loadBalancingConfig{
451393
Name: string(fakeBalancerB),
452394
Config: json.RawMessage(`{}`),
453395
},
454396
},
455397
{
456-
cfg: &testBalancerConfig{},
398+
cfg: &xdsConfig{},
457399
responseToSend: testCDSResp,
458400
expectedChildPolicy: &loadBalancingConfig{
459401
Name: "ROUND_ROBIN",
@@ -464,13 +406,7 @@ func (s) TestXdsBalanceHandleBalancerConfigChildPolicyUpdate(t *testing.T) {
464406
cleanups = append(cleanups, cleanup)
465407
test.cfg.BalancerName = addr
466408

467-
sc, lbc := constructServiceConfigFromXdsConfig(test.cfg)
468-
lb.UpdateClientConnState(balancer.ClientConnState{
469-
ResolverState: resolver.State{
470-
ServiceConfig: sc,
471-
},
472-
BalancerConfig: lbc,
473-
})
409+
lb.UpdateClientConnState(balancer.ClientConnState{BalancerConfig: test.cfg})
474410
if test.responseToSend != nil {
475411
td.sendResp(&response{resp: test.responseToSend})
476412
}
@@ -497,7 +433,7 @@ func (s) TestXdsBalanceHandleBalancerConfigChildPolicyUpdate(t *testing.T) {
497433

498434
// not in fallback mode, overwrite fallback info.
499435
// in fallback mode, update config or switch balancer.
500-
func (s) TestXdsBalanceHandleBalancerConfigFallbackUpdate(t *testing.T) {
436+
func (s) TestXdsBalanceHandleBalancerConfigFallBackUpdate(t *testing.T) {
501437
originalNewEDSBalancer := newEDSBalancer
502438
newEDSBalancer = newFakeEDSBalancer
503439
defer func() {
@@ -514,28 +450,19 @@ func (s) TestXdsBalanceHandleBalancerConfigFallbackUpdate(t *testing.T) {
514450

515451
addr, td, _, cleanup := setupServer(t)
516452

517-
cfg := &testBalancerConfig{
453+
cfg := xdsConfig{
518454
BalancerName: addr,
519-
ChildPolicy: []lbPolicy{fakeBalancerA},
520-
FallbackPolicy: []lbPolicy{fakeBalancerA},
455+
ChildPolicy: &loadBalancingConfig{Name: fakeBalancerA},
456+
FallBackPolicy: &loadBalancingConfig{Name: fakeBalancerA},
521457
}
522-
sc, lbc := constructServiceConfigFromXdsConfig(cfg)
523-
lb.UpdateClientConnState(balancer.ClientConnState{
524-
ResolverState: resolver.State{
525-
ServiceConfig: sc,
526-
},
527-
BalancerConfig: lbc,
528-
})
458+
lb.UpdateClientConnState(balancer.ClientConnState{BalancerConfig: &cfg})
529459

530460
addrs := []resolver.Address{{Addr: "1.1.1.1:10001"}, {Addr: "2.2.2.2:10002"}, {Addr: "3.3.3.3:10003"}}
531-
cfg.FallbackPolicy = []lbPolicy{fakeBalancerB}
532-
sc, lbc = constructServiceConfigFromXdsConfig(cfg)
461+
cfg2 := cfg
462+
cfg2.FallBackPolicy = &loadBalancingConfig{Name: fakeBalancerB}
533463
lb.UpdateClientConnState(balancer.ClientConnState{
534-
ResolverState: resolver.State{
535-
Addresses: addrs,
536-
ServiceConfig: sc,
537-
},
538-
BalancerConfig: lbc,
464+
ResolverState: resolver.State{Addresses: addrs},
465+
BalancerConfig: &cfg2,
539466
})
540467

541468
td.sendResp(&response{resp: testEDSRespWithoutEndpoints})
@@ -563,14 +490,11 @@ func (s) TestXdsBalanceHandleBalancerConfigFallbackUpdate(t *testing.T) {
563490
t.Fatalf("timeout when geting new subconn result")
564491
}
565492

566-
cfg.FallbackPolicy = []lbPolicy{fakeBalancerA}
567-
sc, lbc = constructServiceConfigFromXdsConfig(cfg)
493+
cfg3 := cfg
494+
cfg3.FallBackPolicy = &loadBalancingConfig{Name: fakeBalancerA}
568495
lb.UpdateClientConnState(balancer.ClientConnState{
569-
ResolverState: resolver.State{
570-
Addresses: addrs,
571-
ServiceConfig: sc,
572-
},
573-
BalancerConfig: lbc,
496+
ResolverState: resolver.State{Addresses: addrs},
497+
BalancerConfig: &cfg3,
574498
})
575499

576500
// verify fallback balancer A takes over
@@ -601,18 +525,12 @@ func (s) TestXdsBalancerHandlerSubConnStateChange(t *testing.T) {
601525

602526
addr, td, _, cleanup := setupServer(t)
603527
defer cleanup()
604-
cfg := &testBalancerConfig{
528+
cfg := &xdsConfig{
605529
BalancerName: addr,
606-
ChildPolicy: []lbPolicy{fakeBalancerA},
607-
FallbackPolicy: []lbPolicy{fakeBalancerA},
530+
ChildPolicy: &loadBalancingConfig{Name: fakeBalancerA},
531+
FallBackPolicy: &loadBalancingConfig{Name: fakeBalancerA},
608532
}
609-
sc, lbc := constructServiceConfigFromXdsConfig(cfg)
610-
lb.UpdateClientConnState(balancer.ClientConnState{
611-
ResolverState: resolver.State{
612-
ServiceConfig: sc,
613-
},
614-
BalancerConfig: lbc,
615-
})
533+
lb.UpdateClientConnState(balancer.ClientConnState{BalancerConfig: cfg})
616534

617535
td.sendResp(&response{resp: testEDSRespWithoutEndpoints})
618536

@@ -668,7 +586,7 @@ func (s) TestXdsBalancerHandlerSubConnStateChange(t *testing.T) {
668586
}
669587
}
670588

671-
func (s) TestXdsBalancerFallbackSignalFromEdsBalancer(t *testing.T) {
589+
func (s) TestXdsBalancerFallBackSignalFromEdsBalancer(t *testing.T) {
672590
originalNewEDSBalancer := newEDSBalancer
673591
newEDSBalancer = newFakeEDSBalancer
674592
defer func() {
@@ -685,18 +603,12 @@ func (s) TestXdsBalancerFallbackSignalFromEdsBalancer(t *testing.T) {
685603

686604
addr, td, _, cleanup := setupServer(t)
687605
defer cleanup()
688-
cfg := &testBalancerConfig{
606+
cfg := &xdsConfig{
689607
BalancerName: addr,
690-
ChildPolicy: []lbPolicy{fakeBalancerA},
691-
FallbackPolicy: []lbPolicy{fakeBalancerA},
608+
ChildPolicy: &loadBalancingConfig{Name: fakeBalancerA},
609+
FallBackPolicy: &loadBalancingConfig{Name: fakeBalancerA},
692610
}
693-
sc, lbc := constructServiceConfigFromXdsConfig(cfg)
694-
lb.UpdateClientConnState(balancer.ClientConnState{
695-
ResolverState: resolver.State{
696-
ServiceConfig: sc,
697-
},
698-
BalancerConfig: lbc,
699-
})
611+
lb.UpdateClientConnState(balancer.ClientConnState{BalancerConfig: cfg})
700612

701613
td.sendResp(&response{resp: testEDSRespWithoutEndpoints})
702614

@@ -753,16 +665,16 @@ func (s) TestXdsBalancerFallbackSignalFromEdsBalancer(t *testing.T) {
753665
}
754666

755667
func (s) TestXdsBalancerConfigParsingSelectingLBPolicy(t *testing.T) {
756-
tesCfg := &testBalancerConfig{
757-
BalancerName: "fake.foo.bar",
758-
ChildPolicy: []lbPolicy{fakeBalancerC, fakeBalancerA, fakeBalancerB}, // selects fakeBalancerA
759-
FallbackPolicy: []lbPolicy{fakeBalancerC, fakeBalancerB, fakeBalancerA}, // selects fakeBalancerB
760-
}
761-
js, _ := json.Marshal(tesCfg)
762-
var xdsCfg xdsConfig
763-
if err := json.Unmarshal(js, &xdsCfg); err != nil {
764-
t.Fatal("unable to unmarshal balancer config into xds config")
668+
js := json.RawMessage(`{
669+
"balancerName": "fake.foo.bar",
670+
"childPolicy": [{"fake_balancer_C": {}}, {"fake_balancer_A": {}}, {"fake_balancer_B": {}}],
671+
"fallbackPolicy": [{"fake_balancer_C": {}}, {"fake_balancer_B": {}}, {"fake_balancer_A": {}}]
672+
}`)
673+
cfg, err := (&xdsBalancerBuilder{}).ParseConfig(js)
674+
if err != nil {
675+
t.Fatalf("unable to unmarshal balancer config into xds config: %v", err)
765676
}
677+
xdsCfg := cfg.(*xdsConfig)
766678
wantChildPolicy := &loadBalancingConfig{Name: string(fakeBalancerA), Config: json.RawMessage(`{}`)}
767679
if !reflect.DeepEqual(xdsCfg.ChildPolicy, wantChildPolicy) {
768680
t.Fatalf("got child policy %v, want %v", xdsCfg.ChildPolicy, wantChildPolicy)

0 commit comments

Comments
 (0)