From e2238cfad8170a4cf25f7c5bd71cd2cef0696b68 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Mon, 30 Mar 2020 09:09:34 +0200 Subject: [PATCH] Add _grpc_config replies Signed-off-by: Miek Gieben --- plugin/traffic/lb.go | 14 ++++++++++++++ plugin/traffic/setup.go | 4 ++++ plugin/traffic/setup_test.go | 11 +++++++++++ plugin/traffic/traffic.go | 7 +++---- plugin/traffic/traffic_test.go | 2 +- 5 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 plugin/traffic/lb.go diff --git a/plugin/traffic/lb.go b/plugin/traffic/lb.go new file mode 100644 index 000000000..0bc6617a4 --- /dev/null +++ b/plugin/traffic/lb.go @@ -0,0 +1,14 @@ +package traffic + +import "github.com/miekg/dns" + +// See https://github.com/grpc/grpc/blob/master/doc/service_config.md for the fields in this proto. +// We encode it as json and return it in a TXT field. +var lbTXT = `grpc_config=[{"serviceConfig":{"loadBalancingConfig":[{"xds_experimental":{"lrs_load_reporting_server_name":""}}]}}]` + +func txt(z string) []dns.RR { + return []dns.RR{&dns.TXT{ + Hdr: dns.RR_Header{Name: z, Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 5}, + Txt: []string{lbTXT}, + }} +} diff --git a/plugin/traffic/setup.go b/plugin/traffic/setup.go index dfe6b0ccb..788461c2c 100644 --- a/plugin/traffic/setup.go +++ b/plugin/traffic/setup.go @@ -2,6 +2,7 @@ package traffic import ( "crypto/tls" + "encoding/json" "fmt" "math/rand" "strings" @@ -31,6 +32,9 @@ func setup(c *caddy.Controller) error { if err != nil { return plugin.Error("traffic", err) } + if _, err := json.Marshal(lbTXT); err != nil { + return fmt.Errorf("failed to marshal grpc serverConfig: %s", err) + } dnsserver.GetConfig(c).AddPlugin(func(next plugin.Handler) plugin.Handler { t.Next = next diff --git a/plugin/traffic/setup_test.go b/plugin/traffic/setup_test.go index 8649801de..d2e1ec0d2 100644 --- a/plugin/traffic/setup_test.go +++ b/plugin/traffic/setup_test.go @@ -1,6 +1,7 @@ package traffic import ( + "encoding/json" "testing" "github.com/caddyserver/caddy" @@ -13,6 +14,16 @@ func TestSetup(t *testing.T) { } } +func TestLBTxt(t *testing.T) { + _, err := json.Marshal(lbTXT) + if err != nil { + t.Fatalf("Failed to marshal grpc serverConfig: %s", err) + } + if len(lbTXT) > 255 { + t.Fatalf("Too long grpc serverConfig (>255): %d", len(lbTXT)) + } +} + func TestParseTraffic(t *testing.T) { tests := []struct { input string diff --git a/plugin/traffic/traffic.go b/plugin/traffic/traffic.go index fd8cd2d6f..8f4f1606d 100644 --- a/plugin/traffic/traffic.go +++ b/plugin/traffic/traffic.go @@ -69,10 +69,9 @@ func (t *Traffic) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg return 0, nil } if strings.HasPrefix(strings.ToLower(labels[0]), "_grpc_config") { - // this is the grpc config blob encoded in a TXT record, we just return a NXDOMAIN - // make this a separate so we can insert some logic later. - m.Ns = soa(state.Zone) - m.Rcode = dns.RcodeNameError + // this is the grpc config blob encoded in a TXT record, see documentation for lbTXT. + m.Answer = txt(state.Zone) + m.Rcode = dns.RcodeSuccess w.WriteMsg(m) return 0, nil diff --git a/plugin/traffic/traffic_test.go b/plugin/traffic/traffic_test.go index f5cf44a70..d05eb68ea 100644 --- a/plugin/traffic/traffic_test.go +++ b/plugin/traffic/traffic_test.go @@ -125,7 +125,7 @@ func TestTraffic(t *testing.T) { {"127.0.0.2", 18008, corepb.HealthStatus_HEALTHY}, }), }, - cluster: "_grpc_config.web", qtype: dns.TypeTXT, rcode: dns.RcodeNameError, ns: true, + cluster: "_grpc_config.web", qtype: dns.TypeTXT, rcode: dns.RcodeSuccess, }, }