From d12638932fef65e21635be1c2dbfadc57f94e694 Mon Sep 17 00:00:00 2001 From: Menghan Li Date: Mon, 4 Nov 2019 13:27:04 -0800 Subject: [PATCH] [xds_service_config_new_fields] json unmarshal --- xds/internal/balancer/config.go | 70 +++++++++++++------------------ xds/internal/balancer/xds.go | 2 +- xds/internal/balancer/xds_test.go | 4 +- 3 files changed, 31 insertions(+), 45 deletions(-) diff --git a/xds/internal/balancer/config.go b/xds/internal/balancer/config.go index 76b03c882053..59ed98864f33 100644 --- a/xds/internal/balancer/config.go +++ b/xds/internal/balancer/config.go @@ -39,57 +39,45 @@ type XDSConfig struct { FallBackPolicy *loadBalancingConfig // Name to use in EDS query. If not present, defaults to the server // name from the target URI. - EdsServiceName string + EDSServiceName string // LRS server to send load reports to. If not present, load reporting // will be disabled. If set to the empty string, load reporting will // be sent to the same server that we obtained CDS data from. LrsLoadReportingServerName string } +type xdsConfigJSON struct { + BalancerName string + ChildPolicy []*loadBalancingConfig + FallbackPolicy []*loadBalancingConfig + EDSServiceName string + LRSLoadReportingServerName string +} + // UnmarshalJSON parses the JSON-encoded byte slice in data and stores it in l. // When unmarshalling, we iterate through the childPolicy/fallbackPolicy lists // and select the first LB policy which has been registered. func (l *XDSConfig) UnmarshalJSON(data []byte) error { - var val map[string]json.RawMessage - if err := json.Unmarshal(data, &val); err != nil { + var configJSON xdsConfigJSON + if err := json.Unmarshal(data, &configJSON); err != nil { return err } - for k, v := range val { - switch k { - case "balancerName": - if err := json.Unmarshal(v, &l.BalancerName); err != nil { - return err - } - case "childPolicy": - var lbcfgs []*loadBalancingConfig - if err := json.Unmarshal(v, &lbcfgs); err != nil { - return err - } - for _, lbcfg := range lbcfgs { - if balancer.Get(lbcfg.Name) != nil { - l.ChildPolicy = lbcfg - break - } - } - case "fallbackPolicy": - var lbcfgs []*loadBalancingConfig - if err := json.Unmarshal(v, &lbcfgs); err != nil { - return err - } - for _, lbcfg := range lbcfgs { - if balancer.Get(lbcfg.Name) != nil { - l.FallBackPolicy = lbcfg - break - } - } - case "edsServiceName": - if err := json.Unmarshal(v, &l.EdsServiceName); err != nil { - return err - } - case "lrsLoadReportingServerName": - if err := json.Unmarshal(v, &l.LrsLoadReportingServerName); err != nil { - return err - } + + l.BalancerName = configJSON.BalancerName + l.EDSServiceName = configJSON.EDSServiceName + l.LrsLoadReportingServerName = configJSON.LRSLoadReportingServerName + + for _, lbcfg := range configJSON.ChildPolicy { + if balancer.Get(lbcfg.Name) != nil { + l.ChildPolicy = lbcfg + break + } + } + + for _, lbcfg := range configJSON.FallbackPolicy { + if balancer.Get(lbcfg.Name) != nil { + l.FallBackPolicy = lbcfg + break } } return nil @@ -109,9 +97,7 @@ type loadBalancingConfig struct { // MarshalJSON returns a JSON encoding of l. func (l *loadBalancingConfig) MarshalJSON() ([]byte, error) { - m := make(map[string]json.RawMessage) - m[l.Name] = l.Config - return json.Marshal(m) + return nil, fmt.Errorf("loadBalancingConfig.MarshalJSON() is unimplemented") } // UnmarshalJSON parses the JSON-encoded byte slice in data and stores it in l. diff --git a/xds/internal/balancer/xds.go b/xds/internal/balancer/xds.go index e9205711ae57..601762b43932 100644 --- a/xds/internal/balancer/xds.go +++ b/xds/internal/balancer/xds.go @@ -191,7 +191,7 @@ func (x *xdsBalancer) startNewXDSClient(u *XDSConfig) { prevClient.close() } } - x.client = newXDSClient(u.BalancerName, u.EdsServiceName, x.buildOpts, x.loadStore, newADS, loseContact, exitCleanup) + x.client = newXDSClient(u.BalancerName, u.EDSServiceName, x.buildOpts, x.loadStore, newADS, loseContact, exitCleanup) go x.client.run() } diff --git a/xds/internal/balancer/xds_test.go b/xds/internal/balancer/xds_test.go index 895ceb2fd1ae..16121cc1eb9b 100644 --- a/xds/internal/balancer/xds_test.go +++ b/xds/internal/balancer/xds_test.go @@ -723,7 +723,7 @@ func TestXdsBalancerConfigParsing(t *testing.T) { Name: "pick_first", Config: json.RawMessage("{}"), }, - EdsServiceName: testEDSName, + EDSServiceName: testEDSName, LrsLoadReportingServerName: testLRSName, }, wantErr: false, @@ -757,7 +757,7 @@ func TestXdsBalancerConfigParsing(t *testing.T) { Name: "fake_balancer_B", Config: json.RawMessage("{}"), }, - EdsServiceName: testEDSName, + EDSServiceName: testEDSName, LrsLoadReportingServerName: testLRSName, }, wantErr: false,