From 0a228ba9ebd9a3d40990b80e7a12c6d4b7baa7cd Mon Sep 17 00:00:00 2001 From: Kevin Leimkuhler Date: Tue, 2 Feb 2021 03:00:38 +0000 Subject: [PATCH 1/8] Split tap from core into viz extension Signed-off-by: Kevin Leimkuhler --- .github/workflows/integration_tests.yml | 2 +- .github/workflows/release.yml | 2 +- bin/docker-build | 2 +- bin/docker-build-tap | 20 + bin/docker-push | 2 +- bin/image-load | 4 +- bin/protoc-go.sh | 7 +- controller/Dockerfile | 5 +- controller/api/util/api_utils.go | 193 - controller/cmd/main.go | 6 - controller/proxy-injector/webhook_test.go | 1 - pkg/protohttp/protohttp.go | 28 +- pkg/protohttp/protohttp_test.go | 69 +- .../linkerd-viz/templates/tap-injector.yaml | 2 +- viz/charts/linkerd-viz/templates/tap.yaml | 2 +- viz/charts/linkerd-viz/values.yaml | 10 +- viz/cmd/edges.go | 2 +- viz/cmd/profile.go | 13 +- viz/cmd/profile_test.go | 47 +- viz/cmd/routes.go | 2 +- viz/cmd/stat.go | 2 +- viz/cmd/tap.go | 72 +- viz/cmd/tap_test.go | 149 +- viz/cmd/testdata/install_default.golden | 8 +- .../install_prometheus_disabled.golden | 8 +- .../testdata/install_proxy_resources.golden | 8 +- viz/cmd/top.go | 52 +- viz/metrics-api/Dockerfile | 1 + viz/metrics-api/gen/viz/viz.pb.go | 3651 ++++------------- viz/metrics-api/proto/viz.proto | 164 - viz/pkg/api/api.go | 18 + viz/tap/Dockerfile | 31 + {controller/tap => viz/tap/api}/handlers.go | 10 +- .../tap => viz/tap/api}/handlers_test.go | 2 +- .../tap/apiserver.go => viz/tap/api/server.go | 45 +- .../tap/api/server_test.go | 12 +- viz/tap/cmd/main.go | 22 + .../tap => viz/tap/controller}/client.go | 5 +- .../cmd/tap => viz/tap/controller}/main.go | 22 +- .../tap => viz/tap/controller}/server.go | 131 +- .../tap => viz/tap/controller}/server_test.go | 107 +- viz/tap/gen/tap/tap.pb.go | 2118 ++++++++++ .../tap-injector => viz/tap/injector}/main.go | 5 +- .../tap/injector}/patch.go | 2 +- .../tap/injector}/webhook.go | 2 +- viz/tap/pkg/protohttp.go | 28 + viz/tap/pkg/protohttp_test.go | 54 + pkg/tap/tap.go => viz/tap/pkg/reader.go | 6 +- viz/tap/pkg/util.go | 184 + viz/tap/proto/tap.proto | 172 + web/Dockerfile | 2 + web/srv/api_handlers.go | 26 +- 52 files changed, 3869 insertions(+), 3669 deletions(-) create mode 100755 bin/docker-build-tap create mode 100644 viz/tap/Dockerfile rename {controller/tap => viz/tap/api}/handlers.go (98%) rename {controller/tap => viz/tap/api}/handlers_test.go (99%) rename controller/tap/apiserver.go => viz/tap/api/server.go (82%) rename controller/tap/apiserver_test.go => viz/tap/api/server_test.go (95%) create mode 100644 viz/tap/cmd/main.go rename {controller/tap => viz/tap/controller}/client.go (81%) rename {controller/cmd/tap => viz/tap/controller}/main.go (86%) rename {controller/tap => viz/tap/controller}/server.go (83%) rename {controller/tap => viz/tap/controller}/server_test.go (84%) create mode 100644 viz/tap/gen/tap/tap.pb.go rename {controller/cmd/tap-injector => viz/tap/injector}/main.go (86%) rename {controller/tap-injector => viz/tap/injector}/patch.go (94%) rename {controller/tap-injector => viz/tap/injector}/webhook.go (99%) create mode 100644 viz/tap/pkg/protohttp.go create mode 100644 viz/tap/pkg/protohttp_test.go rename pkg/tap/tap.go => viz/tap/pkg/reader.go (92%) create mode 100644 viz/tap/pkg/util.go create mode 100644 viz/tap/proto/tap.proto diff --git a/.github/workflows/integration_tests.yml b/.github/workflows/integration_tests.yml index 222ec24a8cf52..f0bd5e3f24afa 100644 --- a/.github/workflows/integration_tests.yml +++ b/.github/workflows/integration_tests.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: # Keep in sync with release.yaml matrix build - target: [proxy, controller, metrics-api, web, cni-plugin, debug, cli-bin, grafana, jaeger-webhook] + target: [proxy, controller, metrics-api, web, cni-plugin, debug, cli-bin, grafana, jaeger-webhook, tap] name: Docker build (${{ matrix.target }}) timeout-minutes: 30 steps: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b143cb940d6c8..79c574889df0e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: # Keep in sync with integration_tests.yaml matrix build - target: [proxy, controller, metrics-api, web, cni-plugin, debug, cli-bin, grafana, jaeger-webhook] + target: [proxy, controller, metrics-api, web, cni-plugin, debug, cli-bin, grafana, jaeger-webhook, tap] name: Docker build (${{ matrix.target }}) timeout-minutes: 30 steps: diff --git a/bin/docker-build b/bin/docker-build index 065582b7c7115..f79ea0b70791d 100755 --- a/bin/docker-build +++ b/bin/docker-build @@ -22,4 +22,4 @@ fi "$bindir"/docker-build-grafana "$bindir"/docker-build-jaeger-webhook "$bindir"/docker-build-metrics-api - +"$bindir"/docker-build-tap diff --git a/bin/docker-build-tap b/bin/docker-build-tap new file mode 100755 index 0000000000000..5858d61a45697 --- /dev/null +++ b/bin/docker-build-tap @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -eu + +if [ $# -ne 0 ]; then + echo "no arguments allowed for ${0##*/}, given: $*" >&2 + exit 64 +fi + +bindir=$( cd "${BASH_SOURCE[0]%/*}" && pwd ) +rootdir=$( cd "$bindir"/.. && pwd ) + +# shellcheck source=_docker.sh +. "$bindir"/_docker.sh +# shellcheck source=_tag.sh +. "$bindir"/_tag.sh + +dockerfile=$rootdir/viz/tap/Dockerfile +tag=$(head_root_tag) +docker_build tap "$tag" "$dockerfile" diff --git a/bin/docker-push b/bin/docker-push index c48d79a65c38a..3e9e88a7a2291 100755 --- a/bin/docker-push +++ b/bin/docker-push @@ -14,6 +14,6 @@ bindir=$( cd "${BASH_SOURCE[0]%/*}" && pwd ) # shellcheck source=_docker.sh . "$bindir"/_docker.sh -for img in cli-bin cni-plugin controller metrics-api debug grafana proxy web ; do +for img in cli-bin cni-plugin controller metrics-api debug grafana proxy web tap; do docker_push $img "$tag" done diff --git a/bin/image-load b/bin/image-load index 4f7a184275441..252e69c7bbf98 100755 --- a/bin/image-load +++ b/bin/image-load @@ -10,7 +10,7 @@ while : do case $1 in -h|--help) - echo "Load into KinD/k3d the images for Linkerd's proxy, controller, metrics-api, web, grafana, cli-bin, debug and cni-plugin." + echo "Load into KinD/k3d the images for Linkerd's proxy, controller, metrics-api, web, grafana, cli-bin, tap, debug and cni-plugin." echo "" echo "Usage:" echo " bin/image-load [--kind] [--k3d] [--archive]" @@ -79,7 +79,7 @@ fi "$bin" version rm -f load_fail -for img in proxy controller web metrics-api grafana cli-bin debug cni-plugin jaeger-webhook; do +for img in proxy controller web metrics-api grafana cli-bin debug cni-plugin jaeger-webhook tap; do printf 'Importing %s...\n' $img if [ $archive ]; then param="image-archives/$img.tar" diff --git a/bin/protoc-go.sh b/bin/protoc-go.sh index defb1a990bf8a..0b4288174a584 100755 --- a/bin/protoc-go.sh +++ b/bin/protoc-go.sh @@ -6,17 +6,18 @@ bindir=$( cd "${0%/*}" && pwd ) go install -mod=readonly github.com/golang/protobuf/protoc-gen-go -rm -rf controller/gen/common controller/gen/public controller/gen/config viz/metrics-api/gen -mkdir -p controller/gen/common/healthcheck controller/gen/common/net controller/gen/public viz/metrics-api/gen/viz +rm -rf controller/gen/common controller/gen/public controller/gen/config viz/metrics-api/gen viz/tap/gen +mkdir -p controller/gen/common/healthcheck controller/gen/common/net controller/gen/public viz/metrics-api/gen/viz viz/tap/gen/tap "$bindir"/protoc -I proto --go_out=plugins=grpc,paths=source_relative:controller/gen proto/common/net.proto "$bindir"/protoc -I proto --go_out=plugins=grpc,paths=source_relative:controller/gen proto/public.proto "$bindir"/protoc -I proto --go_out=plugins=grpc,paths=source_relative:controller/gen proto/config/config.proto "$bindir"/protoc -I proto --go_out=plugins=grpc,paths=source_relative:controller/gen proto/common/healthcheck.proto "$bindir"/protoc -I proto -I viz/metrics-api/proto --go_out=plugins=grpc,paths=source_relative:viz/metrics-api/gen viz/metrics-api/proto/viz.proto +"$bindir"/protoc -I proto -I viz/tap/proto -I viz/metrics-api/proto --go_out=plugins=grpc,paths=source_relative:viz/tap/gen viz/tap/proto/tap.proto mv controller/gen/common/net.pb.go controller/gen/common/net/ mv controller/gen/public.pb.go controller/gen/public/ mv controller/gen/common/healthcheck.pb.go controller/gen/common/healthcheck/ mv viz/metrics-api/gen/viz.pb.go viz/metrics-api/gen/viz/viz.pb.go - +mv viz/tap/gen/tap.pb.go viz/tap/gen/tap/tap.pb.go diff --git a/controller/Dockerfile b/controller/Dockerfile index 1b2a628ee50cd..445b51765bb76 100644 --- a/controller/Dockerfile +++ b/controller/Dockerfile @@ -13,10 +13,9 @@ RUN ./bin/install-deps $TARGETARCH FROM go-deps as golang WORKDIR /linkerd-build COPY controller/gen controller/gen -# TODO: remove when tap code gets moved to /viz +# TODO: remove when BuildResource is refactored +# /~https://github.com/linkerd/linkerd2/issues/5589 COPY viz/metrics-api/gen/viz viz/metrics-api/gen/viz -# TODO: remove when tap code gets moved to /viz -COPY viz/pkg/labels viz/pkg/labels COPY pkg pkg COPY controller controller COPY charts/patch charts/patch diff --git a/controller/api/util/api_utils.go b/controller/api/util/api_utils.go index e175f0f9158bd..5c3d3c28c8654 100644 --- a/controller/api/util/api_utils.go +++ b/controller/api/util/api_utils.go @@ -1,12 +1,9 @@ package util import ( - "encoding/binary" "errors" - "fmt" "strings" - netPb "github.com/linkerd/linkerd2/controller/gen/common/net" "github.com/linkerd/linkerd2/pkg/k8s" pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" "google.golang.org/grpc/codes" @@ -19,56 +16,6 @@ import ( Shared utilities for interacting with the controller public api */ -var ( - // ValidTargets specifies resource types allowed as a target: - // target resource on an inbound query - // target resource on an outbound 'to' query - // destination resource on an outbound 'from' query - ValidTargets = []string{ - k8s.Authority, - k8s.CronJob, - k8s.DaemonSet, - k8s.Deployment, - k8s.Job, - k8s.Namespace, - k8s.Pod, - k8s.ReplicaSet, - k8s.ReplicationController, - k8s.StatefulSet, - } - - // ValidTapDestinations specifies resource types allowed as a tap destination: - // destination resource on an outbound 'to' query - ValidTapDestinations = []string{ - k8s.CronJob, - k8s.DaemonSet, - k8s.Deployment, - k8s.Job, - k8s.Namespace, - k8s.Pod, - k8s.ReplicaSet, - k8s.ReplicationController, - k8s.Service, - k8s.StatefulSet, - } -) - -// TapRequestParams contains parameters that are used to build a -// TapByResourceRequest. -type TapRequestParams struct { - Resource string - Namespace string - ToResource string - ToNamespace string - MaxRps float32 - Scheme string - Method string - Authority string - Path string - Extract bool - LabelSelector string -} - // GRPCError generates a gRPC error code, as defined in // google.golang.org/grpc/status. // If the error is nil or already a gRPC error, return the error. @@ -198,143 +145,3 @@ func buildResource(namespace string, resType string, name string) (*pb.Resource, Name: name, }, nil } - -// BuildTapByResourceRequest builds a Public API TapByResourceRequest from a -// TapRequestParams. -func BuildTapByResourceRequest(params TapRequestParams) (*pb.TapByResourceRequest, error) { - target, err := BuildResource(params.Namespace, params.Resource) - if err != nil { - return nil, fmt.Errorf("target resource invalid: %s", err) - } - if !contains(ValidTargets, target.Type) { - return nil, fmt.Errorf("unsupported resource type [%s]", target.Type) - } - - matches := []*pb.TapByResourceRequest_Match{} - - if params.ToResource != "" { - destination, err := BuildResource(params.ToNamespace, params.ToResource) - if err != nil { - return nil, fmt.Errorf("destination resource invalid: %s", err) - } - if !contains(ValidTapDestinations, destination.Type) { - return nil, fmt.Errorf("unsupported resource type [%s]", destination.Type) - } - - match := pb.TapByResourceRequest_Match{ - Match: &pb.TapByResourceRequest_Match_Destinations{ - Destinations: &pb.ResourceSelection{ - Resource: destination, - }, - }, - } - matches = append(matches, &match) - } - - if params.Scheme != "" { - match := buildMatchHTTP(&pb.TapByResourceRequest_Match_Http{ - Match: &pb.TapByResourceRequest_Match_Http_Scheme{Scheme: params.Scheme}, - }) - matches = append(matches, &match) - } - if params.Method != "" { - match := buildMatchHTTP(&pb.TapByResourceRequest_Match_Http{ - Match: &pb.TapByResourceRequest_Match_Http_Method{Method: params.Method}, - }) - matches = append(matches, &match) - } - if params.Authority != "" { - match := buildMatchHTTP(&pb.TapByResourceRequest_Match_Http{ - Match: &pb.TapByResourceRequest_Match_Http_Authority{Authority: params.Authority}, - }) - matches = append(matches, &match) - } - if params.Path != "" { - match := buildMatchHTTP(&pb.TapByResourceRequest_Match_Http{ - Match: &pb.TapByResourceRequest_Match_Http_Path{Path: params.Path}, - }) - matches = append(matches, &match) - } - - extract := &pb.TapByResourceRequest_Extract{} - if params.Extract { - extract = buildExtractHTTP(&pb.TapByResourceRequest_Extract_Http{ - Extract: &pb.TapByResourceRequest_Extract_Http_Headers_{ - Headers: &pb.TapByResourceRequest_Extract_Http_Headers{}, - }, - }) - } - - return &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: target, - LabelSelector: params.LabelSelector, - }, - MaxRps: params.MaxRps, - Match: &pb.TapByResourceRequest_Match{ - Match: &pb.TapByResourceRequest_Match_All{ - All: &pb.TapByResourceRequest_Match_Seq{ - Matches: matches, - }, - }, - }, - Extract: extract, - }, nil -} - -func buildMatchHTTP(match *pb.TapByResourceRequest_Match_Http) pb.TapByResourceRequest_Match { - return pb.TapByResourceRequest_Match{ - Match: &pb.TapByResourceRequest_Match_Http_{ - Http: match, - }, - } -} - -func buildExtractHTTP(extract *pb.TapByResourceRequest_Extract_Http) *pb.TapByResourceRequest_Extract { - return &pb.TapByResourceRequest_Extract{ - Extract: &pb.TapByResourceRequest_Extract_Http_{ - Http: extract, - }, - } -} - -func contains(list []string, s string) bool { - for _, elem := range list { - if s == elem { - return true - } - } - return false -} - -// CreateTapEvent generates tap events for use in tests -func CreateTapEvent(eventHTTP *pb.TapEvent_Http, dstMeta map[string]string, proxyDirection pb.TapEvent_ProxyDirection) *pb.TapEvent { - event := &pb.TapEvent{ - ProxyDirection: proxyDirection, - Source: &netPb.TcpAddress{ - Ip: &netPb.IPAddress{ - Ip: &netPb.IPAddress_Ipv4{ - Ipv4: uint32(1), - }, - }, - }, - Destination: &netPb.TcpAddress{ - Ip: &netPb.IPAddress{ - Ip: &netPb.IPAddress_Ipv6{ - Ipv6: &netPb.IPv6{ - // All nodes address: https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml - First: binary.BigEndian.Uint64([]byte{0xff, 0x01, 0, 0, 0, 0, 0, 0}), - Last: binary.BigEndian.Uint64([]byte{0, 0, 0, 0, 0, 0, 0, 0x01}), - }, - }, - }, - }, - Event: &pb.TapEvent_Http_{ - Http: eventHTTP, - }, - DestinationMeta: &pb.TapEvent_EndpointMeta{ - Labels: dstMeta, - }, - } - return event -} diff --git a/controller/cmd/main.go b/controller/cmd/main.go index 23fac22f547c1..7f578cabe3ffb 100644 --- a/controller/cmd/main.go +++ b/controller/cmd/main.go @@ -10,8 +10,6 @@ import ( proxyinjector "github.com/linkerd/linkerd2/controller/cmd/proxy-injector" publicapi "github.com/linkerd/linkerd2/controller/cmd/public-api" spvalidator "github.com/linkerd/linkerd2/controller/cmd/sp-validator" - "github.com/linkerd/linkerd2/controller/cmd/tap" - tapinjector "github.com/linkerd/linkerd2/controller/cmd/tap-injector" servicemirror "github.com/linkerd/linkerd2/multicluster/cmd/service-mirror" ) @@ -34,10 +32,6 @@ func main() { publicapi.Main(os.Args[2:]) case "sp-validator": spvalidator.Main(os.Args[2:]) - case "tap": - tap.Main(os.Args[2:]) - case "tap-injector": - tapinjector.Main(os.Args[2:]) case "service-mirror": servicemirror.Main(os.Args[2:]) default: diff --git a/controller/proxy-injector/webhook_test.go b/controller/proxy-injector/webhook_test.go index e6a9e3298db17..73d875a6c8cde 100644 --- a/controller/proxy-injector/webhook_test.go +++ b/controller/proxy-injector/webhook_test.go @@ -37,7 +37,6 @@ func confNsDisabled() *inject.ResourceConfig { func TestGetPatch(t *testing.T) { values.GetGlobal().Proxy.DisableIdentity = true - values.GetGlobal().Proxy.DisableTap = true factory := fake.NewFactory(filepath.Join("fake", "data")) nsEnabled, err := factory.Namespace("namespace-inject-enabled.yaml") diff --git a/pkg/protohttp/protohttp.go b/pkg/protohttp/protohttp.go index 5777a78c9cb8e..252fed7215d7c 100644 --- a/pkg/protohttp/protohttp.go +++ b/pkg/protohttp/protohttp.go @@ -11,7 +11,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/linkerd/linkerd2/pkg/k8s" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" log "github.com/sirupsen/logrus" "google.golang.org/grpc/status" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -81,7 +81,7 @@ func WriteErrorToHTTPResponse(w http.ResponseWriter, errorObtained error) { errorMessageToReturn = grpcError.Message() } - errorAsProto := &pb.ApiError{Error: errorMessageToReturn} + errorAsProto := &metricsPb.ApiError{Error: errorMessageToReturn} err := WriteProtoToHTTPResponse(w, errorAsProto) if err != nil { @@ -154,7 +154,7 @@ func CheckIfResponseHasError(rsp *http.Response) error { errorMsg := rsp.Header.Get(errorHeader) if errorMsg != "" { reader := bufio.NewReader(rsp.Body) - var apiError pb.ApiError + var apiError metricsPb.ApiError err := FromByteStreamToProtocolBuffers(reader, &apiError) if err != nil { @@ -200,25 +200,3 @@ func FromByteStreamToProtocolBuffers(byteStreamContainingMessage *bufio.Reader, return nil } - -// TapReqToURL converts a TapByResourceRequest protobuf object to a URL for use -// with the Kubernetes tap.linkerd.io APIService. -// TODO: Move this, probably into its own package, when /controller/gen/public -// moves into /pkg. -func TapReqToURL(req *pb.TapByResourceRequest) string { - res := req.GetTarget().GetResource() - - // non-namespaced - if res.GetType() == k8s.Namespace { - return fmt.Sprintf( - "/apis/tap.linkerd.io/v1alpha1/watch/namespaces/%s/tap", - res.GetName(), - ) - } - - // namespaced - return fmt.Sprintf( - "/apis/tap.linkerd.io/v1alpha1/watch/namespaces/%s/%s/%s/tap", - res.GetNamespace(), res.GetType()+"s", res.GetName(), - ) -} diff --git a/pkg/protohttp/protohttp_test.go b/pkg/protohttp/protohttp_test.go index e93179e4e209f..1c5908503670e 100644 --- a/pkg/protohttp/protohttp_test.go +++ b/pkg/protohttp/protohttp_test.go @@ -15,7 +15,7 @@ import ( "github.com/golang/protobuf/proto" publicPb "github.com/linkerd/linkerd2/controller/gen/public" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" kerrors "k8s.io/apimachinery/pkg/api/errors" @@ -61,10 +61,10 @@ func TestHttpRequestToProto(t *testing.T) { someMethod := http.MethodPost t.Run("Given a valid request, serializes its contents into protobuf object", func(t *testing.T) { - expectedProtoMessage := pb.Pod{ + expectedProtoMessage := metricsPb.Pod{ Name: "some-name", PodIP: "some-name", - Owner: &pb.Pod_Deployment{Deployment: "some-name"}, + Owner: &metricsPb.Pod_Deployment{Deployment: "some-name"}, Status: "some-name", Added: false, ControllerNamespace: "some-name", @@ -80,7 +80,7 @@ func TestHttpRequestToProto(t *testing.T) { t.Fatalf("Unexpected error: %v", err) } - var actualProtoMessage pb.Pod + var actualProtoMessage metricsPb.Pod err = HTTPRequestToProto(req, &actualProtoMessage) if err != nil { t.Fatalf("Unexpected error: %v", err) @@ -92,7 +92,7 @@ func TestHttpRequestToProto(t *testing.T) { }) t.Run("Given a broken request, returns http error", func(t *testing.T) { - var actualProtoMessage pb.Pod + var actualProtoMessage metricsPb.Pod req, err := http.NewRequest(someMethod, someURL, strings.NewReader("not really protobuf")) if err != nil { @@ -136,8 +136,8 @@ func TestWriteErrorToHttpResponse(t *testing.T) { t.Fatalf("Unexpected error: %v", err) } - expectedErrorPayload := pb.ApiError{Error: genericError.Error()} - var actualErrorPayload pb.ApiError + expectedErrorPayload := metricsPb.ApiError{Error: genericError.Error()} + var actualErrorPayload metricsPb.ApiError err = proto.Unmarshal(payloadRead, &actualErrorPayload) if err != nil { t.Fatalf("Unexpected error: %v", err) @@ -170,8 +170,8 @@ func TestWriteErrorToHttpResponse(t *testing.T) { t.Fatalf("Unexpected error: %v", err) } - expectedErrorPayload := pb.ApiError{Error: httpError.WrappedError.Error()} - var actualErrorPayload pb.ApiError + expectedErrorPayload := metricsPb.ApiError{Error: httpError.WrappedError.Error()} + var actualErrorPayload metricsPb.ApiError err = proto.Unmarshal(payloadRead, &actualErrorPayload) if err != nil { t.Fatalf("Unexpected error: %v", err) @@ -203,8 +203,8 @@ func TestWriteErrorToHttpResponse(t *testing.T) { t.Fatalf("Unexpected error: %v", err) } - expectedErrorPayload := pb.ApiError{Error: expectedErrorMessage} - var actualErrorPayload pb.ApiError + expectedErrorPayload := metricsPb.ApiError{Error: expectedErrorMessage} + var actualErrorPayload metricsPb.ApiError err = proto.Unmarshal(payloadRead, &actualErrorPayload) if err != nil { t.Fatalf("Unexpected error: %v", err) @@ -432,7 +432,7 @@ func TestCheckIfResponseHasError(t *testing.T) { t.Run("returns error in body if response contains linkerd-error header", func(t *testing.T) { expectedErrorMessage := "expected error message" - protoInBytes, err := proto.Marshal(&pb.ApiError{Error: expectedErrorMessage}) + protoInBytes, err := proto.Marshal(&metricsPb.ApiError{Error: expectedErrorMessage}) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -524,51 +524,6 @@ func TestCheckIfResponseHasError(t *testing.T) { }) } -func TestTapReqToURL(t *testing.T) { - expectations := []struct { - req *pb.TapByResourceRequest - url string - }{ - { - req: &pb.TapByResourceRequest{}, - url: "/apis/tap.linkerd.io/v1alpha1/watch/namespaces//s//tap", - }, - { - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ - Type: "namespace", - Name: "test-name", - }, - }, - }, - url: "/apis/tap.linkerd.io/v1alpha1/watch/namespaces/test-name/tap", - }, - { - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ - Namespace: "test-ns", - Type: "test-type", - Name: "test-name", - }, - }, - }, - url: "/apis/tap.linkerd.io/v1alpha1/watch/namespaces/test-ns/test-types/test-name/tap", - }, - } - for i, exp := range expectations { - exp := exp // pin - - t.Run(fmt.Sprintf("%d constructs the expected URL from a TapRequest", i), func(t *testing.T) { - url := TapReqToURL(exp.req) - if url != exp.url { - t.Fatalf("Unexpected url: %s, Expected: %s", url, exp.url) - } - }) - } -} - func assertResponseHasProtobufContentType(t *testing.T, responseWriter *stubResponseWriter) { actualContentType := responseWriter.headers.Get(contentTypeHeader) expectedContentType := protobufContentType diff --git a/viz/charts/linkerd-viz/templates/tap-injector.yaml b/viz/charts/linkerd-viz/templates/tap-injector.yaml index ceb9ee10b1c1c..02fa0a1a979c0 100644 --- a/viz/charts/linkerd-viz/templates/tap-injector.yaml +++ b/viz/charts/linkerd-viz/templates/tap-injector.yaml @@ -69,7 +69,7 @@ spec: {{- end }} containers: - args: - - tap-injector + - injector - -tap-service-name=linkerd-tap.{{.Values.namespace}}.serviceaccount.identity.$(_l5d_ns).$(_l5d_trustdomain) image: {{.Values.tapInjector.image.registry}}/{{.Values.tapInjector.image.name}}:{{.Values.tapInjector.image.tag}} imagePullPolicy: {{.Values.tapInjector.image.pullPolicy}} diff --git a/viz/charts/linkerd-viz/templates/tap.yaml b/viz/charts/linkerd-viz/templates/tap.yaml index 37e8e7e945f64..02a0589d90098 100644 --- a/viz/charts/linkerd-viz/templates/tap.yaml +++ b/viz/charts/linkerd-viz/templates/tap.yaml @@ -79,7 +79,7 @@ spec: {{- end }} containers: - args: - - tap + - controller - -controller-namespace={{.Values.linkerdNamespace}} - -log-level={{.Values.tap.logLevel}} - -identity-trust-domain={{.Values.identityTrustDomain}} diff --git a/viz/charts/linkerd-viz/values.yaml b/viz/charts/linkerd-viz/values.yaml index 7a4ac2d132ea4..37cac472fa0a1 100644 --- a/viz/charts/linkerd-viz/values.yaml +++ b/viz/charts/linkerd-viz/values.yaml @@ -6,9 +6,9 @@ # -- control plane version. See Proxy section for proxy version linkerdVersion: &linkerd_version linkerdVersionValue -# -- Kubernetes DNS Domain name to use +# -- Kubernetes DNS Domain name to use clusterDomain: &cluster_domain cluster.local -# -- Trust domain used for identity +# -- Trust domain used for identity identityTrustDomain: *cluster_domain # Annotation labels. Do not edit. createdByAnnotation: linkerd.io/created-by @@ -39,7 +39,7 @@ nodeSelector: imagePullSecrets: [] # - name: my-private-docker-registry-login-secret -# -- Tolerations section, See the +# -- Tolerations section, See the # [K8S documentation](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) # for more information tolerations: @@ -101,7 +101,7 @@ tap: # -- Docker registry for the tap instance registry: *registry # -- Docker image name for the tap instance - name: controller + name: tap # -- Docker image tag for the tap instance tag: *linkerd_version # -- Do not create a secret resource for the Tap component. If this is set to @@ -149,7 +149,7 @@ tapInjector: # -- Docker registry for the tapInjector instance registry: *registry # -- Docker image name for the tapInjector instance - name: controller + name: tap # -- Docker image tag for the tapInjector instance tag: *linkerd_version namespaceSelector: diff --git a/viz/cmd/edges.go b/viz/cmd/edges.go index 20b3eb410a622..ccd7ae95240c1 100644 --- a/viz/cmd/edges.go +++ b/viz/cmd/edges.go @@ -83,7 +83,7 @@ func NewCmdEdges() *cobra.Command { # Get all edges between pods in all namespaces. linkerd viz edges po --all-namespaces`, Args: cobra.ExactArgs(1), - ValidArgs: coreUtil.ValidTargets, + ValidArgs: api.ValidTargets, RunE: func(cmd *cobra.Command, args []string) error { if options.namespace == "" { options.namespace = pkgcmd.GetDefaultNamespace(kubeconfigPath, kubeContext) diff --git a/viz/cmd/profile.go b/viz/cmd/profile.go index 1707146d9bbb1..ddfab7ff88aa1 100644 --- a/viz/cmd/profile.go +++ b/viz/cmd/profile.go @@ -13,16 +13,15 @@ import ( "time" "github.com/ghodss/yaml" - "github.com/linkerd/linkerd2/controller/api/util" sp "github.com/linkerd/linkerd2/controller/gen/apis/serviceprofile/v1alpha2" pkgcmd "github.com/linkerd/linkerd2/pkg/cmd" "github.com/linkerd/linkerd2/pkg/healthcheck" "github.com/linkerd/linkerd2/pkg/k8s" "github.com/linkerd/linkerd2/pkg/profiles" "github.com/linkerd/linkerd2/pkg/protohttp" - "github.com/linkerd/linkerd2/pkg/tap" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" "github.com/linkerd/linkerd2/viz/pkg/api" + pb "github.com/linkerd/linkerd2/viz/tap/gen/tap" + "github.com/linkerd/linkerd2/viz/tap/pkg" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -118,12 +117,12 @@ func newCmdProfile() *cobra.Command { // a service profile with routes pre-populated from the tap data // Only inbound tap traffic is considered. func renderTapOutputProfile(ctx context.Context, k8sAPI *k8s.KubernetesAPI, tapResource, namespace, name, clusterDomain string, tapDuration time.Duration, routeLimit int, w io.Writer) error { - requestParams := util.TapRequestParams{ + requestParams := pkg.TapRequestParams{ Resource: tapResource, Namespace: namespace, } log.Debugf("Running `linkerd tap %s --namespace %s`", tapResource, namespace) - req, err := util.BuildTapByResourceRequest(requestParams) + req, err := pkg.BuildTapByResourceRequest(requestParams) if err != nil { return err } @@ -149,7 +148,7 @@ func tapToServiceProfile(ctx context.Context, k8sAPI *k8s.KubernetesAPI, tapReq } ctxWithTime, cancel := context.WithTimeout(ctx, tapDuration) defer cancel() - reader, body, err := tap.Reader(ctxWithTime, k8sAPI, tapReq) + reader, body, err := pkg.Reader(ctxWithTime, k8sAPI, tapReq) if err != nil { return profile, err } @@ -172,7 +171,7 @@ func routeSpecFromTap(tapByteStream *bufio.Reader, routeLimit int) []*sp.RouteSp if err != io.EOF && !(errors.As(err, &e) && e.Timeout()) && !errors.Is(err, context.DeadlineExceeded) && - !strings.HasSuffix(err.Error(), tap.ErrClosedResponseBody) { + !strings.HasSuffix(err.Error(), pkg.ErrClosedResponseBody) { fmt.Fprintln(os.Stderr, err) } break diff --git a/viz/cmd/profile_test.go b/viz/cmd/profile_test.go index e5b2543d25b60..4143e92f85e2f 100644 --- a/viz/cmd/profile_test.go +++ b/viz/cmd/profile_test.go @@ -7,12 +7,13 @@ import ( "testing" "time" - "github.com/linkerd/linkerd2/controller/api/util" sp "github.com/linkerd/linkerd2/controller/gen/apis/serviceprofile/v1alpha2" "github.com/linkerd/linkerd2/pkg/k8s" "github.com/linkerd/linkerd2/pkg/profiles" "github.com/linkerd/linkerd2/pkg/protohttp" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" + "github.com/linkerd/linkerd2/viz/tap/pkg" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -23,58 +24,58 @@ func TestTapToServiceProfile(t *testing.T) { tapDuration := 5 * time.Second routeLimit := 20 - params := util.TapRequestParams{ + params := pkg.TapRequestParams{ Resource: "deploy/" + name, Namespace: namespace, } - tapReq, err := util.BuildTapByResourceRequest(params) + tapReq, err := pkg.BuildTapByResourceRequest(params) if err != nil { t.Fatalf("Unexpected error: %v", err) } - event1 := util.CreateTapEvent( - &pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_RequestInit_{ + event1 := pkg.CreateTapEvent( + &tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_RequestInit_{ - RequestInit: &pb.TapEvent_Http_RequestInit{ - Id: &pb.TapEvent_Http_StreamId{ + RequestInit: &tapPb.TapEvent_Http_RequestInit{ + Id: &tapPb.TapEvent_Http_StreamId{ Base: 1, }, Authority: "", Path: "/emojivoto.v1.VotingService/VoteFire", - Method: &pb.HttpMethod{ - Type: &pb.HttpMethod_Registered_{ - Registered: pb.HttpMethod_POST, + Method: &metricsPb.HttpMethod{ + Type: &metricsPb.HttpMethod_Registered_{ + Registered: metricsPb.HttpMethod_POST, }, }, }, }, }, map[string]string{}, - pb.TapEvent_INBOUND, + tapPb.TapEvent_INBOUND, ) - event2 := util.CreateTapEvent( - &pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_RequestInit_{ + event2 := pkg.CreateTapEvent( + &tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_RequestInit_{ - RequestInit: &pb.TapEvent_Http_RequestInit{ - Id: &pb.TapEvent_Http_StreamId{ + RequestInit: &tapPb.TapEvent_Http_RequestInit{ + Id: &tapPb.TapEvent_Http_StreamId{ Base: 2, }, Authority: "", Path: "/my/path/hi", - Method: &pb.HttpMethod{ - Type: &pb.HttpMethod_Registered_{ - Registered: pb.HttpMethod_GET, + Method: &metricsPb.HttpMethod{ + Type: &metricsPb.HttpMethod_Registered_{ + Registered: metricsPb.HttpMethod_GET, }, }, }, }, }, map[string]string{}, - pb.TapEvent_INBOUND, + tapPb.TapEvent_INBOUND, ) kubeAPI, err := k8s.NewFakeAPI() @@ -83,7 +84,7 @@ func TestTapToServiceProfile(t *testing.T) { } ts := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { - for _, event := range []*pb.TapEvent{event1, event2} { + for _, event := range []*tapPb.TapEvent{event1, event2} { event := event // pin err = protohttp.WriteProtoToHTTPResponse(w, event) if err != nil { diff --git a/viz/cmd/routes.go b/viz/cmd/routes.go index 23f7ec303f903..3095928ccf827 100644 --- a/viz/cmd/routes.go +++ b/viz/cmd/routes.go @@ -63,7 +63,7 @@ This command will only display traffic which is sent to a service that has a Ser # Routes for calls from the traffic deployment to the webapp service in the test namespace. linkerd viz routes deploy/traffic -n test --to svc/webapp`, Args: cobra.ExactArgs(1), - ValidArgs: coreUtil.ValidTargets, + ValidArgs: api.ValidTargets, RunE: func(cmd *cobra.Command, args []string) error { if options.namespace == "" { options.namespace = pkgcmd.GetDefaultNamespace(kubeconfigPath, kubeContext) diff --git a/viz/cmd/stat.go b/viz/cmd/stat.go index 834c931113534..60c04e3ce0426 100644 --- a/viz/cmd/stat.go +++ b/viz/cmd/stat.go @@ -167,7 +167,7 @@ If no resource name is specified, displays stats about all resources of the spec # Get all inbound stats to the test namespace. linkerd viz stat ns/test`, Args: cobra.MinimumNArgs(1), - ValidArgs: coreUtil.ValidTargets, + ValidArgs: api.ValidTargets, RunE: func(cmd *cobra.Command, args []string) error { if options.namespace == "" { options.namespace = pkgcmd.GetDefaultNamespace(kubeconfigPath, kubeContext) diff --git a/viz/cmd/tap.go b/viz/cmd/tap.go index 7f6eba5aef80e..d9ff3aca3df13 100644 --- a/viz/cmd/tap.go +++ b/viz/cmd/tap.go @@ -10,22 +10,22 @@ import ( "strings" "github.com/golang/protobuf/ptypes/duration" - "github.com/linkerd/linkerd2/controller/api/util" netPb "github.com/linkerd/linkerd2/controller/gen/common/net" "github.com/linkerd/linkerd2/pkg/addr" pkgcmd "github.com/linkerd/linkerd2/pkg/cmd" "github.com/linkerd/linkerd2/pkg/healthcheck" "github.com/linkerd/linkerd2/pkg/k8s" "github.com/linkerd/linkerd2/pkg/protohttp" - "github.com/linkerd/linkerd2/pkg/tap" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" "github.com/linkerd/linkerd2/viz/pkg/api" + tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" + "github.com/linkerd/linkerd2/viz/tap/pkg" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "google.golang.org/grpc/codes" ) -type renderTapEventFunc func(*pb.TapEvent, string) string +type renderTapEventFunc func(*tapPb.TapEvent, string) string type tapOptions struct { namespace string @@ -173,7 +173,7 @@ func NewCmdTap() *cobra.Command { # tap the test namespace, filter by request to prod namespace linkerd viz tap ns/test --to ns/prod`, Args: cobra.RangeArgs(1, 2), - ValidArgs: util.ValidTargets, + ValidArgs: api.ValidTargets, RunE: func(cmd *cobra.Command, args []string) error { if options.namespace == "" { options.namespace = pkgcmd.GetDefaultNamespace(kubeconfigPath, kubeContext) @@ -188,7 +188,7 @@ func NewCmdTap() *cobra.Command { APIAddr: apiAddr, }) - requestParams := util.TapRequestParams{ + requestParams := pkg.TapRequestParams{ Resource: strings.Join(args, "/"), Namespace: options.namespace, ToResource: options.toResource, @@ -207,7 +207,7 @@ func NewCmdTap() *cobra.Command { return fmt.Errorf("validation error when executing tap command: %v", err) } - req, err := util.BuildTapByResourceRequest(requestParams) + req, err := pkg.BuildTapByResourceRequest(requestParams) if err != nil { return err } @@ -245,8 +245,8 @@ func NewCmdTap() *cobra.Command { return cmd } -func requestTapByResourceFromAPI(ctx context.Context, w io.Writer, k8sAPI *k8s.KubernetesAPI, req *pb.TapByResourceRequest, options *tapOptions) error { - reader, body, err := tap.Reader(ctx, k8sAPI, req) +func requestTapByResourceFromAPI(ctx context.Context, w io.Writer, k8sAPI *k8s.KubernetesAPI, req *tapPb.TapByResourceRequest, options *tapOptions) error { + reader, body, err := pkg.Reader(ctx, k8sAPI, req) if err != nil { return err } @@ -255,7 +255,7 @@ func requestTapByResourceFromAPI(ctx context.Context, w io.Writer, k8sAPI *k8s.K return writeTapEventsToBuffer(w, reader, req, options) } -func writeTapEventsToBuffer(w io.Writer, tapByteStream *bufio.Reader, req *pb.TapByResourceRequest, options *tapOptions) error { +func writeTapEventsToBuffer(w io.Writer, tapByteStream *bufio.Reader, req *tapPb.TapByResourceRequest, options *tapOptions) error { var err error switch options.output { case "": @@ -276,7 +276,7 @@ func writeTapEventsToBuffer(w io.Writer, tapByteStream *bufio.Reader, req *pb.Ta func renderTapEvents(tapByteStream *bufio.Reader, w io.Writer, render renderTapEventFunc, resource string) error { for { log.Debug("Waiting for data...") - event := pb.TapEvent{} + event := tapPb.TapEvent{} err := protohttp.FromByteStreamToProtocolBuffers(tapByteStream, &event) if err == io.EOF { break @@ -295,17 +295,17 @@ func renderTapEvents(tapByteStream *bufio.Reader, w io.Writer, render renderTapE } // renderTapEvent renders a Public API TapEvent to a string. -func renderTapEvent(event *pb.TapEvent, resource string) string { +func renderTapEvent(event *tapPb.TapEvent, resource string) string { dst := dst(event) src := src(event) proxy := "???" tls := "" switch event.GetProxyDirection() { - case pb.TapEvent_INBOUND: + case tapPb.TapEvent_INBOUND: proxy = "in " // A space is added so it aligns with `out`. tls = src.tlsStatus() - case pb.TapEvent_OUTBOUND: + case tapPb.TapEvent_OUTBOUND: proxy = "out" tls = dst.tlsStatus() default: @@ -331,7 +331,7 @@ func renderTapEvent(event *pb.TapEvent, resource string) string { } switch ev := event.GetHttp().GetEvent().(type) { - case *pb.TapEvent_Http_RequestInit_: + case *tapPb.TapEvent_Http_RequestInit_: return fmt.Sprintf("req id=%d:%d %s :method=%s :authority=%s :path=%s%s", ev.RequestInit.GetId().GetBase(), ev.RequestInit.GetId().GetStream(), @@ -342,7 +342,7 @@ func renderTapEvent(event *pb.TapEvent, resource string) string { resources, ) - case *pb.TapEvent_Http_ResponseInit_: + case *tapPb.TapEvent_Http_ResponseInit_: return fmt.Sprintf("rsp id=%d:%d %s :status=%d latency=%dµs%s", ev.ResponseInit.GetId().GetBase(), ev.ResponseInit.GetId().GetStream(), @@ -352,9 +352,9 @@ func renderTapEvent(event *pb.TapEvent, resource string) string { resources, ) - case *pb.TapEvent_Http_ResponseEnd_: + case *tapPb.TapEvent_Http_ResponseEnd_: switch eos := ev.ResponseEnd.GetEos().GetEnd().(type) { - case *pb.Eos_GrpcStatusCode: + case *metricsPb.Eos_GrpcStatusCode: return fmt.Sprintf( "end id=%d:%d %s grpc-status=%s duration=%dµs response-length=%dB%s", ev.ResponseEnd.GetId().GetBase(), @@ -366,7 +366,7 @@ func renderTapEvent(event *pb.TapEvent, resource string) string { resources, ) - case *pb.Eos_ResetErrorCode: + case *metricsPb.Eos_ResetErrorCode: return fmt.Sprintf( "end id=%d:%d %s reset-error=%+v duration=%dµs response-length=%dB%s", ev.ResponseEnd.GetId().GetBase(), @@ -395,7 +395,7 @@ func renderTapEvent(event *pb.TapEvent, resource string) string { } // renderTapEventJSON renders a Public API TapEvent to a string in JSON format. -func renderTapEventJSON(event *pb.TapEvent, _ string) string { +func renderTapEventJSON(event *tapPb.TapEvent, _ string) string { m := mapPublicToDisplayTapEvent(event) e, err := json.MarshalIndent(m, "", " ") if err != nil { @@ -405,7 +405,7 @@ func renderTapEventJSON(event *pb.TapEvent, _ string) string { } // Map public API `TapEvent`s to `displayTapEvent`s -func mapPublicToDisplayTapEvent(event *pb.TapEvent) *tapEvent { +func mapPublicToDisplayTapEvent(event *tapPb.TapEvent) *tapEvent { // Map source endpoint sip := addr.PublicIPToString(event.GetSource().GetIp()) src := &endpoint{ @@ -434,7 +434,7 @@ func mapPublicToDisplayTapEvent(event *pb.TapEvent) *tapEvent { } // Attempt to map a `TapEvent_Http_RequestInit event to a `requestInitEvent` -func getRequestInitEvent(pubEv *pb.TapEvent_Http) *requestInitEvent { +func getRequestInitEvent(pubEv *tapPb.TapEvent_Http) *requestInitEvent { reqI := pubEv.GetRequestInit() if reqI == nil { return nil @@ -453,28 +453,28 @@ func getRequestInitEvent(pubEv *pb.TapEvent_Http) *requestInitEvent { } } -func formatMethod(m *pb.HttpMethod) string { - if x, ok := m.GetType().(*pb.HttpMethod_Registered_); ok { +func formatMethod(m *metricsPb.HttpMethod) string { + if x, ok := m.GetType().(*metricsPb.HttpMethod_Registered_); ok { return x.Registered.String() } - if s, ok := m.GetType().(*pb.HttpMethod_Unregistered); ok { + if s, ok := m.GetType().(*metricsPb.HttpMethod_Unregistered); ok { return s.Unregistered } return "" } -func formatScheme(s *pb.Scheme) string { - if x, ok := s.GetType().(*pb.Scheme_Registered_); ok { +func formatScheme(s *metricsPb.Scheme) string { + if x, ok := s.GetType().(*metricsPb.Scheme_Registered_); ok { return x.Registered.String() } - if str, ok := s.GetType().(*pb.Scheme_Unregistered); ok { + if str, ok := s.GetType().(*metricsPb.Scheme_Unregistered); ok { return str.Unregistered } return "" } // Attempt to map a `TapEvent_Http_ResponseInit` event to a `responseInitEvent` -func getResponseInitEvent(pubEv *pb.TapEvent_Http) *responseInitEvent { +func getResponseInitEvent(pubEv *tapPb.TapEvent_Http) *responseInitEvent { resI := pubEv.GetResponseInit() if resI == nil { return nil @@ -492,7 +492,7 @@ func getResponseInitEvent(pubEv *pb.TapEvent_Http) *responseInitEvent { } // Attempt to map a `TapEvent_Http_ResponseEnd` event to a `responseEndEvent` -func getResponseEndEvent(pubEv *pb.TapEvent_Http) *responseEndEvent { +func getResponseEndEvent(pubEv *tapPb.TapEvent_Http) *responseEndEvent { resE := pubEv.GetResponseEnd() if resE == nil { return nil @@ -512,15 +512,15 @@ func getResponseEndEvent(pubEv *pb.TapEvent_Http) *responseEndEvent { } } -func formatHeadersTrailers(hs *pb.Headers) []metadata { +func formatHeadersTrailers(hs *metricsPb.Headers) []metadata { var fm []metadata for _, h := range hs.GetHeaders() { switch h.GetValue().(type) { - case *pb.Headers_Header_ValueStr: + case *metricsPb.Headers_Header_ValueStr: fht := &metadataStr{Name: h.GetName(), ValueStr: h.GetValueStr()} fm = append(fm, fht) continue - case *pb.Headers_Header_ValueBin: + case *metricsPb.Headers_Header_ValueBin: fht := &metadataBin{Name: h.GetName(), ValueBin: h.GetValueBin()} fm = append(fm, fht) continue @@ -530,7 +530,7 @@ func formatHeadersTrailers(hs *pb.Headers) []metadata { } // src returns the source peer of a `TapEvent`. -func src(event *pb.TapEvent) peer { +func src(event *tapPb.TapEvent) peer { return peer{ address: event.GetSource(), labels: event.GetSourceMeta().GetLabels(), @@ -539,7 +539,7 @@ func src(event *pb.TapEvent) peer { } // dst returns the destination peer of a `TapEvent`. -func dst(event *pb.TapEvent) peer { +func dst(event *tapPb.TapEvent) peer { return peer{ address: event.GetDestination(), labels: event.GetDestinationMeta().GetLabels(), @@ -596,7 +596,7 @@ func (p *peer) tlsStatus() string { return p.labels["tls"] } -func routeLabels(event *pb.TapEvent) string { +func routeLabels(event *tapPb.TapEvent) string { out := "" for key, val := range event.GetRouteMeta().GetLabels() { out = fmt.Sprintf("%s rt_%s=%s", out, key, val) diff --git a/viz/cmd/tap_test.go b/viz/cmd/tap_test.go index a9522b718333a..00c378dd5416f 100644 --- a/viz/cmd/tap_test.go +++ b/viz/cmd/tap_test.go @@ -9,12 +9,13 @@ import ( "testing" "github.com/golang/protobuf/ptypes/duration" - "github.com/linkerd/linkerd2/controller/api/util" netPb "github.com/linkerd/linkerd2/controller/gen/common/net" "github.com/linkerd/linkerd2/pkg/addr" "github.com/linkerd/linkerd2/pkg/k8s" "github.com/linkerd/linkerd2/pkg/protohttp" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" + "github.com/linkerd/linkerd2/viz/tap/pkg" "google.golang.org/grpc/codes" ) @@ -22,7 +23,7 @@ const targetName = "pod-666" func busyTest(t *testing.T, output string) { resourceType := k8s.Pod - params := util.TapRequestParams{ + params := pkg.TapRequestParams{ Resource: resourceType + "/" + targetName, Scheme: "https", Method: "GET", @@ -30,41 +31,41 @@ func busyTest(t *testing.T, output string) { Path: "/some/path", } - req, err := util.BuildTapByResourceRequest(params) + req, err := pkg.BuildTapByResourceRequest(params) if err != nil { t.Fatalf("Unexpected error: %v", err) } - event1 := util.CreateTapEvent( - &pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_RequestInit_{ - RequestInit: &pb.TapEvent_Http_RequestInit{ - Id: &pb.TapEvent_Http_StreamId{ + event1 := pkg.CreateTapEvent( + &tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_RequestInit_{ + RequestInit: &tapPb.TapEvent_Http_RequestInit{ + Id: &tapPb.TapEvent_Http_StreamId{ Base: 1, }, - Method: &pb.HttpMethod{ - Type: &pb.HttpMethod_Registered_{ - Registered: pb.HttpMethod_GET, + Method: &metricsPb.HttpMethod{ + Type: &metricsPb.HttpMethod_Registered_{ + Registered: metricsPb.HttpMethod_GET, }, }, - Scheme: &pb.Scheme{ - Type: &pb.Scheme_Registered_{ - Registered: pb.Scheme_HTTPS, + Scheme: &metricsPb.Scheme{ + Type: &metricsPb.Scheme_Registered_{ + Registered: metricsPb.Scheme_HTTPS, }, }, Authority: params.Authority, Path: params.Path, - Headers: &pb.Headers{ - Headers: []*pb.Headers_Header{ + Headers: &metricsPb.Headers{ + Headers: []*metricsPb.Headers_Header{ { Name: "header-name-1", - Value: &pb.Headers_Header_ValueStr{ + Value: &metricsPb.Headers_Header_ValueStr{ ValueStr: "header-value-str-1", }, }, { Name: "header-name-2", - Value: &pb.Headers_Header_ValueBin{ + Value: &metricsPb.Headers_Header_ValueBin{ ValueBin: []byte("header-value-bin-2"), }, }, @@ -77,17 +78,17 @@ func busyTest(t *testing.T, output string) { "pod": "my-pod", "tls": "true", }, - pb.TapEvent_OUTBOUND, + tapPb.TapEvent_OUTBOUND, ) - event2 := util.CreateTapEvent( - &pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_ResponseEnd_{ - ResponseEnd: &pb.TapEvent_Http_ResponseEnd{ - Id: &pb.TapEvent_Http_StreamId{ + event2 := pkg.CreateTapEvent( + &tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_ResponseEnd_{ + ResponseEnd: &tapPb.TapEvent_Http_ResponseEnd{ + Id: &tapPb.TapEvent_Http_StreamId{ Base: 1, }, - Eos: &pb.Eos{ - End: &pb.Eos_GrpcStatusCode{GrpcStatusCode: 666}, + Eos: &metricsPb.Eos{ + End: &metricsPb.Eos_GrpcStatusCode{GrpcStatusCode: 666}, }, SinceRequestInit: &duration.Duration{ Seconds: 10, @@ -96,11 +97,11 @@ func busyTest(t *testing.T, output string) { Seconds: 100, }, ResponseBytes: 1337, - Trailers: &pb.Headers{ - Headers: []*pb.Headers_Header{ + Trailers: &metricsPb.Headers{ + Headers: []*metricsPb.Headers_Header{ { Name: "trailer-name", - Value: &pb.Headers_Header_ValueBin{ + Value: &metricsPb.Headers_Header_ValueBin{ ValueBin: []byte("header-value-bin"), }, }, @@ -110,7 +111,7 @@ func busyTest(t *testing.T, output string) { }, }, map[string]string{}, - pb.TapEvent_OUTBOUND, + tapPb.TapEvent_OUTBOUND, ) kubeAPI, err := k8s.NewFakeAPI() if err != nil { @@ -118,7 +119,7 @@ func busyTest(t *testing.T, output string) { } ts := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { - for _, event := range []*pb.TapEvent{event1, event2} { + for _, event := range []*tapPb.TapEvent{event1, event2} { err = protohttp.WriteProtoToHTTPResponse(w, event) if err != nil { t.Fatalf("Unexpected error: %v", err) @@ -176,7 +177,7 @@ func TestRequestTapByResourceFromAPI(t *testing.T) { t.Run("Should render empty response if no events returned", func(t *testing.T) { resourceType := k8s.Pod - params := util.TapRequestParams{ + params := pkg.TapRequestParams{ Resource: resourceType + "/" + targetName, Scheme: "https", Method: "GET", @@ -184,7 +185,7 @@ func TestRequestTapByResourceFromAPI(t *testing.T) { Path: "/some/path", } - req, err := util.BuildTapByResourceRequest(params) + req, err := pkg.BuildTapByResourceRequest(params) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -220,7 +221,7 @@ func TestRequestTapByResourceFromAPI(t *testing.T) { t.Run("Should return error if stream returned error", func(t *testing.T) { t.SkipNow() resourceType := k8s.Pod - params := util.TapRequestParams{ + params := pkg.TapRequestParams{ Resource: resourceType + "/" + targetName, Scheme: "https", Method: "GET", @@ -228,7 +229,7 @@ func TestRequestTapByResourceFromAPI(t *testing.T) { Path: "/some/path", } - req, err := util.BuildTapByResourceRequest(params) + req, err := pkg.BuildTapByResourceRequest(params) if err != nil { t.Fatalf("Unexpected error: %v", err) } @@ -248,23 +249,23 @@ func TestRequestTapByResourceFromAPI(t *testing.T) { } func TestEventToString(t *testing.T) { - toTapEvent := func(httpEvent *pb.TapEvent_Http) *pb.TapEvent { - streamID := &pb.TapEvent_Http_StreamId{ + toTapEvent := func(httpEvent *tapPb.TapEvent_Http) *tapPb.TapEvent { + streamID := &tapPb.TapEvent_Http_StreamId{ Base: 7, Stream: 8, } switch httpEvent.Event.(type) { - case *pb.TapEvent_Http_RequestInit_: + case *tapPb.TapEvent_Http_RequestInit_: httpEvent.GetRequestInit().Id = streamID - case *pb.TapEvent_Http_ResponseInit_: + case *tapPb.TapEvent_Http_ResponseInit_: httpEvent.GetResponseInit().Id = streamID - case *pb.TapEvent_Http_ResponseEnd_: + case *tapPb.TapEvent_Http_ResponseEnd_: httpEvent.GetResponseEnd().Id = streamID } - return &pb.TapEvent{ - ProxyDirection: pb.TapEvent_OUTBOUND, + return &tapPb.TapEvent{ + ProxyDirection: tapPb.TapEvent_OUTBOUND, Source: &netPb.TcpAddress{ Ip: addr.PublicIPV4(1, 2, 3, 4), Port: 5555, @@ -273,22 +274,22 @@ func TestEventToString(t *testing.T) { Ip: addr.PublicIPV4(2, 3, 4, 5), Port: 6666, }, - Event: &pb.TapEvent_Http_{Http: httpEvent}, + Event: &tapPb.TapEvent_Http_{Http: httpEvent}, } } t.Run("Converts HTTP request init event to string", func(t *testing.T) { - event := toTapEvent(&pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_RequestInit_{ - RequestInit: &pb.TapEvent_Http_RequestInit{ - Method: &pb.HttpMethod{ - Type: &pb.HttpMethod_Registered_{ - Registered: pb.HttpMethod_POST, + event := toTapEvent(&tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_RequestInit_{ + RequestInit: &tapPb.TapEvent_Http_RequestInit{ + Method: &metricsPb.HttpMethod{ + Type: &metricsPb.HttpMethod_Registered_{ + Registered: metricsPb.HttpMethod_POST, }, }, - Scheme: &pb.Scheme{ - Type: &pb.Scheme_Registered_{ - Registered: pb.Scheme_HTTPS, + Scheme: &metricsPb.Scheme{ + Type: &metricsPb.Scheme_Registered_{ + Registered: metricsPb.Scheme_HTTPS, }, }, Authority: "hello.default:7777", @@ -305,9 +306,9 @@ func TestEventToString(t *testing.T) { }) t.Run("Converts HTTP response init event to string", func(t *testing.T) { - event := toTapEvent(&pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_ResponseInit_{ - ResponseInit: &pb.TapEvent_Http_ResponseInit{ + event := toTapEvent(&tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_ResponseInit_{ + ResponseInit: &tapPb.TapEvent_Http_ResponseInit{ SinceRequestInit: &duration.Duration{Nanos: 999000}, HttpStatus: http.StatusOK, }, @@ -322,14 +323,14 @@ func TestEventToString(t *testing.T) { }) t.Run("Converts gRPC response end event to string", func(t *testing.T) { - event := toTapEvent(&pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_ResponseEnd_{ - ResponseEnd: &pb.TapEvent_Http_ResponseEnd{ + event := toTapEvent(&tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_ResponseEnd_{ + ResponseEnd: &tapPb.TapEvent_Http_ResponseEnd{ SinceRequestInit: &duration.Duration{Nanos: 999000}, SinceResponseInit: &duration.Duration{Nanos: 888000}, ResponseBytes: 111, - Eos: &pb.Eos{ - End: &pb.Eos_GrpcStatusCode{GrpcStatusCode: uint32(codes.OK)}, + Eos: &metricsPb.Eos{ + End: &metricsPb.Eos_GrpcStatusCode{GrpcStatusCode: uint32(codes.OK)}, }, }, }, @@ -343,14 +344,14 @@ func TestEventToString(t *testing.T) { }) t.Run("Converts HTTP response end event with reset error code to string", func(t *testing.T) { - event := toTapEvent(&pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_ResponseEnd_{ - ResponseEnd: &pb.TapEvent_Http_ResponseEnd{ + event := toTapEvent(&tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_ResponseEnd_{ + ResponseEnd: &tapPb.TapEvent_Http_ResponseEnd{ SinceRequestInit: &duration.Duration{Nanos: 999000}, SinceResponseInit: &duration.Duration{Nanos: 888000}, ResponseBytes: 111, - Eos: &pb.Eos{ - End: &pb.Eos_ResetErrorCode{ResetErrorCode: 123}, + Eos: &metricsPb.Eos{ + End: &metricsPb.Eos_ResetErrorCode{ResetErrorCode: 123}, }, }, }, @@ -364,13 +365,13 @@ func TestEventToString(t *testing.T) { }) t.Run("Converts HTTP response end event with empty EOS context string", func(t *testing.T) { - event := toTapEvent(&pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_ResponseEnd_{ - ResponseEnd: &pb.TapEvent_Http_ResponseEnd{ + event := toTapEvent(&tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_ResponseEnd_{ + ResponseEnd: &tapPb.TapEvent_Http_ResponseEnd{ SinceRequestInit: &duration.Duration{Nanos: 999000}, SinceResponseInit: &duration.Duration{Nanos: 888000}, ResponseBytes: 111, - Eos: &pb.Eos{}, + Eos: &metricsPb.Eos{}, }, }, }) @@ -383,9 +384,9 @@ func TestEventToString(t *testing.T) { }) t.Run("Converts HTTP response end event without EOS context string", func(t *testing.T) { - event := toTapEvent(&pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_ResponseEnd_{ - ResponseEnd: &pb.TapEvent_Http_ResponseEnd{ + event := toTapEvent(&tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_ResponseEnd_{ + ResponseEnd: &tapPb.TapEvent_Http_ResponseEnd{ SinceRequestInit: &duration.Duration{Nanos: 999000}, SinceResponseInit: &duration.Duration{Nanos: 888000}, ResponseBytes: 111, @@ -401,7 +402,7 @@ func TestEventToString(t *testing.T) { }) t.Run("Handles unknown event types", func(t *testing.T) { - event := toTapEvent(&pb.TapEvent_Http{}) + event := toTapEvent(&tapPb.TapEvent_Http{}) expectedOutput := "unknown proxy=out src=1.2.3.4:5555 dst=2.3.4.5:6666 tls=" output := renderTapEvent(event, "") diff --git a/viz/cmd/testdata/install_default.golden b/viz/cmd/testdata/install_default.golden index a707feeccd4bc..e98f86f711645 100644 --- a/viz/cmd/testdata/install_default.golden +++ b/viz/cmd/testdata/install_default.golden @@ -930,11 +930,11 @@ spec: beta.kubernetes.io/os: linux containers: - args: - - tap + - controller - -controller-namespace=linkerd - -log-level=info - -identity-trust-domain=cluster.local - image: ghcr.io/linkerd/controller:dev-undefined + image: ghcr.io/linkerd/tap:dev-undefined imagePullPolicy: livenessProbe: httpGet: @@ -1091,9 +1091,9 @@ spec: beta.kubernetes.io/os: linux containers: - args: - - tap-injector + - injector - -tap-service-name=linkerd-tap.linkerd-viz.serviceaccount.identity.$(_l5d_ns).$(_l5d_trustdomain) - image: ghcr.io/linkerd/controller:dev-undefined + image: ghcr.io/linkerd/tap:dev-undefined imagePullPolicy: livenessProbe: httpGet: diff --git a/viz/cmd/testdata/install_prometheus_disabled.golden b/viz/cmd/testdata/install_prometheus_disabled.golden index 3487b8c5b4dde..97a1a089cd129 100644 --- a/viz/cmd/testdata/install_prometheus_disabled.golden +++ b/viz/cmd/testdata/install_prometheus_disabled.golden @@ -640,11 +640,11 @@ spec: beta.kubernetes.io/os: linux containers: - args: - - tap + - controller - -controller-namespace=linkerd - -log-level=info - -identity-trust-domain=cluster.local - image: ghcr.io/linkerd/controller:dev-undefined + image: ghcr.io/linkerd/tap:dev-undefined imagePullPolicy: livenessProbe: httpGet: @@ -801,9 +801,9 @@ spec: beta.kubernetes.io/os: linux containers: - args: - - tap-injector + - injector - -tap-service-name=linkerd-tap.linkerd-viz.serviceaccount.identity.$(_l5d_ns).$(_l5d_trustdomain) - image: ghcr.io/linkerd/controller:dev-undefined + image: ghcr.io/linkerd/tap:dev-undefined imagePullPolicy: livenessProbe: httpGet: diff --git a/viz/cmd/testdata/install_proxy_resources.golden b/viz/cmd/testdata/install_proxy_resources.golden index 27837a82aa9da..de4f2de9b787c 100644 --- a/viz/cmd/testdata/install_proxy_resources.golden +++ b/viz/cmd/testdata/install_proxy_resources.golden @@ -942,11 +942,11 @@ spec: beta.kubernetes.io/os: linux containers: - args: - - tap + - controller - -controller-namespace=linkerd - -log-level=info - -identity-trust-domain=cluster.local - image: ghcr.io/linkerd/controller:dev-undefined + image: ghcr.io/linkerd/tap:dev-undefined imagePullPolicy: livenessProbe: httpGet: @@ -1103,9 +1103,9 @@ spec: beta.kubernetes.io/os: linux containers: - args: - - tap-injector + - injector - -tap-service-name=linkerd-tap.linkerd-viz.serviceaccount.identity.$(_l5d_ns).$(_l5d_trustdomain) - image: ghcr.io/linkerd/controller:dev-undefined + image: ghcr.io/linkerd/tap:dev-undefined imagePullPolicy: livenessProbe: httpGet: diff --git a/viz/cmd/top.go b/viz/cmd/top.go index c122ad2c7b7ea..307c2cecc8bbd 100644 --- a/viz/cmd/top.go +++ b/viz/cmd/top.go @@ -11,16 +11,16 @@ import ( "time" "github.com/golang/protobuf/ptypes" - "github.com/linkerd/linkerd2/controller/api/util" "github.com/linkerd/linkerd2/pkg/addr" pkgcmd "github.com/linkerd/linkerd2/pkg/cmd" "github.com/linkerd/linkerd2/pkg/healthcheck" "github.com/linkerd/linkerd2/pkg/k8s" "github.com/linkerd/linkerd2/pkg/protohttp" - "github.com/linkerd/linkerd2/pkg/tap" - api "github.com/linkerd/linkerd2/viz/metrics-api" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" - vizAPI "github.com/linkerd/linkerd2/viz/pkg/api" + metricsAPI "github.com/linkerd/linkerd2/viz/metrics-api" + metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + "github.com/linkerd/linkerd2/viz/pkg/api" + tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" + "github.com/linkerd/linkerd2/viz/tap/pkg" runewidth "github.com/mattn/go-runewidth" termbox "github.com/nsf/termbox-go" log "github.com/sirupsen/logrus" @@ -43,10 +43,10 @@ type topOptions struct { } type topRequest struct { - event *pb.TapEvent - reqInit *pb.TapEvent_Http_RequestInit - rspInit *pb.TapEvent_Http_ResponseInit - rspEnd *pb.TapEvent_Http_ResponseEnd + event *tapPb.TapEvent + reqInit *tapPb.TapEvent_Http_RequestInit + rspInit *tapPb.TapEvent_Http_ResponseInit + rspEnd *tapPb.TapEvent_Http_ResponseEnd } type topRequestID struct { @@ -320,13 +320,13 @@ func NewCmdTop() *cobra.Command { # display traffic for the web-dlbvj pod in the default namespace linkerd viz top pod/web-dlbvj`, Args: cobra.RangeArgs(1, 2), - ValidArgs: util.ValidTargets, + ValidArgs: api.ValidTargets, RunE: func(cmd *cobra.Command, args []string) error { if options.namespace == "" { options.namespace = pkgcmd.GetDefaultNamespace(kubeconfigPath, kubeContext) } - vizAPI.CheckClientOrExit(healthcheck.Options{ + api.CheckClientOrExit(healthcheck.Options{ ControlPlaneNamespace: controlPlaneNamespace, KubeConfig: kubeconfigPath, Impersonate: impersonate, @@ -335,7 +335,7 @@ func NewCmdTop() *cobra.Command { APIAddr: apiAddr, }) - requestParams := util.TapRequestParams{ + requestParams := pkg.TapRequestParams{ Resource: strings.Join(args, "/"), Namespace: options.namespace, ToResource: options.toResource, @@ -362,7 +362,7 @@ func NewCmdTop() *cobra.Command { table.columns[routeColumn].display = true } - req, err := util.BuildTapByResourceRequest(requestParams) + req, err := pkg.BuildTapByResourceRequest(requestParams) if err != nil { return err } @@ -399,8 +399,8 @@ func NewCmdTop() *cobra.Command { return cmd } -func getTrafficByResourceFromAPI(ctx context.Context, k8sAPI *k8s.KubernetesAPI, req *pb.TapByResourceRequest, table *topTable) error { - reader, body, err := tap.Reader(ctx, k8sAPI, req) +func getTrafficByResourceFromAPI(ctx context.Context, k8sAPI *k8s.KubernetesAPI, req *tapPb.TapByResourceRequest, table *topTable) error { + reader, body, err := pkg.Reader(ctx, k8sAPI, req) if err != nil { return err } @@ -419,7 +419,7 @@ func getTrafficByResourceFromAPI(ctx context.Context, k8sAPI *k8s.KubernetesAPI, // processEvents() -> // requestCh -> // renderTable() - eventCh := make(chan *pb.TapEvent) + eventCh := make(chan *tapPb.TapEvent) requestCh := make(chan topRequest, 100) // for closing: @@ -444,14 +444,14 @@ func getTrafficByResourceFromAPI(ctx context.Context, k8sAPI *k8s.KubernetesAPI, return nil } -func recvEvents(tapByteStream *bufio.Reader, eventCh chan<- *pb.TapEvent, closing chan<- struct{}) { +func recvEvents(tapByteStream *bufio.Reader, eventCh chan<- *tapPb.TapEvent, closing chan<- struct{}) { for { - event := &pb.TapEvent{} + event := &tapPb.TapEvent{} err := protohttp.FromByteStreamToProtocolBuffers(tapByteStream, event) if err != nil { if err == io.EOF { fmt.Println("Tap stream terminated") - } else if !strings.HasSuffix(err.Error(), tap.ErrClosedResponseBody) { + } else if !strings.HasSuffix(err.Error(), pkg.ErrClosedResponseBody) { fmt.Println(err.Error()) } @@ -463,7 +463,7 @@ func recvEvents(tapByteStream *bufio.Reader, eventCh chan<- *pb.TapEvent, closin } } -func processEvents(eventCh <-chan *pb.TapEvent, requestCh chan<- topRequest, done <-chan struct{}) { +func processEvents(eventCh <-chan *tapPb.TapEvent, requestCh chan<- topRequest, done <-chan struct{}) { outstandingRequests := make(map[topRequestID]topRequest) for { @@ -476,14 +476,14 @@ func processEvents(eventCh <-chan *pb.TapEvent, requestCh chan<- topRequest, don dst: addr.PublicAddressToString(event.GetDestination()), } switch ev := event.GetHttp().GetEvent().(type) { - case *pb.TapEvent_Http_RequestInit_: + case *tapPb.TapEvent_Http_RequestInit_: id.stream = ev.RequestInit.GetId().Stream outstandingRequests[id] = topRequest{ event: event, reqInit: ev.RequestInit, } - case *pb.TapEvent_Http_ResponseInit_: + case *tapPb.TapEvent_Http_ResponseInit_: id.stream = ev.ResponseInit.GetId().Stream if req, ok := outstandingRequests[id]; ok { req.rspInit = ev.ResponseInit @@ -492,7 +492,7 @@ func processEvents(eventCh <-chan *pb.TapEvent, requestCh chan<- topRequest, don log.Warnf("Got ResponseInit for unknown stream: %s", id) } - case *pb.TapEvent_Http_ResponseEnd_: + case *tapPb.TapEvent_Http_ResponseEnd_: id.stream = ev.ResponseEnd.GetId().Stream if req, ok := outstandingRequests[id]; ok { req.rspEnd = ev.ResponseEnd @@ -555,7 +555,7 @@ func newRow(req topRequest) (tableRow, error) { path := req.reqInit.GetPath() route := req.event.GetRouteMeta().GetLabels()["route"] if route == "" { - route = api.DefaultRouteName + route = metricsAPI.DefaultRouteName } method := req.reqInit.GetMethod().GetRegistered().String() source := stripPort(addr.PublicAddressToString(req.event.GetSource())) @@ -576,7 +576,7 @@ func newRow(req topRequest) (tableRow, error) { success := req.rspInit.GetHttpStatus() < 500 if success { switch eos := req.rspEnd.GetEos().GetEnd().(type) { - case *pb.Eos_GrpcStatusCode: + case *metricsPb.Eos_GrpcStatusCode: switch codes.Code(eos.GrpcStatusCode) { case codes.Unknown, codes.DeadlineExceeded, @@ -588,7 +588,7 @@ func newRow(req topRequest) (tableRow, error) { success = true } - case *pb.Eos_ResetErrorCode: + case *metricsPb.Eos_ResetErrorCode: success = false } } diff --git a/viz/metrics-api/Dockerfile b/viz/metrics-api/Dockerfile index 34b6d86c2b9e0..b0ad5d524e676 100644 --- a/viz/metrics-api/Dockerfile +++ b/viz/metrics-api/Dockerfile @@ -15,6 +15,7 @@ WORKDIR /linkerd-build COPY pkg pkg COPY controller controller COPY viz/metrics-api viz/metrics-api +COPY viz/tap/gen/tap viz/tap/gen/tap COPY viz/pkg viz/pkg ARG TARGETARCH diff --git a/viz/metrics-api/gen/viz/viz.pb.go b/viz/metrics-api/gen/viz/viz.pb.go index 0fbbe69a13c22..2f5007addafeb 100644 --- a/viz/metrics-api/gen/viz/viz.pb.go +++ b/viz/metrics-api/gen/viz/viz.pb.go @@ -11,7 +11,6 @@ import ( proto "github.com/golang/protobuf/proto" duration "github.com/golang/protobuf/ptypes/duration" healthcheck "github.com/linkerd/linkerd2/controller/gen/common/healthcheck" - net "github.com/linkerd/linkerd2/controller/gen/common/net" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -96,7 +95,7 @@ func (x HttpMethod_Registered) Number() protoreflect.EnumNumber { // Deprecated: Use HttpMethod_Registered.Descriptor instead. func (HttpMethod_Registered) EnumDescriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{9, 0} + return file_viz_proto_rawDescGZIP(), []int{7, 0} } type Scheme_Registered int32 @@ -142,56 +141,7 @@ func (x Scheme_Registered) Number() protoreflect.EnumNumber { // Deprecated: Use Scheme_Registered.Descriptor instead. func (Scheme_Registered) EnumDescriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{10, 0} -} - -type TapEvent_ProxyDirection int32 - -const ( - TapEvent_UNKNOWN TapEvent_ProxyDirection = 0 - TapEvent_INBOUND TapEvent_ProxyDirection = 1 - TapEvent_OUTBOUND TapEvent_ProxyDirection = 2 -) - -// Enum value maps for TapEvent_ProxyDirection. -var ( - TapEvent_ProxyDirection_name = map[int32]string{ - 0: "UNKNOWN", - 1: "INBOUND", - 2: "OUTBOUND", - } - TapEvent_ProxyDirection_value = map[string]int32{ - "UNKNOWN": 0, - "INBOUND": 1, - "OUTBOUND": 2, - } -) - -func (x TapEvent_ProxyDirection) Enum() *TapEvent_ProxyDirection { - p := new(TapEvent_ProxyDirection) - *p = x - return p -} - -func (x TapEvent_ProxyDirection) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (TapEvent_ProxyDirection) Descriptor() protoreflect.EnumDescriptor { - return file_viz_proto_enumTypes[2].Descriptor() -} - -func (TapEvent_ProxyDirection) Type() protoreflect.EnumType { - return &file_viz_proto_enumTypes[2] -} - -func (x TapEvent_ProxyDirection) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use TapEvent_ProxyDirection.Descriptor instead. -func (TapEvent_ProxyDirection) EnumDescriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{13, 0} + return file_viz_proto_rawDescGZIP(), []int{8, 0} } type Empty struct { @@ -709,239 +659,6 @@ func (*Pod_DaemonSet) isPod_Owner() {} func (*Pod_Job) isPod_Owner() {} -// Deprecated: Do not use. -type TapRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Target: - // *TapRequest_Pod - // *TapRequest_Deployment - Target isTapRequest_Target `protobuf_oneof:"target"` - // validation of these fields happens on the server - MaxRps float32 `protobuf:"fixed32,3,opt,name=maxRps,proto3" json:"maxRps,omitempty"` - ToPort uint32 `protobuf:"varint,4,opt,name=toPort,proto3" json:"toPort,omitempty"` - ToIP string `protobuf:"bytes,5,opt,name=toIP,proto3" json:"toIP,omitempty"` - FromPort uint32 `protobuf:"varint,6,opt,name=fromPort,proto3" json:"fromPort,omitempty"` - FromIP string `protobuf:"bytes,7,opt,name=fromIP,proto3" json:"fromIP,omitempty"` - Scheme string `protobuf:"bytes,8,opt,name=scheme,proto3" json:"scheme,omitempty"` - Method string `protobuf:"bytes,9,opt,name=method,proto3" json:"method,omitempty"` - Authority string `protobuf:"bytes,10,opt,name=authority,proto3" json:"authority,omitempty"` - Path string `protobuf:"bytes,11,opt,name=path,proto3" json:"path,omitempty"` -} - -func (x *TapRequest) Reset() { - *x = TapRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapRequest) ProtoMessage() {} - -func (x *TapRequest) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapRequest.ProtoReflect.Descriptor instead. -func (*TapRequest) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{7} -} - -func (m *TapRequest) GetTarget() isTapRequest_Target { - if m != nil { - return m.Target - } - return nil -} - -func (x *TapRequest) GetPod() string { - if x, ok := x.GetTarget().(*TapRequest_Pod); ok { - return x.Pod - } - return "" -} - -func (x *TapRequest) GetDeployment() string { - if x, ok := x.GetTarget().(*TapRequest_Deployment); ok { - return x.Deployment - } - return "" -} - -func (x *TapRequest) GetMaxRps() float32 { - if x != nil { - return x.MaxRps - } - return 0 -} - -func (x *TapRequest) GetToPort() uint32 { - if x != nil { - return x.ToPort - } - return 0 -} - -func (x *TapRequest) GetToIP() string { - if x != nil { - return x.ToIP - } - return "" -} - -func (x *TapRequest) GetFromPort() uint32 { - if x != nil { - return x.FromPort - } - return 0 -} - -func (x *TapRequest) GetFromIP() string { - if x != nil { - return x.FromIP - } - return "" -} - -func (x *TapRequest) GetScheme() string { - if x != nil { - return x.Scheme - } - return "" -} - -func (x *TapRequest) GetMethod() string { - if x != nil { - return x.Method - } - return "" -} - -func (x *TapRequest) GetAuthority() string { - if x != nil { - return x.Authority - } - return "" -} - -func (x *TapRequest) GetPath() string { - if x != nil { - return x.Path - } - return "" -} - -type isTapRequest_Target interface { - isTapRequest_Target() -} - -type TapRequest_Pod struct { - Pod string `protobuf:"bytes,1,opt,name=pod,proto3,oneof"` -} - -type TapRequest_Deployment struct { - Deployment string `protobuf:"bytes,2,opt,name=deployment,proto3,oneof"` -} - -func (*TapRequest_Pod) isTapRequest_Target() {} - -func (*TapRequest_Deployment) isTapRequest_Target() {} - -// A tap request over kubernetes resources. -// -// This is used only by the tap APIServer. -type TapByResourceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Describes the kubernetes pods that should be tapped. - Target *ResourceSelection `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` - // Selects over events to be reported. - Match *TapByResourceRequest_Match `protobuf:"bytes,2,opt,name=match,proto3" json:"match,omitempty"` - // Limits the number of events to be inspected. - MaxRps float32 `protobuf:"fixed32,3,opt,name=maxRps,proto3" json:"maxRps,omitempty"` - // Conditionally extracts components from requests and responses to include - // in tap events - Extract *TapByResourceRequest_Extract `protobuf:"bytes,4,opt,name=extract,proto3" json:"extract,omitempty"` -} - -func (x *TapByResourceRequest) Reset() { - *x = TapByResourceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapByResourceRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapByResourceRequest) ProtoMessage() {} - -func (x *TapByResourceRequest) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapByResourceRequest.ProtoReflect.Descriptor instead. -func (*TapByResourceRequest) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{8} -} - -func (x *TapByResourceRequest) GetTarget() *ResourceSelection { - if x != nil { - return x.Target - } - return nil -} - -func (x *TapByResourceRequest) GetMatch() *TapByResourceRequest_Match { - if x != nil { - return x.Match - } - return nil -} - -func (x *TapByResourceRequest) GetMaxRps() float32 { - if x != nil { - return x.MaxRps - } - return 0 -} - -func (x *TapByResourceRequest) GetExtract() *TapByResourceRequest_Extract { - if x != nil { - return x.Extract - } - return nil -} - type HttpMethod struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -956,7 +673,7 @@ type HttpMethod struct { func (x *HttpMethod) Reset() { *x = HttpMethod{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[9] + mi := &file_viz_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -969,7 +686,7 @@ func (x *HttpMethod) String() string { func (*HttpMethod) ProtoMessage() {} func (x *HttpMethod) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[9] + mi := &file_viz_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -982,7 +699,7 @@ func (x *HttpMethod) ProtoReflect() protoreflect.Message { // Deprecated: Use HttpMethod.ProtoReflect.Descriptor instead. func (*HttpMethod) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{9} + return file_viz_proto_rawDescGZIP(), []int{7} } func (m *HttpMethod) GetType() isHttpMethod_Type { @@ -1036,7 +753,7 @@ type Scheme struct { func (x *Scheme) Reset() { *x = Scheme{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[10] + mi := &file_viz_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1049,7 +766,7 @@ func (x *Scheme) String() string { func (*Scheme) ProtoMessage() {} func (x *Scheme) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[10] + mi := &file_viz_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1062,7 +779,7 @@ func (x *Scheme) ProtoReflect() protoreflect.Message { // Deprecated: Use Scheme.ProtoReflect.Descriptor instead. func (*Scheme) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{10} + return file_viz_proto_rawDescGZIP(), []int{8} } func (m *Scheme) GetType() isScheme_Type { @@ -1113,7 +830,7 @@ type Headers struct { func (x *Headers) Reset() { *x = Headers{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[11] + mi := &file_viz_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1126,7 +843,7 @@ func (x *Headers) String() string { func (*Headers) ProtoMessage() {} func (x *Headers) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[11] + mi := &file_viz_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1139,7 +856,7 @@ func (x *Headers) ProtoReflect() protoreflect.Message { // Deprecated: Use Headers.ProtoReflect.Descriptor instead. func (*Headers) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{11} + return file_viz_proto_rawDescGZIP(), []int{9} } func (x *Headers) GetHeaders() []*Headers_Header { @@ -1163,7 +880,7 @@ type Eos struct { func (x *Eos) Reset() { *x = Eos{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[12] + mi := &file_viz_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1176,7 +893,7 @@ func (x *Eos) String() string { func (*Eos) ProtoMessage() {} func (x *Eos) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[12] + mi := &file_viz_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1189,7 +906,7 @@ func (x *Eos) ProtoReflect() protoreflect.Message { // Deprecated: Use Eos.ProtoReflect.Descriptor instead. func (*Eos) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{12} + return file_viz_proto_rawDescGZIP(), []int{10} } func (m *Eos) GetEnd() isEos_End { @@ -1229,40 +946,31 @@ func (*Eos_GrpcStatusCode) isEos_End() {} func (*Eos_ResetErrorCode) isEos_End() {} -// This is used only by the tap APIServer. -type TapEvent struct { +type ApiError struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Source *net.TcpAddress `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` - SourceMeta *TapEvent_EndpointMeta `protobuf:"bytes,5,opt,name=source_meta,json=sourceMeta,proto3" json:"source_meta,omitempty"` - Destination *net.TcpAddress `protobuf:"bytes,2,opt,name=destination,proto3" json:"destination,omitempty"` - DestinationMeta *TapEvent_EndpointMeta `protobuf:"bytes,4,opt,name=destination_meta,json=destinationMeta,proto3" json:"destination_meta,omitempty"` - RouteMeta *TapEvent_RouteMeta `protobuf:"bytes,7,opt,name=route_meta,json=routeMeta,proto3" json:"route_meta,omitempty"` - ProxyDirection TapEvent_ProxyDirection `protobuf:"varint,6,opt,name=proxy_direction,json=proxyDirection,proto3,enum=linkerd2.viz.TapEvent_ProxyDirection" json:"proxy_direction,omitempty"` - // Types that are assignable to Event: - // *TapEvent_Http_ - Event isTapEvent_Event `protobuf_oneof:"event"` + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` } -func (x *TapEvent) Reset() { - *x = TapEvent{} +func (x *ApiError) Reset() { + *x = ApiError{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[13] + mi := &file_viz_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TapEvent) String() string { +func (x *ApiError) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TapEvent) ProtoMessage() {} +func (*ApiError) ProtoMessage() {} -func (x *TapEvent) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[13] +func (x *ApiError) ProtoReflect() protoreflect.Message { + mi := &file_viz_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1273,162 +981,56 @@ func (x *TapEvent) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TapEvent.ProtoReflect.Descriptor instead. -func (*TapEvent) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{13} +// Deprecated: Use ApiError.ProtoReflect.Descriptor instead. +func (*ApiError) Descriptor() ([]byte, []int) { + return file_viz_proto_rawDescGZIP(), []int{11} } -func (x *TapEvent) GetSource() *net.TcpAddress { +func (x *ApiError) GetError() string { if x != nil { - return x.Source + return x.Error } - return nil + return "" } -func (x *TapEvent) GetSourceMeta() *TapEvent_EndpointMeta { - if x != nil { - return x.SourceMeta - } - return nil +type PodErrors struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Errors []*PodErrors_PodError `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"` } -func (x *TapEvent) GetDestination() *net.TcpAddress { - if x != nil { - return x.Destination +func (x *PodErrors) Reset() { + *x = PodErrors{} + if protoimpl.UnsafeEnabled { + mi := &file_viz_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *TapEvent) GetDestinationMeta() *TapEvent_EndpointMeta { - if x != nil { - return x.DestinationMeta - } - return nil +func (x *PodErrors) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *TapEvent) GetRouteMeta() *TapEvent_RouteMeta { - if x != nil { - return x.RouteMeta +func (*PodErrors) ProtoMessage() {} + +func (x *PodErrors) ProtoReflect() protoreflect.Message { + mi := &file_viz_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil -} - -func (x *TapEvent) GetProxyDirection() TapEvent_ProxyDirection { - if x != nil { - return x.ProxyDirection - } - return TapEvent_UNKNOWN -} - -func (m *TapEvent) GetEvent() isTapEvent_Event { - if m != nil { - return m.Event - } - return nil -} - -func (x *TapEvent) GetHttp() *TapEvent_Http { - if x, ok := x.GetEvent().(*TapEvent_Http_); ok { - return x.Http - } - return nil -} - -type isTapEvent_Event interface { - isTapEvent_Event() -} - -type TapEvent_Http_ struct { - Http *TapEvent_Http `protobuf:"bytes,3,opt,name=http,proto3,oneof"` -} - -func (*TapEvent_Http_) isTapEvent_Event() {} - -type ApiError struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` -} - -func (x *ApiError) Reset() { - *x = ApiError{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ApiError) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ApiError) ProtoMessage() {} - -func (x *ApiError) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ApiError.ProtoReflect.Descriptor instead. -func (*ApiError) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{14} -} - -func (x *ApiError) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -type PodErrors struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Errors []*PodErrors_PodError `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"` -} - -func (x *PodErrors) Reset() { - *x = PodErrors{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PodErrors) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PodErrors) ProtoMessage() {} - -func (x *PodErrors) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) + return mi.MessageOf(x) } // Deprecated: Use PodErrors.ProtoReflect.Descriptor instead. func (*PodErrors) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{15} + return file_viz_proto_rawDescGZIP(), []int{12} } func (x *PodErrors) GetErrors() []*PodErrors_PodError { @@ -1461,7 +1063,7 @@ type Resource struct { func (x *Resource) Reset() { *x = Resource{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[16] + mi := &file_viz_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1474,7 +1076,7 @@ func (x *Resource) String() string { func (*Resource) ProtoMessage() {} func (x *Resource) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[16] + mi := &file_viz_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1487,7 +1089,7 @@ func (x *Resource) ProtoReflect() protoreflect.Message { // Deprecated: Use Resource.ProtoReflect.Descriptor instead. func (*Resource) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{16} + return file_viz_proto_rawDescGZIP(), []int{13} } func (x *Resource) GetNamespace() string { @@ -1529,7 +1131,7 @@ type ResourceSelection struct { func (x *ResourceSelection) Reset() { *x = ResourceSelection{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[17] + mi := &file_viz_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1542,7 +1144,7 @@ func (x *ResourceSelection) String() string { func (*ResourceSelection) ProtoMessage() {} func (x *ResourceSelection) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[17] + mi := &file_viz_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1555,7 +1157,7 @@ func (x *ResourceSelection) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceSelection.ProtoReflect.Descriptor instead. func (*ResourceSelection) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{17} + return file_viz_proto_rawDescGZIP(), []int{14} } func (x *ResourceSelection) GetResource() *Resource { @@ -1584,7 +1186,7 @@ type ResourceError struct { func (x *ResourceError) Reset() { *x = ResourceError{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[18] + mi := &file_viz_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1597,7 +1199,7 @@ func (x *ResourceError) String() string { func (*ResourceError) ProtoMessage() {} func (x *ResourceError) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[18] + mi := &file_viz_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1610,7 +1212,7 @@ func (x *ResourceError) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceError.ProtoReflect.Descriptor instead. func (*ResourceError) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{18} + return file_viz_proto_rawDescGZIP(), []int{15} } func (x *ResourceError) GetResource() *Resource { @@ -1646,7 +1248,7 @@ type StatSummaryRequest struct { func (x *StatSummaryRequest) Reset() { *x = StatSummaryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[19] + mi := &file_viz_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1659,7 +1261,7 @@ func (x *StatSummaryRequest) String() string { func (*StatSummaryRequest) ProtoMessage() {} func (x *StatSummaryRequest) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[19] + mi := &file_viz_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1672,7 +1274,7 @@ func (x *StatSummaryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatSummaryRequest.ProtoReflect.Descriptor instead. func (*StatSummaryRequest) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{19} + return file_viz_proto_rawDescGZIP(), []int{16} } func (x *StatSummaryRequest) GetSelector() *ResourceSelection { @@ -1767,7 +1369,7 @@ type StatSummaryResponse struct { func (x *StatSummaryResponse) Reset() { *x = StatSummaryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[20] + mi := &file_viz_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1780,7 +1382,7 @@ func (x *StatSummaryResponse) String() string { func (*StatSummaryResponse) ProtoMessage() {} func (x *StatSummaryResponse) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[20] + mi := &file_viz_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1793,7 +1395,7 @@ func (x *StatSummaryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatSummaryResponse.ProtoReflect.Descriptor instead. func (*StatSummaryResponse) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{20} + return file_viz_proto_rawDescGZIP(), []int{17} } func (m *StatSummaryResponse) GetResponse() isStatSummaryResponse_Response { @@ -1850,7 +1452,7 @@ type BasicStats struct { func (x *BasicStats) Reset() { *x = BasicStats{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[21] + mi := &file_viz_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1863,7 +1465,7 @@ func (x *BasicStats) String() string { func (*BasicStats) ProtoMessage() {} func (x *BasicStats) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[21] + mi := &file_viz_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1876,7 +1478,7 @@ func (x *BasicStats) ProtoReflect() protoreflect.Message { // Deprecated: Use BasicStats.ProtoReflect.Descriptor instead. func (*BasicStats) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{21} + return file_viz_proto_rawDescGZIP(), []int{18} } func (x *BasicStats) GetSuccessCount() uint64 { @@ -1944,7 +1546,7 @@ type TcpStats struct { func (x *TcpStats) Reset() { *x = TcpStats{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[22] + mi := &file_viz_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1957,7 +1559,7 @@ func (x *TcpStats) String() string { func (*TcpStats) ProtoMessage() {} func (x *TcpStats) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[22] + mi := &file_viz_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1970,7 +1572,7 @@ func (x *TcpStats) ProtoReflect() protoreflect.Message { // Deprecated: Use TcpStats.ProtoReflect.Descriptor instead. func (*TcpStats) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{22} + return file_viz_proto_rawDescGZIP(), []int{19} } func (x *TcpStats) GetOpenConnections() uint64 { @@ -2007,7 +1609,7 @@ type TrafficSplitStats struct { func (x *TrafficSplitStats) Reset() { *x = TrafficSplitStats{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[23] + mi := &file_viz_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2020,7 +1622,7 @@ func (x *TrafficSplitStats) String() string { func (*TrafficSplitStats) ProtoMessage() {} func (x *TrafficSplitStats) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[23] + mi := &file_viz_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2033,7 +1635,7 @@ func (x *TrafficSplitStats) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficSplitStats.ProtoReflect.Descriptor instead. func (*TrafficSplitStats) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{23} + return file_viz_proto_rawDescGZIP(), []int{20} } func (x *TrafficSplitStats) GetApex() string { @@ -2070,7 +1672,7 @@ type StatTable struct { func (x *StatTable) Reset() { *x = StatTable{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[24] + mi := &file_viz_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2083,7 +1685,7 @@ func (x *StatTable) String() string { func (*StatTable) ProtoMessage() {} func (x *StatTable) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[24] + mi := &file_viz_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2096,7 +1698,7 @@ func (x *StatTable) ProtoReflect() protoreflect.Message { // Deprecated: Use StatTable.ProtoReflect.Descriptor instead. func (*StatTable) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{24} + return file_viz_proto_rawDescGZIP(), []int{21} } func (m *StatTable) GetTable() isStatTable_Table { @@ -2134,7 +1736,7 @@ type EdgesRequest struct { func (x *EdgesRequest) Reset() { *x = EdgesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[25] + mi := &file_viz_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2147,7 +1749,7 @@ func (x *EdgesRequest) String() string { func (*EdgesRequest) ProtoMessage() {} func (x *EdgesRequest) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[25] + mi := &file_viz_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2160,7 +1762,7 @@ func (x *EdgesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EdgesRequest.ProtoReflect.Descriptor instead. func (*EdgesRequest) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{25} + return file_viz_proto_rawDescGZIP(), []int{22} } func (x *EdgesRequest) GetSelector() *ResourceSelection { @@ -2184,7 +1786,7 @@ type EdgesResponse struct { func (x *EdgesResponse) Reset() { *x = EdgesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[26] + mi := &file_viz_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2197,7 +1799,7 @@ func (x *EdgesResponse) String() string { func (*EdgesResponse) ProtoMessage() {} func (x *EdgesResponse) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[26] + mi := &file_viz_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2210,7 +1812,7 @@ func (x *EdgesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EdgesResponse.ProtoReflect.Descriptor instead. func (*EdgesResponse) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{26} + return file_viz_proto_rawDescGZIP(), []int{23} } func (m *EdgesResponse) GetResponse() isEdgesResponse_Response { @@ -2265,7 +1867,7 @@ type Edge struct { func (x *Edge) Reset() { *x = Edge{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[27] + mi := &file_viz_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2278,7 +1880,7 @@ func (x *Edge) String() string { func (*Edge) ProtoMessage() {} func (x *Edge) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[27] + mi := &file_viz_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2291,7 +1893,7 @@ func (x *Edge) ProtoReflect() protoreflect.Message { // Deprecated: Use Edge.ProtoReflect.Descriptor instead. func (*Edge) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{27} + return file_viz_proto_rawDescGZIP(), []int{24} } func (x *Edge) GetSrc() *Resource { @@ -2345,7 +1947,7 @@ type TopRoutesRequest struct { func (x *TopRoutesRequest) Reset() { *x = TopRoutesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[28] + mi := &file_viz_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2358,7 +1960,7 @@ func (x *TopRoutesRequest) String() string { func (*TopRoutesRequest) ProtoMessage() {} func (x *TopRoutesRequest) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[28] + mi := &file_viz_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2371,7 +1973,7 @@ func (x *TopRoutesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TopRoutesRequest.ProtoReflect.Descriptor instead. func (*TopRoutesRequest) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{28} + return file_viz_proto_rawDescGZIP(), []int{25} } func (x *TopRoutesRequest) GetSelector() *ResourceSelection { @@ -2439,7 +2041,7 @@ type TopRoutesResponse struct { func (x *TopRoutesResponse) Reset() { *x = TopRoutesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[29] + mi := &file_viz_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2452,7 +2054,7 @@ func (x *TopRoutesResponse) String() string { func (*TopRoutesResponse) ProtoMessage() {} func (x *TopRoutesResponse) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[29] + mi := &file_viz_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2465,7 +2067,7 @@ func (x *TopRoutesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TopRoutesResponse.ProtoReflect.Descriptor instead. func (*TopRoutesResponse) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{29} + return file_viz_proto_rawDescGZIP(), []int{26} } func (m *TopRoutesResponse) GetResponse() isTopRoutesResponse_Response { @@ -2517,7 +2119,7 @@ type RouteTable struct { func (x *RouteTable) Reset() { *x = RouteTable{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[30] + mi := &file_viz_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2530,7 +2132,7 @@ func (x *RouteTable) String() string { func (*RouteTable) ProtoMessage() {} func (x *RouteTable) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[30] + mi := &file_viz_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2543,7 +2145,7 @@ func (x *RouteTable) ProtoReflect() protoreflect.Message { // Deprecated: Use RouteTable.ProtoReflect.Descriptor instead. func (*RouteTable) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{30} + return file_viz_proto_rawDescGZIP(), []int{27} } func (x *RouteTable) GetRows() []*RouteTable_Row { @@ -2571,7 +2173,7 @@ type GatewaysTable struct { func (x *GatewaysTable) Reset() { *x = GatewaysTable{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[31] + mi := &file_viz_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2584,7 +2186,7 @@ func (x *GatewaysTable) String() string { func (*GatewaysTable) ProtoMessage() {} func (x *GatewaysTable) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[31] + mi := &file_viz_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2597,7 +2199,7 @@ func (x *GatewaysTable) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewaysTable.ProtoReflect.Descriptor instead. func (*GatewaysTable) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{31} + return file_viz_proto_rawDescGZIP(), []int{28} } func (x *GatewaysTable) GetRows() []*GatewaysTable_Row { @@ -2620,7 +2222,7 @@ type GatewaysRequest struct { func (x *GatewaysRequest) Reset() { *x = GatewaysRequest{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[32] + mi := &file_viz_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2633,7 +2235,7 @@ func (x *GatewaysRequest) String() string { func (*GatewaysRequest) ProtoMessage() {} func (x *GatewaysRequest) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[32] + mi := &file_viz_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2646,7 +2248,7 @@ func (x *GatewaysRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewaysRequest.ProtoReflect.Descriptor instead. func (*GatewaysRequest) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{32} + return file_viz_proto_rawDescGZIP(), []int{29} } func (x *GatewaysRequest) GetRemoteClusterName() string { @@ -2684,7 +2286,7 @@ type GatewaysResponse struct { func (x *GatewaysResponse) Reset() { *x = GatewaysResponse{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[33] + mi := &file_viz_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2697,7 +2299,7 @@ func (x *GatewaysResponse) String() string { func (*GatewaysResponse) ProtoMessage() {} func (x *GatewaysResponse) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[33] + mi := &file_viz_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2710,7 +2312,7 @@ func (x *GatewaysResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewaysResponse.ProtoReflect.Descriptor instead. func (*GatewaysResponse) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{33} + return file_viz_proto_rawDescGZIP(), []int{30} } func (m *GatewaysResponse) GetResponse() isGatewaysResponse_Response { @@ -2750,37 +2352,40 @@ func (*GatewaysResponse_Ok_) isGatewaysResponse_Response() {} func (*GatewaysResponse_Error) isGatewaysResponse_Response() {} -type TapByResourceRequest_Match struct { +type Headers_Header struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Types that are assignable to Match: - // *TapByResourceRequest_Match_All - // *TapByResourceRequest_Match_Any - // *TapByResourceRequest_Match_Not - // *TapByResourceRequest_Match_Destinations - // *TapByResourceRequest_Match_Http_ - Match isTapByResourceRequest_Match_Match `protobuf_oneof:"match"` + // The name of a header in a request. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The value of a header in a request. If the value consists entirely of + // UTF-8 encodings, `value` will be set; otherwise a binary value is + // assumed and `value_bin` will be set. + // + // Types that are assignable to Value: + // *Headers_Header_ValueStr + // *Headers_Header_ValueBin + Value isHeaders_Header_Value `protobuf_oneof:"value"` } -func (x *TapByResourceRequest_Match) Reset() { - *x = TapByResourceRequest_Match{} +func (x *Headers_Header) Reset() { + *x = Headers_Header{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[34] + mi := &file_viz_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TapByResourceRequest_Match) String() string { +func (x *Headers_Header) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TapByResourceRequest_Match) ProtoMessage() {} +func (*Headers_Header) ProtoMessage() {} -func (x *TapByResourceRequest_Match) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[34] +func (x *Headers_Header) ProtoReflect() protoreflect.Message { + mi := &file_viz_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2791,999 +2396,54 @@ func (x *TapByResourceRequest_Match) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TapByResourceRequest_Match.ProtoReflect.Descriptor instead. -func (*TapByResourceRequest_Match) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{8, 0} +// Deprecated: Use Headers_Header.ProtoReflect.Descriptor instead. +func (*Headers_Header) Descriptor() ([]byte, []int) { + return file_viz_proto_rawDescGZIP(), []int{9, 0} } -func (m *TapByResourceRequest_Match) GetMatch() isTapByResourceRequest_Match_Match { - if m != nil { - return m.Match +func (x *Headers_Header) GetName() string { + if x != nil { + return x.Name } - return nil + return "" } -func (x *TapByResourceRequest_Match) GetAll() *TapByResourceRequest_Match_Seq { - if x, ok := x.GetMatch().(*TapByResourceRequest_Match_All); ok { - return x.All +func (m *Headers_Header) GetValue() isHeaders_Header_Value { + if m != nil { + return m.Value } return nil } -func (x *TapByResourceRequest_Match) GetAny() *TapByResourceRequest_Match_Seq { - if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Any); ok { - return x.Any +func (x *Headers_Header) GetValueStr() string { + if x, ok := x.GetValue().(*Headers_Header_ValueStr); ok { + return x.ValueStr } - return nil + return "" } -func (x *TapByResourceRequest_Match) GetNot() *TapByResourceRequest_Match { - if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Not); ok { - return x.Not +func (x *Headers_Header) GetValueBin() []byte { + if x, ok := x.GetValue().(*Headers_Header_ValueBin); ok { + return x.ValueBin } return nil } -func (x *TapByResourceRequest_Match) GetDestinations() *ResourceSelection { - if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Destinations); ok { - return x.Destinations - } - return nil +type isHeaders_Header_Value interface { + isHeaders_Header_Value() } -func (x *TapByResourceRequest_Match) GetHttp() *TapByResourceRequest_Match_Http { - if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Http_); ok { - return x.Http - } - return nil +type Headers_Header_ValueStr struct { + ValueStr string `protobuf:"bytes,2,opt,name=value_str,json=valueStr,proto3,oneof"` } -type isTapByResourceRequest_Match_Match interface { - isTapByResourceRequest_Match_Match() -} - -type TapByResourceRequest_Match_All struct { - // If empty, matches all messages. - All *TapByResourceRequest_Match_Seq `protobuf:"bytes,1,opt,name=all,proto3,oneof"` -} - -type TapByResourceRequest_Match_Any struct { - // If empty, matches no messages. - Any *TapByResourceRequest_Match_Seq `protobuf:"bytes,2,opt,name=any,proto3,oneof"` -} - -type TapByResourceRequest_Match_Not struct { - // Inverts the inner match. - Not *TapByResourceRequest_Match `protobuf:"bytes,3,opt,name=not,proto3,oneof"` -} - -type TapByResourceRequest_Match_Destinations struct { - // Matches events being sent to any of the selected destinations. - Destinations *ResourceSelection `protobuf:"bytes,4,opt,name=destinations,proto3,oneof"` -} - -type TapByResourceRequest_Match_Http_ struct { - // Matches HTTP requests by their metadata. - Http *TapByResourceRequest_Match_Http `protobuf:"bytes,5,opt,name=http,proto3,oneof"` -} - -func (*TapByResourceRequest_Match_All) isTapByResourceRequest_Match_Match() {} - -func (*TapByResourceRequest_Match_Any) isTapByResourceRequest_Match_Match() {} - -func (*TapByResourceRequest_Match_Not) isTapByResourceRequest_Match_Match() {} - -func (*TapByResourceRequest_Match_Destinations) isTapByResourceRequest_Match_Match() {} - -func (*TapByResourceRequest_Match_Http_) isTapByResourceRequest_Match_Match() {} - -type TapByResourceRequest_Extract struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Extract: - // *TapByResourceRequest_Extract_Http_ - Extract isTapByResourceRequest_Extract_Extract `protobuf_oneof:"extract"` -} - -func (x *TapByResourceRequest_Extract) Reset() { - *x = TapByResourceRequest_Extract{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapByResourceRequest_Extract) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapByResourceRequest_Extract) ProtoMessage() {} - -func (x *TapByResourceRequest_Extract) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapByResourceRequest_Extract.ProtoReflect.Descriptor instead. -func (*TapByResourceRequest_Extract) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{8, 1} -} - -func (m *TapByResourceRequest_Extract) GetExtract() isTapByResourceRequest_Extract_Extract { - if m != nil { - return m.Extract - } - return nil -} - -func (x *TapByResourceRequest_Extract) GetHttp() *TapByResourceRequest_Extract_Http { - if x, ok := x.GetExtract().(*TapByResourceRequest_Extract_Http_); ok { - return x.Http - } - return nil -} - -type isTapByResourceRequest_Extract_Extract interface { - isTapByResourceRequest_Extract_Extract() -} - -type TapByResourceRequest_Extract_Http_ struct { - Http *TapByResourceRequest_Extract_Http `protobuf:"bytes,1,opt,name=http,proto3,oneof"` -} - -func (*TapByResourceRequest_Extract_Http_) isTapByResourceRequest_Extract_Extract() {} - -type TapByResourceRequest_Match_Seq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Matches []*TapByResourceRequest_Match `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` -} - -func (x *TapByResourceRequest_Match_Seq) Reset() { - *x = TapByResourceRequest_Match_Seq{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapByResourceRequest_Match_Seq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapByResourceRequest_Match_Seq) ProtoMessage() {} - -func (x *TapByResourceRequest_Match_Seq) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapByResourceRequest_Match_Seq.ProtoReflect.Descriptor instead. -func (*TapByResourceRequest_Match_Seq) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{8, 0, 0} -} - -func (x *TapByResourceRequest_Match_Seq) GetMatches() []*TapByResourceRequest_Match { - if x != nil { - return x.Matches - } - return nil -} - -type TapByResourceRequest_Match_Http struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Match: - // *TapByResourceRequest_Match_Http_Scheme - // *TapByResourceRequest_Match_Http_Method - // *TapByResourceRequest_Match_Http_Authority - // *TapByResourceRequest_Match_Http_Path - Match isTapByResourceRequest_Match_Http_Match `protobuf_oneof:"match"` -} - -func (x *TapByResourceRequest_Match_Http) Reset() { - *x = TapByResourceRequest_Match_Http{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapByResourceRequest_Match_Http) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapByResourceRequest_Match_Http) ProtoMessage() {} - -func (x *TapByResourceRequest_Match_Http) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapByResourceRequest_Match_Http.ProtoReflect.Descriptor instead. -func (*TapByResourceRequest_Match_Http) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{8, 0, 1} -} - -func (m *TapByResourceRequest_Match_Http) GetMatch() isTapByResourceRequest_Match_Http_Match { - if m != nil { - return m.Match - } - return nil -} - -func (x *TapByResourceRequest_Match_Http) GetScheme() string { - if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Http_Scheme); ok { - return x.Scheme - } - return "" -} - -func (x *TapByResourceRequest_Match_Http) GetMethod() string { - if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Http_Method); ok { - return x.Method - } - return "" -} - -func (x *TapByResourceRequest_Match_Http) GetAuthority() string { - if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Http_Authority); ok { - return x.Authority - } - return "" -} - -func (x *TapByResourceRequest_Match_Http) GetPath() string { - if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Http_Path); ok { - return x.Path - } - return "" -} - -type isTapByResourceRequest_Match_Http_Match interface { - isTapByResourceRequest_Match_Http_Match() -} - -type TapByResourceRequest_Match_Http_Scheme struct { - Scheme string `protobuf:"bytes,1,opt,name=scheme,proto3,oneof"` -} - -type TapByResourceRequest_Match_Http_Method struct { - Method string `protobuf:"bytes,2,opt,name=method,proto3,oneof"` -} - -type TapByResourceRequest_Match_Http_Authority struct { - Authority string `protobuf:"bytes,3,opt,name=authority,proto3,oneof"` -} - -type TapByResourceRequest_Match_Http_Path struct { - Path string `protobuf:"bytes,4,opt,name=path,proto3,oneof"` -} - -func (*TapByResourceRequest_Match_Http_Scheme) isTapByResourceRequest_Match_Http_Match() {} - -func (*TapByResourceRequest_Match_Http_Method) isTapByResourceRequest_Match_Http_Match() {} - -func (*TapByResourceRequest_Match_Http_Authority) isTapByResourceRequest_Match_Http_Match() {} - -func (*TapByResourceRequest_Match_Http_Path) isTapByResourceRequest_Match_Http_Match() {} - -type TapByResourceRequest_Extract_Http struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Extract: - // *TapByResourceRequest_Extract_Http_Headers_ - Extract isTapByResourceRequest_Extract_Http_Extract `protobuf_oneof:"extract"` -} - -func (x *TapByResourceRequest_Extract_Http) Reset() { - *x = TapByResourceRequest_Extract_Http{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapByResourceRequest_Extract_Http) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapByResourceRequest_Extract_Http) ProtoMessage() {} - -func (x *TapByResourceRequest_Extract_Http) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapByResourceRequest_Extract_Http.ProtoReflect.Descriptor instead. -func (*TapByResourceRequest_Extract_Http) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{8, 1, 0} -} - -func (m *TapByResourceRequest_Extract_Http) GetExtract() isTapByResourceRequest_Extract_Http_Extract { - if m != nil { - return m.Extract - } - return nil -} - -func (x *TapByResourceRequest_Extract_Http) GetHeaders() *TapByResourceRequest_Extract_Http_Headers { - if x, ok := x.GetExtract().(*TapByResourceRequest_Extract_Http_Headers_); ok { - return x.Headers - } - return nil -} - -type isTapByResourceRequest_Extract_Http_Extract interface { - isTapByResourceRequest_Extract_Http_Extract() -} - -type TapByResourceRequest_Extract_Http_Headers_ struct { - Headers *TapByResourceRequest_Extract_Http_Headers `protobuf:"bytes,1,opt,name=headers,proto3,oneof"` -} - -func (*TapByResourceRequest_Extract_Http_Headers_) isTapByResourceRequest_Extract_Http_Extract() {} - -type TapByResourceRequest_Extract_Http_Headers struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *TapByResourceRequest_Extract_Http_Headers) Reset() { - *x = TapByResourceRequest_Extract_Http_Headers{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapByResourceRequest_Extract_Http_Headers) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapByResourceRequest_Extract_Http_Headers) ProtoMessage() {} - -func (x *TapByResourceRequest_Extract_Http_Headers) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapByResourceRequest_Extract_Http_Headers.ProtoReflect.Descriptor instead. -func (*TapByResourceRequest_Extract_Http_Headers) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{8, 1, 0, 0} -} - -type Headers_Header struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The name of a header in a request. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The value of a header in a request. If the value consists entirely of - // UTF-8 encodings, `value` will be set; otherwise a binary value is - // assumed and `value_bin` will be set. - // - // Types that are assignable to Value: - // *Headers_Header_ValueStr - // *Headers_Header_ValueBin - Value isHeaders_Header_Value `protobuf_oneof:"value"` -} - -func (x *Headers_Header) Reset() { - *x = Headers_Header{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Headers_Header) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Headers_Header) ProtoMessage() {} - -func (x *Headers_Header) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Headers_Header.ProtoReflect.Descriptor instead. -func (*Headers_Header) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{11, 0} -} - -func (x *Headers_Header) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (m *Headers_Header) GetValue() isHeaders_Header_Value { - if m != nil { - return m.Value - } - return nil -} - -func (x *Headers_Header) GetValueStr() string { - if x, ok := x.GetValue().(*Headers_Header_ValueStr); ok { - return x.ValueStr - } - return "" -} - -func (x *Headers_Header) GetValueBin() []byte { - if x, ok := x.GetValue().(*Headers_Header_ValueBin); ok { - return x.ValueBin - } - return nil -} - -type isHeaders_Header_Value interface { - isHeaders_Header_Value() -} - -type Headers_Header_ValueStr struct { - ValueStr string `protobuf:"bytes,2,opt,name=value_str,json=valueStr,proto3,oneof"` -} - -type Headers_Header_ValueBin struct { - ValueBin []byte `protobuf:"bytes,3,opt,name=value_bin,json=valueBin,proto3,oneof"` -} - -func (*Headers_Header_ValueStr) isHeaders_Header_Value() {} - -func (*Headers_Header_ValueBin) isHeaders_Header_Value() {} - -type TapEvent_EndpointMeta struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Labels map[string]string `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (x *TapEvent_EndpointMeta) Reset() { - *x = TapEvent_EndpointMeta{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapEvent_EndpointMeta) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapEvent_EndpointMeta) ProtoMessage() {} - -func (x *TapEvent_EndpointMeta) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapEvent_EndpointMeta.ProtoReflect.Descriptor instead. -func (*TapEvent_EndpointMeta) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{13, 0} -} - -func (x *TapEvent_EndpointMeta) GetLabels() map[string]string { - if x != nil { - return x.Labels - } - return nil -} - -type TapEvent_RouteMeta struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Labels map[string]string `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` -} - -func (x *TapEvent_RouteMeta) Reset() { - *x = TapEvent_RouteMeta{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapEvent_RouteMeta) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapEvent_RouteMeta) ProtoMessage() {} - -func (x *TapEvent_RouteMeta) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapEvent_RouteMeta.ProtoReflect.Descriptor instead. -func (*TapEvent_RouteMeta) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{13, 1} -} - -func (x *TapEvent_RouteMeta) GetLabels() map[string]string { - if x != nil { - return x.Labels - } - return nil -} - -type TapEvent_Http struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Event: - // *TapEvent_Http_RequestInit_ - // *TapEvent_Http_ResponseInit_ - // *TapEvent_Http_ResponseEnd_ - Event isTapEvent_Http_Event `protobuf_oneof:"event"` -} - -func (x *TapEvent_Http) Reset() { - *x = TapEvent_Http{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapEvent_Http) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapEvent_Http) ProtoMessage() {} - -func (x *TapEvent_Http) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapEvent_Http.ProtoReflect.Descriptor instead. -func (*TapEvent_Http) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{13, 2} -} - -func (m *TapEvent_Http) GetEvent() isTapEvent_Http_Event { - if m != nil { - return m.Event - } - return nil -} - -func (x *TapEvent_Http) GetRequestInit() *TapEvent_Http_RequestInit { - if x, ok := x.GetEvent().(*TapEvent_Http_RequestInit_); ok { - return x.RequestInit - } - return nil -} - -func (x *TapEvent_Http) GetResponseInit() *TapEvent_Http_ResponseInit { - if x, ok := x.GetEvent().(*TapEvent_Http_ResponseInit_); ok { - return x.ResponseInit - } - return nil -} - -func (x *TapEvent_Http) GetResponseEnd() *TapEvent_Http_ResponseEnd { - if x, ok := x.GetEvent().(*TapEvent_Http_ResponseEnd_); ok { - return x.ResponseEnd - } - return nil -} - -type isTapEvent_Http_Event interface { - isTapEvent_Http_Event() -} - -type TapEvent_Http_RequestInit_ struct { - RequestInit *TapEvent_Http_RequestInit `protobuf:"bytes,1,opt,name=request_init,json=requestInit,proto3,oneof"` -} - -type TapEvent_Http_ResponseInit_ struct { - ResponseInit *TapEvent_Http_ResponseInit `protobuf:"bytes,2,opt,name=response_init,json=responseInit,proto3,oneof"` -} - -type TapEvent_Http_ResponseEnd_ struct { - ResponseEnd *TapEvent_Http_ResponseEnd `protobuf:"bytes,3,opt,name=response_end,json=responseEnd,proto3,oneof"` -} - -func (*TapEvent_Http_RequestInit_) isTapEvent_Http_Event() {} - -func (*TapEvent_Http_ResponseInit_) isTapEvent_Http_Event() {} - -func (*TapEvent_Http_ResponseEnd_) isTapEvent_Http_Event() {} - -type TapEvent_Http_StreamId struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // A randomized base (stable across a process's runtime) - Base uint32 `protobuf:"varint,1,opt,name=base,proto3" json:"base,omitempty"` - // A stream id unique within the lifetime of `base`. - Stream uint64 `protobuf:"varint,2,opt,name=stream,proto3" json:"stream,omitempty"` -} - -func (x *TapEvent_Http_StreamId) Reset() { - *x = TapEvent_Http_StreamId{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapEvent_Http_StreamId) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapEvent_Http_StreamId) ProtoMessage() {} - -func (x *TapEvent_Http_StreamId) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapEvent_Http_StreamId.ProtoReflect.Descriptor instead. -func (*TapEvent_Http_StreamId) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{13, 2, 0} -} - -func (x *TapEvent_Http_StreamId) GetBase() uint32 { - if x != nil { - return x.Base - } - return 0 -} - -func (x *TapEvent_Http_StreamId) GetStream() uint64 { - if x != nil { - return x.Stream - } - return 0 -} - -type TapEvent_Http_RequestInit struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id *TapEvent_Http_StreamId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Method *HttpMethod `protobuf:"bytes,2,opt,name=method,proto3" json:"method,omitempty"` - Scheme *Scheme `protobuf:"bytes,3,opt,name=scheme,proto3" json:"scheme,omitempty"` - Authority string `protobuf:"bytes,4,opt,name=authority,proto3" json:"authority,omitempty"` - Path string `protobuf:"bytes,5,opt,name=path,proto3" json:"path,omitempty"` - Headers *Headers `protobuf:"bytes,6,opt,name=headers,proto3" json:"headers,omitempty"` -} - -func (x *TapEvent_Http_RequestInit) Reset() { - *x = TapEvent_Http_RequestInit{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapEvent_Http_RequestInit) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapEvent_Http_RequestInit) ProtoMessage() {} - -func (x *TapEvent_Http_RequestInit) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapEvent_Http_RequestInit.ProtoReflect.Descriptor instead. -func (*TapEvent_Http_RequestInit) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{13, 2, 1} -} - -func (x *TapEvent_Http_RequestInit) GetId() *TapEvent_Http_StreamId { - if x != nil { - return x.Id - } - return nil -} - -func (x *TapEvent_Http_RequestInit) GetMethod() *HttpMethod { - if x != nil { - return x.Method - } - return nil -} - -func (x *TapEvent_Http_RequestInit) GetScheme() *Scheme { - if x != nil { - return x.Scheme - } - return nil -} - -func (x *TapEvent_Http_RequestInit) GetAuthority() string { - if x != nil { - return x.Authority - } - return "" -} - -func (x *TapEvent_Http_RequestInit) GetPath() string { - if x != nil { - return x.Path - } - return "" -} - -func (x *TapEvent_Http_RequestInit) GetHeaders() *Headers { - if x != nil { - return x.Headers - } - return nil -} - -type TapEvent_Http_ResponseInit struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id *TapEvent_Http_StreamId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - SinceRequestInit *duration.Duration `protobuf:"bytes,2,opt,name=since_request_init,json=sinceRequestInit,proto3" json:"since_request_init,omitempty"` - HttpStatus uint32 `protobuf:"varint,3,opt,name=http_status,json=httpStatus,proto3" json:"http_status,omitempty"` - Headers *Headers `protobuf:"bytes,4,opt,name=headers,proto3" json:"headers,omitempty"` -} - -func (x *TapEvent_Http_ResponseInit) Reset() { - *x = TapEvent_Http_ResponseInit{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapEvent_Http_ResponseInit) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapEvent_Http_ResponseInit) ProtoMessage() {} - -func (x *TapEvent_Http_ResponseInit) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapEvent_Http_ResponseInit.ProtoReflect.Descriptor instead. -func (*TapEvent_Http_ResponseInit) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{13, 2, 2} -} - -func (x *TapEvent_Http_ResponseInit) GetId() *TapEvent_Http_StreamId { - if x != nil { - return x.Id - } - return nil -} - -func (x *TapEvent_Http_ResponseInit) GetSinceRequestInit() *duration.Duration { - if x != nil { - return x.SinceRequestInit - } - return nil -} - -func (x *TapEvent_Http_ResponseInit) GetHttpStatus() uint32 { - if x != nil { - return x.HttpStatus - } - return 0 -} - -func (x *TapEvent_Http_ResponseInit) GetHeaders() *Headers { - if x != nil { - return x.Headers - } - return nil -} - -type TapEvent_Http_ResponseEnd struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id *TapEvent_Http_StreamId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - SinceRequestInit *duration.Duration `protobuf:"bytes,2,opt,name=since_request_init,json=sinceRequestInit,proto3" json:"since_request_init,omitempty"` - SinceResponseInit *duration.Duration `protobuf:"bytes,3,opt,name=since_response_init,json=sinceResponseInit,proto3" json:"since_response_init,omitempty"` - ResponseBytes uint64 `protobuf:"varint,4,opt,name=response_bytes,json=responseBytes,proto3" json:"response_bytes,omitempty"` - Eos *Eos `protobuf:"bytes,5,opt,name=eos,proto3" json:"eos,omitempty"` - Trailers *Headers `protobuf:"bytes,6,opt,name=trailers,proto3" json:"trailers,omitempty"` -} - -func (x *TapEvent_Http_ResponseEnd) Reset() { - *x = TapEvent_Http_ResponseEnd{} - if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TapEvent_Http_ResponseEnd) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TapEvent_Http_ResponseEnd) ProtoMessage() {} - -func (x *TapEvent_Http_ResponseEnd) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TapEvent_Http_ResponseEnd.ProtoReflect.Descriptor instead. -func (*TapEvent_Http_ResponseEnd) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{13, 2, 3} -} - -func (x *TapEvent_Http_ResponseEnd) GetId() *TapEvent_Http_StreamId { - if x != nil { - return x.Id - } - return nil -} - -func (x *TapEvent_Http_ResponseEnd) GetSinceRequestInit() *duration.Duration { - if x != nil { - return x.SinceRequestInit - } - return nil -} - -func (x *TapEvent_Http_ResponseEnd) GetSinceResponseInit() *duration.Duration { - if x != nil { - return x.SinceResponseInit - } - return nil -} - -func (x *TapEvent_Http_ResponseEnd) GetResponseBytes() uint64 { - if x != nil { - return x.ResponseBytes - } - return 0 +type Headers_Header_ValueBin struct { + ValueBin []byte `protobuf:"bytes,3,opt,name=value_bin,json=valueBin,proto3,oneof"` } -func (x *TapEvent_Http_ResponseEnd) GetEos() *Eos { - if x != nil { - return x.Eos - } - return nil -} +func (*Headers_Header_ValueStr) isHeaders_Header_Value() {} -func (x *TapEvent_Http_ResponseEnd) GetTrailers() *Headers { - if x != nil { - return x.Trailers - } - return nil -} +func (*Headers_Header_ValueBin) isHeaders_Header_Value() {} type PodErrors_PodError struct { state protoimpl.MessageState @@ -3798,7 +2458,7 @@ type PodErrors_PodError struct { func (x *PodErrors_PodError) Reset() { *x = PodErrors_PodError{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[50] + mi := &file_viz_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3811,7 +2471,7 @@ func (x *PodErrors_PodError) String() string { func (*PodErrors_PodError) ProtoMessage() {} func (x *PodErrors_PodError) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[50] + mi := &file_viz_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3824,7 +2484,7 @@ func (x *PodErrors_PodError) ProtoReflect() protoreflect.Message { // Deprecated: Use PodErrors_PodError.ProtoReflect.Descriptor instead. func (*PodErrors_PodError) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{15, 0} + return file_viz_proto_rawDescGZIP(), []int{12, 0} } func (m *PodErrors_PodError) GetError() isPodErrors_PodError_Error { @@ -3866,7 +2526,7 @@ type PodErrors_PodError_ContainerError struct { func (x *PodErrors_PodError_ContainerError) Reset() { *x = PodErrors_PodError_ContainerError{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[51] + mi := &file_viz_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3879,7 +2539,7 @@ func (x *PodErrors_PodError_ContainerError) String() string { func (*PodErrors_PodError_ContainerError) ProtoMessage() {} func (x *PodErrors_PodError_ContainerError) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[51] + mi := &file_viz_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3892,7 +2552,7 @@ func (x *PodErrors_PodError_ContainerError) ProtoReflect() protoreflect.Message // Deprecated: Use PodErrors_PodError_ContainerError.ProtoReflect.Descriptor instead. func (*PodErrors_PodError_ContainerError) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{15, 0, 0} + return file_viz_proto_rawDescGZIP(), []int{12, 0, 0} } func (x *PodErrors_PodError_ContainerError) GetMessage() string { @@ -3934,7 +2594,7 @@ type StatSummaryResponse_Ok struct { func (x *StatSummaryResponse_Ok) Reset() { *x = StatSummaryResponse_Ok{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[52] + mi := &file_viz_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3947,7 +2607,7 @@ func (x *StatSummaryResponse_Ok) String() string { func (*StatSummaryResponse_Ok) ProtoMessage() {} func (x *StatSummaryResponse_Ok) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[52] + mi := &file_viz_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3960,7 +2620,7 @@ func (x *StatSummaryResponse_Ok) ProtoReflect() protoreflect.Message { // Deprecated: Use StatSummaryResponse_Ok.ProtoReflect.Descriptor instead. func (*StatSummaryResponse_Ok) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{20, 0} + return file_viz_proto_rawDescGZIP(), []int{17, 0} } func (x *StatSummaryResponse_Ok) GetStatTables() []*StatTable { @@ -3981,7 +2641,7 @@ type StatTable_PodGroup struct { func (x *StatTable_PodGroup) Reset() { *x = StatTable_PodGroup{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[53] + mi := &file_viz_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3994,7 +2654,7 @@ func (x *StatTable_PodGroup) String() string { func (*StatTable_PodGroup) ProtoMessage() {} func (x *StatTable_PodGroup) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[53] + mi := &file_viz_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4007,7 +2667,7 @@ func (x *StatTable_PodGroup) ProtoReflect() protoreflect.Message { // Deprecated: Use StatTable_PodGroup.ProtoReflect.Descriptor instead. func (*StatTable_PodGroup) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{24, 0} + return file_viz_proto_rawDescGZIP(), []int{21, 0} } func (x *StatTable_PodGroup) GetRows() []*StatTable_PodGroup_Row { @@ -4042,7 +2702,7 @@ type StatTable_PodGroup_Row struct { func (x *StatTable_PodGroup_Row) Reset() { *x = StatTable_PodGroup_Row{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[54] + mi := &file_viz_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4055,7 +2715,7 @@ func (x *StatTable_PodGroup_Row) String() string { func (*StatTable_PodGroup_Row) ProtoMessage() {} func (x *StatTable_PodGroup_Row) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[54] + mi := &file_viz_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4068,7 +2728,7 @@ func (x *StatTable_PodGroup_Row) ProtoReflect() protoreflect.Message { // Deprecated: Use StatTable_PodGroup_Row.ProtoReflect.Descriptor instead. func (*StatTable_PodGroup_Row) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{24, 0, 0} + return file_viz_proto_rawDescGZIP(), []int{21, 0, 0} } func (x *StatTable_PodGroup_Row) GetResource() *Resource { @@ -4152,7 +2812,7 @@ type EdgesResponse_Ok struct { func (x *EdgesResponse_Ok) Reset() { *x = EdgesResponse_Ok{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[56] + mi := &file_viz_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4165,7 +2825,7 @@ func (x *EdgesResponse_Ok) String() string { func (*EdgesResponse_Ok) ProtoMessage() {} func (x *EdgesResponse_Ok) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[56] + mi := &file_viz_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4178,7 +2838,7 @@ func (x *EdgesResponse_Ok) ProtoReflect() protoreflect.Message { // Deprecated: Use EdgesResponse_Ok.ProtoReflect.Descriptor instead. func (*EdgesResponse_Ok) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{26, 0} + return file_viz_proto_rawDescGZIP(), []int{23, 0} } func (x *EdgesResponse_Ok) GetEdges() []*Edge { @@ -4199,7 +2859,7 @@ type TopRoutesResponse_Ok struct { func (x *TopRoutesResponse_Ok) Reset() { *x = TopRoutesResponse_Ok{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[57] + mi := &file_viz_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4212,7 +2872,7 @@ func (x *TopRoutesResponse_Ok) String() string { func (*TopRoutesResponse_Ok) ProtoMessage() {} func (x *TopRoutesResponse_Ok) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[57] + mi := &file_viz_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4225,7 +2885,7 @@ func (x *TopRoutesResponse_Ok) ProtoReflect() protoreflect.Message { // Deprecated: Use TopRoutesResponse_Ok.ProtoReflect.Descriptor instead. func (*TopRoutesResponse_Ok) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{29, 0} + return file_viz_proto_rawDescGZIP(), []int{26, 0} } func (x *TopRoutesResponse_Ok) GetRoutes() []*RouteTable { @@ -4249,7 +2909,7 @@ type RouteTable_Row struct { func (x *RouteTable_Row) Reset() { *x = RouteTable_Row{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[58] + mi := &file_viz_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4262,7 +2922,7 @@ func (x *RouteTable_Row) String() string { func (*RouteTable_Row) ProtoMessage() {} func (x *RouteTable_Row) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[58] + mi := &file_viz_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4275,7 +2935,7 @@ func (x *RouteTable_Row) ProtoReflect() protoreflect.Message { // Deprecated: Use RouteTable_Row.ProtoReflect.Descriptor instead. func (*RouteTable_Row) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{30, 0} + return file_viz_proto_rawDescGZIP(), []int{27, 0} } func (x *RouteTable_Row) GetRoute() string { @@ -4324,7 +2984,7 @@ type GatewaysTable_Row struct { func (x *GatewaysTable_Row) Reset() { *x = GatewaysTable_Row{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[59] + mi := &file_viz_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4337,7 +2997,7 @@ func (x *GatewaysTable_Row) String() string { func (*GatewaysTable_Row) ProtoMessage() {} func (x *GatewaysTable_Row) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[59] + mi := &file_viz_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4350,7 +3010,7 @@ func (x *GatewaysTable_Row) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewaysTable_Row.ProtoReflect.Descriptor instead. func (*GatewaysTable_Row) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{31, 0} + return file_viz_proto_rawDescGZIP(), []int{28, 0} } func (x *GatewaysTable_Row) GetNamespace() string { @@ -4420,7 +3080,7 @@ type GatewaysResponse_Ok struct { func (x *GatewaysResponse_Ok) Reset() { *x = GatewaysResponse_Ok{} if protoimpl.UnsafeEnabled { - mi := &file_viz_proto_msgTypes[60] + mi := &file_viz_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4433,7 +3093,7 @@ func (x *GatewaysResponse_Ok) String() string { func (*GatewaysResponse_Ok) ProtoMessage() {} func (x *GatewaysResponse_Ok) ProtoReflect() protoreflect.Message { - mi := &file_viz_proto_msgTypes[60] + mi := &file_viz_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4446,7 +3106,7 @@ func (x *GatewaysResponse_Ok) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewaysResponse_Ok.ProtoReflect.Descriptor instead. func (*GatewaysResponse_Ok) Descriptor() ([]byte, []int) { - return file_viz_proto_rawDescGZIP(), []int{33, 0} + return file_viz_proto_rawDescGZIP(), []int{30, 0} } func (x *GatewaysResponse_Ok) GetGatewaysTable() *GatewaysTable { @@ -4464,1028 +3124,560 @@ var file_viz_proto_rawDesc = []byte{ 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x33, - 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x22, 0x49, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x3b, - 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x70, 0x0a, 0x0f, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x39, 0x0a, - 0x10, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x25, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x50, - 0x6f, 0x64, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x22, 0xfa, 0x04, 0x0a, 0x03, 0x50, 0x6f, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x64, 0x49, 0x50, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x6f, 0x64, 0x49, 0x50, 0x12, 0x20, 0x0a, 0x0a, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0b, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x12, - 0x37, 0x0a, 0x16, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x15, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x66, 0x75, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 0x12, 0x1f, 0x0a, - 0x0a, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x09, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x12, - 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x6a, - 0x6f, 0x62, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, - 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, - 0x12, 0x43, 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x75, - 0x70, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x61, 0x64, 0x79, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x22, - 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x0a, 0x05, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0xaa, 0x02, 0x0a, 0x0a, 0x54, 0x61, 0x70, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x03, 0x70, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x03, 0x70, 0x6f, 0x64, 0x12, 0x20, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, - 0x78, 0x52, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x52, - 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x06, 0x74, 0x6f, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x6f, - 0x49, 0x50, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x6f, 0x49, 0x50, 0x12, 0x1a, - 0x0a, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x72, - 0x6f, 0x6d, 0x49, 0x50, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x72, 0x6f, 0x6d, - 0x49, 0x50, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x3a, 0x02, 0x18, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x22, 0xe5, 0x07, 0x0a, 0x14, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, - 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x3e, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, - 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x70, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x70, 0x73, 0x12, 0x44, 0x0a, 0x07, - 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, - 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x07, 0x65, 0x78, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x1a, 0xa4, 0x04, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x40, 0x0a, 0x03, - 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x2e, 0x53, 0x65, 0x71, 0x48, 0x00, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x40, - 0x0a, 0x03, 0x61, 0x6e, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x69, - 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x65, 0x71, 0x48, 0x00, 0x52, 0x03, 0x61, 0x6e, 0x79, - 0x12, 0x3c, 0x0a, 0x03, 0x6e, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, - 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, 0x03, 0x6e, 0x6f, 0x74, 0x12, 0x45, - 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, - 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, - 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x48, 0x74, - 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, 0x49, 0x0a, 0x03, 0x53, 0x65, - 0x71, 0x12, 0x42, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x73, 0x1a, 0x79, 0x0a, 0x04, 0x48, 0x74, 0x74, 0x70, 0x12, 0x18, 0x0a, - 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x12, 0x1e, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x42, 0x07, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x42, 0x07, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x1a, 0xce, 0x01, 0x0a, 0x07, 0x45, 0x78, - 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x45, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, - 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x2e, - 0x48, 0x74, 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, 0x71, 0x0a, 0x04, - 0x48, 0x74, 0x74, 0x70, 0x12, 0x53, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, - 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, - 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x48, 0x00, - 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x42, - 0x09, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x22, 0xf1, 0x01, 0x0a, 0x0a, 0x48, - 0x74, 0x74, 0x70, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x74, 0x74, - 0x70, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x12, 0x24, 0x0a, 0x0c, 0x75, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x6e, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x22, 0x6e, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x65, 0x64, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x45, 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, - 0x04, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x02, - 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, - 0x50, 0x41, 0x54, 0x43, 0x48, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x50, 0x54, 0x49, 0x4f, - 0x4e, 0x53, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, - 0x06, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x45, 0x41, 0x44, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, 0x54, - 0x52, 0x41, 0x43, 0x45, 0x10, 0x08, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x9c, - 0x01, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x65, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x48, 0x00, - 0x52, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0c, - 0x75, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x64, 0x22, 0x21, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, - 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, - 0x54, 0x50, 0x53, 0x10, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa6, 0x01, - 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x69, 0x6e, - 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x1a, 0x63, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1d, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x74, 0x72, 0x12, 0x1d, - 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x48, 0x00, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x69, 0x6e, 0x42, 0x07, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x64, 0x0a, 0x03, 0x45, 0x6f, 0x73, 0x12, 0x2a, 0x0a, - 0x10, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x73, - 0x65, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x74, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xc2, 0x0f, 0x0a, - 0x08, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, - 0x54, 0x63, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, - 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, - 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x63, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x10, 0x64, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, - 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x0a, 0x72, - 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, - 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x52, 0x09, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x0f, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, - 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x04, - 0x68, 0x74, 0x74, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x69, 0x6e, - 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, - 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x12, 0x47, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, - 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x8c, 0x01, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x12, 0x44, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0xf8, 0x08, 0x0a, 0x04, 0x48, 0x74, 0x74, 0x70, 0x12, 0x4c, 0x0a, 0x0c, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x4f, 0x0a, 0x0d, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, - 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x4c, 0x0a, 0x0c, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, - 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x1a, 0x36, 0x0a, 0x08, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x1a, 0x86, 0x02, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, - 0x74, 0x12, 0x34, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, - 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x52, - 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2f, 0x0a, 0x07, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x69, 0x6e, - 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0xdf, 0x01, 0x0a, 0x0c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x34, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, - 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, - 0x48, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x47, 0x0a, 0x12, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x74, - 0x74, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0a, 0x68, 0x74, 0x74, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, - 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0xd6, 0x02, 0x0a, - 0x0b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x47, 0x0a, 0x12, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x49, 0x0a, 0x13, 0x73, - 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x69, 0x6e, - 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, - 0x03, 0x65, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6c, 0x69, 0x6e, - 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x6f, 0x73, 0x52, 0x03, 0x65, - 0x6f, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, - 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x08, 0x74, 0x72, 0x61, - 0x69, 0x6c, 0x65, 0x72, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x38, - 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, - 0x07, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x55, - 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x22, 0x20, 0x0a, 0x08, 0x41, 0x70, 0x69, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0xa4, 0x02, 0x0a, 0x09, 0x50, 0x6f, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, - 0x2e, 0x50, 0x6f, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x50, 0x6f, 0x64, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x1a, 0xdc, 0x01, 0x0a, 0x08, - 0x50, 0x6f, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4f, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6c, 0x69, - 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x50, 0x6f, 0x64, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x50, 0x6f, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x09, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x1a, 0x76, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x50, 0x0a, 0x08, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x6e, 0x0a, 0x11, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, - 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x59, 0x0a, 0x0d, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x32, 0x0a, - 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xdf, 0x02, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, - 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x29, 0x0a, 0x04, - 0x6e, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x69, 0x6e, - 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, - 0x00, 0x52, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x74, 0x6f, 0x5f, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, - 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x48, 0x00, 0x52, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x6b, 0x69, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x63, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x74, 0x63, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x0a, 0x0a, - 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0xce, 0x01, 0x0a, 0x13, 0x53, 0x74, - 0x61, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x36, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x4f, 0x6b, 0x48, 0x00, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x33, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x3e, - 0x0a, 0x02, 0x4f, 0x6b, 0x12, 0x38, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x42, 0x0a, - 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xac, 0x02, 0x0a, 0x0a, 0x42, - 0x61, 0x73, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, - 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, - 0x73, 0x5f, 0x70, 0x35, 0x30, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x50, 0x35, 0x30, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x5f, 0x70, 0x39, 0x35, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x50, 0x39, 0x35, 0x12, - 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x5f, 0x70, 0x39, - 0x39, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, - 0x4d, 0x73, 0x50, 0x39, 0x39, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x12, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x63, 0x74, 0x75, 0x61, - 0x6c, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x61, 0x69, - 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x08, 0x54, 0x63, - 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x72, 0x65, 0x61, - 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x53, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x61, 0x70, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x70, 0x65, 0x78, - 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6c, 0x65, 0x61, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xe6, 0x05, 0x0a, - 0x09, 0x53, 0x74, 0x61, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x09, 0x70, 0x6f, - 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x50, 0x6f, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, - 0x00, 0x52, 0x08, 0x70, 0x6f, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x8e, 0x05, 0x0a, 0x08, - 0x50, 0x6f, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x38, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, - 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, - 0x50, 0x6f, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, - 0x77, 0x73, 0x1a, 0xc7, 0x04, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, - 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x68, 0x65, - 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x64, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, - 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x50, - 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, - 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x74, 0x63, 0x70, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x69, 0x6e, - 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x63, 0x70, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x52, 0x08, 0x74, 0x63, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x08, - 0x74, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x07, 0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x59, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x35, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x50, 0x6f, 0x64, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x2e, 0x52, 0x6f, 0x77, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x50, 0x6f, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x42, 0x79, - 0x50, 0x6f, 0x64, 0x1a, 0x57, 0x0a, 0x10, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x42, 0x79, 0x50, - 0x6f, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x50, 0x6f, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x07, 0x0a, 0x05, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x4b, 0x0a, 0x0c, 0x45, 0x64, 0x67, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, - 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x22, 0xb2, 0x01, 0x0a, 0x0d, 0x45, 0x64, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, - 0x45, 0x64, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4f, 0x6b, - 0x48, 0x00, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x33, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, - 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x2e, 0x0a, 0x02, 0x4f, - 0x6b, 0x12, 0x28, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, - 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbc, 0x01, 0x0a, 0x04, 0x45, 0x64, 0x67, 0x65, - 0x12, 0x28, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x03, 0x73, 0x72, 0x63, 0x12, 0x28, 0x0a, 0x03, 0x64, 0x73, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, - 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x03, 0x64, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x26, - 0x0a, 0x0f, 0x6e, 0x6f, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x4d, 0x73, 0x67, 0x22, 0xe2, 0x01, 0x0a, 0x10, 0x54, 0x6f, 0x70, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, - 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x29, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, - 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x04, - 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, - 0x0a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0xc2, 0x01, 0x0a, 0x11, - 0x54, 0x6f, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x33, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x34, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x54, 0x6f, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x4f, 0x6b, 0x48, 0x00, 0x52, 0x02, 0x6f, 0x6b, 0x1a, 0x36, 0x0a, 0x02, - 0x4f, 0x6b, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0xe7, 0x01, 0x0a, 0x0a, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x8a, 0x01, - 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x1c, 0x0a, 0x09, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0xd2, 0x02, 0x0a, 0x0d, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x04, - 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, - 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, - 0x73, 0x1a, 0x8b, 0x02, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, - 0x0a, 0x0f, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x24, 0x0a, - 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x5f, 0x70, 0x35, 0x30, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, - 0x50, 0x35, 0x30, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, - 0x73, 0x5f, 0x70, 0x39, 0x35, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x50, 0x39, 0x35, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x50, 0x39, 0x39, 0x22, - 0x8f, 0x01, 0x0a, 0x0f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x22, 0xd2, 0x01, 0x0a, 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x4f, 0x6b, 0x48, 0x00, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x33, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x69, 0x6e, - 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x1a, 0x48, 0x0a, 0x02, 0x4f, 0x6b, 0x12, 0x42, 0x0a, 0x0e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x73, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x0d, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xd0, 0x04, 0x0a, 0x03, 0x41, 0x70, 0x69, 0x12, 0x54, - 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x05, 0x45, 0x64, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x2e, - 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x64, 0x67, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x64, 0x67, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x08, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x73, 0x12, 0x1d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, - 0x76, 0x69, 0x7a, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, - 0x69, 0x7a, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x09, 0x54, 0x6f, 0x70, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x54, 0x6f, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x54, 0x6f, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, - 0x73, 0x12, 0x1d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x21, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, - 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x09, 0x53, - 0x65, 0x6c, 0x66, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x2d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x72, 0x64, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x53, 0x65, 0x6c, 0x66, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, - 0x64, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x53, 0x65, 0x6c, 0x66, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0x99, 0x01, 0x0a, 0x03, 0x54, 0x61, - 0x70, 0x12, 0x3e, 0x0a, 0x03, 0x54, 0x61, 0x70, 0x12, 0x18, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x03, 0x88, 0x02, 0x01, 0x30, - 0x01, 0x12, 0x52, 0x0a, 0x0d, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x22, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, - 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, - 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x03, - 0x88, 0x02, 0x01, 0x30, 0x01, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2f, 0x76, 0x69, 0x7a, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x76, 0x69, 0x7a, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_viz_proto_rawDescOnce sync.Once - file_viz_proto_rawDescData = file_viz_proto_rawDesc -) - -func file_viz_proto_rawDescGZIP() []byte { - file_viz_proto_rawDescOnce.Do(func() { - file_viz_proto_rawDescData = protoimpl.X.CompressGZIP(file_viz_proto_rawDescData) - }) - return file_viz_proto_rawDescData -} - -var file_viz_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_viz_proto_msgTypes = make([]protoimpl.MessageInfo, 61) -var file_viz_proto_goTypes = []interface{}{ - (HttpMethod_Registered)(0), // 0: linkerd2.viz.HttpMethod.Registered - (Scheme_Registered)(0), // 1: linkerd2.viz.Scheme.Registered - (TapEvent_ProxyDirection)(0), // 2: linkerd2.viz.TapEvent.ProxyDirection - (*Empty)(nil), // 3: linkerd2.viz.Empty - (*ListServicesRequest)(nil), // 4: linkerd2.viz.ListServicesRequest - (*ListServicesResponse)(nil), // 5: linkerd2.viz.ListServicesResponse - (*Service)(nil), // 6: linkerd2.viz.Service - (*ListPodsRequest)(nil), // 7: linkerd2.viz.ListPodsRequest - (*ListPodsResponse)(nil), // 8: linkerd2.viz.ListPodsResponse - (*Pod)(nil), // 9: linkerd2.viz.Pod - (*TapRequest)(nil), // 10: linkerd2.viz.TapRequest - (*TapByResourceRequest)(nil), // 11: linkerd2.viz.TapByResourceRequest - (*HttpMethod)(nil), // 12: linkerd2.viz.HttpMethod - (*Scheme)(nil), // 13: linkerd2.viz.Scheme - (*Headers)(nil), // 14: linkerd2.viz.Headers - (*Eos)(nil), // 15: linkerd2.viz.Eos - (*TapEvent)(nil), // 16: linkerd2.viz.TapEvent - (*ApiError)(nil), // 17: linkerd2.viz.ApiError - (*PodErrors)(nil), // 18: linkerd2.viz.PodErrors - (*Resource)(nil), // 19: linkerd2.viz.Resource - (*ResourceSelection)(nil), // 20: linkerd2.viz.ResourceSelection - (*ResourceError)(nil), // 21: linkerd2.viz.ResourceError - (*StatSummaryRequest)(nil), // 22: linkerd2.viz.StatSummaryRequest - (*StatSummaryResponse)(nil), // 23: linkerd2.viz.StatSummaryResponse - (*BasicStats)(nil), // 24: linkerd2.viz.BasicStats - (*TcpStats)(nil), // 25: linkerd2.viz.TcpStats - (*TrafficSplitStats)(nil), // 26: linkerd2.viz.TrafficSplitStats - (*StatTable)(nil), // 27: linkerd2.viz.StatTable - (*EdgesRequest)(nil), // 28: linkerd2.viz.EdgesRequest - (*EdgesResponse)(nil), // 29: linkerd2.viz.EdgesResponse - (*Edge)(nil), // 30: linkerd2.viz.Edge - (*TopRoutesRequest)(nil), // 31: linkerd2.viz.TopRoutesRequest - (*TopRoutesResponse)(nil), // 32: linkerd2.viz.TopRoutesResponse - (*RouteTable)(nil), // 33: linkerd2.viz.RouteTable - (*GatewaysTable)(nil), // 34: linkerd2.viz.GatewaysTable - (*GatewaysRequest)(nil), // 35: linkerd2.viz.GatewaysRequest - (*GatewaysResponse)(nil), // 36: linkerd2.viz.GatewaysResponse - (*TapByResourceRequest_Match)(nil), // 37: linkerd2.viz.TapByResourceRequest.Match - (*TapByResourceRequest_Extract)(nil), // 38: linkerd2.viz.TapByResourceRequest.Extract - (*TapByResourceRequest_Match_Seq)(nil), // 39: linkerd2.viz.TapByResourceRequest.Match.Seq - (*TapByResourceRequest_Match_Http)(nil), // 40: linkerd2.viz.TapByResourceRequest.Match.Http - (*TapByResourceRequest_Extract_Http)(nil), // 41: linkerd2.viz.TapByResourceRequest.Extract.Http - (*TapByResourceRequest_Extract_Http_Headers)(nil), // 42: linkerd2.viz.TapByResourceRequest.Extract.Http.Headers - (*Headers_Header)(nil), // 43: linkerd2.viz.Headers.Header - (*TapEvent_EndpointMeta)(nil), // 44: linkerd2.viz.TapEvent.EndpointMeta - (*TapEvent_RouteMeta)(nil), // 45: linkerd2.viz.TapEvent.RouteMeta - (*TapEvent_Http)(nil), // 46: linkerd2.viz.TapEvent.Http - nil, // 47: linkerd2.viz.TapEvent.EndpointMeta.LabelsEntry - nil, // 48: linkerd2.viz.TapEvent.RouteMeta.LabelsEntry - (*TapEvent_Http_StreamId)(nil), // 49: linkerd2.viz.TapEvent.Http.StreamId - (*TapEvent_Http_RequestInit)(nil), // 50: linkerd2.viz.TapEvent.Http.RequestInit - (*TapEvent_Http_ResponseInit)(nil), // 51: linkerd2.viz.TapEvent.Http.ResponseInit - (*TapEvent_Http_ResponseEnd)(nil), // 52: linkerd2.viz.TapEvent.Http.ResponseEnd - (*PodErrors_PodError)(nil), // 53: linkerd2.viz.PodErrors.PodError - (*PodErrors_PodError_ContainerError)(nil), // 54: linkerd2.viz.PodErrors.PodError.ContainerError - (*StatSummaryResponse_Ok)(nil), // 55: linkerd2.viz.StatSummaryResponse.Ok - (*StatTable_PodGroup)(nil), // 56: linkerd2.viz.StatTable.PodGroup - (*StatTable_PodGroup_Row)(nil), // 57: linkerd2.viz.StatTable.PodGroup.Row - nil, // 58: linkerd2.viz.StatTable.PodGroup.Row.ErrorsByPodEntry - (*EdgesResponse_Ok)(nil), // 59: linkerd2.viz.EdgesResponse.Ok - (*TopRoutesResponse_Ok)(nil), // 60: linkerd2.viz.TopRoutesResponse.Ok - (*RouteTable_Row)(nil), // 61: linkerd2.viz.RouteTable.Row - (*GatewaysTable_Row)(nil), // 62: linkerd2.viz.GatewaysTable.Row - (*GatewaysResponse_Ok)(nil), // 63: linkerd2.viz.GatewaysResponse.Ok - (*duration.Duration)(nil), // 64: google.protobuf.Duration - (*net.TcpAddress)(nil), // 65: linkerd2.common.net.TcpAddress - (*healthcheck.SelfCheckRequest)(nil), // 66: linkerd2.common.healthcheck.SelfCheckRequest - (*healthcheck.SelfCheckResponse)(nil), // 67: linkerd2.common.healthcheck.SelfCheckResponse -} -var file_viz_proto_depIdxs = []int32{ - 6, // 0: linkerd2.viz.ListServicesResponse.services:type_name -> linkerd2.viz.Service - 20, // 1: linkerd2.viz.ListPodsRequest.selector:type_name -> linkerd2.viz.ResourceSelection - 9, // 2: linkerd2.viz.ListPodsResponse.pods:type_name -> linkerd2.viz.Pod - 64, // 3: linkerd2.viz.Pod.sinceLastReport:type_name -> google.protobuf.Duration - 64, // 4: linkerd2.viz.Pod.uptime:type_name -> google.protobuf.Duration - 20, // 5: linkerd2.viz.TapByResourceRequest.target:type_name -> linkerd2.viz.ResourceSelection - 37, // 6: linkerd2.viz.TapByResourceRequest.match:type_name -> linkerd2.viz.TapByResourceRequest.Match - 38, // 7: linkerd2.viz.TapByResourceRequest.extract:type_name -> linkerd2.viz.TapByResourceRequest.Extract - 0, // 8: linkerd2.viz.HttpMethod.registered:type_name -> linkerd2.viz.HttpMethod.Registered - 1, // 9: linkerd2.viz.Scheme.registered:type_name -> linkerd2.viz.Scheme.Registered - 43, // 10: linkerd2.viz.Headers.headers:type_name -> linkerd2.viz.Headers.Header - 65, // 11: linkerd2.viz.TapEvent.source:type_name -> linkerd2.common.net.TcpAddress - 44, // 12: linkerd2.viz.TapEvent.source_meta:type_name -> linkerd2.viz.TapEvent.EndpointMeta - 65, // 13: linkerd2.viz.TapEvent.destination:type_name -> linkerd2.common.net.TcpAddress - 44, // 14: linkerd2.viz.TapEvent.destination_meta:type_name -> linkerd2.viz.TapEvent.EndpointMeta - 45, // 15: linkerd2.viz.TapEvent.route_meta:type_name -> linkerd2.viz.TapEvent.RouteMeta - 2, // 16: linkerd2.viz.TapEvent.proxy_direction:type_name -> linkerd2.viz.TapEvent.ProxyDirection - 46, // 17: linkerd2.viz.TapEvent.http:type_name -> linkerd2.viz.TapEvent.Http - 53, // 18: linkerd2.viz.PodErrors.errors:type_name -> linkerd2.viz.PodErrors.PodError - 19, // 19: linkerd2.viz.ResourceSelection.resource:type_name -> linkerd2.viz.Resource - 19, // 20: linkerd2.viz.ResourceError.resource:type_name -> linkerd2.viz.Resource - 20, // 21: linkerd2.viz.StatSummaryRequest.selector:type_name -> linkerd2.viz.ResourceSelection - 3, // 22: linkerd2.viz.StatSummaryRequest.none:type_name -> linkerd2.viz.Empty - 19, // 23: linkerd2.viz.StatSummaryRequest.to_resource:type_name -> linkerd2.viz.Resource - 19, // 24: linkerd2.viz.StatSummaryRequest.from_resource:type_name -> linkerd2.viz.Resource - 55, // 25: linkerd2.viz.StatSummaryResponse.ok:type_name -> linkerd2.viz.StatSummaryResponse.Ok - 21, // 26: linkerd2.viz.StatSummaryResponse.error:type_name -> linkerd2.viz.ResourceError - 56, // 27: linkerd2.viz.StatTable.pod_group:type_name -> linkerd2.viz.StatTable.PodGroup - 20, // 28: linkerd2.viz.EdgesRequest.selector:type_name -> linkerd2.viz.ResourceSelection - 59, // 29: linkerd2.viz.EdgesResponse.ok:type_name -> linkerd2.viz.EdgesResponse.Ok - 21, // 30: linkerd2.viz.EdgesResponse.error:type_name -> linkerd2.viz.ResourceError - 19, // 31: linkerd2.viz.Edge.src:type_name -> linkerd2.viz.Resource - 19, // 32: linkerd2.viz.Edge.dst:type_name -> linkerd2.viz.Resource - 20, // 33: linkerd2.viz.TopRoutesRequest.selector:type_name -> linkerd2.viz.ResourceSelection - 3, // 34: linkerd2.viz.TopRoutesRequest.none:type_name -> linkerd2.viz.Empty - 19, // 35: linkerd2.viz.TopRoutesRequest.to_resource:type_name -> linkerd2.viz.Resource - 21, // 36: linkerd2.viz.TopRoutesResponse.error:type_name -> linkerd2.viz.ResourceError - 60, // 37: linkerd2.viz.TopRoutesResponse.ok:type_name -> linkerd2.viz.TopRoutesResponse.Ok - 61, // 38: linkerd2.viz.RouteTable.rows:type_name -> linkerd2.viz.RouteTable.Row - 62, // 39: linkerd2.viz.GatewaysTable.rows:type_name -> linkerd2.viz.GatewaysTable.Row - 63, // 40: linkerd2.viz.GatewaysResponse.ok:type_name -> linkerd2.viz.GatewaysResponse.Ok - 21, // 41: linkerd2.viz.GatewaysResponse.error:type_name -> linkerd2.viz.ResourceError - 39, // 42: linkerd2.viz.TapByResourceRequest.Match.all:type_name -> linkerd2.viz.TapByResourceRequest.Match.Seq - 39, // 43: linkerd2.viz.TapByResourceRequest.Match.any:type_name -> linkerd2.viz.TapByResourceRequest.Match.Seq - 37, // 44: linkerd2.viz.TapByResourceRequest.Match.not:type_name -> linkerd2.viz.TapByResourceRequest.Match - 20, // 45: linkerd2.viz.TapByResourceRequest.Match.destinations:type_name -> linkerd2.viz.ResourceSelection - 40, // 46: linkerd2.viz.TapByResourceRequest.Match.http:type_name -> linkerd2.viz.TapByResourceRequest.Match.Http - 41, // 47: linkerd2.viz.TapByResourceRequest.Extract.http:type_name -> linkerd2.viz.TapByResourceRequest.Extract.Http - 37, // 48: linkerd2.viz.TapByResourceRequest.Match.Seq.matches:type_name -> linkerd2.viz.TapByResourceRequest.Match - 42, // 49: linkerd2.viz.TapByResourceRequest.Extract.Http.headers:type_name -> linkerd2.viz.TapByResourceRequest.Extract.Http.Headers - 47, // 50: linkerd2.viz.TapEvent.EndpointMeta.labels:type_name -> linkerd2.viz.TapEvent.EndpointMeta.LabelsEntry - 48, // 51: linkerd2.viz.TapEvent.RouteMeta.labels:type_name -> linkerd2.viz.TapEvent.RouteMeta.LabelsEntry - 50, // 52: linkerd2.viz.TapEvent.Http.request_init:type_name -> linkerd2.viz.TapEvent.Http.RequestInit - 51, // 53: linkerd2.viz.TapEvent.Http.response_init:type_name -> linkerd2.viz.TapEvent.Http.ResponseInit - 52, // 54: linkerd2.viz.TapEvent.Http.response_end:type_name -> linkerd2.viz.TapEvent.Http.ResponseEnd - 49, // 55: linkerd2.viz.TapEvent.Http.RequestInit.id:type_name -> linkerd2.viz.TapEvent.Http.StreamId - 12, // 56: linkerd2.viz.TapEvent.Http.RequestInit.method:type_name -> linkerd2.viz.HttpMethod - 13, // 57: linkerd2.viz.TapEvent.Http.RequestInit.scheme:type_name -> linkerd2.viz.Scheme - 14, // 58: linkerd2.viz.TapEvent.Http.RequestInit.headers:type_name -> linkerd2.viz.Headers - 49, // 59: linkerd2.viz.TapEvent.Http.ResponseInit.id:type_name -> linkerd2.viz.TapEvent.Http.StreamId - 64, // 60: linkerd2.viz.TapEvent.Http.ResponseInit.since_request_init:type_name -> google.protobuf.Duration - 14, // 61: linkerd2.viz.TapEvent.Http.ResponseInit.headers:type_name -> linkerd2.viz.Headers - 49, // 62: linkerd2.viz.TapEvent.Http.ResponseEnd.id:type_name -> linkerd2.viz.TapEvent.Http.StreamId - 64, // 63: linkerd2.viz.TapEvent.Http.ResponseEnd.since_request_init:type_name -> google.protobuf.Duration - 64, // 64: linkerd2.viz.TapEvent.Http.ResponseEnd.since_response_init:type_name -> google.protobuf.Duration - 15, // 65: linkerd2.viz.TapEvent.Http.ResponseEnd.eos:type_name -> linkerd2.viz.Eos - 14, // 66: linkerd2.viz.TapEvent.Http.ResponseEnd.trailers:type_name -> linkerd2.viz.Headers - 54, // 67: linkerd2.viz.PodErrors.PodError.container:type_name -> linkerd2.viz.PodErrors.PodError.ContainerError - 27, // 68: linkerd2.viz.StatSummaryResponse.Ok.stat_tables:type_name -> linkerd2.viz.StatTable - 57, // 69: linkerd2.viz.StatTable.PodGroup.rows:type_name -> linkerd2.viz.StatTable.PodGroup.Row - 19, // 70: linkerd2.viz.StatTable.PodGroup.Row.resource:type_name -> linkerd2.viz.Resource - 24, // 71: linkerd2.viz.StatTable.PodGroup.Row.stats:type_name -> linkerd2.viz.BasicStats - 25, // 72: linkerd2.viz.StatTable.PodGroup.Row.tcp_stats:type_name -> linkerd2.viz.TcpStats - 26, // 73: linkerd2.viz.StatTable.PodGroup.Row.ts_stats:type_name -> linkerd2.viz.TrafficSplitStats - 58, // 74: linkerd2.viz.StatTable.PodGroup.Row.errors_by_pod:type_name -> linkerd2.viz.StatTable.PodGroup.Row.ErrorsByPodEntry - 18, // 75: linkerd2.viz.StatTable.PodGroup.Row.ErrorsByPodEntry.value:type_name -> linkerd2.viz.PodErrors - 30, // 76: linkerd2.viz.EdgesResponse.Ok.edges:type_name -> linkerd2.viz.Edge - 33, // 77: linkerd2.viz.TopRoutesResponse.Ok.routes:type_name -> linkerd2.viz.RouteTable - 24, // 78: linkerd2.viz.RouteTable.Row.stats:type_name -> linkerd2.viz.BasicStats - 34, // 79: linkerd2.viz.GatewaysResponse.Ok.gateways_table:type_name -> linkerd2.viz.GatewaysTable - 22, // 80: linkerd2.viz.Api.StatSummary:input_type -> linkerd2.viz.StatSummaryRequest - 28, // 81: linkerd2.viz.Api.Edges:input_type -> linkerd2.viz.EdgesRequest - 35, // 82: linkerd2.viz.Api.Gateways:input_type -> linkerd2.viz.GatewaysRequest - 31, // 83: linkerd2.viz.Api.TopRoutes:input_type -> linkerd2.viz.TopRoutesRequest - 7, // 84: linkerd2.viz.Api.ListPods:input_type -> linkerd2.viz.ListPodsRequest - 4, // 85: linkerd2.viz.Api.ListServices:input_type -> linkerd2.viz.ListServicesRequest - 66, // 86: linkerd2.viz.Api.SelfCheck:input_type -> linkerd2.common.healthcheck.SelfCheckRequest - 10, // 87: linkerd2.viz.Tap.Tap:input_type -> linkerd2.viz.TapRequest - 11, // 88: linkerd2.viz.Tap.TapByResource:input_type -> linkerd2.viz.TapByResourceRequest - 23, // 89: linkerd2.viz.Api.StatSummary:output_type -> linkerd2.viz.StatSummaryResponse - 29, // 90: linkerd2.viz.Api.Edges:output_type -> linkerd2.viz.EdgesResponse - 36, // 91: linkerd2.viz.Api.Gateways:output_type -> linkerd2.viz.GatewaysResponse - 32, // 92: linkerd2.viz.Api.TopRoutes:output_type -> linkerd2.viz.TopRoutesResponse - 8, // 93: linkerd2.viz.Api.ListPods:output_type -> linkerd2.viz.ListPodsResponse - 5, // 94: linkerd2.viz.Api.ListServices:output_type -> linkerd2.viz.ListServicesResponse - 67, // 95: linkerd2.viz.Api.SelfCheck:output_type -> linkerd2.common.healthcheck.SelfCheckResponse - 16, // 96: linkerd2.viz.Tap.Tap:output_type -> linkerd2.viz.TapEvent - 16, // 97: linkerd2.viz.Tap.TapByResource:output_type -> linkerd2.viz.TapEvent - 89, // [89:98] is the sub-list for method output_type - 80, // [80:89] is the sub-list for method input_type - 80, // [80:80] is the sub-list for extension type_name - 80, // [80:80] is the sub-list for extension extendee - 0, // [0:80] is the sub-list for field type_name -} - -func init() { file_viz_proto_init() } -func file_viz_proto_init() { - if File_viz_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_viz_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Empty); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListServicesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListServicesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Service); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPodsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPodsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Pod); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapByResourceRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HttpMethod); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Scheme); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Headers); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Eos); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiError); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PodErrors); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_viz_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Resource); i { + 0x6f, 0x74, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x33, 0x0a, 0x13, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x22, 0x49, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x3b, 0x0a, 0x07, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x70, 0x0a, 0x0f, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x3b, + 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x39, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x25, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x50, 0x6f, 0x64, + 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x22, 0xfa, 0x04, 0x0a, 0x03, 0x50, 0x6f, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x64, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x70, 0x6f, 0x64, 0x49, 0x50, 0x12, 0x20, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0b, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x12, 0x37, 0x0a, + 0x16, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x15, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, + 0x75, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0a, 0x64, + 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x09, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x03, + 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x6a, 0x6f, 0x62, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x65, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x12, 0x43, + 0x0a, 0x0f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x75, 0x70, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x61, 0x64, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x22, 0x0a, 0x0c, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x22, 0xf1, 0x01, 0x0a, 0x0a, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x12, 0x45, 0x0a, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0a, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x75, 0x6e, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0c, 0x75, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x22, + 0x6e, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x12, 0x07, 0x0a, + 0x03, 0x47, 0x45, 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x01, + 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, + 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x41, 0x54, 0x43, 0x48, 0x10, 0x04, + 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x05, 0x12, 0x0b, 0x0a, + 0x07, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x45, + 0x41, 0x44, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x08, 0x42, + 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0c, 0x75, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x75, + 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x22, 0x21, 0x0a, 0x0a, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, + 0x50, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x01, 0x42, 0x06, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, + 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x63, 0x0a, 0x06, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x53, 0x74, 0x72, 0x12, 0x1d, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x62, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x08, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x42, 0x69, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x64, 0x0a, 0x03, 0x45, 0x6f, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x48, 0x00, 0x52, 0x0e, 0x67, 0x72, 0x70, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, + 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0e, + 0x72, 0x65, 0x73, 0x65, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x05, + 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x20, 0x0a, 0x08, 0x41, 0x70, 0x69, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa4, 0x02, 0x0a, 0x09, 0x50, 0x6f, 0x64, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, + 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x50, 0x6f, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x50, + 0x6f, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x1a, + 0xdc, 0x01, 0x0a, 0x08, 0x50, 0x6f, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4f, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x50, + 0x6f, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x50, 0x6f, 0x64, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x1a, 0x76, 0x0a, + 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x50, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0x6e, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, + 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x22, 0x59, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, + 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xdf, 0x02, 0x0a, 0x12, + 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x1f, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x12, 0x29, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x74, + 0x6f, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x6f, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x6b, 0x69, 0x70, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x63, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x74, 0x63, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0xce, 0x01, + 0x0a, 0x13, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4f, 0x6b, 0x48, 0x00, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x33, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x1a, 0x3e, 0x0a, 0x02, 0x4f, 0x6b, 0x12, 0x38, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, + 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xac, + 0x02, 0x0a, 0x0a, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x6e, + 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x5f, 0x70, 0x35, 0x30, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x50, 0x35, 0x30, 0x12, 0x24, 0x0a, + 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x5f, 0x70, 0x39, 0x35, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, + 0x50, 0x39, 0x35, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, + 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x74, + 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x50, 0x39, 0x39, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x63, 0x74, + 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x61, + 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x61, 0x63, 0x74, 0x75, 0x61, + 0x6c, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x8b, 0x01, + 0x0a, 0x08, 0x54, 0x63, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, + 0x65, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0e, 0x72, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x2a, 0x0a, 0x11, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x53, 0x0a, 0x11, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x61, 0x70, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x61, 0x70, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x22, 0xe6, 0x05, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x3f, + 0x0a, 0x09, 0x70, 0x6f, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x50, 0x6f, 0x64, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, + 0x8e, 0x05, 0x0a, 0x08, 0x50, 0x6f, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x38, 0x0a, 0x04, + 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x50, 0x6f, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x52, 0x6f, 0x77, + 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x1a, 0xc7, 0x04, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x32, + 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6d, + 0x65, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x64, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x09, 0x74, + 0x63, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x63, + 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x08, 0x74, 0x63, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x12, 0x3a, 0x0a, 0x08, 0x74, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, + 0x7a, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x52, 0x07, 0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x59, 0x0a, 0x0d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x6f, 0x64, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, + 0x69, 0x7a, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x50, 0x6f, 0x64, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x52, 0x6f, 0x77, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x42, 0x79, 0x50, 0x6f, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x64, 0x1a, 0x57, 0x0a, 0x10, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x42, 0x79, 0x50, 0x6f, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x50, 0x6f, 0x64, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x42, 0x07, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x4b, 0x0a, 0x0c, 0x45, 0x64, 0x67, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xb2, 0x01, 0x0a, 0x0d, 0x45, 0x64, 0x67, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x64, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x4f, 0x6b, 0x48, 0x00, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x33, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x1a, + 0x2e, 0x0a, 0x02, 0x4f, 0x6b, 0x12, 0x28, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x42, + 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbc, 0x01, 0x0a, 0x04, + 0x45, 0x64, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x03, 0x73, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x03, 0x73, 0x72, 0x63, 0x12, 0x28, + 0x0a, 0x03, 0x64, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x03, 0x64, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4d, 0x73, 0x67, 0x22, 0xe2, 0x01, 0x0a, 0x10, 0x54, + 0x6f, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x29, 0x0a, + 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x48, 0x00, 0x52, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x12, 0x39, 0x0a, 0x0b, 0x74, 0x6f, 0x5f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x22, + 0xc2, 0x01, 0x0a, 0x11, 0x54, 0x6f, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x34, 0x0a, 0x02, 0x6f, 0x6b, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x6f, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4f, 0x6b, 0x48, 0x00, 0x52, 0x02, 0x6f, 0x6b, + 0x1a, 0x36, 0x0a, 0x02, 0x4f, 0x6b, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe7, 0x01, 0x0a, 0x0a, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, + 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x52, + 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x1a, 0x8a, 0x01, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2e, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x42, 0x61, 0x73, + 0x69, 0x63, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0xd2, + 0x02, 0x0a, 0x0d, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x33, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x52, + 0x04, 0x72, 0x6f, 0x77, 0x73, 0x1a, 0x8b, 0x02, 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x70, 0x61, 0x69, + 0x72, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x61, + 0x6c, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x76, + 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x5f, + 0x70, 0x35, 0x30, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x6e, + 0x63, 0x79, 0x4d, 0x73, 0x50, 0x35, 0x30, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x6e, + 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x5f, 0x70, 0x39, 0x35, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x50, 0x39, 0x35, 0x12, 0x24, 0x0a, + 0x0e, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, + 0x50, 0x39, 0x39, 0x22, 0x8f, 0x01, 0x0a, 0x0f, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x22, 0xd2, 0x01, 0x0a, 0x10, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x02, 0x6f, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4f, 0x6b, 0x48, 0x00, 0x52, 0x02, 0x6f, 0x6b, 0x12, + 0x33, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x1a, 0x48, 0x0a, 0x02, 0x4f, 0x6b, 0x12, 0x42, 0x0a, 0x0e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, + 0x7a, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, + 0x0d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x0a, + 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xd0, 0x04, 0x0a, 0x03, 0x41, + 0x70, 0x69, 0x12, 0x54, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x12, 0x20, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, + 0x69, 0x7a, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x05, 0x45, 0x64, 0x67, 0x65, + 0x73, 0x12, 0x1a, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, + 0x2e, 0x45, 0x64, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x64, 0x67, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x08, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x12, 0x1d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, + 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, + 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x09, 0x54, 0x6f, 0x70, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x6f, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x54, 0x6f, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x08, 0x4c, 0x69, 0x73, + 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x1d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, + 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x76, 0x69, 0x7a, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x6c, 0x0a, 0x09, 0x53, 0x65, 0x6c, 0x66, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x2d, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x53, 0x65, 0x6c, 0x66, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2e, 0x53, 0x65, 0x6c, 0x66, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x35, 0x5a, + 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2f, 0x76, 0x69, 0x7a, + 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, + 0x2f, 0x76, 0x69, 0x7a, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_viz_proto_rawDescOnce sync.Once + file_viz_proto_rawDescData = file_viz_proto_rawDesc +) + +func file_viz_proto_rawDescGZIP() []byte { + file_viz_proto_rawDescOnce.Do(func() { + file_viz_proto_rawDescData = protoimpl.X.CompressGZIP(file_viz_proto_rawDescData) + }) + return file_viz_proto_rawDescData +} + +var file_viz_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_viz_proto_msgTypes = make([]protoimpl.MessageInfo, 43) +var file_viz_proto_goTypes = []interface{}{ + (HttpMethod_Registered)(0), // 0: linkerd2.viz.HttpMethod.Registered + (Scheme_Registered)(0), // 1: linkerd2.viz.Scheme.Registered + (*Empty)(nil), // 2: linkerd2.viz.Empty + (*ListServicesRequest)(nil), // 3: linkerd2.viz.ListServicesRequest + (*ListServicesResponse)(nil), // 4: linkerd2.viz.ListServicesResponse + (*Service)(nil), // 5: linkerd2.viz.Service + (*ListPodsRequest)(nil), // 6: linkerd2.viz.ListPodsRequest + (*ListPodsResponse)(nil), // 7: linkerd2.viz.ListPodsResponse + (*Pod)(nil), // 8: linkerd2.viz.Pod + (*HttpMethod)(nil), // 9: linkerd2.viz.HttpMethod + (*Scheme)(nil), // 10: linkerd2.viz.Scheme + (*Headers)(nil), // 11: linkerd2.viz.Headers + (*Eos)(nil), // 12: linkerd2.viz.Eos + (*ApiError)(nil), // 13: linkerd2.viz.ApiError + (*PodErrors)(nil), // 14: linkerd2.viz.PodErrors + (*Resource)(nil), // 15: linkerd2.viz.Resource + (*ResourceSelection)(nil), // 16: linkerd2.viz.ResourceSelection + (*ResourceError)(nil), // 17: linkerd2.viz.ResourceError + (*StatSummaryRequest)(nil), // 18: linkerd2.viz.StatSummaryRequest + (*StatSummaryResponse)(nil), // 19: linkerd2.viz.StatSummaryResponse + (*BasicStats)(nil), // 20: linkerd2.viz.BasicStats + (*TcpStats)(nil), // 21: linkerd2.viz.TcpStats + (*TrafficSplitStats)(nil), // 22: linkerd2.viz.TrafficSplitStats + (*StatTable)(nil), // 23: linkerd2.viz.StatTable + (*EdgesRequest)(nil), // 24: linkerd2.viz.EdgesRequest + (*EdgesResponse)(nil), // 25: linkerd2.viz.EdgesResponse + (*Edge)(nil), // 26: linkerd2.viz.Edge + (*TopRoutesRequest)(nil), // 27: linkerd2.viz.TopRoutesRequest + (*TopRoutesResponse)(nil), // 28: linkerd2.viz.TopRoutesResponse + (*RouteTable)(nil), // 29: linkerd2.viz.RouteTable + (*GatewaysTable)(nil), // 30: linkerd2.viz.GatewaysTable + (*GatewaysRequest)(nil), // 31: linkerd2.viz.GatewaysRequest + (*GatewaysResponse)(nil), // 32: linkerd2.viz.GatewaysResponse + (*Headers_Header)(nil), // 33: linkerd2.viz.Headers.Header + (*PodErrors_PodError)(nil), // 34: linkerd2.viz.PodErrors.PodError + (*PodErrors_PodError_ContainerError)(nil), // 35: linkerd2.viz.PodErrors.PodError.ContainerError + (*StatSummaryResponse_Ok)(nil), // 36: linkerd2.viz.StatSummaryResponse.Ok + (*StatTable_PodGroup)(nil), // 37: linkerd2.viz.StatTable.PodGroup + (*StatTable_PodGroup_Row)(nil), // 38: linkerd2.viz.StatTable.PodGroup.Row + nil, // 39: linkerd2.viz.StatTable.PodGroup.Row.ErrorsByPodEntry + (*EdgesResponse_Ok)(nil), // 40: linkerd2.viz.EdgesResponse.Ok + (*TopRoutesResponse_Ok)(nil), // 41: linkerd2.viz.TopRoutesResponse.Ok + (*RouteTable_Row)(nil), // 42: linkerd2.viz.RouteTable.Row + (*GatewaysTable_Row)(nil), // 43: linkerd2.viz.GatewaysTable.Row + (*GatewaysResponse_Ok)(nil), // 44: linkerd2.viz.GatewaysResponse.Ok + (*duration.Duration)(nil), // 45: google.protobuf.Duration + (*healthcheck.SelfCheckRequest)(nil), // 46: linkerd2.common.healthcheck.SelfCheckRequest + (*healthcheck.SelfCheckResponse)(nil), // 47: linkerd2.common.healthcheck.SelfCheckResponse +} +var file_viz_proto_depIdxs = []int32{ + 5, // 0: linkerd2.viz.ListServicesResponse.services:type_name -> linkerd2.viz.Service + 16, // 1: linkerd2.viz.ListPodsRequest.selector:type_name -> linkerd2.viz.ResourceSelection + 8, // 2: linkerd2.viz.ListPodsResponse.pods:type_name -> linkerd2.viz.Pod + 45, // 3: linkerd2.viz.Pod.sinceLastReport:type_name -> google.protobuf.Duration + 45, // 4: linkerd2.viz.Pod.uptime:type_name -> google.protobuf.Duration + 0, // 5: linkerd2.viz.HttpMethod.registered:type_name -> linkerd2.viz.HttpMethod.Registered + 1, // 6: linkerd2.viz.Scheme.registered:type_name -> linkerd2.viz.Scheme.Registered + 33, // 7: linkerd2.viz.Headers.headers:type_name -> linkerd2.viz.Headers.Header + 34, // 8: linkerd2.viz.PodErrors.errors:type_name -> linkerd2.viz.PodErrors.PodError + 15, // 9: linkerd2.viz.ResourceSelection.resource:type_name -> linkerd2.viz.Resource + 15, // 10: linkerd2.viz.ResourceError.resource:type_name -> linkerd2.viz.Resource + 16, // 11: linkerd2.viz.StatSummaryRequest.selector:type_name -> linkerd2.viz.ResourceSelection + 2, // 12: linkerd2.viz.StatSummaryRequest.none:type_name -> linkerd2.viz.Empty + 15, // 13: linkerd2.viz.StatSummaryRequest.to_resource:type_name -> linkerd2.viz.Resource + 15, // 14: linkerd2.viz.StatSummaryRequest.from_resource:type_name -> linkerd2.viz.Resource + 36, // 15: linkerd2.viz.StatSummaryResponse.ok:type_name -> linkerd2.viz.StatSummaryResponse.Ok + 17, // 16: linkerd2.viz.StatSummaryResponse.error:type_name -> linkerd2.viz.ResourceError + 37, // 17: linkerd2.viz.StatTable.pod_group:type_name -> linkerd2.viz.StatTable.PodGroup + 16, // 18: linkerd2.viz.EdgesRequest.selector:type_name -> linkerd2.viz.ResourceSelection + 40, // 19: linkerd2.viz.EdgesResponse.ok:type_name -> linkerd2.viz.EdgesResponse.Ok + 17, // 20: linkerd2.viz.EdgesResponse.error:type_name -> linkerd2.viz.ResourceError + 15, // 21: linkerd2.viz.Edge.src:type_name -> linkerd2.viz.Resource + 15, // 22: linkerd2.viz.Edge.dst:type_name -> linkerd2.viz.Resource + 16, // 23: linkerd2.viz.TopRoutesRequest.selector:type_name -> linkerd2.viz.ResourceSelection + 2, // 24: linkerd2.viz.TopRoutesRequest.none:type_name -> linkerd2.viz.Empty + 15, // 25: linkerd2.viz.TopRoutesRequest.to_resource:type_name -> linkerd2.viz.Resource + 17, // 26: linkerd2.viz.TopRoutesResponse.error:type_name -> linkerd2.viz.ResourceError + 41, // 27: linkerd2.viz.TopRoutesResponse.ok:type_name -> linkerd2.viz.TopRoutesResponse.Ok + 42, // 28: linkerd2.viz.RouteTable.rows:type_name -> linkerd2.viz.RouteTable.Row + 43, // 29: linkerd2.viz.GatewaysTable.rows:type_name -> linkerd2.viz.GatewaysTable.Row + 44, // 30: linkerd2.viz.GatewaysResponse.ok:type_name -> linkerd2.viz.GatewaysResponse.Ok + 17, // 31: linkerd2.viz.GatewaysResponse.error:type_name -> linkerd2.viz.ResourceError + 35, // 32: linkerd2.viz.PodErrors.PodError.container:type_name -> linkerd2.viz.PodErrors.PodError.ContainerError + 23, // 33: linkerd2.viz.StatSummaryResponse.Ok.stat_tables:type_name -> linkerd2.viz.StatTable + 38, // 34: linkerd2.viz.StatTable.PodGroup.rows:type_name -> linkerd2.viz.StatTable.PodGroup.Row + 15, // 35: linkerd2.viz.StatTable.PodGroup.Row.resource:type_name -> linkerd2.viz.Resource + 20, // 36: linkerd2.viz.StatTable.PodGroup.Row.stats:type_name -> linkerd2.viz.BasicStats + 21, // 37: linkerd2.viz.StatTable.PodGroup.Row.tcp_stats:type_name -> linkerd2.viz.TcpStats + 22, // 38: linkerd2.viz.StatTable.PodGroup.Row.ts_stats:type_name -> linkerd2.viz.TrafficSplitStats + 39, // 39: linkerd2.viz.StatTable.PodGroup.Row.errors_by_pod:type_name -> linkerd2.viz.StatTable.PodGroup.Row.ErrorsByPodEntry + 14, // 40: linkerd2.viz.StatTable.PodGroup.Row.ErrorsByPodEntry.value:type_name -> linkerd2.viz.PodErrors + 26, // 41: linkerd2.viz.EdgesResponse.Ok.edges:type_name -> linkerd2.viz.Edge + 29, // 42: linkerd2.viz.TopRoutesResponse.Ok.routes:type_name -> linkerd2.viz.RouteTable + 20, // 43: linkerd2.viz.RouteTable.Row.stats:type_name -> linkerd2.viz.BasicStats + 30, // 44: linkerd2.viz.GatewaysResponse.Ok.gateways_table:type_name -> linkerd2.viz.GatewaysTable + 18, // 45: linkerd2.viz.Api.StatSummary:input_type -> linkerd2.viz.StatSummaryRequest + 24, // 46: linkerd2.viz.Api.Edges:input_type -> linkerd2.viz.EdgesRequest + 31, // 47: linkerd2.viz.Api.Gateways:input_type -> linkerd2.viz.GatewaysRequest + 27, // 48: linkerd2.viz.Api.TopRoutes:input_type -> linkerd2.viz.TopRoutesRequest + 6, // 49: linkerd2.viz.Api.ListPods:input_type -> linkerd2.viz.ListPodsRequest + 3, // 50: linkerd2.viz.Api.ListServices:input_type -> linkerd2.viz.ListServicesRequest + 46, // 51: linkerd2.viz.Api.SelfCheck:input_type -> linkerd2.common.healthcheck.SelfCheckRequest + 19, // 52: linkerd2.viz.Api.StatSummary:output_type -> linkerd2.viz.StatSummaryResponse + 25, // 53: linkerd2.viz.Api.Edges:output_type -> linkerd2.viz.EdgesResponse + 32, // 54: linkerd2.viz.Api.Gateways:output_type -> linkerd2.viz.GatewaysResponse + 28, // 55: linkerd2.viz.Api.TopRoutes:output_type -> linkerd2.viz.TopRoutesResponse + 7, // 56: linkerd2.viz.Api.ListPods:output_type -> linkerd2.viz.ListPodsResponse + 4, // 57: linkerd2.viz.Api.ListServices:output_type -> linkerd2.viz.ListServicesResponse + 47, // 58: linkerd2.viz.Api.SelfCheck:output_type -> linkerd2.common.healthcheck.SelfCheckResponse + 52, // [52:59] is the sub-list for method output_type + 45, // [45:52] is the sub-list for method input_type + 45, // [45:45] is the sub-list for extension type_name + 45, // [45:45] is the sub-list for extension extendee + 0, // [0:45] is the sub-list for field type_name +} + +func init() { file_viz_proto_init() } +func file_viz_proto_init() { + if File_viz_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_viz_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { case 0: return &v.state case 1: @@ -5496,8 +3688,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceSelection); i { + file_viz_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListServicesRequest); i { case 0: return &v.state case 1: @@ -5508,8 +3700,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceError); i { + file_viz_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListServicesResponse); i { case 0: return &v.state case 1: @@ -5520,8 +3712,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatSummaryRequest); i { + file_viz_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Service); i { case 0: return &v.state case 1: @@ -5532,8 +3724,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatSummaryResponse); i { + file_viz_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListPodsRequest); i { case 0: return &v.state case 1: @@ -5544,8 +3736,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BasicStats); i { + file_viz_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListPodsResponse); i { case 0: return &v.state case 1: @@ -5556,8 +3748,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TcpStats); i { + file_viz_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Pod); i { case 0: return &v.state case 1: @@ -5568,8 +3760,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficSplitStats); i { + file_viz_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HttpMethod); i { case 0: return &v.state case 1: @@ -5580,8 +3772,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatTable); i { + file_viz_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Scheme); i { case 0: return &v.state case 1: @@ -5592,8 +3784,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EdgesRequest); i { + file_viz_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Headers); i { case 0: return &v.state case 1: @@ -5604,8 +3796,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EdgesResponse); i { + file_viz_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Eos); i { case 0: return &v.state case 1: @@ -5616,8 +3808,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Edge); i { + file_viz_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApiError); i { case 0: return &v.state case 1: @@ -5628,8 +3820,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TopRoutesRequest); i { + file_viz_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PodErrors); i { case 0: return &v.state case 1: @@ -5640,8 +3832,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TopRoutesResponse); i { + file_viz_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Resource); i { case 0: return &v.state case 1: @@ -5652,8 +3844,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RouteTable); i { + file_viz_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceSelection); i { case 0: return &v.state case 1: @@ -5664,8 +3856,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GatewaysTable); i { + file_viz_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceError); i { case 0: return &v.state case 1: @@ -5676,8 +3868,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GatewaysRequest); i { + file_viz_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatSummaryRequest); i { case 0: return &v.state case 1: @@ -5688,8 +3880,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GatewaysResponse); i { + file_viz_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatSummaryResponse); i { case 0: return &v.state case 1: @@ -5700,8 +3892,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapByResourceRequest_Match); i { + file_viz_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BasicStats); i { case 0: return &v.state case 1: @@ -5712,8 +3904,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapByResourceRequest_Extract); i { + file_viz_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TcpStats); i { case 0: return &v.state case 1: @@ -5724,8 +3916,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapByResourceRequest_Match_Seq); i { + file_viz_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TrafficSplitStats); i { case 0: return &v.state case 1: @@ -5736,8 +3928,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapByResourceRequest_Match_Http); i { + file_viz_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatTable); i { case 0: return &v.state case 1: @@ -5748,8 +3940,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapByResourceRequest_Extract_Http); i { + file_viz_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EdgesRequest); i { case 0: return &v.state case 1: @@ -5760,8 +3952,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapByResourceRequest_Extract_Http_Headers); i { + file_viz_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EdgesResponse); i { case 0: return &v.state case 1: @@ -5772,8 +3964,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Headers_Header); i { + file_viz_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Edge); i { case 0: return &v.state case 1: @@ -5784,8 +3976,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapEvent_EndpointMeta); i { + file_viz_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TopRoutesRequest); i { case 0: return &v.state case 1: @@ -5796,8 +3988,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapEvent_RouteMeta); i { + file_viz_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TopRoutesResponse); i { case 0: return &v.state case 1: @@ -5808,8 +4000,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapEvent_Http); i { + file_viz_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RouteTable); i { case 0: return &v.state case 1: @@ -5820,8 +4012,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapEvent_Http_StreamId); i { + file_viz_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GatewaysTable); i { case 0: return &v.state case 1: @@ -5832,8 +4024,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapEvent_Http_RequestInit); i { + file_viz_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GatewaysRequest); i { case 0: return &v.state case 1: @@ -5844,8 +4036,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapEvent_Http_ResponseInit); i { + file_viz_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GatewaysResponse); i { case 0: return &v.state case 1: @@ -5856,8 +4048,8 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TapEvent_Http_ResponseEnd); i { + file_viz_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Headers_Header); i { case 0: return &v.state case 1: @@ -5868,7 +4060,7 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_viz_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PodErrors_PodError); i { case 0: return &v.state @@ -5880,7 +4072,7 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_viz_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PodErrors_PodError_ContainerError); i { case 0: return &v.state @@ -5892,7 +4084,7 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_viz_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatSummaryResponse_Ok); i { case 0: return &v.state @@ -5904,7 +4096,7 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_viz_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatTable_PodGroup); i { case 0: return &v.state @@ -5916,7 +4108,7 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_viz_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatTable_PodGroup_Row); i { case 0: return &v.state @@ -5928,7 +4120,7 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_viz_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EdgesResponse_Ok); i { case 0: return &v.state @@ -5940,7 +4132,7 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_viz_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TopRoutesResponse_Ok); i { case 0: return &v.state @@ -5952,7 +4144,7 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_viz_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RouteTable_Row); i { case 0: return &v.state @@ -5964,7 +4156,7 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_viz_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GatewaysTable_Row); i { case 0: return &v.state @@ -5976,7 +4168,7 @@ func file_viz_proto_init() { return nil } } - file_viz_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_viz_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GatewaysResponse_Ok); i { case 0: return &v.state @@ -5998,81 +4190,50 @@ func file_viz_proto_init() { (*Pod_Job)(nil), } file_viz_proto_msgTypes[7].OneofWrappers = []interface{}{ - (*TapRequest_Pod)(nil), - (*TapRequest_Deployment)(nil), - } - file_viz_proto_msgTypes[9].OneofWrappers = []interface{}{ (*HttpMethod_Registered_)(nil), (*HttpMethod_Unregistered)(nil), } - file_viz_proto_msgTypes[10].OneofWrappers = []interface{}{ + file_viz_proto_msgTypes[8].OneofWrappers = []interface{}{ (*Scheme_Registered_)(nil), (*Scheme_Unregistered)(nil), } - file_viz_proto_msgTypes[12].OneofWrappers = []interface{}{ + file_viz_proto_msgTypes[10].OneofWrappers = []interface{}{ (*Eos_GrpcStatusCode)(nil), (*Eos_ResetErrorCode)(nil), } - file_viz_proto_msgTypes[13].OneofWrappers = []interface{}{ - (*TapEvent_Http_)(nil), - } - file_viz_proto_msgTypes[19].OneofWrappers = []interface{}{ + file_viz_proto_msgTypes[16].OneofWrappers = []interface{}{ (*StatSummaryRequest_None)(nil), (*StatSummaryRequest_ToResource)(nil), (*StatSummaryRequest_FromResource)(nil), } - file_viz_proto_msgTypes[20].OneofWrappers = []interface{}{ + file_viz_proto_msgTypes[17].OneofWrappers = []interface{}{ (*StatSummaryResponse_Ok_)(nil), (*StatSummaryResponse_Error)(nil), } - file_viz_proto_msgTypes[24].OneofWrappers = []interface{}{ + file_viz_proto_msgTypes[21].OneofWrappers = []interface{}{ (*StatTable_PodGroup_)(nil), } - file_viz_proto_msgTypes[26].OneofWrappers = []interface{}{ + file_viz_proto_msgTypes[23].OneofWrappers = []interface{}{ (*EdgesResponse_Ok_)(nil), (*EdgesResponse_Error)(nil), } - file_viz_proto_msgTypes[28].OneofWrappers = []interface{}{ + file_viz_proto_msgTypes[25].OneofWrappers = []interface{}{ (*TopRoutesRequest_None)(nil), (*TopRoutesRequest_ToResource)(nil), } - file_viz_proto_msgTypes[29].OneofWrappers = []interface{}{ + file_viz_proto_msgTypes[26].OneofWrappers = []interface{}{ (*TopRoutesResponse_Error)(nil), (*TopRoutesResponse_Ok_)(nil), } - file_viz_proto_msgTypes[33].OneofWrappers = []interface{}{ + file_viz_proto_msgTypes[30].OneofWrappers = []interface{}{ (*GatewaysResponse_Ok_)(nil), (*GatewaysResponse_Error)(nil), } - file_viz_proto_msgTypes[34].OneofWrappers = []interface{}{ - (*TapByResourceRequest_Match_All)(nil), - (*TapByResourceRequest_Match_Any)(nil), - (*TapByResourceRequest_Match_Not)(nil), - (*TapByResourceRequest_Match_Destinations)(nil), - (*TapByResourceRequest_Match_Http_)(nil), - } - file_viz_proto_msgTypes[35].OneofWrappers = []interface{}{ - (*TapByResourceRequest_Extract_Http_)(nil), - } - file_viz_proto_msgTypes[37].OneofWrappers = []interface{}{ - (*TapByResourceRequest_Match_Http_Scheme)(nil), - (*TapByResourceRequest_Match_Http_Method)(nil), - (*TapByResourceRequest_Match_Http_Authority)(nil), - (*TapByResourceRequest_Match_Http_Path)(nil), - } - file_viz_proto_msgTypes[38].OneofWrappers = []interface{}{ - (*TapByResourceRequest_Extract_Http_Headers_)(nil), - } - file_viz_proto_msgTypes[40].OneofWrappers = []interface{}{ + file_viz_proto_msgTypes[31].OneofWrappers = []interface{}{ (*Headers_Header_ValueStr)(nil), (*Headers_Header_ValueBin)(nil), } - file_viz_proto_msgTypes[43].OneofWrappers = []interface{}{ - (*TapEvent_Http_RequestInit_)(nil), - (*TapEvent_Http_ResponseInit_)(nil), - (*TapEvent_Http_ResponseEnd_)(nil), - } - file_viz_proto_msgTypes[50].OneofWrappers = []interface{}{ + file_viz_proto_msgTypes[32].OneofWrappers = []interface{}{ (*PodErrors_PodError_Container)(nil), } type x struct{} @@ -6080,10 +4241,10 @@ func file_viz_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_viz_proto_rawDesc, - NumEnums: 3, - NumMessages: 61, + NumEnums: 2, + NumMessages: 43, NumExtensions: 0, - NumServices: 2, + NumServices: 1, }, GoTypes: file_viz_proto_goTypes, DependencyIndexes: file_viz_proto_depIdxs, @@ -6391,171 +4552,3 @@ var _Api_serviceDesc = grpc.ServiceDesc{ Streams: []grpc.StreamDesc{}, Metadata: "viz.proto", } - -// TapClient is the client API for Tap service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type TapClient interface { - // Deprecated: Do not use. - Tap(ctx context.Context, in *TapRequest, opts ...grpc.CallOption) (Tap_TapClient, error) - // Deprecated: Do not use. - TapByResource(ctx context.Context, in *TapByResourceRequest, opts ...grpc.CallOption) (Tap_TapByResourceClient, error) -} - -type tapClient struct { - cc grpc.ClientConnInterface -} - -func NewTapClient(cc grpc.ClientConnInterface) TapClient { - return &tapClient{cc} -} - -// Deprecated: Do not use. -func (c *tapClient) Tap(ctx context.Context, in *TapRequest, opts ...grpc.CallOption) (Tap_TapClient, error) { - stream, err := c.cc.NewStream(ctx, &_Tap_serviceDesc.Streams[0], "/linkerd2.viz.Tap/Tap", opts...) - if err != nil { - return nil, err - } - x := &tapTapClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Tap_TapClient interface { - Recv() (*TapEvent, error) - grpc.ClientStream -} - -type tapTapClient struct { - grpc.ClientStream -} - -func (x *tapTapClient) Recv() (*TapEvent, error) { - m := new(TapEvent) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// Deprecated: Do not use. -func (c *tapClient) TapByResource(ctx context.Context, in *TapByResourceRequest, opts ...grpc.CallOption) (Tap_TapByResourceClient, error) { - stream, err := c.cc.NewStream(ctx, &_Tap_serviceDesc.Streams[1], "/linkerd2.viz.Tap/TapByResource", opts...) - if err != nil { - return nil, err - } - x := &tapTapByResourceClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Tap_TapByResourceClient interface { - Recv() (*TapEvent, error) - grpc.ClientStream -} - -type tapTapByResourceClient struct { - grpc.ClientStream -} - -func (x *tapTapByResourceClient) Recv() (*TapEvent, error) { - m := new(TapEvent) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// TapServer is the server API for Tap service. -type TapServer interface { - // Deprecated: Do not use. - Tap(*TapRequest, Tap_TapServer) error - // Deprecated: Do not use. - TapByResource(*TapByResourceRequest, Tap_TapByResourceServer) error -} - -// UnimplementedTapServer can be embedded to have forward compatible implementations. -type UnimplementedTapServer struct { -} - -func (*UnimplementedTapServer) Tap(*TapRequest, Tap_TapServer) error { - return status.Errorf(codes.Unimplemented, "method Tap not implemented") -} -func (*UnimplementedTapServer) TapByResource(*TapByResourceRequest, Tap_TapByResourceServer) error { - return status.Errorf(codes.Unimplemented, "method TapByResource not implemented") -} - -func RegisterTapServer(s *grpc.Server, srv TapServer) { - s.RegisterService(&_Tap_serviceDesc, srv) -} - -func _Tap_Tap_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(TapRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(TapServer).Tap(m, &tapTapServer{stream}) -} - -type Tap_TapServer interface { - Send(*TapEvent) error - grpc.ServerStream -} - -type tapTapServer struct { - grpc.ServerStream -} - -func (x *tapTapServer) Send(m *TapEvent) error { - return x.ServerStream.SendMsg(m) -} - -func _Tap_TapByResource_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(TapByResourceRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(TapServer).TapByResource(m, &tapTapByResourceServer{stream}) -} - -type Tap_TapByResourceServer interface { - Send(*TapEvent) error - grpc.ServerStream -} - -type tapTapByResourceServer struct { - grpc.ServerStream -} - -func (x *tapTapByResourceServer) Send(m *TapEvent) error { - return x.ServerStream.SendMsg(m) -} - -var _Tap_serviceDesc = grpc.ServiceDesc{ - ServiceName: "linkerd2.viz.Tap", - HandlerType: (*TapServer)(nil), - Methods: []grpc.MethodDesc{}, - Streams: []grpc.StreamDesc{ - { - StreamName: "Tap", - Handler: _Tap_Tap_Handler, - ServerStreams: true, - }, - { - StreamName: "TapByResource", - Handler: _Tap_TapByResource_Handler, - ServerStreams: true, - }, - }, - Metadata: "viz.proto", -} diff --git a/viz/metrics-api/proto/viz.proto b/viz/metrics-api/proto/viz.proto index b44d1e04ad0a1..97308c06cbe0e 100644 --- a/viz/metrics-api/proto/viz.proto +++ b/viz/metrics-api/proto/viz.proto @@ -4,7 +4,6 @@ package linkerd2.viz; import "google/protobuf/duration.proto"; import "common/healthcheck.proto"; -import "common/net.proto"; option go_package = "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz"; @@ -51,89 +50,6 @@ message Pod { string resourceVersion = 17; // resource version in the Kubernetes API } -message TapRequest { - option deprecated = true; - - oneof target { - string pod = 1; - string deployment = 2; - } - // validation of these fields happens on the server - float maxRps = 3; - uint32 toPort = 4; - string toIP = 5; - uint32 fromPort = 6; - string fromIP = 7; - string scheme = 8; - string method = 9; - string authority = 10; - string path = 11; -} - -// A tap request over kubernetes resources. -// -// This is used only by the tap APIServer. -message TapByResourceRequest { - // Describes the kubernetes pods that should be tapped. - ResourceSelection target = 1; - - // Selects over events to be reported. - Match match = 2; - - // Limits the number of events to be inspected. - float maxRps = 3; - - message Match { - oneof match { - // If empty, matches all messages. - Seq all = 1; - - // If empty, matches no messages. - Seq any = 2; - - // Inverts the inner match. - Match not = 3; - - // Matches events being sent to any of the selected destinations. - ResourceSelection destinations = 4; - - // Matches HTTP requests by their metadata. - Http http = 5; - } - - message Seq { - repeated Match matches = 1; - } - - message Http { - oneof match { - string scheme = 1; - string method = 2; - string authority = 3; - string path = 4; - } - } - } - - // Conditionally extracts components from requests and responses to include - // in tap events - Extract extract = 4; - - message Extract { - oneof extract { - Http http = 1; - } - - message Http { - oneof extract { - Headers headers = 1; - } - - message Headers {} - } - } -} - message HttpMethod { enum Registered { GET = 0; @@ -188,81 +104,6 @@ message Eos { } } -// This is used only by the tap APIServer. -message TapEvent { - linkerd2.common.net.TcpAddress source = 1; - EndpointMeta source_meta = 5; - - linkerd2.common.net.TcpAddress destination = 2; - EndpointMeta destination_meta = 4; - - RouteMeta route_meta = 7; - - ProxyDirection proxy_direction = 6; - enum ProxyDirection { - UNKNOWN = 0; - INBOUND = 1; - OUTBOUND = 2; - } - - oneof event { - Http http = 3; - } - - message EndpointMeta { - map labels = 1; - } - - message RouteMeta { - map labels = 1; - } - - message Http { - oneof event { - RequestInit request_init = 1; - ResponseInit response_init = 2; - ResponseEnd response_end = 3; - } - - message StreamId { - // A randomized base (stable across a process's runtime) - uint32 base = 1; - - // A stream id unique within the lifetime of `base`. - uint64 stream = 2; - } - - message RequestInit { - StreamId id = 1; - HttpMethod method = 2; - Scheme scheme = 3; - string authority = 4; - string path = 5; - Headers headers = 6; - } - - message ResponseInit { - StreamId id = 1; - - google.protobuf.Duration since_request_init = 2; - - uint32 http_status = 3; - Headers headers = 4; - } - - message ResponseEnd { - StreamId id = 1; - - google.protobuf.Duration since_request_init = 2; - google.protobuf.Duration since_response_init = 3; - uint64 response_bytes = 4; - - Eos eos = 5; - Headers trailers = 6; - } - } -} - message ApiError { string error = 1; } @@ -507,8 +348,3 @@ service Api { rpc SelfCheck(linkerd2.common.healthcheck.SelfCheckRequest) returns (linkerd2.common.healthcheck.SelfCheckResponse) {} } - -service Tap { - rpc Tap(TapRequest) returns (stream TapEvent) { option deprecated = true; } - rpc TapByResource(TapByResourceRequest) returns (stream TapEvent) { option deprecated = true; } -} diff --git a/viz/pkg/api/api.go b/viz/pkg/api/api.go index 76b12b6b61434..6fac72685d583 100644 --- a/viz/pkg/api/api.go +++ b/viz/pkg/api/api.go @@ -6,10 +6,28 @@ import ( "time" "github.com/linkerd/linkerd2/pkg/healthcheck" + "github.com/linkerd/linkerd2/pkg/k8s" pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" vizHealthCheck "github.com/linkerd/linkerd2/viz/pkg/healthcheck" ) +// ValidTargets specifies resource types allowed as a target: +// - target resource on an inbound query +// - target resource on an outbound 'to' query +// - destination resource on an outbound 'from' query +var ValidTargets = []string{ + k8s.Authority, + k8s.CronJob, + k8s.DaemonSet, + k8s.Deployment, + k8s.Job, + k8s.Namespace, + k8s.Pod, + k8s.ReplicaSet, + k8s.ReplicationController, + k8s.StatefulSet, +} + // CheckClientOrExit builds a new Viz API client and executes default status // checks to determine if the client can successfully perform cli commands. If the // checks fail, then CLI will print an error and exit. diff --git a/viz/tap/Dockerfile b/viz/tap/Dockerfile new file mode 100644 index 0000000000000..393388c4a41dd --- /dev/null +++ b/viz/tap/Dockerfile @@ -0,0 +1,31 @@ +ARG BUILDPLATFORM=linux/amd64 + +# Precompile key slow-to-build dependencies +FROM --platform=$BUILDPLATFORM golang:1.14.2-alpine as go-deps +WORKDIR /linkerd-build +COPY go.mod go.sum ./ +COPY bin/install-deps bin/ +RUN go mod download +ARG TARGETARCH +RUN ./bin/install-deps $TARGETARCH + +## compile tap +FROM go-deps as golang +WORKDIR /linkerd-build +COPY pkg pkg +COPY controller controller +COPY viz/metrics-api/gen/viz viz/metrics-api/gen/viz +COPY viz/metrics-api/client viz/metrics-api/client +COPY viz/tap viz/tap +COPY viz/pkg viz/pkg + +ARG TARGETARCH +RUN CGO_ENABLED=0 GOOS=linux GOARCH=$TARGETARCH go build -o /out/tap -tags prod -mod=readonly -ldflags "-s -w" ./viz/tap/cmd + +## package runtime +FROM scratch +ENV PATH=$PATH:/go/bin +COPY LICENSE /linkerd/LICENSE +COPY --from=golang /out/tap /go/bin/tap + +ENTRYPOINT ["/go/bin/tap"] diff --git a/controller/tap/handlers.go b/viz/tap/api/handlers.go similarity index 98% rename from controller/tap/handlers.go rename to viz/tap/api/handlers.go index 427acea46c216..160c57d2a78bb 100644 --- a/controller/tap/handlers.go +++ b/viz/tap/api/handlers.go @@ -1,4 +1,4 @@ -package tap +package api import ( "context" @@ -12,8 +12,8 @@ import ( "github.com/linkerd/linkerd2/controller/k8s" pkgK8s "github.com/linkerd/linkerd2/pkg/k8s" "github.com/linkerd/linkerd2/pkg/protohttp" - "github.com/linkerd/linkerd2/pkg/tap" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + pb "github.com/linkerd/linkerd2/viz/tap/gen/tap" + "github.com/linkerd/linkerd2/viz/tap/pkg" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/sirupsen/logrus" "google.golang.org/grpc/metadata" @@ -140,7 +140,7 @@ func (h *handler) handleTap(w http.ResponseWriter, req *http.Request, p httprout req.Header[h.groupHeader], ) if err != nil { - err = fmt.Errorf("tap authorization failed (%s), visit %s for more information", err, tap.TapRbacURL) + err = fmt.Errorf("tap authorization failed (%s), visit %s for more information", err, pkg.TapRbacURL) h.log.Error(err) renderJSONError(w, err, http.StatusForbidden) return @@ -155,7 +155,7 @@ func (h *handler) handleTap(w http.ResponseWriter, req *http.Request, p httprout return } - url := protohttp.TapReqToURL(&tapReq) + url := pkg.TapReqToURL(&tapReq) if url != req.URL.Path { err = fmt.Errorf("tap request body did not match APIServer URL: %+v != %+v", url, req.URL.Path) h.log.Error(err) diff --git a/controller/tap/handlers_test.go b/viz/tap/api/handlers_test.go similarity index 99% rename from controller/tap/handlers_test.go rename to viz/tap/api/handlers_test.go index bde022382ce71..650160a079e95 100644 --- a/controller/tap/handlers_test.go +++ b/viz/tap/api/handlers_test.go @@ -1,4 +1,4 @@ -package tap +package api import ( "fmt" diff --git a/controller/tap/apiserver.go b/viz/tap/api/server.go similarity index 82% rename from controller/tap/apiserver.go rename to viz/tap/api/server.go index 8b73164bc0d40..ae0c9eb827652 100644 --- a/controller/tap/apiserver.go +++ b/viz/tap/api/server.go @@ -1,4 +1,4 @@ -package tap +package api import ( "context" @@ -12,18 +12,17 @@ import ( "github.com/julienschmidt/httprouter" "github.com/linkerd/linkerd2/controller/k8s" - k8sutils "github.com/linkerd/linkerd2/pkg/k8s" pkgk8s "github.com/linkerd/linkerd2/pkg/k8s" "github.com/linkerd/linkerd2/pkg/prometheus" pkgTls "github.com/linkerd/linkerd2/pkg/tls" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + pb "github.com/linkerd/linkerd2/viz/tap/gen/tap" "github.com/prometheus/common/log" "github.com/sirupsen/logrus" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -// APIServer holds the underlying http server and its config -type APIServer struct { +// Server holds the underlying http server and its config +type Server struct { *http.Server listener net.Listener router *httprouter.Router @@ -32,14 +31,14 @@ type APIServer struct { log *logrus.Entry } -// NewAPIServer creates a new server that implements the Tap APIService. -func NewAPIServer( +// NewServer creates a new server that implements the Tap APIService. +func NewServer( ctx context.Context, addr string, k8sAPI *k8s.API, grpcTapServer pb.TapServer, disableCommonNames bool, -) (*APIServer, error) { +) (*Server, error) { updateEvent := make(chan struct{}) errEvent := make(chan error) watcher := pkgTls.NewFsCredsWatcher(pkgk8s.MountPathTLSBase, updateEvent, errEvent). @@ -50,7 +49,7 @@ func NewAPIServer( } }() - clientCAPem, allowedNames, usernameHeader, groupHeader, err := apiServerAuth(ctx, k8sAPI) + clientCAPem, allowedNames, usernameHeader, groupHeader, err := serverAuth(ctx, k8sAPI) if err != nil { return nil, err } @@ -61,7 +60,7 @@ func NewAPIServer( } log := logrus.WithFields(logrus.Fields{ - "component": "apiserver", + "component": "tap API server", "addr": addr, }) @@ -90,7 +89,7 @@ func NewAPIServer( return nil, fmt.Errorf("net.Listen failed with: %s", err) } - s := &APIServer{ + s := &Server{ Server: httpServer, listener: lis, router: initRouter(h), @@ -111,8 +110,8 @@ func NewAPIServer( } // Start starts the https server -func (a *APIServer) Start(ctx context.Context) { - a.log.Infof("starting APIServer on %s", a.Server.Addr) +func (a *Server) Start(ctx context.Context) { + a.log.Infof("starting tap API server on %s", a.Server.Addr) if err := a.ServeTLS(a.listener, "", ""); err != nil { if err == http.ErrServerClosed { return @@ -121,12 +120,12 @@ func (a *APIServer) Start(ctx context.Context) { } } -func (a *APIServer) getCertificate(_ *tls.ClientHelloInfo) (*tls.Certificate, error) { +func (a *Server) getCertificate(_ *tls.ClientHelloInfo) (*tls.Certificate, error) { return a.certValue.Load().(*tls.Certificate), nil } -// ServeHTTP handles all routes for the APIServer. -func (a *APIServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { +// ServeHTTP handles all routes for the Server. +func (a *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { a.log.Debugf("ServeHTTP(): %+v", req) if err := a.validate(req); err != nil { a.log.Debug(err) @@ -137,7 +136,7 @@ func (a *APIServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { } // validate ensures that the request should be honored returning an error otherwise. -func (a *APIServer) validate(req *http.Request) error { +func (a *Server) validate(req *http.Request) error { // if `requestheader-allowed-names` was empty, allow any CN if len(a.allowedNames) > 0 { for _, cn := range a.allowedNames { @@ -158,21 +157,21 @@ func (a *APIServer) validate(req *http.Request) error { return nil } -// apiServerAuth parses the relevant data out of a ConfigMap to enable client -// TLS authentication. +// serverAuth parses the relevant data out of a ConfigMap to enable client TLS +// authentication. // kubectl -n kube-system get cm/extension-apiserver-authentication // accessible via the extension-apiserver-authentication-reader role -func apiServerAuth(ctx context.Context, k8sAPI *k8s.API) (string, []string, string, string, error) { +func serverAuth(ctx context.Context, k8sAPI *k8s.API) (string, []string, string, string, error) { cm, err := k8sAPI.Client.CoreV1(). ConfigMaps(metav1.NamespaceSystem). - Get(ctx, k8sutils.ExtensionAPIServerAuthenticationConfigMapName, metav1.GetOptions{}) + Get(ctx, pkgk8s.ExtensionAPIServerAuthenticationConfigMapName, metav1.GetOptions{}) if err != nil { - return "", nil, "", "", fmt.Errorf("failed to load [%s] config: %s", k8sutils.ExtensionAPIServerAuthenticationConfigMapName, err) + return "", nil, "", "", fmt.Errorf("failed to load [%s] config: %s", pkgk8s.ExtensionAPIServerAuthenticationConfigMapName, err) } - clientCAPem, ok := cm.Data[k8sutils.ExtensionAPIServerAuthenticationRequestHeaderClientCAFileKey] + clientCAPem, ok := cm.Data[pkgk8s.ExtensionAPIServerAuthenticationRequestHeaderClientCAFileKey] if !ok { return "", nil, "", "", fmt.Errorf("no client CA cert available for apiextension-server") diff --git a/controller/tap/apiserver_test.go b/viz/tap/api/server_test.go similarity index 95% rename from controller/tap/apiserver_test.go rename to viz/tap/api/server_test.go index 1a007a696f779..f9d9b18501404 100644 --- a/controller/tap/apiserver_test.go +++ b/viz/tap/api/server_test.go @@ -1,4 +1,4 @@ -package tap +package api import ( "context" @@ -62,7 +62,7 @@ data: t.Fatalf("NewFakeAPI returned an error: %s", err) } - clientCAPem, allowedNames, usernameHeader, groupHeader, err := apiServerAuth(ctx, k8sAPI) + clientCAPem, allowedNames, usernameHeader, groupHeader, err := serverAuth(ctx, k8sAPI) if !reflect.DeepEqual(err, exp.err) { t.Errorf("apiServerAuth returned unexpected error: %s, expected: %s", err, exp.err) } @@ -90,7 +90,7 @@ func TestValidate(t *testing.T) { req := http.Request{TLS: &tls} - server := APIServer{} + server := Server{} if err := server.validate(&req); err != nil { t.Fatalf("No error expected for %q but encountered %q", cert.Subject.CommonName, err.Error()) } @@ -104,7 +104,7 @@ func TestValidate_ClientAllowed(t *testing.T) { req := http.Request{TLS: &tls} - server := APIServer{allowedNames: []string{"name-trusted"}} + server := Server{allowedNames: []string{"name-trusted"}} if err := server.validate(&req); err != nil { t.Fatalf("No error expected for %q but encountered %q", cert.Subject.CommonName, err.Error()) } @@ -118,7 +118,7 @@ func TestValidate_ClientAllowedViaSAN(t *testing.T) { req := http.Request{TLS: &tls} - server := APIServer{allowedNames: []string{"linkerd.io"}} + server := Server{allowedNames: []string{"linkerd.io"}} if err := server.validate(&req); err != nil { t.Fatalf("No error expected for %q but encountered %q", cert.Subject.CommonName, err.Error()) } @@ -132,7 +132,7 @@ func TestValidate_ClientNotAllowed(t *testing.T) { req := http.Request{TLS: &tls} - server := APIServer{allowedNames: []string{"name-trusted"}} + server := Server{allowedNames: []string{"name-trusted"}} if err := server.validate(&req); err == nil { t.Fatalf("Expected request to be rejected for %q", cert.Subject.CommonName) } diff --git a/viz/tap/cmd/main.go b/viz/tap/cmd/main.go new file mode 100644 index 0000000000000..37a343f5b0f44 --- /dev/null +++ b/viz/tap/cmd/main.go @@ -0,0 +1,22 @@ +package main + +import ( + "fmt" + "os" + + "github.com/linkerd/linkerd2/viz/tap/controller" + "github.com/linkerd/linkerd2/viz/tap/injector" +) + +func main() { + if len(os.Args) < 2 { + fmt.Println("expected a subcommand") + os.Exit(1) + } + switch os.Args[1] { + case "controller": + controller.Main(os.Args[2:]) + case "injector": + injector.Main(os.Args[2:]) + } +} diff --git a/controller/tap/client.go b/viz/tap/controller/client.go similarity index 81% rename from controller/tap/client.go rename to viz/tap/controller/client.go index 7c82a2cd3caf0..82bef2e39a979 100644 --- a/controller/tap/client.go +++ b/viz/tap/controller/client.go @@ -1,7 +1,7 @@ -package tap +package controller import ( - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + pb "github.com/linkerd/linkerd2/viz/tap/gen/tap" "google.golang.org/grpc" ) @@ -11,6 +11,5 @@ func NewClient(addr string) (pb.TapClient, *grpc.ClientConn, error) { if err != nil { return nil, nil, err } - return pb.NewTapClient(conn), conn, nil } diff --git a/controller/cmd/tap/main.go b/viz/tap/controller/main.go similarity index 86% rename from controller/cmd/tap/main.go rename to viz/tap/controller/main.go index dae386674d08d..4d3d160833609 100644 --- a/controller/cmd/tap/main.go +++ b/viz/tap/controller/main.go @@ -1,4 +1,4 @@ -package tap +package controller import ( "context" @@ -8,10 +8,10 @@ import ( "syscall" "github.com/linkerd/linkerd2/controller/k8s" - "github.com/linkerd/linkerd2/controller/tap" "github.com/linkerd/linkerd2/pkg/admin" "github.com/linkerd/linkerd2/pkg/flags" "github.com/linkerd/linkerd2/pkg/trace" + "github.com/linkerd/linkerd2/viz/tap/api" log "github.com/sirupsen/logrus" ) @@ -20,7 +20,6 @@ const defaultDomain = "cluster.local" // Main executes the tap subcommand func Main(args []string) { cmd := flag.NewFlagSet("tap", flag.ExitOnError) - apiServerAddr := cmd.String("apiserver-addr", ":8089", "address to serve the apiserver on") metricsAddr := cmd.String("metrics-addr", ":9998", "address to serve scrapable metrics on") kubeConfigPath := cmd.String("kubeconfig", "", "path to kube config") @@ -28,15 +27,11 @@ func Main(args []string) { tapPort := cmd.Uint("tap-port", 4190, "proxy tap port to connect to") disableCommonNames := cmd.Bool("disable-common-names", false, "disable checks for Common Names (for development)") trustDomain := cmd.String("identity-trust-domain", defaultDomain, "configures the name suffix used for identities") - traceCollector := flags.AddTraceFlags(cmd) - flags.ConfigureAndParse(cmd, args) ctx := context.Background() - stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt, syscall.SIGTERM) - k8sAPI, err := k8s.InitializeAPI( ctx, *kubeConfigPath, @@ -56,28 +51,21 @@ func Main(args []string) { if err != nil { log.Fatalf("Failed to initialize K8s API: %s", err) } - log.Infof("Using trust domain: %s", *trustDomain) - if *traceCollector != "" { if err := trace.InitializeTracing("linkerd-tap", *traceCollector); err != nil { log.Warnf("failed to initialize tracing: %s", err) } } - grpcTapServer := tap.NewGrpcTapServer(*tapPort, *controllerNamespace, *trustDomain, k8sAPI) - - apiServer, err := tap.NewAPIServer(ctx, *apiServerAddr, k8sAPI, grpcTapServer, *disableCommonNames) + grpcTapServer := NewGrpcTapServer(*tapPort, *controllerNamespace, *trustDomain, k8sAPI) + apiServer, err := api.NewServer(ctx, *apiServerAddr, k8sAPI, grpcTapServer, *disableCommonNames) if err != nil { log.Fatal(err.Error()) } - - k8sAPI.Sync(nil) // blocks until caches are synced - + k8sAPI.Sync(nil) go apiServer.Start(ctx) go admin.StartServer(*metricsAddr) - <-stop - log.Infof("shutting down APIServer on %s", *apiServerAddr) apiServer.Shutdown(ctx) } diff --git a/controller/tap/server.go b/viz/tap/controller/server.go similarity index 83% rename from controller/tap/server.go rename to viz/tap/controller/server.go index b99d52d67576c..4092ff78239ad 100644 --- a/controller/tap/server.go +++ b/viz/tap/controller/server.go @@ -1,4 +1,4 @@ -package tap +package controller import ( "context" @@ -19,8 +19,9 @@ import ( pkgK8s "github.com/linkerd/linkerd2/pkg/k8s" "github.com/linkerd/linkerd2/pkg/prometheus" "github.com/linkerd/linkerd2/pkg/util" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" vizLabels "github.com/linkerd/linkerd2/viz/pkg/labels" + tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" log "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/codes" @@ -47,12 +48,12 @@ var ( ) // Tap is deprecated, use TapByResource. -func (s *GRPCTapServer) Tap(req *pb.TapRequest, stream pb.Tap_TapServer) error { +func (s *GRPCTapServer) Tap(req *tapPb.TapRequest, stream tapPb.Tap_TapServer) error { return status.Error(codes.Unimplemented, "Tap is deprecated, use TapByResource") } // TapByResource taps all resources matched by the request object. -func (s *GRPCTapServer) TapByResource(req *pb.TapByResourceRequest, stream pb.Tap_TapByResourceServer) error { +func (s *GRPCTapServer) TapByResource(req *tapPb.TapByResourceRequest, stream tapPb.Tap_TapByResourceServer) error { if req == nil { return status.Error(codes.InvalidArgument, "TapByResource received nil TapByResourceRequest") } @@ -115,7 +116,7 @@ func (s *GRPCTapServer) TapByResource(req *pb.TapByResourceRequest, stream pb.Ta log.Infof("Tapping %d pods for target: %s", len(pods), res.String()) - events := make(chan *pb.TapEvent) + events := make(chan *tapPb.TapEvent) // divide the rps evenly between all pods to tap rpsPerPod := req.GetMaxRps() / float32(len(pods)) @@ -168,7 +169,7 @@ func (s *GRPCTapServer) TapByResource(req *pb.TapByResourceRequest, stream pb.Ta } } -func makeByResourceMatch(match *pb.TapByResourceRequest_Match) (*proxy.ObserveRequest_Match, error) { +func makeByResourceMatch(match *tapPb.TapByResourceRequest_Match) (*proxy.ObserveRequest_Match, error) { // TODO: for now assume it's always a single, flat `All` match list seq := match.GetAll() if seq == nil { @@ -179,7 +180,7 @@ func makeByResourceMatch(match *pb.TapByResourceRequest_Match) (*proxy.ObserveRe for _, reqMatch := range seq.Matches { switch typed := reqMatch.Match.(type) { - case *pb.TapByResourceRequest_Match_Destinations: + case *tapPb.TapByResourceRequest_Match_Destinations: for k, v := range destinationLabels(typed.Destinations.Resource) { matches = append(matches, &proxy.ObserveRequest_Match{ @@ -192,24 +193,24 @@ func makeByResourceMatch(match *pb.TapByResourceRequest_Match) (*proxy.ObserveRe }) } - case *pb.TapByResourceRequest_Match_Http_: + case *tapPb.TapByResourceRequest_Match_Http_: httpMatch := proxy.ObserveRequest_Match_Http{} switch httpTyped := typed.Http.Match.(type) { - case *pb.TapByResourceRequest_Match_Http_Scheme: + case *tapPb.TapByResourceRequest_Match_Http_Scheme: httpMatch = proxy.ObserveRequest_Match_Http{ Match: &proxy.ObserveRequest_Match_Http_Scheme{ Scheme: util.ParseScheme(httpTyped.Scheme), }, } - case *pb.TapByResourceRequest_Match_Http_Method: + case *tapPb.TapByResourceRequest_Match_Http_Method: httpMatch = proxy.ObserveRequest_Match_Http{ Match: &proxy.ObserveRequest_Match_Http_Method{ Method: util.ParseMethod(httpTyped.Method), }, } - case *pb.TapByResourceRequest_Match_Http_Authority: + case *tapPb.TapByResourceRequest_Match_Http_Authority: httpMatch = proxy.ObserveRequest_Match_Http{ Match: &proxy.ObserveRequest_Match_Http_Authority{ Authority: &proxy.ObserveRequest_Match_Http_StringMatch{ @@ -219,7 +220,7 @@ func makeByResourceMatch(match *pb.TapByResourceRequest_Match) (*proxy.ObserveRe }, }, } - case *pb.TapByResourceRequest_Match_Http_Path: + case *tapPb.TapByResourceRequest_Match_Http_Path: httpMatch = proxy.ObserveRequest_Match_Http{ Match: &proxy.ObserveRequest_Match_Http_Path{ Path: &proxy.ObserveRequest_Match_Http_StringMatch{ @@ -254,7 +255,7 @@ func makeByResourceMatch(match *pb.TapByResourceRequest_Match) (*proxy.ObserveRe } // TODO: factor out with `promLabels` in public-api -func destinationLabels(resource *pb.Resource) map[string]string { +func destinationLabels(resource *metricsPb.Resource) map[string]string { dstLabels := map[string]string{} if resource.Name != "" { l5dLabel := pkgK8s.KindToL5DLabel(resource.Type) @@ -266,7 +267,7 @@ func destinationLabels(resource *pb.Resource) map[string]string { return dstLabels } -func buildExtractHTTP(extract *pb.TapByResourceRequest_Extract_Http) *proxy.ObserveRequest_Extract { +func buildExtractHTTP(extract *tapPb.TapByResourceRequest_Extract_Http) *proxy.ObserveRequest_Extract { if extract.GetHeaders() != nil { return &proxy.ObserveRequest_Extract{ Extract: &proxy.ObserveRequest_Extract_Http_{ @@ -289,7 +290,7 @@ func buildExtractHTTP(extract *pb.TapByResourceRequest_Extract_Http) *proxy.Obse // of maxRps * 1s at most once per 1s window. If this limit is reached in // less than 1s, we sleep until the end of the window before calling Observe // again. -func (s *GRPCTapServer) tapProxy(ctx context.Context, maxRps float32, match *proxy.ObserveRequest_Match, extract *proxy.ObserveRequest_Extract, addr string, events chan *pb.TapEvent) { +func (s *GRPCTapServer) tapProxy(ctx context.Context, maxRps float32, match *proxy.ObserveRequest_Match, extract *proxy.ObserveRequest_Extract, addr string, events chan *tapPb.TapEvent) { tapAddr := fmt.Sprintf("%s:%d", addr, s.tapPort) log.Infof("Establishing tap on %s", tapAddr) conn, err := grpc.DialContext(ctx, tapAddr, grpc.WithInsecure()) @@ -341,37 +342,37 @@ func (s *GRPCTapServer) tapProxy(ctx context.Context, maxRps float32, match *pro } } -func (s *GRPCTapServer) translateEvent(ctx context.Context, orig *proxy.TapEvent) *pb.TapEvent { - direction := func(orig proxy.TapEvent_ProxyDirection) pb.TapEvent_ProxyDirection { +func (s *GRPCTapServer) translateEvent(ctx context.Context, orig *proxy.TapEvent) *tapPb.TapEvent { + direction := func(orig proxy.TapEvent_ProxyDirection) tapPb.TapEvent_ProxyDirection { switch orig { case proxy.TapEvent_INBOUND: - return pb.TapEvent_INBOUND + return tapPb.TapEvent_INBOUND case proxy.TapEvent_OUTBOUND: - return pb.TapEvent_OUTBOUND + return tapPb.TapEvent_OUTBOUND default: - return pb.TapEvent_UNKNOWN + return tapPb.TapEvent_UNKNOWN } } - event := func(orig *proxy.TapEvent_Http) *pb.TapEvent_Http_ { - id := func(orig *proxy.TapEvent_Http_StreamId) *pb.TapEvent_Http_StreamId { - return &pb.TapEvent_Http_StreamId{ + event := func(orig *proxy.TapEvent_Http) *tapPb.TapEvent_Http_ { + id := func(orig *proxy.TapEvent_Http_StreamId) *tapPb.TapEvent_Http_StreamId { + return &tapPb.TapEvent_Http_StreamId{ Base: orig.GetBase(), Stream: orig.GetStream(), } } - method := func(orig *httpPb.HttpMethod) *pb.HttpMethod { + method := func(orig *httpPb.HttpMethod) *metricsPb.HttpMethod { switch m := orig.GetType().(type) { case *httpPb.HttpMethod_Registered_: - return &pb.HttpMethod{ - Type: &pb.HttpMethod_Registered_{ - Registered: pb.HttpMethod_Registered(m.Registered), + return &metricsPb.HttpMethod{ + Type: &metricsPb.HttpMethod_Registered_{ + Registered: metricsPb.HttpMethod_Registered(m.Registered), }, } case *httpPb.HttpMethod_Unregistered: - return &pb.HttpMethod{ - Type: &pb.HttpMethod_Unregistered{ + return &metricsPb.HttpMethod{ + Type: &metricsPb.HttpMethod_Unregistered{ Unregistered: m.Unregistered, }, } @@ -380,17 +381,17 @@ func (s *GRPCTapServer) translateEvent(ctx context.Context, orig *proxy.TapEvent } } - scheme := func(orig *httpPb.Scheme) *pb.Scheme { + scheme := func(orig *httpPb.Scheme) *metricsPb.Scheme { switch s := orig.GetType().(type) { case *httpPb.Scheme_Registered_: - return &pb.Scheme{ - Type: &pb.Scheme_Registered_{ - Registered: pb.Scheme_Registered(s.Registered), + return &metricsPb.Scheme{ + Type: &metricsPb.Scheme_Registered_{ + Registered: metricsPb.Scheme_Registered(s.Registered), }, } case *httpPb.Scheme_Unregistered: - return &pb.Scheme{ - Type: &pb.Scheme_Unregistered{ + return &metricsPb.Scheme{ + Type: &metricsPb.Scheme_Unregistered{ Unregistered: s.Unregistered, }, } @@ -399,31 +400,31 @@ func (s *GRPCTapServer) translateEvent(ctx context.Context, orig *proxy.TapEvent } } - headers := func(orig *httpPb.Headers) *pb.Headers { + headers := func(orig *httpPb.Headers) *metricsPb.Headers { if orig == nil { return nil } - var headers []*pb.Headers_Header + var headers []*metricsPb.Headers_Header for _, header := range orig.GetHeaders() { n := header.GetName() b := header.GetValue() - h := pb.Headers_Header{Name: n, Value: &pb.Headers_Header_ValueBin{ValueBin: b}} + h := metricsPb.Headers_Header{Name: n, Value: &metricsPb.Headers_Header_ValueBin{ValueBin: b}} if utf8.Valid(b) { - h = pb.Headers_Header{Name: n, Value: &pb.Headers_Header_ValueStr{ValueStr: string(b)}} + h = metricsPb.Headers_Header{Name: n, Value: &metricsPb.Headers_Header_ValueStr{ValueStr: string(b)}} } headers = append(headers, &h) } - return &pb.Headers{ + return &metricsPb.Headers{ Headers: headers, } } switch orig := orig.GetEvent().(type) { case *proxy.TapEvent_Http_RequestInit_: - return &pb.TapEvent_Http_{ - Http: &pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_RequestInit_{ - RequestInit: &pb.TapEvent_Http_RequestInit{ + return &tapPb.TapEvent_Http_{ + Http: &tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_RequestInit_{ + RequestInit: &tapPb.TapEvent_Http_RequestInit{ Id: id(orig.RequestInit.GetId()), Method: method(orig.RequestInit.GetMethod()), Scheme: scheme(orig.RequestInit.GetScheme()), @@ -436,10 +437,10 @@ func (s *GRPCTapServer) translateEvent(ctx context.Context, orig *proxy.TapEvent } case *proxy.TapEvent_Http_ResponseInit_: - return &pb.TapEvent_Http_{ - Http: &pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_ResponseInit_{ - ResponseInit: &pb.TapEvent_Http_ResponseInit{ + return &tapPb.TapEvent_Http_{ + Http: &tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_ResponseInit_{ + ResponseInit: &tapPb.TapEvent_Http_ResponseInit{ Id: id(orig.ResponseInit.GetId()), SinceRequestInit: orig.ResponseInit.GetSinceRequestInit(), HttpStatus: orig.ResponseInit.GetHttpStatus(), @@ -450,17 +451,17 @@ func (s *GRPCTapServer) translateEvent(ctx context.Context, orig *proxy.TapEvent } case *proxy.TapEvent_Http_ResponseEnd_: - eos := func(orig *proxy.Eos) *pb.Eos { + eos := func(orig *proxy.Eos) *metricsPb.Eos { switch e := orig.GetEnd().(type) { case *proxy.Eos_ResetErrorCode: - return &pb.Eos{ - End: &pb.Eos_ResetErrorCode{ + return &metricsPb.Eos{ + End: &metricsPb.Eos_ResetErrorCode{ ResetErrorCode: e.ResetErrorCode, }, } case *proxy.Eos_GrpcStatusCode: - return &pb.Eos{ - End: &pb.Eos_GrpcStatusCode{ + return &metricsPb.Eos{ + End: &metricsPb.Eos_GrpcStatusCode{ GrpcStatusCode: e.GrpcStatusCode, }, } @@ -469,10 +470,10 @@ func (s *GRPCTapServer) translateEvent(ctx context.Context, orig *proxy.TapEvent } } - return &pb.TapEvent_Http_{ - Http: &pb.TapEvent_Http{ - Event: &pb.TapEvent_Http_ResponseEnd_{ - ResponseEnd: &pb.TapEvent_Http_ResponseEnd{ + return &tapPb.TapEvent_Http_{ + Http: &tapPb.TapEvent_Http{ + Event: &tapPb.TapEvent_Http_ResponseEnd_{ + ResponseEnd: &tapPb.TapEvent_Http_ResponseEnd{ Id: id(orig.ResponseEnd.GetId()), SinceRequestInit: orig.ResponseEnd.GetSinceRequestInit(), SinceResponseInit: orig.ResponseEnd.GetSinceResponseInit(), @@ -498,16 +499,16 @@ func (s *GRPCTapServer) translateEvent(ctx context.Context, orig *proxy.TapEvent destinationLabels = make(map[string]string) } - ev := &pb.TapEvent{ + ev := &tapPb.TapEvent{ Source: addr.NetToPublic(orig.GetSource()), - SourceMeta: &pb.TapEvent_EndpointMeta{ + SourceMeta: &tapPb.TapEvent_EndpointMeta{ Labels: sourceLabels, }, Destination: addr.NetToPublic(orig.GetDestination()), - DestinationMeta: &pb.TapEvent_EndpointMeta{ + DestinationMeta: &tapPb.TapEvent_EndpointMeta{ Labels: destinationLabels, }, - RouteMeta: &pb.TapEvent_RouteMeta{ + RouteMeta: &tapPb.TapEvent_RouteMeta{ Labels: orig.GetRouteMeta().GetLabels(), }, ProxyDirection: direction(orig.GetProxyDirection()), @@ -546,7 +547,7 @@ func newGRPCTapServer( } s := prometheus.NewGrpcServer() - pb.RegisterTapServer(s, srv) + tapPb.RegisterTapServer(s, srv) return srv } @@ -574,13 +575,13 @@ func indexByIP(obj interface{}) ([]string, error) { // // Since errors encountered while hydrating metadata are non-fatal and result // only in missing labels, any errors are logged at the WARN level. -func (s *GRPCTapServer) hydrateEventLabels(ctx context.Context, ev *pb.TapEvent) { +func (s *GRPCTapServer) hydrateEventLabels(ctx context.Context, ev *tapPb.TapEvent) { err := s.hydrateIPLabels(ctx, ev.GetSource().GetIp(), ev.GetSourceMeta().GetLabels()) if err != nil { log.Warnf("error hydrating source labels: %s", err) } - if ev.ProxyDirection == pb.TapEvent_INBOUND { + if ev.ProxyDirection == tapPb.TapEvent_INBOUND { // Events emitted by an inbound proxies don't have destination labels, // since the inbound proxy _is_ the destination, and proxies don't know // their own labels. @@ -665,7 +666,7 @@ func (s *GRPCTapServer) resourceForIP(ip *netPb.IPAddress) (runtime.Object, erro return singleRunningPod, nil } -func getLabelSelector(req *pb.TapByResourceRequest) (labels.Selector, error) { +func getLabelSelector(req *tapPb.TapByResourceRequest) (labels.Selector, error) { labelSelector := labels.Everything() if s := req.GetTarget().GetLabelSelector(); s != "" { var err error diff --git a/controller/tap/server_test.go b/viz/tap/controller/server_test.go similarity index 84% rename from controller/tap/server_test.go rename to viz/tap/controller/server_test.go index dbb345293eb48..805e93c144296 100644 --- a/controller/tap/server_test.go +++ b/viz/tap/controller/server_test.go @@ -1,4 +1,4 @@ -package tap +package controller import ( "context" @@ -13,7 +13,8 @@ import ( "github.com/linkerd/linkerd2/controller/k8s" "github.com/linkerd/linkerd2/pkg/addr" pkgK8s "github.com/linkerd/linkerd2/pkg/k8s" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" @@ -23,7 +24,7 @@ import ( type tapExpected struct { err error k8sRes []string - req *pb.TapByResourceRequest + req *tapPb.TapByResourceRequest requireID string } @@ -32,7 +33,7 @@ type mockTapByResourceServer struct { util.MockServerStream } -func (m *mockTapByResourceServer) Send(event *pb.TapEvent) error { +func (m *mockTapByResourceServer) Send(event *tapPb.TapEvent) error { return nil } @@ -53,7 +54,7 @@ func TestTapByResource(t *testing.T) { { err: status.Error(codes.InvalidArgument, "TapByResource received nil target ResourceSelection"), k8sRes: []string{}, - req: &pb.TapByResourceRequest{}, + req: &tapPb.TapByResourceRequest{}, }, { err: status.Errorf(codes.Unimplemented, "unexpected match specified: any:{}"), @@ -74,17 +75,17 @@ status: podIP: 127.0.0.1 `, }, - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ Namespace: "emojivoto", Type: pkgK8s.Pod, Name: "emojivoto-meshed", }, }, - Match: &pb.TapByResourceRequest_Match{ - Match: &pb.TapByResourceRequest_Match_Any{ - Any: &pb.TapByResourceRequest_Match_Seq{}, + Match: &tapPb.TapByResourceRequest_Match{ + Match: &tapPb.TapByResourceRequest_Match_Any{ + Any: &tapPb.TapByResourceRequest_Match_Seq{}, }, }, }, @@ -104,9 +105,9 @@ status: podIP: 127.0.0.1 `, }, - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ Namespace: "emojivoto", Type: pkgK8s.Pod, Name: "emojivoto-not-meshed", @@ -117,9 +118,9 @@ status: { err: status.Errorf(codes.Unimplemented, "unimplemented resource type: bad-type"), k8sRes: []string{}, - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ Namespace: "emojivoto", Type: "bad-type", Name: "emojivoto-meshed-not-found", @@ -145,9 +146,9 @@ status: podIP: 127.0.0.1 `, }, - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ Namespace: "emojivoto", Type: pkgK8s.Pod, Name: "emojivoto-meshed-not-found", @@ -173,9 +174,9 @@ status: podIP: 127.0.0.1 `, }, - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ Namespace: "emojivoto", Type: pkgK8s.Pod, Name: "emojivoto-meshed", @@ -203,17 +204,17 @@ status: podIP: 127.0.0.1 `, }, - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ Namespace: "emojivoto", Type: pkgK8s.Pod, Name: "emojivoto-meshed-tap-disabled", }, }, - Match: &pb.TapByResourceRequest_Match{ - Match: &pb.TapByResourceRequest_Match_All{ - All: &pb.TapByResourceRequest_Match_Seq{}, + Match: &tapPb.TapByResourceRequest_Match{ + Match: &tapPb.TapByResourceRequest_Match_All{ + All: &tapPb.TapByResourceRequest_Match_Seq{}, }, }, }, @@ -237,17 +238,17 @@ status: podIP: 127.0.0.1 `, }, - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ Namespace: "emojivoto", Type: pkgK8s.Pod, Name: "emojivoto-meshed-tap-not-enabled", }, }, - Match: &pb.TapByResourceRequest_Match{ - Match: &pb.TapByResourceRequest_Match_All{ - All: &pb.TapByResourceRequest_Match_Seq{}, + Match: &tapPb.TapByResourceRequest_Match{ + Match: &tapPb.TapByResourceRequest_Match_All{ + All: &tapPb.TapByResourceRequest_Match_Seq{}, }, }, }, @@ -272,17 +273,17 @@ status: podIP: 127.0.0.1 `, }, - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ Namespace: "emojivoto", Type: pkgK8s.Pod, Name: "emojivoto-meshed", }, }, - Match: &pb.TapByResourceRequest_Match{ - Match: &pb.TapByResourceRequest_Match_All{ - All: &pb.TapByResourceRequest_Match_Seq{}, + Match: &tapPb.TapByResourceRequest_Match{ + Match: &tapPb.TapByResourceRequest_Match_All{ + All: &tapPb.TapByResourceRequest_Match_Seq{}, }, }, }, @@ -309,17 +310,17 @@ status: podIP: 127.0.0.1 `, }, - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ Namespace: "emojivoto", Type: pkgK8s.Pod, Name: "emojivoto-meshed", }, }, - Match: &pb.TapByResourceRequest_Match{ - Match: &pb.TapByResourceRequest_Match_All{ - All: &pb.TapByResourceRequest_Match_Seq{}, + Match: &tapPb.TapByResourceRequest_Match{ + Match: &tapPb.TapByResourceRequest_Match_All{ + All: &tapPb.TapByResourceRequest_Match_Seq{}, }, }, }, @@ -351,17 +352,17 @@ status: podIP: 127.0.0.1 `, }, - req: &pb.TapByResourceRequest{ - Target: &pb.ResourceSelection{ - Resource: &pb.Resource{ + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ Namespace: "", Type: pkgK8s.Namespace, Name: "emojivoto", }, }, - Match: &pb.TapByResourceRequest_Match{ - Match: &pb.TapByResourceRequest_Match_All{ - All: &pb.TapByResourceRequest_Match_Seq{}, + Match: &tapPb.TapByResourceRequest_Match{ + Match: &tapPb.TapByResourceRequest_Match_All{ + All: &tapPb.TapByResourceRequest_Match_Seq{}, }, }, }, diff --git a/viz/tap/gen/tap/tap.pb.go b/viz/tap/gen/tap/tap.pb.go new file mode 100644 index 0000000000000..6982925270ea8 --- /dev/null +++ b/viz/tap/gen/tap/tap.pb.go @@ -0,0 +1,2118 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.24.0 +// protoc v3.6.0 +// source: tap.proto + +package tap + +import ( + context "context" + proto "github.com/golang/protobuf/proto" + duration "github.com/golang/protobuf/ptypes/duration" + net "github.com/linkerd/linkerd2/controller/gen/common/net" + viz "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type TapEvent_ProxyDirection int32 + +const ( + TapEvent_UNKNOWN TapEvent_ProxyDirection = 0 + TapEvent_INBOUND TapEvent_ProxyDirection = 1 + TapEvent_OUTBOUND TapEvent_ProxyDirection = 2 +) + +// Enum value maps for TapEvent_ProxyDirection. +var ( + TapEvent_ProxyDirection_name = map[int32]string{ + 0: "UNKNOWN", + 1: "INBOUND", + 2: "OUTBOUND", + } + TapEvent_ProxyDirection_value = map[string]int32{ + "UNKNOWN": 0, + "INBOUND": 1, + "OUTBOUND": 2, + } +) + +func (x TapEvent_ProxyDirection) Enum() *TapEvent_ProxyDirection { + p := new(TapEvent_ProxyDirection) + *p = x + return p +} + +func (x TapEvent_ProxyDirection) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TapEvent_ProxyDirection) Descriptor() protoreflect.EnumDescriptor { + return file_tap_proto_enumTypes[0].Descriptor() +} + +func (TapEvent_ProxyDirection) Type() protoreflect.EnumType { + return &file_tap_proto_enumTypes[0] +} + +func (x TapEvent_ProxyDirection) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TapEvent_ProxyDirection.Descriptor instead. +func (TapEvent_ProxyDirection) EnumDescriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{2, 0} +} + +// Deprecated: Do not use. +type TapRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Target: + // *TapRequest_Pod + // *TapRequest_Deployment + Target isTapRequest_Target `protobuf_oneof:"target"` + // validation of these fields happens on the server + MaxRps float32 `protobuf:"fixed32,3,opt,name=maxRps,proto3" json:"maxRps,omitempty"` + ToPort uint32 `protobuf:"varint,4,opt,name=toPort,proto3" json:"toPort,omitempty"` + ToIP string `protobuf:"bytes,5,opt,name=toIP,proto3" json:"toIP,omitempty"` + FromPort uint32 `protobuf:"varint,6,opt,name=fromPort,proto3" json:"fromPort,omitempty"` + FromIP string `protobuf:"bytes,7,opt,name=fromIP,proto3" json:"fromIP,omitempty"` + Scheme string `protobuf:"bytes,8,opt,name=scheme,proto3" json:"scheme,omitempty"` + Method string `protobuf:"bytes,9,opt,name=method,proto3" json:"method,omitempty"` + Authority string `protobuf:"bytes,10,opt,name=authority,proto3" json:"authority,omitempty"` + Path string `protobuf:"bytes,11,opt,name=path,proto3" json:"path,omitempty"` +} + +func (x *TapRequest) Reset() { + *x = TapRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapRequest) ProtoMessage() {} + +func (x *TapRequest) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapRequest.ProtoReflect.Descriptor instead. +func (*TapRequest) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{0} +} + +func (m *TapRequest) GetTarget() isTapRequest_Target { + if m != nil { + return m.Target + } + return nil +} + +func (x *TapRequest) GetPod() string { + if x, ok := x.GetTarget().(*TapRequest_Pod); ok { + return x.Pod + } + return "" +} + +func (x *TapRequest) GetDeployment() string { + if x, ok := x.GetTarget().(*TapRequest_Deployment); ok { + return x.Deployment + } + return "" +} + +func (x *TapRequest) GetMaxRps() float32 { + if x != nil { + return x.MaxRps + } + return 0 +} + +func (x *TapRequest) GetToPort() uint32 { + if x != nil { + return x.ToPort + } + return 0 +} + +func (x *TapRequest) GetToIP() string { + if x != nil { + return x.ToIP + } + return "" +} + +func (x *TapRequest) GetFromPort() uint32 { + if x != nil { + return x.FromPort + } + return 0 +} + +func (x *TapRequest) GetFromIP() string { + if x != nil { + return x.FromIP + } + return "" +} + +func (x *TapRequest) GetScheme() string { + if x != nil { + return x.Scheme + } + return "" +} + +func (x *TapRequest) GetMethod() string { + if x != nil { + return x.Method + } + return "" +} + +func (x *TapRequest) GetAuthority() string { + if x != nil { + return x.Authority + } + return "" +} + +func (x *TapRequest) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +type isTapRequest_Target interface { + isTapRequest_Target() +} + +type TapRequest_Pod struct { + Pod string `protobuf:"bytes,1,opt,name=pod,proto3,oneof"` +} + +type TapRequest_Deployment struct { + Deployment string `protobuf:"bytes,2,opt,name=deployment,proto3,oneof"` +} + +func (*TapRequest_Pod) isTapRequest_Target() {} + +func (*TapRequest_Deployment) isTapRequest_Target() {} + +// A tap request over kubernetes resources. +// +// This is used only by the tap APIServer. +type TapByResourceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Describes the kubernetes pods that should be tapped. + Target *viz.ResourceSelection `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + // Selects over events to be reported. + Match *TapByResourceRequest_Match `protobuf:"bytes,2,opt,name=match,proto3" json:"match,omitempty"` + // Limits the number of events to be inspected. + MaxRps float32 `protobuf:"fixed32,3,opt,name=maxRps,proto3" json:"maxRps,omitempty"` + // Conditionally extracts components from requests and responses to include + // in tap events + Extract *TapByResourceRequest_Extract `protobuf:"bytes,4,opt,name=extract,proto3" json:"extract,omitempty"` +} + +func (x *TapByResourceRequest) Reset() { + *x = TapByResourceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapByResourceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapByResourceRequest) ProtoMessage() {} + +func (x *TapByResourceRequest) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapByResourceRequest.ProtoReflect.Descriptor instead. +func (*TapByResourceRequest) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{1} +} + +func (x *TapByResourceRequest) GetTarget() *viz.ResourceSelection { + if x != nil { + return x.Target + } + return nil +} + +func (x *TapByResourceRequest) GetMatch() *TapByResourceRequest_Match { + if x != nil { + return x.Match + } + return nil +} + +func (x *TapByResourceRequest) GetMaxRps() float32 { + if x != nil { + return x.MaxRps + } + return 0 +} + +func (x *TapByResourceRequest) GetExtract() *TapByResourceRequest_Extract { + if x != nil { + return x.Extract + } + return nil +} + +// This is used only by the tap APIServer. +type TapEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Source *net.TcpAddress `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` + SourceMeta *TapEvent_EndpointMeta `protobuf:"bytes,5,opt,name=source_meta,json=sourceMeta,proto3" json:"source_meta,omitempty"` + Destination *net.TcpAddress `protobuf:"bytes,2,opt,name=destination,proto3" json:"destination,omitempty"` + DestinationMeta *TapEvent_EndpointMeta `protobuf:"bytes,4,opt,name=destination_meta,json=destinationMeta,proto3" json:"destination_meta,omitempty"` + RouteMeta *TapEvent_RouteMeta `protobuf:"bytes,7,opt,name=route_meta,json=routeMeta,proto3" json:"route_meta,omitempty"` + ProxyDirection TapEvent_ProxyDirection `protobuf:"varint,6,opt,name=proxy_direction,json=proxyDirection,proto3,enum=linkerd2.tap.TapEvent_ProxyDirection" json:"proxy_direction,omitempty"` + // Types that are assignable to Event: + // *TapEvent_Http_ + Event isTapEvent_Event `protobuf_oneof:"event"` +} + +func (x *TapEvent) Reset() { + *x = TapEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapEvent) ProtoMessage() {} + +func (x *TapEvent) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapEvent.ProtoReflect.Descriptor instead. +func (*TapEvent) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{2} +} + +func (x *TapEvent) GetSource() *net.TcpAddress { + if x != nil { + return x.Source + } + return nil +} + +func (x *TapEvent) GetSourceMeta() *TapEvent_EndpointMeta { + if x != nil { + return x.SourceMeta + } + return nil +} + +func (x *TapEvent) GetDestination() *net.TcpAddress { + if x != nil { + return x.Destination + } + return nil +} + +func (x *TapEvent) GetDestinationMeta() *TapEvent_EndpointMeta { + if x != nil { + return x.DestinationMeta + } + return nil +} + +func (x *TapEvent) GetRouteMeta() *TapEvent_RouteMeta { + if x != nil { + return x.RouteMeta + } + return nil +} + +func (x *TapEvent) GetProxyDirection() TapEvent_ProxyDirection { + if x != nil { + return x.ProxyDirection + } + return TapEvent_UNKNOWN +} + +func (m *TapEvent) GetEvent() isTapEvent_Event { + if m != nil { + return m.Event + } + return nil +} + +func (x *TapEvent) GetHttp() *TapEvent_Http { + if x, ok := x.GetEvent().(*TapEvent_Http_); ok { + return x.Http + } + return nil +} + +type isTapEvent_Event interface { + isTapEvent_Event() +} + +type TapEvent_Http_ struct { + Http *TapEvent_Http `protobuf:"bytes,3,opt,name=http,proto3,oneof"` +} + +func (*TapEvent_Http_) isTapEvent_Event() {} + +type TapByResourceRequest_Match struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Match: + // *TapByResourceRequest_Match_All + // *TapByResourceRequest_Match_Any + // *TapByResourceRequest_Match_Not + // *TapByResourceRequest_Match_Destinations + // *TapByResourceRequest_Match_Http_ + Match isTapByResourceRequest_Match_Match `protobuf_oneof:"match"` +} + +func (x *TapByResourceRequest_Match) Reset() { + *x = TapByResourceRequest_Match{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapByResourceRequest_Match) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapByResourceRequest_Match) ProtoMessage() {} + +func (x *TapByResourceRequest_Match) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapByResourceRequest_Match.ProtoReflect.Descriptor instead. +func (*TapByResourceRequest_Match) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{1, 0} +} + +func (m *TapByResourceRequest_Match) GetMatch() isTapByResourceRequest_Match_Match { + if m != nil { + return m.Match + } + return nil +} + +func (x *TapByResourceRequest_Match) GetAll() *TapByResourceRequest_Match_Seq { + if x, ok := x.GetMatch().(*TapByResourceRequest_Match_All); ok { + return x.All + } + return nil +} + +func (x *TapByResourceRequest_Match) GetAny() *TapByResourceRequest_Match_Seq { + if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Any); ok { + return x.Any + } + return nil +} + +func (x *TapByResourceRequest_Match) GetNot() *TapByResourceRequest_Match { + if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Not); ok { + return x.Not + } + return nil +} + +func (x *TapByResourceRequest_Match) GetDestinations() *viz.ResourceSelection { + if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Destinations); ok { + return x.Destinations + } + return nil +} + +func (x *TapByResourceRequest_Match) GetHttp() *TapByResourceRequest_Match_Http { + if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Http_); ok { + return x.Http + } + return nil +} + +type isTapByResourceRequest_Match_Match interface { + isTapByResourceRequest_Match_Match() +} + +type TapByResourceRequest_Match_All struct { + // If empty, matches all messages. + All *TapByResourceRequest_Match_Seq `protobuf:"bytes,1,opt,name=all,proto3,oneof"` +} + +type TapByResourceRequest_Match_Any struct { + // If empty, matches no messages. + Any *TapByResourceRequest_Match_Seq `protobuf:"bytes,2,opt,name=any,proto3,oneof"` +} + +type TapByResourceRequest_Match_Not struct { + // Inverts the inner match. + Not *TapByResourceRequest_Match `protobuf:"bytes,3,opt,name=not,proto3,oneof"` +} + +type TapByResourceRequest_Match_Destinations struct { + // Matches events being sent to any of the selected destinations. + Destinations *viz.ResourceSelection `protobuf:"bytes,4,opt,name=destinations,proto3,oneof"` +} + +type TapByResourceRequest_Match_Http_ struct { + // Matches HTTP requests by their metadata. + Http *TapByResourceRequest_Match_Http `protobuf:"bytes,5,opt,name=http,proto3,oneof"` +} + +func (*TapByResourceRequest_Match_All) isTapByResourceRequest_Match_Match() {} + +func (*TapByResourceRequest_Match_Any) isTapByResourceRequest_Match_Match() {} + +func (*TapByResourceRequest_Match_Not) isTapByResourceRequest_Match_Match() {} + +func (*TapByResourceRequest_Match_Destinations) isTapByResourceRequest_Match_Match() {} + +func (*TapByResourceRequest_Match_Http_) isTapByResourceRequest_Match_Match() {} + +type TapByResourceRequest_Extract struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Extract: + // *TapByResourceRequest_Extract_Http_ + Extract isTapByResourceRequest_Extract_Extract `protobuf_oneof:"extract"` +} + +func (x *TapByResourceRequest_Extract) Reset() { + *x = TapByResourceRequest_Extract{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapByResourceRequest_Extract) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapByResourceRequest_Extract) ProtoMessage() {} + +func (x *TapByResourceRequest_Extract) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapByResourceRequest_Extract.ProtoReflect.Descriptor instead. +func (*TapByResourceRequest_Extract) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{1, 1} +} + +func (m *TapByResourceRequest_Extract) GetExtract() isTapByResourceRequest_Extract_Extract { + if m != nil { + return m.Extract + } + return nil +} + +func (x *TapByResourceRequest_Extract) GetHttp() *TapByResourceRequest_Extract_Http { + if x, ok := x.GetExtract().(*TapByResourceRequest_Extract_Http_); ok { + return x.Http + } + return nil +} + +type isTapByResourceRequest_Extract_Extract interface { + isTapByResourceRequest_Extract_Extract() +} + +type TapByResourceRequest_Extract_Http_ struct { + Http *TapByResourceRequest_Extract_Http `protobuf:"bytes,1,opt,name=http,proto3,oneof"` +} + +func (*TapByResourceRequest_Extract_Http_) isTapByResourceRequest_Extract_Extract() {} + +type TapByResourceRequest_Match_Seq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Matches []*TapByResourceRequest_Match `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` +} + +func (x *TapByResourceRequest_Match_Seq) Reset() { + *x = TapByResourceRequest_Match_Seq{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapByResourceRequest_Match_Seq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapByResourceRequest_Match_Seq) ProtoMessage() {} + +func (x *TapByResourceRequest_Match_Seq) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapByResourceRequest_Match_Seq.ProtoReflect.Descriptor instead. +func (*TapByResourceRequest_Match_Seq) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{1, 0, 0} +} + +func (x *TapByResourceRequest_Match_Seq) GetMatches() []*TapByResourceRequest_Match { + if x != nil { + return x.Matches + } + return nil +} + +type TapByResourceRequest_Match_Http struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Match: + // *TapByResourceRequest_Match_Http_Scheme + // *TapByResourceRequest_Match_Http_Method + // *TapByResourceRequest_Match_Http_Authority + // *TapByResourceRequest_Match_Http_Path + Match isTapByResourceRequest_Match_Http_Match `protobuf_oneof:"match"` +} + +func (x *TapByResourceRequest_Match_Http) Reset() { + *x = TapByResourceRequest_Match_Http{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapByResourceRequest_Match_Http) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapByResourceRequest_Match_Http) ProtoMessage() {} + +func (x *TapByResourceRequest_Match_Http) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapByResourceRequest_Match_Http.ProtoReflect.Descriptor instead. +func (*TapByResourceRequest_Match_Http) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{1, 0, 1} +} + +func (m *TapByResourceRequest_Match_Http) GetMatch() isTapByResourceRequest_Match_Http_Match { + if m != nil { + return m.Match + } + return nil +} + +func (x *TapByResourceRequest_Match_Http) GetScheme() string { + if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Http_Scheme); ok { + return x.Scheme + } + return "" +} + +func (x *TapByResourceRequest_Match_Http) GetMethod() string { + if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Http_Method); ok { + return x.Method + } + return "" +} + +func (x *TapByResourceRequest_Match_Http) GetAuthority() string { + if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Http_Authority); ok { + return x.Authority + } + return "" +} + +func (x *TapByResourceRequest_Match_Http) GetPath() string { + if x, ok := x.GetMatch().(*TapByResourceRequest_Match_Http_Path); ok { + return x.Path + } + return "" +} + +type isTapByResourceRequest_Match_Http_Match interface { + isTapByResourceRequest_Match_Http_Match() +} + +type TapByResourceRequest_Match_Http_Scheme struct { + Scheme string `protobuf:"bytes,1,opt,name=scheme,proto3,oneof"` +} + +type TapByResourceRequest_Match_Http_Method struct { + Method string `protobuf:"bytes,2,opt,name=method,proto3,oneof"` +} + +type TapByResourceRequest_Match_Http_Authority struct { + Authority string `protobuf:"bytes,3,opt,name=authority,proto3,oneof"` +} + +type TapByResourceRequest_Match_Http_Path struct { + Path string `protobuf:"bytes,4,opt,name=path,proto3,oneof"` +} + +func (*TapByResourceRequest_Match_Http_Scheme) isTapByResourceRequest_Match_Http_Match() {} + +func (*TapByResourceRequest_Match_Http_Method) isTapByResourceRequest_Match_Http_Match() {} + +func (*TapByResourceRequest_Match_Http_Authority) isTapByResourceRequest_Match_Http_Match() {} + +func (*TapByResourceRequest_Match_Http_Path) isTapByResourceRequest_Match_Http_Match() {} + +type TapByResourceRequest_Extract_Http struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Extract: + // *TapByResourceRequest_Extract_Http_Headers_ + Extract isTapByResourceRequest_Extract_Http_Extract `protobuf_oneof:"extract"` +} + +func (x *TapByResourceRequest_Extract_Http) Reset() { + *x = TapByResourceRequest_Extract_Http{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapByResourceRequest_Extract_Http) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapByResourceRequest_Extract_Http) ProtoMessage() {} + +func (x *TapByResourceRequest_Extract_Http) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapByResourceRequest_Extract_Http.ProtoReflect.Descriptor instead. +func (*TapByResourceRequest_Extract_Http) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{1, 1, 0} +} + +func (m *TapByResourceRequest_Extract_Http) GetExtract() isTapByResourceRequest_Extract_Http_Extract { + if m != nil { + return m.Extract + } + return nil +} + +func (x *TapByResourceRequest_Extract_Http) GetHeaders() *TapByResourceRequest_Extract_Http_Headers { + if x, ok := x.GetExtract().(*TapByResourceRequest_Extract_Http_Headers_); ok { + return x.Headers + } + return nil +} + +type isTapByResourceRequest_Extract_Http_Extract interface { + isTapByResourceRequest_Extract_Http_Extract() +} + +type TapByResourceRequest_Extract_Http_Headers_ struct { + Headers *TapByResourceRequest_Extract_Http_Headers `protobuf:"bytes,1,opt,name=headers,proto3,oneof"` +} + +func (*TapByResourceRequest_Extract_Http_Headers_) isTapByResourceRequest_Extract_Http_Extract() {} + +type TapByResourceRequest_Extract_Http_Headers struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *TapByResourceRequest_Extract_Http_Headers) Reset() { + *x = TapByResourceRequest_Extract_Http_Headers{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapByResourceRequest_Extract_Http_Headers) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapByResourceRequest_Extract_Http_Headers) ProtoMessage() {} + +func (x *TapByResourceRequest_Extract_Http_Headers) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapByResourceRequest_Extract_Http_Headers.ProtoReflect.Descriptor instead. +func (*TapByResourceRequest_Extract_Http_Headers) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{1, 1, 0, 0} +} + +type TapEvent_EndpointMeta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Labels map[string]string `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *TapEvent_EndpointMeta) Reset() { + *x = TapEvent_EndpointMeta{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapEvent_EndpointMeta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapEvent_EndpointMeta) ProtoMessage() {} + +func (x *TapEvent_EndpointMeta) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapEvent_EndpointMeta.ProtoReflect.Descriptor instead. +func (*TapEvent_EndpointMeta) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{2, 0} +} + +func (x *TapEvent_EndpointMeta) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} + +type TapEvent_RouteMeta struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Labels map[string]string `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *TapEvent_RouteMeta) Reset() { + *x = TapEvent_RouteMeta{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapEvent_RouteMeta) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapEvent_RouteMeta) ProtoMessage() {} + +func (x *TapEvent_RouteMeta) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapEvent_RouteMeta.ProtoReflect.Descriptor instead. +func (*TapEvent_RouteMeta) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{2, 1} +} + +func (x *TapEvent_RouteMeta) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} + +type TapEvent_Http struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Event: + // *TapEvent_Http_RequestInit_ + // *TapEvent_Http_ResponseInit_ + // *TapEvent_Http_ResponseEnd_ + Event isTapEvent_Http_Event `protobuf_oneof:"event"` +} + +func (x *TapEvent_Http) Reset() { + *x = TapEvent_Http{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapEvent_Http) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapEvent_Http) ProtoMessage() {} + +func (x *TapEvent_Http) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapEvent_Http.ProtoReflect.Descriptor instead. +func (*TapEvent_Http) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{2, 2} +} + +func (m *TapEvent_Http) GetEvent() isTapEvent_Http_Event { + if m != nil { + return m.Event + } + return nil +} + +func (x *TapEvent_Http) GetRequestInit() *TapEvent_Http_RequestInit { + if x, ok := x.GetEvent().(*TapEvent_Http_RequestInit_); ok { + return x.RequestInit + } + return nil +} + +func (x *TapEvent_Http) GetResponseInit() *TapEvent_Http_ResponseInit { + if x, ok := x.GetEvent().(*TapEvent_Http_ResponseInit_); ok { + return x.ResponseInit + } + return nil +} + +func (x *TapEvent_Http) GetResponseEnd() *TapEvent_Http_ResponseEnd { + if x, ok := x.GetEvent().(*TapEvent_Http_ResponseEnd_); ok { + return x.ResponseEnd + } + return nil +} + +type isTapEvent_Http_Event interface { + isTapEvent_Http_Event() +} + +type TapEvent_Http_RequestInit_ struct { + RequestInit *TapEvent_Http_RequestInit `protobuf:"bytes,1,opt,name=request_init,json=requestInit,proto3,oneof"` +} + +type TapEvent_Http_ResponseInit_ struct { + ResponseInit *TapEvent_Http_ResponseInit `protobuf:"bytes,2,opt,name=response_init,json=responseInit,proto3,oneof"` +} + +type TapEvent_Http_ResponseEnd_ struct { + ResponseEnd *TapEvent_Http_ResponseEnd `protobuf:"bytes,3,opt,name=response_end,json=responseEnd,proto3,oneof"` +} + +func (*TapEvent_Http_RequestInit_) isTapEvent_Http_Event() {} + +func (*TapEvent_Http_ResponseInit_) isTapEvent_Http_Event() {} + +func (*TapEvent_Http_ResponseEnd_) isTapEvent_Http_Event() {} + +type TapEvent_Http_StreamId struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A randomized base (stable across a process's runtime) + Base uint32 `protobuf:"varint,1,opt,name=base,proto3" json:"base,omitempty"` + // A stream id unique within the lifetime of `base`. + Stream uint64 `protobuf:"varint,2,opt,name=stream,proto3" json:"stream,omitempty"` +} + +func (x *TapEvent_Http_StreamId) Reset() { + *x = TapEvent_Http_StreamId{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapEvent_Http_StreamId) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapEvent_Http_StreamId) ProtoMessage() {} + +func (x *TapEvent_Http_StreamId) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapEvent_Http_StreamId.ProtoReflect.Descriptor instead. +func (*TapEvent_Http_StreamId) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{2, 2, 0} +} + +func (x *TapEvent_Http_StreamId) GetBase() uint32 { + if x != nil { + return x.Base + } + return 0 +} + +func (x *TapEvent_Http_StreamId) GetStream() uint64 { + if x != nil { + return x.Stream + } + return 0 +} + +type TapEvent_Http_RequestInit struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id *TapEvent_Http_StreamId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Method *viz.HttpMethod `protobuf:"bytes,2,opt,name=method,proto3" json:"method,omitempty"` + Scheme *viz.Scheme `protobuf:"bytes,3,opt,name=scheme,proto3" json:"scheme,omitempty"` + Authority string `protobuf:"bytes,4,opt,name=authority,proto3" json:"authority,omitempty"` + Path string `protobuf:"bytes,5,opt,name=path,proto3" json:"path,omitempty"` + Headers *viz.Headers `protobuf:"bytes,6,opt,name=headers,proto3" json:"headers,omitempty"` +} + +func (x *TapEvent_Http_RequestInit) Reset() { + *x = TapEvent_Http_RequestInit{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapEvent_Http_RequestInit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapEvent_Http_RequestInit) ProtoMessage() {} + +func (x *TapEvent_Http_RequestInit) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapEvent_Http_RequestInit.ProtoReflect.Descriptor instead. +func (*TapEvent_Http_RequestInit) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{2, 2, 1} +} + +func (x *TapEvent_Http_RequestInit) GetId() *TapEvent_Http_StreamId { + if x != nil { + return x.Id + } + return nil +} + +func (x *TapEvent_Http_RequestInit) GetMethod() *viz.HttpMethod { + if x != nil { + return x.Method + } + return nil +} + +func (x *TapEvent_Http_RequestInit) GetScheme() *viz.Scheme { + if x != nil { + return x.Scheme + } + return nil +} + +func (x *TapEvent_Http_RequestInit) GetAuthority() string { + if x != nil { + return x.Authority + } + return "" +} + +func (x *TapEvent_Http_RequestInit) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *TapEvent_Http_RequestInit) GetHeaders() *viz.Headers { + if x != nil { + return x.Headers + } + return nil +} + +type TapEvent_Http_ResponseInit struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id *TapEvent_Http_StreamId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + SinceRequestInit *duration.Duration `protobuf:"bytes,2,opt,name=since_request_init,json=sinceRequestInit,proto3" json:"since_request_init,omitempty"` + HttpStatus uint32 `protobuf:"varint,3,opt,name=http_status,json=httpStatus,proto3" json:"http_status,omitempty"` + Headers *viz.Headers `protobuf:"bytes,4,opt,name=headers,proto3" json:"headers,omitempty"` +} + +func (x *TapEvent_Http_ResponseInit) Reset() { + *x = TapEvent_Http_ResponseInit{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapEvent_Http_ResponseInit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapEvent_Http_ResponseInit) ProtoMessage() {} + +func (x *TapEvent_Http_ResponseInit) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapEvent_Http_ResponseInit.ProtoReflect.Descriptor instead. +func (*TapEvent_Http_ResponseInit) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{2, 2, 2} +} + +func (x *TapEvent_Http_ResponseInit) GetId() *TapEvent_Http_StreamId { + if x != nil { + return x.Id + } + return nil +} + +func (x *TapEvent_Http_ResponseInit) GetSinceRequestInit() *duration.Duration { + if x != nil { + return x.SinceRequestInit + } + return nil +} + +func (x *TapEvent_Http_ResponseInit) GetHttpStatus() uint32 { + if x != nil { + return x.HttpStatus + } + return 0 +} + +func (x *TapEvent_Http_ResponseInit) GetHeaders() *viz.Headers { + if x != nil { + return x.Headers + } + return nil +} + +type TapEvent_Http_ResponseEnd struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id *TapEvent_Http_StreamId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + SinceRequestInit *duration.Duration `protobuf:"bytes,2,opt,name=since_request_init,json=sinceRequestInit,proto3" json:"since_request_init,omitempty"` + SinceResponseInit *duration.Duration `protobuf:"bytes,3,opt,name=since_response_init,json=sinceResponseInit,proto3" json:"since_response_init,omitempty"` + ResponseBytes uint64 `protobuf:"varint,4,opt,name=response_bytes,json=responseBytes,proto3" json:"response_bytes,omitempty"` + Eos *viz.Eos `protobuf:"bytes,5,opt,name=eos,proto3" json:"eos,omitempty"` + Trailers *viz.Headers `protobuf:"bytes,6,opt,name=trailers,proto3" json:"trailers,omitempty"` +} + +func (x *TapEvent_Http_ResponseEnd) Reset() { + *x = TapEvent_Http_ResponseEnd{} + if protoimpl.UnsafeEnabled { + mi := &file_tap_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TapEvent_Http_ResponseEnd) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TapEvent_Http_ResponseEnd) ProtoMessage() {} + +func (x *TapEvent_Http_ResponseEnd) ProtoReflect() protoreflect.Message { + mi := &file_tap_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TapEvent_Http_ResponseEnd.ProtoReflect.Descriptor instead. +func (*TapEvent_Http_ResponseEnd) Descriptor() ([]byte, []int) { + return file_tap_proto_rawDescGZIP(), []int{2, 2, 3} +} + +func (x *TapEvent_Http_ResponseEnd) GetId() *TapEvent_Http_StreamId { + if x != nil { + return x.Id + } + return nil +} + +func (x *TapEvent_Http_ResponseEnd) GetSinceRequestInit() *duration.Duration { + if x != nil { + return x.SinceRequestInit + } + return nil +} + +func (x *TapEvent_Http_ResponseEnd) GetSinceResponseInit() *duration.Duration { + if x != nil { + return x.SinceResponseInit + } + return nil +} + +func (x *TapEvent_Http_ResponseEnd) GetResponseBytes() uint64 { + if x != nil { + return x.ResponseBytes + } + return 0 +} + +func (x *TapEvent_Http_ResponseEnd) GetEos() *viz.Eos { + if x != nil { + return x.Eos + } + return nil +} + +func (x *TapEvent_Http_ResponseEnd) GetTrailers() *viz.Headers { + if x != nil { + return x.Trailers + } + return nil +} + +var File_tap_proto protoreflect.FileDescriptor + +var file_tap_proto_rawDesc = []byte{ + 0x0a, 0x09, 0x74, 0x61, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x76, 0x69, 0x7a, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xaa, 0x02, 0x0a, 0x0a, 0x54, 0x61, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x03, 0x70, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x70, 0x6f, 0x64, 0x12, 0x20, 0x0a, 0x0a, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, + 0x61, 0x78, 0x52, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x6d, 0x61, 0x78, + 0x52, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x06, 0x74, 0x6f, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x6f, 0x49, 0x50, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x6f, 0x49, 0x50, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, + 0x72, 0x6f, 0x6d, 0x49, 0x50, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x72, 0x6f, + 0x6d, 0x49, 0x50, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x02, 0x18, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x22, 0xe5, 0x07, 0x0a, 0x14, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x3e, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x70, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x70, 0x73, 0x12, 0x44, 0x0a, + 0x07, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, + 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x07, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x1a, 0xa4, 0x04, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x40, 0x0a, + 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x65, 0x71, 0x48, 0x00, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, + 0x40, 0x0a, 0x03, 0x61, 0x6e, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, + 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x65, 0x71, 0x48, 0x00, 0x52, 0x03, 0x61, 0x6e, + 0x79, 0x12, 0x3c, 0x0a, 0x03, 0x6e, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, + 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, 0x03, 0x6e, 0x6f, 0x74, 0x12, + 0x45, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, + 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x48, + 0x74, 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, 0x49, 0x0a, 0x03, 0x53, + 0x65, 0x71, 0x12, 0x42, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, + 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x1a, 0x79, 0x0a, 0x04, 0x48, 0x74, 0x74, 0x70, 0x12, 0x18, + 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x42, 0x07, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x42, 0x07, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x1a, 0xce, 0x01, 0x0a, 0x07, 0x45, + 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x45, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x2e, 0x48, 0x74, 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, 0x71, 0x0a, + 0x04, 0x48, 0x74, 0x74, 0x70, 0x12, 0x53, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x48, + 0x00, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x42, 0x09, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x22, 0xc2, 0x0f, 0x0a, 0x08, + 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, + 0x72, 0x64, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x54, + 0x63, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, + 0x65, 0x74, 0x2e, 0x54, 0x63, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x10, 0x64, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x0a, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, + 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x52, 0x09, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x0f, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x04, 0x68, + 0x74, 0x74, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, 0x92, + 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, + 0x47, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, + 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x8c, 0x01, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x12, 0x44, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, + 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0xf8, 0x08, 0x0a, 0x04, 0x48, 0x74, 0x74, 0x70, 0x12, 0x4c, 0x0a, 0x0c, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, + 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x4f, 0x0a, 0x0d, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, + 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x4c, 0x0a, 0x0c, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, + 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x1a, 0x36, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x1a, 0x86, 0x02, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, + 0x12, 0x34, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, + 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x52, 0x06, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2f, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0xdf, 0x01, 0x0a, 0x0c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x34, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, + 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x47, 0x0a, 0x12, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x74, 0x74, + 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x68, 0x74, 0x74, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0xd6, 0x02, 0x0a, 0x0b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, + 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x48, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x47, 0x0a, 0x12, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x49, 0x0a, 0x13, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x11, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x03, + 0x65, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x6f, 0x73, 0x52, 0x03, 0x65, 0x6f, + 0x73, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, + 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x08, 0x74, 0x72, 0x61, 0x69, + 0x6c, 0x65, 0x72, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x38, 0x0a, + 0x0e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x55, 0x54, + 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x32, 0x99, 0x01, 0x0a, 0x03, 0x54, 0x61, 0x70, 0x12, 0x3e, 0x0a, 0x03, 0x54, 0x61, 0x70, 0x12, + 0x18, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, + 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x22, 0x03, 0x88, 0x02, 0x01, 0x30, 0x01, 0x12, 0x52, 0x0a, 0x0d, 0x54, 0x61, 0x70, 0x42, + 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x03, 0x88, 0x02, 0x01, 0x30, 0x01, 0x42, 0x2d, 0x5a, 0x2b, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x65, + 0x72, 0x64, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2f, 0x76, 0x69, 0x7a, 0x2f, + 0x74, 0x61, 0x70, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x74, 0x61, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, +} + +var ( + file_tap_proto_rawDescOnce sync.Once + file_tap_proto_rawDescData = file_tap_proto_rawDesc +) + +func file_tap_proto_rawDescGZIP() []byte { + file_tap_proto_rawDescOnce.Do(func() { + file_tap_proto_rawDescData = protoimpl.X.CompressGZIP(file_tap_proto_rawDescData) + }) + return file_tap_proto_rawDescData +} + +var file_tap_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_tap_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_tap_proto_goTypes = []interface{}{ + (TapEvent_ProxyDirection)(0), // 0: linkerd2.tap.TapEvent.ProxyDirection + (*TapRequest)(nil), // 1: linkerd2.tap.TapRequest + (*TapByResourceRequest)(nil), // 2: linkerd2.tap.TapByResourceRequest + (*TapEvent)(nil), // 3: linkerd2.tap.TapEvent + (*TapByResourceRequest_Match)(nil), // 4: linkerd2.tap.TapByResourceRequest.Match + (*TapByResourceRequest_Extract)(nil), // 5: linkerd2.tap.TapByResourceRequest.Extract + (*TapByResourceRequest_Match_Seq)(nil), // 6: linkerd2.tap.TapByResourceRequest.Match.Seq + (*TapByResourceRequest_Match_Http)(nil), // 7: linkerd2.tap.TapByResourceRequest.Match.Http + (*TapByResourceRequest_Extract_Http)(nil), // 8: linkerd2.tap.TapByResourceRequest.Extract.Http + (*TapByResourceRequest_Extract_Http_Headers)(nil), // 9: linkerd2.tap.TapByResourceRequest.Extract.Http.Headers + (*TapEvent_EndpointMeta)(nil), // 10: linkerd2.tap.TapEvent.EndpointMeta + (*TapEvent_RouteMeta)(nil), // 11: linkerd2.tap.TapEvent.RouteMeta + (*TapEvent_Http)(nil), // 12: linkerd2.tap.TapEvent.Http + nil, // 13: linkerd2.tap.TapEvent.EndpointMeta.LabelsEntry + nil, // 14: linkerd2.tap.TapEvent.RouteMeta.LabelsEntry + (*TapEvent_Http_StreamId)(nil), // 15: linkerd2.tap.TapEvent.Http.StreamId + (*TapEvent_Http_RequestInit)(nil), // 16: linkerd2.tap.TapEvent.Http.RequestInit + (*TapEvent_Http_ResponseInit)(nil), // 17: linkerd2.tap.TapEvent.Http.ResponseInit + (*TapEvent_Http_ResponseEnd)(nil), // 18: linkerd2.tap.TapEvent.Http.ResponseEnd + (*viz.ResourceSelection)(nil), // 19: linkerd2.viz.ResourceSelection + (*net.TcpAddress)(nil), // 20: linkerd2.common.net.TcpAddress + (*viz.HttpMethod)(nil), // 21: linkerd2.viz.HttpMethod + (*viz.Scheme)(nil), // 22: linkerd2.viz.Scheme + (*viz.Headers)(nil), // 23: linkerd2.viz.Headers + (*duration.Duration)(nil), // 24: google.protobuf.Duration + (*viz.Eos)(nil), // 25: linkerd2.viz.Eos +} +var file_tap_proto_depIdxs = []int32{ + 19, // 0: linkerd2.tap.TapByResourceRequest.target:type_name -> linkerd2.viz.ResourceSelection + 4, // 1: linkerd2.tap.TapByResourceRequest.match:type_name -> linkerd2.tap.TapByResourceRequest.Match + 5, // 2: linkerd2.tap.TapByResourceRequest.extract:type_name -> linkerd2.tap.TapByResourceRequest.Extract + 20, // 3: linkerd2.tap.TapEvent.source:type_name -> linkerd2.common.net.TcpAddress + 10, // 4: linkerd2.tap.TapEvent.source_meta:type_name -> linkerd2.tap.TapEvent.EndpointMeta + 20, // 5: linkerd2.tap.TapEvent.destination:type_name -> linkerd2.common.net.TcpAddress + 10, // 6: linkerd2.tap.TapEvent.destination_meta:type_name -> linkerd2.tap.TapEvent.EndpointMeta + 11, // 7: linkerd2.tap.TapEvent.route_meta:type_name -> linkerd2.tap.TapEvent.RouteMeta + 0, // 8: linkerd2.tap.TapEvent.proxy_direction:type_name -> linkerd2.tap.TapEvent.ProxyDirection + 12, // 9: linkerd2.tap.TapEvent.http:type_name -> linkerd2.tap.TapEvent.Http + 6, // 10: linkerd2.tap.TapByResourceRequest.Match.all:type_name -> linkerd2.tap.TapByResourceRequest.Match.Seq + 6, // 11: linkerd2.tap.TapByResourceRequest.Match.any:type_name -> linkerd2.tap.TapByResourceRequest.Match.Seq + 4, // 12: linkerd2.tap.TapByResourceRequest.Match.not:type_name -> linkerd2.tap.TapByResourceRequest.Match + 19, // 13: linkerd2.tap.TapByResourceRequest.Match.destinations:type_name -> linkerd2.viz.ResourceSelection + 7, // 14: linkerd2.tap.TapByResourceRequest.Match.http:type_name -> linkerd2.tap.TapByResourceRequest.Match.Http + 8, // 15: linkerd2.tap.TapByResourceRequest.Extract.http:type_name -> linkerd2.tap.TapByResourceRequest.Extract.Http + 4, // 16: linkerd2.tap.TapByResourceRequest.Match.Seq.matches:type_name -> linkerd2.tap.TapByResourceRequest.Match + 9, // 17: linkerd2.tap.TapByResourceRequest.Extract.Http.headers:type_name -> linkerd2.tap.TapByResourceRequest.Extract.Http.Headers + 13, // 18: linkerd2.tap.TapEvent.EndpointMeta.labels:type_name -> linkerd2.tap.TapEvent.EndpointMeta.LabelsEntry + 14, // 19: linkerd2.tap.TapEvent.RouteMeta.labels:type_name -> linkerd2.tap.TapEvent.RouteMeta.LabelsEntry + 16, // 20: linkerd2.tap.TapEvent.Http.request_init:type_name -> linkerd2.tap.TapEvent.Http.RequestInit + 17, // 21: linkerd2.tap.TapEvent.Http.response_init:type_name -> linkerd2.tap.TapEvent.Http.ResponseInit + 18, // 22: linkerd2.tap.TapEvent.Http.response_end:type_name -> linkerd2.tap.TapEvent.Http.ResponseEnd + 15, // 23: linkerd2.tap.TapEvent.Http.RequestInit.id:type_name -> linkerd2.tap.TapEvent.Http.StreamId + 21, // 24: linkerd2.tap.TapEvent.Http.RequestInit.method:type_name -> linkerd2.viz.HttpMethod + 22, // 25: linkerd2.tap.TapEvent.Http.RequestInit.scheme:type_name -> linkerd2.viz.Scheme + 23, // 26: linkerd2.tap.TapEvent.Http.RequestInit.headers:type_name -> linkerd2.viz.Headers + 15, // 27: linkerd2.tap.TapEvent.Http.ResponseInit.id:type_name -> linkerd2.tap.TapEvent.Http.StreamId + 24, // 28: linkerd2.tap.TapEvent.Http.ResponseInit.since_request_init:type_name -> google.protobuf.Duration + 23, // 29: linkerd2.tap.TapEvent.Http.ResponseInit.headers:type_name -> linkerd2.viz.Headers + 15, // 30: linkerd2.tap.TapEvent.Http.ResponseEnd.id:type_name -> linkerd2.tap.TapEvent.Http.StreamId + 24, // 31: linkerd2.tap.TapEvent.Http.ResponseEnd.since_request_init:type_name -> google.protobuf.Duration + 24, // 32: linkerd2.tap.TapEvent.Http.ResponseEnd.since_response_init:type_name -> google.protobuf.Duration + 25, // 33: linkerd2.tap.TapEvent.Http.ResponseEnd.eos:type_name -> linkerd2.viz.Eos + 23, // 34: linkerd2.tap.TapEvent.Http.ResponseEnd.trailers:type_name -> linkerd2.viz.Headers + 1, // 35: linkerd2.tap.Tap.Tap:input_type -> linkerd2.tap.TapRequest + 2, // 36: linkerd2.tap.Tap.TapByResource:input_type -> linkerd2.tap.TapByResourceRequest + 3, // 37: linkerd2.tap.Tap.Tap:output_type -> linkerd2.tap.TapEvent + 3, // 38: linkerd2.tap.Tap.TapByResource:output_type -> linkerd2.tap.TapEvent + 37, // [37:39] is the sub-list for method output_type + 35, // [35:37] is the sub-list for method input_type + 35, // [35:35] is the sub-list for extension type_name + 35, // [35:35] is the sub-list for extension extendee + 0, // [0:35] is the sub-list for field type_name +} + +func init() { file_tap_proto_init() } +func file_tap_proto_init() { + if File_tap_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_tap_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapByResourceRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapByResourceRequest_Match); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapByResourceRequest_Extract); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapByResourceRequest_Match_Seq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapByResourceRequest_Match_Http); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapByResourceRequest_Extract_Http); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapByResourceRequest_Extract_Http_Headers); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapEvent_EndpointMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapEvent_RouteMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapEvent_Http); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapEvent_Http_StreamId); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapEvent_Http_RequestInit); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapEvent_Http_ResponseInit); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tap_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TapEvent_Http_ResponseEnd); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_tap_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*TapRequest_Pod)(nil), + (*TapRequest_Deployment)(nil), + } + file_tap_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*TapEvent_Http_)(nil), + } + file_tap_proto_msgTypes[3].OneofWrappers = []interface{}{ + (*TapByResourceRequest_Match_All)(nil), + (*TapByResourceRequest_Match_Any)(nil), + (*TapByResourceRequest_Match_Not)(nil), + (*TapByResourceRequest_Match_Destinations)(nil), + (*TapByResourceRequest_Match_Http_)(nil), + } + file_tap_proto_msgTypes[4].OneofWrappers = []interface{}{ + (*TapByResourceRequest_Extract_Http_)(nil), + } + file_tap_proto_msgTypes[6].OneofWrappers = []interface{}{ + (*TapByResourceRequest_Match_Http_Scheme)(nil), + (*TapByResourceRequest_Match_Http_Method)(nil), + (*TapByResourceRequest_Match_Http_Authority)(nil), + (*TapByResourceRequest_Match_Http_Path)(nil), + } + file_tap_proto_msgTypes[7].OneofWrappers = []interface{}{ + (*TapByResourceRequest_Extract_Http_Headers_)(nil), + } + file_tap_proto_msgTypes[11].OneofWrappers = []interface{}{ + (*TapEvent_Http_RequestInit_)(nil), + (*TapEvent_Http_ResponseInit_)(nil), + (*TapEvent_Http_ResponseEnd_)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_tap_proto_rawDesc, + NumEnums: 1, + NumMessages: 18, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_tap_proto_goTypes, + DependencyIndexes: file_tap_proto_depIdxs, + EnumInfos: file_tap_proto_enumTypes, + MessageInfos: file_tap_proto_msgTypes, + }.Build() + File_tap_proto = out.File + file_tap_proto_rawDesc = nil + file_tap_proto_goTypes = nil + file_tap_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// TapClient is the client API for Tap service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type TapClient interface { + // Deprecated: Do not use. + Tap(ctx context.Context, in *TapRequest, opts ...grpc.CallOption) (Tap_TapClient, error) + // Deprecated: Do not use. + TapByResource(ctx context.Context, in *TapByResourceRequest, opts ...grpc.CallOption) (Tap_TapByResourceClient, error) +} + +type tapClient struct { + cc grpc.ClientConnInterface +} + +func NewTapClient(cc grpc.ClientConnInterface) TapClient { + return &tapClient{cc} +} + +// Deprecated: Do not use. +func (c *tapClient) Tap(ctx context.Context, in *TapRequest, opts ...grpc.CallOption) (Tap_TapClient, error) { + stream, err := c.cc.NewStream(ctx, &_Tap_serviceDesc.Streams[0], "/linkerd2.tap.Tap/Tap", opts...) + if err != nil { + return nil, err + } + x := &tapTapClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Tap_TapClient interface { + Recv() (*TapEvent, error) + grpc.ClientStream +} + +type tapTapClient struct { + grpc.ClientStream +} + +func (x *tapTapClient) Recv() (*TapEvent, error) { + m := new(TapEvent) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// Deprecated: Do not use. +func (c *tapClient) TapByResource(ctx context.Context, in *TapByResourceRequest, opts ...grpc.CallOption) (Tap_TapByResourceClient, error) { + stream, err := c.cc.NewStream(ctx, &_Tap_serviceDesc.Streams[1], "/linkerd2.tap.Tap/TapByResource", opts...) + if err != nil { + return nil, err + } + x := &tapTapByResourceClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Tap_TapByResourceClient interface { + Recv() (*TapEvent, error) + grpc.ClientStream +} + +type tapTapByResourceClient struct { + grpc.ClientStream +} + +func (x *tapTapByResourceClient) Recv() (*TapEvent, error) { + m := new(TapEvent) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// TapServer is the server API for Tap service. +type TapServer interface { + // Deprecated: Do not use. + Tap(*TapRequest, Tap_TapServer) error + // Deprecated: Do not use. + TapByResource(*TapByResourceRequest, Tap_TapByResourceServer) error +} + +// UnimplementedTapServer can be embedded to have forward compatible implementations. +type UnimplementedTapServer struct { +} + +func (*UnimplementedTapServer) Tap(*TapRequest, Tap_TapServer) error { + return status.Errorf(codes.Unimplemented, "method Tap not implemented") +} +func (*UnimplementedTapServer) TapByResource(*TapByResourceRequest, Tap_TapByResourceServer) error { + return status.Errorf(codes.Unimplemented, "method TapByResource not implemented") +} + +func RegisterTapServer(s *grpc.Server, srv TapServer) { + s.RegisterService(&_Tap_serviceDesc, srv) +} + +func _Tap_Tap_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(TapRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(TapServer).Tap(m, &tapTapServer{stream}) +} + +type Tap_TapServer interface { + Send(*TapEvent) error + grpc.ServerStream +} + +type tapTapServer struct { + grpc.ServerStream +} + +func (x *tapTapServer) Send(m *TapEvent) error { + return x.ServerStream.SendMsg(m) +} + +func _Tap_TapByResource_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(TapByResourceRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(TapServer).TapByResource(m, &tapTapByResourceServer{stream}) +} + +type Tap_TapByResourceServer interface { + Send(*TapEvent) error + grpc.ServerStream +} + +type tapTapByResourceServer struct { + grpc.ServerStream +} + +func (x *tapTapByResourceServer) Send(m *TapEvent) error { + return x.ServerStream.SendMsg(m) +} + +var _Tap_serviceDesc = grpc.ServiceDesc{ + ServiceName: "linkerd2.tap.Tap", + HandlerType: (*TapServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "Tap", + Handler: _Tap_Tap_Handler, + ServerStreams: true, + }, + { + StreamName: "TapByResource", + Handler: _Tap_TapByResource_Handler, + ServerStreams: true, + }, + }, + Metadata: "tap.proto", +} diff --git a/controller/cmd/tap-injector/main.go b/viz/tap/injector/main.go similarity index 86% rename from controller/cmd/tap-injector/main.go rename to viz/tap/injector/main.go index 0a6ca78412840..8012a7c8c4a88 100644 --- a/controller/cmd/tap-injector/main.go +++ b/viz/tap/injector/main.go @@ -1,4 +1,4 @@ -package tapinjector +package injector import ( "context" @@ -6,7 +6,6 @@ import ( "fmt" "github.com/linkerd/linkerd2/controller/k8s" - tapinjector "github.com/linkerd/linkerd2/controller/tap-injector" "github.com/linkerd/linkerd2/controller/webhook" "github.com/linkerd/linkerd2/pkg/flags" ) @@ -22,7 +21,7 @@ func Main(args []string) { webhook.Launch( context.Background(), []k8s.APIResource{k8s.NS}, - tapinjector.Mutate(*tapSvcName), + Mutate(*tapSvcName), "tap-injector", *metricsAddr, *addr, diff --git a/controller/tap-injector/patch.go b/viz/tap/injector/patch.go similarity index 94% rename from controller/tap-injector/patch.go rename to viz/tap/injector/patch.go index d1532c6e6518e..57305fb1b78b4 100644 --- a/controller/tap-injector/patch.go +++ b/viz/tap/injector/patch.go @@ -1,4 +1,4 @@ -package tapinjector +package injector import ( "fmt" diff --git a/controller/tap-injector/webhook.go b/viz/tap/injector/webhook.go similarity index 99% rename from controller/tap-injector/webhook.go rename to viz/tap/injector/webhook.go index 071d7c5d502eb..2eee06e6f459b 100644 --- a/controller/tap-injector/webhook.go +++ b/viz/tap/injector/webhook.go @@ -1,4 +1,4 @@ -package tapinjector +package injector import ( "bytes" diff --git a/viz/tap/pkg/protohttp.go b/viz/tap/pkg/protohttp.go new file mode 100644 index 0000000000000..26ec53542091c --- /dev/null +++ b/viz/tap/pkg/protohttp.go @@ -0,0 +1,28 @@ +package pkg + +import ( + "fmt" + + "github.com/linkerd/linkerd2/pkg/k8s" + tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" +) + +// TapReqToURL converts a TapByResourceRequest protobuf object to a URL for use +// with the Kubernetes tap.linkerd.io APIService. +func TapReqToURL(req *tapPb.TapByResourceRequest) string { + res := req.GetTarget().GetResource() + + // non-namespaced + if res.GetType() == k8s.Namespace { + return fmt.Sprintf( + "/apis/tap.linkerd.io/v1alpha1/watch/namespaces/%s/tap", + res.GetName(), + ) + } + + // namespaced + return fmt.Sprintf( + "/apis/tap.linkerd.io/v1alpha1/watch/namespaces/%s/%s/%s/tap", + res.GetNamespace(), res.GetType()+"s", res.GetName(), + ) +} diff --git a/viz/tap/pkg/protohttp_test.go b/viz/tap/pkg/protohttp_test.go new file mode 100644 index 0000000000000..40033c584cd95 --- /dev/null +++ b/viz/tap/pkg/protohttp_test.go @@ -0,0 +1,54 @@ +package pkg + +import ( + "fmt" + "testing" + + metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" +) + +func TestTapReqToURL(t *testing.T) { + expectations := []struct { + req *tapPb.TapByResourceRequest + url string + }{ + { + req: &tapPb.TapByResourceRequest{}, + url: "/apis/tap.linkerd.io/v1alpha1/watch/namespaces//s//tap", + }, + { + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ + Type: "namespace", + Name: "test-name", + }, + }, + }, + url: "/apis/tap.linkerd.io/v1alpha1/watch/namespaces/test-name/tap", + }, + { + req: &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ + Namespace: "test-ns", + Type: "test-type", + Name: "test-name", + }, + }, + }, + url: "/apis/tap.linkerd.io/v1alpha1/watch/namespaces/test-ns/test-types/test-name/tap", + }, + } + for i, exp := range expectations { + exp := exp // pin + + t.Run(fmt.Sprintf("%d constructs the expected URL from a TapRequest", i), func(t *testing.T) { + url := TapReqToURL(exp.req) + if url != exp.url { + t.Fatalf("Unexpected url: %s, Expected: %s", url, exp.url) + } + }) + } +} diff --git a/pkg/tap/tap.go b/viz/tap/pkg/reader.go similarity index 92% rename from pkg/tap/tap.go rename to viz/tap/pkg/reader.go index e8d1da1ec02f1..5d7d89c3092fb 100644 --- a/pkg/tap/tap.go +++ b/viz/tap/pkg/reader.go @@ -1,4 +1,4 @@ -package tap +package pkg import ( "bufio" @@ -12,7 +12,7 @@ import ( "github.com/golang/protobuf/proto" "github.com/linkerd/linkerd2/pkg/k8s" "github.com/linkerd/linkerd2/pkg/protohttp" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + pb "github.com/linkerd/linkerd2/viz/tap/gen/tap" log "github.com/sirupsen/logrus" ) @@ -42,7 +42,7 @@ func Reader(ctx context.Context, k8sAPI *k8s.KubernetesAPI, req *pb.TapByResourc if err != nil { return nil, nil, err } - url.Path = fmt.Sprintf("%s%s", url.Path, protohttp.TapReqToURL(req)) + url.Path = fmt.Sprintf("%s%s", url.Path, TapReqToURL(req)) httpReq, err := http.NewRequest( http.MethodPost, diff --git a/viz/tap/pkg/util.go b/viz/tap/pkg/util.go new file mode 100644 index 0000000000000..afca6d301efeb --- /dev/null +++ b/viz/tap/pkg/util.go @@ -0,0 +1,184 @@ +package pkg + +import ( + "encoding/binary" + "fmt" + + "github.com/linkerd/linkerd2/controller/api/util" + netPb "github.com/linkerd/linkerd2/controller/gen/common/net" + "github.com/linkerd/linkerd2/pkg/k8s" + metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + "github.com/linkerd/linkerd2/viz/pkg/api" + tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" +) + +// ValidTapDestinations specifies resource types allowed as a tap destination: +// - destination resource on an outbound 'to' query +var ValidTapDestinations = []string{ + k8s.CronJob, + k8s.DaemonSet, + k8s.Deployment, + k8s.Job, + k8s.Namespace, + k8s.Pod, + k8s.ReplicaSet, + k8s.ReplicationController, + k8s.Service, + k8s.StatefulSet, +} + +// TapRequestParams contains parameters that are used to build a +// TapByResourceRequest. +type TapRequestParams struct { + Resource string + Namespace string + ToResource string + ToNamespace string + MaxRps float32 + Scheme string + Method string + Authority string + Path string + Extract bool + LabelSelector string +} + +// BuildTapByResourceRequest builds a Public API TapByResourceRequest from a +// TapRequestParams. +func BuildTapByResourceRequest(params TapRequestParams) (*tapPb.TapByResourceRequest, error) { + target, err := util.BuildResource(params.Namespace, params.Resource) + if err != nil { + return nil, fmt.Errorf("target resource invalid: %s", err) + } + if !contains(api.ValidTargets, target.Type) { + return nil, fmt.Errorf("unsupported resource type [%s]", target.Type) + } + + matches := []*tapPb.TapByResourceRequest_Match{} + + if params.ToResource != "" { + destination, err := util.BuildResource(params.ToNamespace, params.ToResource) + if err != nil { + return nil, fmt.Errorf("destination resource invalid: %s", err) + } + if !contains(ValidTapDestinations, destination.Type) { + return nil, fmt.Errorf("unsupported resource type [%s]", destination.Type) + } + + match := tapPb.TapByResourceRequest_Match{ + Match: &tapPb.TapByResourceRequest_Match_Destinations{ + Destinations: &metricsPb.ResourceSelection{ + Resource: destination, + }, + }, + } + matches = append(matches, &match) + } + + if params.Scheme != "" { + match := buildMatchHTTP(&tapPb.TapByResourceRequest_Match_Http{ + Match: &tapPb.TapByResourceRequest_Match_Http_Scheme{Scheme: params.Scheme}, + }) + matches = append(matches, &match) + } + if params.Method != "" { + match := buildMatchHTTP(&tapPb.TapByResourceRequest_Match_Http{ + Match: &tapPb.TapByResourceRequest_Match_Http_Method{Method: params.Method}, + }) + matches = append(matches, &match) + } + if params.Authority != "" { + match := buildMatchHTTP(&tapPb.TapByResourceRequest_Match_Http{ + Match: &tapPb.TapByResourceRequest_Match_Http_Authority{Authority: params.Authority}, + }) + matches = append(matches, &match) + } + if params.Path != "" { + match := buildMatchHTTP(&tapPb.TapByResourceRequest_Match_Http{ + Match: &tapPb.TapByResourceRequest_Match_Http_Path{Path: params.Path}, + }) + matches = append(matches, &match) + } + + extract := &tapPb.TapByResourceRequest_Extract{} + if params.Extract { + extract = buildExtractHTTP(&tapPb.TapByResourceRequest_Extract_Http{ + Extract: &tapPb.TapByResourceRequest_Extract_Http_Headers_{ + Headers: &tapPb.TapByResourceRequest_Extract_Http_Headers{}, + }, + }) + } + + return &tapPb.TapByResourceRequest{ + Target: &metricsPb.ResourceSelection{ + Resource: target, + LabelSelector: params.LabelSelector, + }, + MaxRps: params.MaxRps, + Match: &tapPb.TapByResourceRequest_Match{ + Match: &tapPb.TapByResourceRequest_Match_All{ + All: &tapPb.TapByResourceRequest_Match_Seq{ + Matches: matches, + }, + }, + }, + Extract: extract, + }, nil +} + +func buildMatchHTTP(match *tapPb.TapByResourceRequest_Match_Http) tapPb.TapByResourceRequest_Match { + return tapPb.TapByResourceRequest_Match{ + Match: &tapPb.TapByResourceRequest_Match_Http_{ + Http: match, + }, + } +} + +func buildExtractHTTP(extract *tapPb.TapByResourceRequest_Extract_Http) *tapPb.TapByResourceRequest_Extract { + return &tapPb.TapByResourceRequest_Extract{ + Extract: &tapPb.TapByResourceRequest_Extract_Http_{ + Http: extract, + }, + } +} + +func contains(list []string, s string) bool { + for _, elem := range list { + if s == elem { + return true + } + } + return false +} + +// CreateTapEvent generates tap events for use in tests +func CreateTapEvent(eventHTTP *tapPb.TapEvent_Http, dstMeta map[string]string, proxyDirection tapPb.TapEvent_ProxyDirection) *tapPb.TapEvent { + event := &tapPb.TapEvent{ + ProxyDirection: proxyDirection, + Source: &netPb.TcpAddress{ + Ip: &netPb.IPAddress{ + Ip: &netPb.IPAddress_Ipv4{ + Ipv4: uint32(1), + }, + }, + }, + Destination: &netPb.TcpAddress{ + Ip: &netPb.IPAddress{ + Ip: &netPb.IPAddress_Ipv6{ + Ipv6: &netPb.IPv6{ + // All nodes address: https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml + First: binary.BigEndian.Uint64([]byte{0xff, 0x01, 0, 0, 0, 0, 0, 0}), + Last: binary.BigEndian.Uint64([]byte{0, 0, 0, 0, 0, 0, 0, 0x01}), + }, + }, + }, + }, + Event: &tapPb.TapEvent_Http_{ + Http: eventHTTP, + }, + DestinationMeta: &tapPb.TapEvent_EndpointMeta{ + Labels: dstMeta, + }, + } + return event +} diff --git a/viz/tap/proto/tap.proto b/viz/tap/proto/tap.proto new file mode 100644 index 0000000000000..6c0d749111d80 --- /dev/null +++ b/viz/tap/proto/tap.proto @@ -0,0 +1,172 @@ +syntax = "proto3"; + +package linkerd2.tap; + +import "google/protobuf/duration.proto"; +import "common/net.proto"; +import "viz.proto"; + +option go_package = "github.com/linkerd/linkerd2/viz/tap/gen/tap"; + +message TapRequest { + option deprecated = true; + + oneof target { + string pod = 1; + string deployment = 2; + } + // validation of these fields happens on the server + float maxRps = 3; + uint32 toPort = 4; + string toIP = 5; + uint32 fromPort = 6; + string fromIP = 7; + string scheme = 8; + string method = 9; + string authority = 10; + string path = 11; +} + +// A tap request over kubernetes resources. +// +// This is used only by the tap APIServer. +message TapByResourceRequest { + // Describes the kubernetes pods that should be tapped. + viz.ResourceSelection target = 1; + + // Selects over events to be reported. + Match match = 2; + + // Limits the number of events to be inspected. + float maxRps = 3; + + message Match { + oneof match { + // If empty, matches all messages. + Seq all = 1; + + // If empty, matches no messages. + Seq any = 2; + + // Inverts the inner match. + Match not = 3; + + // Matches events being sent to any of the selected destinations. + viz.ResourceSelection destinations = 4; + + // Matches HTTP requests by their metadata. + Http http = 5; + } + + message Seq { + repeated Match matches = 1; + } + + message Http { + oneof match { + string scheme = 1; + string method = 2; + string authority = 3; + string path = 4; + } + } + } + + // Conditionally extracts components from requests and responses to include + // in tap events + Extract extract = 4; + + message Extract { + oneof extract { + Http http = 1; + } + + message Http { + oneof extract { + Headers headers = 1; + } + + message Headers {} + } + } +} + +// This is used only by the tap APIServer. +message TapEvent { + linkerd2.common.net.TcpAddress source = 1; + EndpointMeta source_meta = 5; + + linkerd2.common.net.TcpAddress destination = 2; + EndpointMeta destination_meta = 4; + + RouteMeta route_meta = 7; + + ProxyDirection proxy_direction = 6; + enum ProxyDirection { + UNKNOWN = 0; + INBOUND = 1; + OUTBOUND = 2; + } + + oneof event { + Http http = 3; + } + + message EndpointMeta { + map labels = 1; + } + + message RouteMeta { + map labels = 1; + } + + message Http { + oneof event { + RequestInit request_init = 1; + ResponseInit response_init = 2; + ResponseEnd response_end = 3; + } + + message StreamId { + // A randomized base (stable across a process's runtime) + uint32 base = 1; + + // A stream id unique within the lifetime of `base`. + uint64 stream = 2; + } + + message RequestInit { + StreamId id = 1; + viz.HttpMethod method = 2; + viz.Scheme scheme = 3; + string authority = 4; + string path = 5; + viz.Headers headers = 6; + } + + message ResponseInit { + StreamId id = 1; + + google.protobuf.Duration since_request_init = 2; + + uint32 http_status = 3; + viz.Headers headers = 4; + } + + message ResponseEnd { + StreamId id = 1; + + google.protobuf.Duration since_request_init = 2; + google.protobuf.Duration since_response_init = 3; + uint64 response_bytes = 4; + + viz.Eos eos = 5; + viz.Headers trailers = 6; + } + } +} + +service Tap { + rpc Tap(TapRequest) returns (stream TapEvent) { option deprecated = true; } + rpc TapByResource(TapByResourceRequest) returns (stream TapEvent) { option deprecated = true; } +} diff --git a/web/Dockerfile b/web/Dockerfile index 21379975c2c73..502e49dc47bf6 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -40,6 +40,8 @@ COPY web/srv web/srv COPY controller controller COPY viz/metrics-api viz/metrics-api COPY viz/pkg viz/pkg +COPY viz/tap/gen/tap viz/tap/gen/tap +COPY viz/tap/pkg viz/tap/pkg COPY pkg pkg ARG TARGETARCH RUN CGO_ENABLED=0 GOOS=linux GOARCH=$TARGETARCH go build -mod=readonly -o web/web -ldflags "-s -w" ./web diff --git a/web/srv/api_handlers.go b/web/srv/api_handlers.go index 437ce408ed44a..f1a3d48d16a4c 100644 --- a/web/srv/api_handlers.go +++ b/web/srv/api_handlers.go @@ -15,14 +15,14 @@ import ( "github.com/golang/protobuf/proto" "github.com/gorilla/websocket" "github.com/julienschmidt/httprouter" - coreUtil "github.com/linkerd/linkerd2/controller/api/util" publicPb "github.com/linkerd/linkerd2/controller/gen/public" "github.com/linkerd/linkerd2/pkg/healthcheck" "github.com/linkerd/linkerd2/pkg/k8s" "github.com/linkerd/linkerd2/pkg/protohttp" - "github.com/linkerd/linkerd2/pkg/tap" - pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" vizUtil "github.com/linkerd/linkerd2/viz/metrics-api/util" + tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" + "github.com/linkerd/linkerd2/viz/tap/pkg" log "github.com/sirupsen/logrus" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/yaml" @@ -98,9 +98,9 @@ func (h *handler) handleAPIVersion(w http.ResponseWriter, req *http.Request, p h } func (h *handler) handleAPIPods(w http.ResponseWriter, req *http.Request, p httprouter.Params) { - pods, err := h.apiClient.ListPods(req.Context(), &pb.ListPodsRequest{ - Selector: &pb.ResourceSelection{ - Resource: &pb.Resource{ + pods, err := h.apiClient.ListPods(req.Context(), &metricsPb.ListPodsRequest{ + Selector: &metricsPb.ResourceSelection{ + Resource: &metricsPb.Resource{ Namespace: req.FormValue("namespace"), }, }, @@ -115,7 +115,7 @@ func (h *handler) handleAPIPods(w http.ResponseWriter, req *http.Request, p http } func (h *handler) handleAPIServices(w http.ResponseWriter, req *http.Request, p httprouter.Params) { - services, err := h.apiClient.ListServices(req.Context(), &pb.ListServicesRequest{ + services, err := h.apiClient.ListServices(req.Context(), &metricsPb.ListServicesRequest{ Namespace: req.FormValue("namespace"), }) @@ -257,27 +257,27 @@ func (h *handler) handleAPITap(w http.ResponseWriter, req *http.Request, p httpr return } - var requestParams coreUtil.TapRequestParams + var requestParams pkg.TapRequestParams err = json.Unmarshal(message, &requestParams) if err != nil { websocketError(ws, websocket.CloseInternalServerErr, err) return } - tapReq, err := coreUtil.BuildTapByResourceRequest(requestParams) + tapReq, err := pkg.BuildTapByResourceRequest(requestParams) if err != nil { websocketError(ws, websocket.CloseInternalServerErr, err) return } go func() { - reader, body, err := tap.Reader(req.Context(), h.k8sAPI, tapReq) + reader, body, err := pkg.Reader(req.Context(), h.k8sAPI, tapReq) if err != nil { // If there was a [403] error when initiating a tap, close the // socket with `ClosePolicyViolation` status code so that the error // renders without the error prefix in the banner if httpErr, ok := err.(protohttp.HTTPError); ok && httpErr.Code == http.StatusForbidden { - err := fmt.Errorf("missing authorization, visit %s to remedy", tap.TapRbacURL) + err := fmt.Errorf("missing authorization, visit %s to remedy", pkg.TapRbacURL) websocketError(ws, websocket.ClosePolicyViolation, err) return } @@ -290,7 +290,7 @@ func (h *handler) handleAPITap(w http.ResponseWriter, req *http.Request, p httpr defer body.Close() for { - event := pb.TapEvent{} + event := tapPb.TapEvent{} err := protohttp.FromByteStreamToProtocolBuffers(reader, &event) if err == io.EOF { break @@ -451,7 +451,7 @@ func (h *handler) handleAPIGateways(w http.ResponseWriter, req *http.Request, _ renderJSONError(w, err, http.StatusInternalServerError) return } - gatewayRequest := &pb.GatewaysRequest{ + gatewayRequest := &metricsPb.GatewaysRequest{ TimeWindow: window, GatewayNamespace: req.FormValue("gatewayNamespace"), RemoteClusterName: req.FormValue("remoteClusterName"), From a715be72093e88689e5a8e1b4d59ec8c4663d591 Mon Sep 17 00:00:00 2001 From: Kevin Leimkuhler Date: Tue, 2 Feb 2021 03:20:29 +0000 Subject: [PATCH 2/8] Add Helm doc lints Signed-off-by: Kevin Leimkuhler --- viz/charts/linkerd-viz/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/viz/charts/linkerd-viz/README.md b/viz/charts/linkerd-viz/README.md index 855017d67e17b..6a14344892e43 100644 --- a/viz/charts/linkerd-viz/README.md +++ b/viz/charts/linkerd-viz/README.md @@ -71,7 +71,7 @@ Kubernetes: `>=1.13.0-0` | Key | Type | Default | Description | |-----|------|---------|-------------| -| clusterDomain | string | `"cluster.local"` | Kubernetes DNS Domain name to use | +| clusterDomain | string | `"cluster.local"` | Kubernetes DNS Domain name to use | | createdByAnnotation | string | `"linkerd.io/created-by"` | | | dashboard.UID | int | `2103` | | | dashboard.enforcedHostRegexp | string | `""` | Host header validation regex for the dashboard. See the [Linkerd documentation](https://linkerd.io/2/tasks/exposing-dashboard) for more information | @@ -100,7 +100,7 @@ Kubernetes: `>=1.13.0-0` | grafana.resources.cpu.request | string | `nil` | Amount of CPU units that the grafana container requests | | grafana.resources.memory.limit | string | `nil` | Maximum amount of memory that grafana container can use | | grafana.resources.memory.request | string | `nil` | Amount of memory that the grafana container requests | -| identityTrustDomain | string | `"cluster.local"` | Trust domain used for identity | +| identityTrustDomain | string | `"cluster.local"` | Trust domain used for identity | | imagePullSecrets | list | `[]` | For Private docker registries, authentication is needed. Registry secrets are applied to the respective service accounts | | installNamespace | bool | `true` | Set to false when installing in a custom namespace. | | jaegerUrl | string | `""` | url of external jaeger instance Set this to `jaeger.linkerd-jaeger.svc.` if you plan to use jaeger extension | @@ -144,7 +144,7 @@ Kubernetes: `>=1.13.0-0` | tap.caBundle | string | `""` | Bundle of CA certificates for Tap component. If not provided then Helm will use the certificate generated for `tap.crtPEM`. If `tap.externalSecret` is set to true, this value must be set, as no certificate will be generated. | | tap.crtPEM | string | `""` | Certificate for the Tap component. If not provided then Helm will generate one. | | tap.externalSecret | bool | `false` | Do not create a secret resource for the Tap component. If this is set to `true`, the value `tap.caBundle` must be set (see below). | -| tap.image.name | string | `"controller"` | Docker image name for the tap instance | +| tap.image.name | string | `"tap"` | Docker image name for the tap instance | | tap.image.registry | string | `"ghcr.io/linkerd"` | Docker registry for the tap instance | | tap.image.tag | string | `"linkerdVersionValue"` | Docker image tag for the tap instance | | tap.keyPEM | string | `""` | Certificate key for Tap component. If not provided then Helm will generate one. | @@ -160,7 +160,7 @@ Kubernetes: `>=1.13.0-0` | tapInjector.crtPEM | string | `""` | Certificate for the tapInjector. If not provided then Helm will generate one. | | tapInjector.externalSecret | bool | `false` | Do not create a secret resource for the tapInjector webhook. If this is set to `true`, the value `tapInjector.caBundle` must be set (see below) | | tapInjector.failurePolicy | string | `"Ignore"` | | -| tapInjector.image.name | string | `"controller"` | Docker image name for the tapInjector instance | +| tapInjector.image.name | string | `"tap"` | Docker image name for the tapInjector instance | | tapInjector.image.registry | string | `"ghcr.io/linkerd"` | Docker registry for the tapInjector instance | | tapInjector.image.tag | string | `"linkerdVersionValue"` | Docker image tag for the tapInjector instance | | tapInjector.keyPEM | string | `""` | Certificate key for the tapInjector. If not provided then Helm will generate one. | @@ -172,7 +172,7 @@ Kubernetes: `>=1.13.0-0` | tapInjector.resources.cpu.request | string | `nil` | Amount of CPU units that the tapInjector container requests | | tapInjector.resources.memory.limit | string | `nil` | Maximum amount of memory that tapInjector container can use | | tapInjector.resources.memory.request | string | `nil` | Amount of memory that the tapInjector container requests | -| tolerations | string | `nil` | Tolerations section, See the [K8S documentation](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) for more information | +| tolerations | string | `nil` | Tolerations section, See the [K8S documentation](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) for more information | ---------------------------------------------- Autogenerated from chart metadata using [helm-docs v1.4.0](/~https://github.com/norwoodj/helm-docs/releases/v1.4.0) From 3e5a763b8efb988a20ee43d0606de8aa411fa86b Mon Sep 17 00:00:00 2001 From: Kevin Leimkuhler Date: Tue, 2 Feb 2021 03:55:37 +0000 Subject: [PATCH 3/8] Remove dependency on pkg/inject and some minor nits Signed-off-by: Kevin Leimkuhler --- charts/linkerd2/README.md | 2 +- charts/linkerd2/values.yaml | 2 +- pkg/inject/env.go | 6 ------ pkg/protohttp/protohttp.go | 2 +- viz/tap/injector/patch.go | 12 +++--------- 5 files changed, 6 insertions(+), 18 deletions(-) delete mode 100644 pkg/inject/env.go diff --git a/charts/linkerd2/README.md b/charts/linkerd2/README.md index 320da05214753..a144e49ae7318 100644 --- a/charts/linkerd2/README.md +++ b/charts/linkerd2/README.md @@ -124,7 +124,7 @@ Kubernetes: `>=1.13.0-0` | Key | Type | Default | Description | |-----|------|---------|-------------| -| controllerImage | string | `"ghcr.io/linkerd/controller"` | Docker image for the controller, tap and identity components | +| controllerImage | string | `"ghcr.io/linkerd/controller"` | Docker image for the controller and identity components | | controllerReplicas | int | `1` | Number of replicas for each control plane pod | | controllerUID | int | `2103` | User ID for the control plane components | | debugContainer.image.name | string | `"ghcr.io/linkerd/debug"` | Docker image for the debug container | diff --git a/charts/linkerd2/values.yaml b/charts/linkerd2/values.yaml index 53cacad00b61a..b9193a009165e 100644 --- a/charts/linkerd2/values.yaml +++ b/charts/linkerd2/values.yaml @@ -174,7 +174,7 @@ omitWebhookSideEffects: false webhookFailurePolicy: Ignore -# controllerImage -- Docker image for the controller, tap and identity +# controllerImage -- Docker image for the controller and identity # components controllerImage: ghcr.io/linkerd/controller # -- Number of replicas for each control plane pod diff --git a/pkg/inject/env.go b/pkg/inject/env.go deleted file mode 100644 index d90d52991c9d6..0000000000000 --- a/pkg/inject/env.go +++ /dev/null @@ -1,6 +0,0 @@ -package inject - -const ( - // TapSvcEnvKey is the environment key that the proxy reads to know the tap svc name - TapSvcEnvKey = "LINKERD2_PROXY_TAP_SVC_NAME" -) diff --git a/pkg/protohttp/protohttp.go b/pkg/protohttp/protohttp.go index 252fed7215d7c..14eae8cadd36c 100644 --- a/pkg/protohttp/protohttp.go +++ b/pkg/protohttp/protohttp.go @@ -32,7 +32,7 @@ type HTTPError struct { } // FlushableResponseWriter wraps a ResponseWriter for use in streaming -// responses, such as Tap. +// responses type FlushableResponseWriter interface { http.ResponseWriter http.Flusher diff --git a/viz/tap/injector/patch.go b/viz/tap/injector/patch.go index 57305fb1b78b4..39c1a9d47a0fe 100644 --- a/viz/tap/injector/patch.go +++ b/viz/tap/injector/patch.go @@ -1,12 +1,6 @@ package injector -import ( - "fmt" - - "github.com/linkerd/linkerd2/pkg/inject" -) - -var tpl = fmt.Sprintf(`[ +var tpl = `[ { "op": "add", "path": "/metadata/annotations/{{.Annotation}}", @@ -16,8 +10,8 @@ var tpl = fmt.Sprintf(`[ "op": "add", "path": "/spec/containers/{{.ProxyIndex}}/env/-", "value": { - "name": "%s", + "name": LINKERD2_PROXY_TAP_SVC_NAME, "value": "{{.ProxyTapSvcName}}" } } -]`, inject.TapSvcEnvKey) +]` From c08aa8f5d790ec4507e0e79627aed47c2a551772 Mon Sep 17 00:00:00 2001 From: Kevin Leimkuhler Date: Tue, 2 Feb 2021 16:25:07 +0000 Subject: [PATCH 4/8] Remove dependency on pkg/charts Signed-off-by: Kevin Leimkuhler --- viz/cmd/edges.go | 3 ++- viz/cmd/routes.go | 3 ++- viz/cmd/stat.go | 3 ++- viz/cmd/tap.go | 3 ++- viz/cmd/top.go | 3 ++- viz/pkg/api/api.go | 18 ------------------ viz/pkg/util.go | 20 ++++++++++++++++++++ viz/tap/pkg/util.go | 4 ++-- 8 files changed, 32 insertions(+), 25 deletions(-) create mode 100644 viz/pkg/util.go diff --git a/viz/cmd/edges.go b/viz/cmd/edges.go index ccd7ae95240c1..02dedfe9062a3 100644 --- a/viz/cmd/edges.go +++ b/viz/cmd/edges.go @@ -16,6 +16,7 @@ import ( "github.com/linkerd/linkerd2/pkg/healthcheck" pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" "github.com/linkerd/linkerd2/viz/metrics-api/util" + "github.com/linkerd/linkerd2/viz/pkg" "github.com/linkerd/linkerd2/viz/pkg/api" "github.com/spf13/cobra" ) @@ -83,7 +84,7 @@ func NewCmdEdges() *cobra.Command { # Get all edges between pods in all namespaces. linkerd viz edges po --all-namespaces`, Args: cobra.ExactArgs(1), - ValidArgs: api.ValidTargets, + ValidArgs: pkg.ValidTargets, RunE: func(cmd *cobra.Command, args []string) error { if options.namespace == "" { options.namespace = pkgcmd.GetDefaultNamespace(kubeconfigPath, kubeContext) diff --git a/viz/cmd/routes.go b/viz/cmd/routes.go index 3095928ccf827..1420e568b2959 100644 --- a/viz/cmd/routes.go +++ b/viz/cmd/routes.go @@ -17,6 +17,7 @@ import ( "github.com/linkerd/linkerd2/pkg/k8s" pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" "github.com/linkerd/linkerd2/viz/metrics-api/util" + "github.com/linkerd/linkerd2/viz/pkg" "github.com/linkerd/linkerd2/viz/pkg/api" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" @@ -63,7 +64,7 @@ This command will only display traffic which is sent to a service that has a Ser # Routes for calls from the traffic deployment to the webapp service in the test namespace. linkerd viz routes deploy/traffic -n test --to svc/webapp`, Args: cobra.ExactArgs(1), - ValidArgs: api.ValidTargets, + ValidArgs: pkg.ValidTargets, RunE: func(cmd *cobra.Command, args []string) error { if options.namespace == "" { options.namespace = pkgcmd.GetDefaultNamespace(kubeconfigPath, kubeContext) diff --git a/viz/cmd/stat.go b/viz/cmd/stat.go index 60c04e3ce0426..6aaf9a702b49d 100644 --- a/viz/cmd/stat.go +++ b/viz/cmd/stat.go @@ -18,6 +18,7 @@ import ( "github.com/linkerd/linkerd2/pkg/k8s" pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" "github.com/linkerd/linkerd2/viz/metrics-api/util" + "github.com/linkerd/linkerd2/viz/pkg" "github.com/linkerd/linkerd2/viz/pkg/api" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" @@ -167,7 +168,7 @@ If no resource name is specified, displays stats about all resources of the spec # Get all inbound stats to the test namespace. linkerd viz stat ns/test`, Args: cobra.MinimumNArgs(1), - ValidArgs: api.ValidTargets, + ValidArgs: pkg.ValidTargets, RunE: func(cmd *cobra.Command, args []string) error { if options.namespace == "" { options.namespace = pkgcmd.GetDefaultNamespace(kubeconfigPath, kubeContext) diff --git a/viz/cmd/tap.go b/viz/cmd/tap.go index d9ff3aca3df13..cebd71f9419f8 100644 --- a/viz/cmd/tap.go +++ b/viz/cmd/tap.go @@ -17,6 +17,7 @@ import ( "github.com/linkerd/linkerd2/pkg/k8s" "github.com/linkerd/linkerd2/pkg/protohttp" metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + vizpkg "github.com/linkerd/linkerd2/viz/pkg" "github.com/linkerd/linkerd2/viz/pkg/api" tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" "github.com/linkerd/linkerd2/viz/tap/pkg" @@ -173,7 +174,7 @@ func NewCmdTap() *cobra.Command { # tap the test namespace, filter by request to prod namespace linkerd viz tap ns/test --to ns/prod`, Args: cobra.RangeArgs(1, 2), - ValidArgs: api.ValidTargets, + ValidArgs: vizpkg.ValidTargets, RunE: func(cmd *cobra.Command, args []string) error { if options.namespace == "" { options.namespace = pkgcmd.GetDefaultNamespace(kubeconfigPath, kubeContext) diff --git a/viz/cmd/top.go b/viz/cmd/top.go index 307c2cecc8bbd..8c7643e01115b 100644 --- a/viz/cmd/top.go +++ b/viz/cmd/top.go @@ -18,6 +18,7 @@ import ( "github.com/linkerd/linkerd2/pkg/protohttp" metricsAPI "github.com/linkerd/linkerd2/viz/metrics-api" metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" + vizpkg "github.com/linkerd/linkerd2/viz/pkg" "github.com/linkerd/linkerd2/viz/pkg/api" tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" "github.com/linkerd/linkerd2/viz/tap/pkg" @@ -320,7 +321,7 @@ func NewCmdTop() *cobra.Command { # display traffic for the web-dlbvj pod in the default namespace linkerd viz top pod/web-dlbvj`, Args: cobra.RangeArgs(1, 2), - ValidArgs: api.ValidTargets, + ValidArgs: vizpkg.ValidTargets, RunE: func(cmd *cobra.Command, args []string) error { if options.namespace == "" { options.namespace = pkgcmd.GetDefaultNamespace(kubeconfigPath, kubeContext) diff --git a/viz/pkg/api/api.go b/viz/pkg/api/api.go index 6fac72685d583..76b12b6b61434 100644 --- a/viz/pkg/api/api.go +++ b/viz/pkg/api/api.go @@ -6,28 +6,10 @@ import ( "time" "github.com/linkerd/linkerd2/pkg/healthcheck" - "github.com/linkerd/linkerd2/pkg/k8s" pb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" vizHealthCheck "github.com/linkerd/linkerd2/viz/pkg/healthcheck" ) -// ValidTargets specifies resource types allowed as a target: -// - target resource on an inbound query -// - target resource on an outbound 'to' query -// - destination resource on an outbound 'from' query -var ValidTargets = []string{ - k8s.Authority, - k8s.CronJob, - k8s.DaemonSet, - k8s.Deployment, - k8s.Job, - k8s.Namespace, - k8s.Pod, - k8s.ReplicaSet, - k8s.ReplicationController, - k8s.StatefulSet, -} - // CheckClientOrExit builds a new Viz API client and executes default status // checks to determine if the client can successfully perform cli commands. If the // checks fail, then CLI will print an error and exit. diff --git a/viz/pkg/util.go b/viz/pkg/util.go new file mode 100644 index 0000000000000..b9e4684dd01c6 --- /dev/null +++ b/viz/pkg/util.go @@ -0,0 +1,20 @@ +package pkg + +import "github.com/linkerd/linkerd2/pkg/k8s" + +// ValidTargets specifies resource types allowed as a target: +// - target resource on an inbound query +// - target resource on an outbound 'to' query +// - destination resource on an outbound 'from' query +var ValidTargets = []string{ + k8s.Authority, + k8s.CronJob, + k8s.DaemonSet, + k8s.Deployment, + k8s.Job, + k8s.Namespace, + k8s.Pod, + k8s.ReplicaSet, + k8s.ReplicationController, + k8s.StatefulSet, +} diff --git a/viz/tap/pkg/util.go b/viz/tap/pkg/util.go index afca6d301efeb..f02480335a24a 100644 --- a/viz/tap/pkg/util.go +++ b/viz/tap/pkg/util.go @@ -8,7 +8,7 @@ import ( netPb "github.com/linkerd/linkerd2/controller/gen/common/net" "github.com/linkerd/linkerd2/pkg/k8s" metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" - "github.com/linkerd/linkerd2/viz/pkg/api" + "github.com/linkerd/linkerd2/viz/pkg" tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" ) @@ -50,7 +50,7 @@ func BuildTapByResourceRequest(params TapRequestParams) (*tapPb.TapByResourceReq if err != nil { return nil, fmt.Errorf("target resource invalid: %s", err) } - if !contains(api.ValidTargets, target.Type) { + if !contains(pkg.ValidTargets, target.Type) { return nil, fmt.Errorf("unsupported resource type [%s]", target.Type) } From f10fa668451a260437237dd306f9be482d1b069a Mon Sep 17 00:00:00 2001 From: Kevin Leimkuhler Date: Tue, 2 Feb 2021 18:23:11 +0000 Subject: [PATCH 5/8] Fix patch Signed-off-by: Kevin Leimkuhler --- viz/tap/injector/patch.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viz/tap/injector/patch.go b/viz/tap/injector/patch.go index 39c1a9d47a0fe..8bf4bc1d67aca 100644 --- a/viz/tap/injector/patch.go +++ b/viz/tap/injector/patch.go @@ -10,7 +10,7 @@ var tpl = `[ "op": "add", "path": "/spec/containers/{{.ProxyIndex}}/env/-", "value": { - "name": LINKERD2_PROXY_TAP_SVC_NAME, + "name": "LINKERD2_PROXY_TAP_SVC_NAME", "value": "{{.ProxyTapSvcName}}" } } From 19b5bdc7e258801699646f3a64dccf0ec36bb91c Mon Sep 17 00:00:00 2001 From: Kevin Leimkuhler Date: Wed, 3 Feb 2021 22:46:52 +0000 Subject: [PATCH 6/8] Add review feedback Signed-off-by: Kevin Leimkuhler --- viz/charts/linkerd-viz/templates/tap.yaml | 4 +- viz/cmd/testdata/install_default.golden | 4 +- .../install_prometheus_disabled.golden | 4 +- .../testdata/install_proxy_resources.golden | 4 +- viz/metrics-api/Dockerfile | 1 - viz/tap/Dockerfile | 4 +- viz/tap/{controller => api}/client.go | 2 +- .../server.go => api/grpc_server.go} | 2 +- .../grpc_server_test.go} | 2 +- viz/tap/{controller => api}/main.go | 9 ++--- viz/tap/api/{server.go => sever.go} | 0 viz/tap/cmd/main.go | 6 +-- viz/tap/pkg/events.go | 40 +++++++++++++++++++ viz/tap/pkg/{util.go => requests.go} | 34 ---------------- web/srv/api_handlers.go | 10 ++--- 15 files changed, 66 insertions(+), 60 deletions(-) rename viz/tap/{controller => api}/client.go (95%) rename viz/tap/{controller/server.go => api/grpc_server.go} (99%) rename viz/tap/{controller/server_test.go => api/grpc_server_test.go} (99%) rename viz/tap/{controller => api}/main.go (83%) rename viz/tap/api/{server.go => sever.go} (100%) create mode 100644 viz/tap/pkg/events.go rename viz/tap/pkg/{util.go => requests.go} (80%) diff --git a/viz/charts/linkerd-viz/templates/tap.yaml b/viz/charts/linkerd-viz/templates/tap.yaml index 02a0589d90098..903e262ee2be7 100644 --- a/viz/charts/linkerd-viz/templates/tap.yaml +++ b/viz/charts/linkerd-viz/templates/tap.yaml @@ -79,8 +79,8 @@ spec: {{- end }} containers: - args: - - controller - - -controller-namespace={{.Values.linkerdNamespace}} + - api + - -api-namespace={{.Values.linkerdNamespace}} - -log-level={{.Values.tap.logLevel}} - -identity-trust-domain={{.Values.identityTrustDomain}} image: {{.Values.tap.image.registry}}/{{.Values.tap.image.name}}:{{.Values.tap.image.tag}} diff --git a/viz/cmd/testdata/install_default.golden b/viz/cmd/testdata/install_default.golden index e98f86f711645..2b71333083a84 100644 --- a/viz/cmd/testdata/install_default.golden +++ b/viz/cmd/testdata/install_default.golden @@ -930,8 +930,8 @@ spec: beta.kubernetes.io/os: linux containers: - args: - - controller - - -controller-namespace=linkerd + - api + - -api-namespace=linkerd - -log-level=info - -identity-trust-domain=cluster.local image: ghcr.io/linkerd/tap:dev-undefined diff --git a/viz/cmd/testdata/install_prometheus_disabled.golden b/viz/cmd/testdata/install_prometheus_disabled.golden index 97a1a089cd129..91d0e3c9f4a1a 100644 --- a/viz/cmd/testdata/install_prometheus_disabled.golden +++ b/viz/cmd/testdata/install_prometheus_disabled.golden @@ -640,8 +640,8 @@ spec: beta.kubernetes.io/os: linux containers: - args: - - controller - - -controller-namespace=linkerd + - api + - -api-namespace=linkerd - -log-level=info - -identity-trust-domain=cluster.local image: ghcr.io/linkerd/tap:dev-undefined diff --git a/viz/cmd/testdata/install_proxy_resources.golden b/viz/cmd/testdata/install_proxy_resources.golden index de4f2de9b787c..8b4c3194050f1 100644 --- a/viz/cmd/testdata/install_proxy_resources.golden +++ b/viz/cmd/testdata/install_proxy_resources.golden @@ -942,8 +942,8 @@ spec: beta.kubernetes.io/os: linux containers: - args: - - controller - - -controller-namespace=linkerd + - api + - -api-namespace=linkerd - -log-level=info - -identity-trust-domain=cluster.local image: ghcr.io/linkerd/tap:dev-undefined diff --git a/viz/metrics-api/Dockerfile b/viz/metrics-api/Dockerfile index b0ad5d524e676..34b6d86c2b9e0 100644 --- a/viz/metrics-api/Dockerfile +++ b/viz/metrics-api/Dockerfile @@ -15,7 +15,6 @@ WORKDIR /linkerd-build COPY pkg pkg COPY controller controller COPY viz/metrics-api viz/metrics-api -COPY viz/tap/gen/tap viz/tap/gen/tap COPY viz/pkg viz/pkg ARG TARGETARCH diff --git a/viz/tap/Dockerfile b/viz/tap/Dockerfile index 393388c4a41dd..ed9721e060d39 100644 --- a/viz/tap/Dockerfile +++ b/viz/tap/Dockerfile @@ -13,9 +13,11 @@ RUN ./bin/install-deps $TARGETARCH FROM go-deps as golang WORKDIR /linkerd-build COPY pkg pkg +# TODO: remove after /~https://github.com/linkerd/linkerd2/issues/5661 COPY controller controller +# TODO: remove when BuildResource is refactored +# /~https://github.com/linkerd/linkerd2/issues/5589 COPY viz/metrics-api/gen/viz viz/metrics-api/gen/viz -COPY viz/metrics-api/client viz/metrics-api/client COPY viz/tap viz/tap COPY viz/pkg viz/pkg diff --git a/viz/tap/controller/client.go b/viz/tap/api/client.go similarity index 95% rename from viz/tap/controller/client.go rename to viz/tap/api/client.go index 82bef2e39a979..c59e8a438634b 100644 --- a/viz/tap/controller/client.go +++ b/viz/tap/api/client.go @@ -1,4 +1,4 @@ -package controller +package api import ( pb "github.com/linkerd/linkerd2/viz/tap/gen/tap" diff --git a/viz/tap/controller/server.go b/viz/tap/api/grpc_server.go similarity index 99% rename from viz/tap/controller/server.go rename to viz/tap/api/grpc_server.go index 4092ff78239ad..cf76e4ff99c01 100644 --- a/viz/tap/controller/server.go +++ b/viz/tap/api/grpc_server.go @@ -1,4 +1,4 @@ -package controller +package api import ( "context" diff --git a/viz/tap/controller/server_test.go b/viz/tap/api/grpc_server_test.go similarity index 99% rename from viz/tap/controller/server_test.go rename to viz/tap/api/grpc_server_test.go index 805e93c144296..3e7e739cc3c47 100644 --- a/viz/tap/controller/server_test.go +++ b/viz/tap/api/grpc_server_test.go @@ -1,4 +1,4 @@ -package controller +package api import ( "context" diff --git a/viz/tap/controller/main.go b/viz/tap/api/main.go similarity index 83% rename from viz/tap/controller/main.go rename to viz/tap/api/main.go index 4d3d160833609..a62fd59b32fea 100644 --- a/viz/tap/controller/main.go +++ b/viz/tap/api/main.go @@ -1,4 +1,4 @@ -package controller +package api import ( "context" @@ -11,7 +11,6 @@ import ( "github.com/linkerd/linkerd2/pkg/admin" "github.com/linkerd/linkerd2/pkg/flags" "github.com/linkerd/linkerd2/pkg/trace" - "github.com/linkerd/linkerd2/viz/tap/api" log "github.com/sirupsen/logrus" ) @@ -23,7 +22,7 @@ func Main(args []string) { apiServerAddr := cmd.String("apiserver-addr", ":8089", "address to serve the apiserver on") metricsAddr := cmd.String("metrics-addr", ":9998", "address to serve scrapable metrics on") kubeConfigPath := cmd.String("kubeconfig", "", "path to kube config") - controllerNamespace := cmd.String("controller-namespace", "linkerd", "namespace in which Linkerd is installed") + apiNamespace := cmd.String("api-namespace", "linkerd", "namespace in which Linkerd is installed") tapPort := cmd.Uint("tap-port", 4190, "proxy tap port to connect to") disableCommonNames := cmd.Bool("disable-common-names", false, "disable checks for Common Names (for development)") trustDomain := cmd.String("identity-trust-domain", defaultDomain, "configures the name suffix used for identities") @@ -57,8 +56,8 @@ func Main(args []string) { log.Warnf("failed to initialize tracing: %s", err) } } - grpcTapServer := NewGrpcTapServer(*tapPort, *controllerNamespace, *trustDomain, k8sAPI) - apiServer, err := api.NewServer(ctx, *apiServerAddr, k8sAPI, grpcTapServer, *disableCommonNames) + grpcTapServer := NewGrpcTapServer(*tapPort, *apiNamespace, *trustDomain, k8sAPI) + apiServer, err := NewServer(ctx, *apiServerAddr, k8sAPI, grpcTapServer, *disableCommonNames) if err != nil { log.Fatal(err.Error()) } diff --git a/viz/tap/api/server.go b/viz/tap/api/sever.go similarity index 100% rename from viz/tap/api/server.go rename to viz/tap/api/sever.go diff --git a/viz/tap/cmd/main.go b/viz/tap/cmd/main.go index 37a343f5b0f44..3092325699f60 100644 --- a/viz/tap/cmd/main.go +++ b/viz/tap/cmd/main.go @@ -4,7 +4,7 @@ import ( "fmt" "os" - "github.com/linkerd/linkerd2/viz/tap/controller" + "github.com/linkerd/linkerd2/viz/tap/api" "github.com/linkerd/linkerd2/viz/tap/injector" ) @@ -14,8 +14,8 @@ func main() { os.Exit(1) } switch os.Args[1] { - case "controller": - controller.Main(os.Args[2:]) + case "api": + api.Main(os.Args[2:]) case "injector": injector.Main(os.Args[2:]) } diff --git a/viz/tap/pkg/events.go b/viz/tap/pkg/events.go new file mode 100644 index 0000000000000..85792bda04678 --- /dev/null +++ b/viz/tap/pkg/events.go @@ -0,0 +1,40 @@ +package pkg + +import ( + "encoding/binary" + + netPb "github.com/linkerd/linkerd2/controller/gen/common/net" + tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" +) + +// CreateTapEvent generates tap events for use in tests +func CreateTapEvent(eventHTTP *tapPb.TapEvent_Http, dstMeta map[string]string, proxyDirection tapPb.TapEvent_ProxyDirection) *tapPb.TapEvent { + event := &tapPb.TapEvent{ + ProxyDirection: proxyDirection, + Source: &netPb.TcpAddress{ + Ip: &netPb.IPAddress{ + Ip: &netPb.IPAddress_Ipv4{ + Ipv4: uint32(1), + }, + }, + }, + Destination: &netPb.TcpAddress{ + Ip: &netPb.IPAddress{ + Ip: &netPb.IPAddress_Ipv6{ + Ipv6: &netPb.IPv6{ + // All nodes address: https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml + First: binary.BigEndian.Uint64([]byte{0xff, 0x01, 0, 0, 0, 0, 0, 0}), + Last: binary.BigEndian.Uint64([]byte{0, 0, 0, 0, 0, 0, 0, 0x01}), + }, + }, + }, + }, + Event: &tapPb.TapEvent_Http_{ + Http: eventHTTP, + }, + DestinationMeta: &tapPb.TapEvent_EndpointMeta{ + Labels: dstMeta, + }, + } + return event +} diff --git a/viz/tap/pkg/util.go b/viz/tap/pkg/requests.go similarity index 80% rename from viz/tap/pkg/util.go rename to viz/tap/pkg/requests.go index f02480335a24a..3f95bd933d2f6 100644 --- a/viz/tap/pkg/util.go +++ b/viz/tap/pkg/requests.go @@ -1,11 +1,9 @@ package pkg import ( - "encoding/binary" "fmt" "github.com/linkerd/linkerd2/controller/api/util" - netPb "github.com/linkerd/linkerd2/controller/gen/common/net" "github.com/linkerd/linkerd2/pkg/k8s" metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" "github.com/linkerd/linkerd2/viz/pkg" @@ -150,35 +148,3 @@ func contains(list []string, s string) bool { } return false } - -// CreateTapEvent generates tap events for use in tests -func CreateTapEvent(eventHTTP *tapPb.TapEvent_Http, dstMeta map[string]string, proxyDirection tapPb.TapEvent_ProxyDirection) *tapPb.TapEvent { - event := &tapPb.TapEvent{ - ProxyDirection: proxyDirection, - Source: &netPb.TcpAddress{ - Ip: &netPb.IPAddress{ - Ip: &netPb.IPAddress_Ipv4{ - Ipv4: uint32(1), - }, - }, - }, - Destination: &netPb.TcpAddress{ - Ip: &netPb.IPAddress{ - Ip: &netPb.IPAddress_Ipv6{ - Ipv6: &netPb.IPv6{ - // All nodes address: https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml - First: binary.BigEndian.Uint64([]byte{0xff, 0x01, 0, 0, 0, 0, 0, 0}), - Last: binary.BigEndian.Uint64([]byte{0, 0, 0, 0, 0, 0, 0, 0x01}), - }, - }, - }, - }, - Event: &tapPb.TapEvent_Http_{ - Http: eventHTTP, - }, - DestinationMeta: &tapPb.TapEvent_EndpointMeta{ - Labels: dstMeta, - }, - } - return event -} diff --git a/web/srv/api_handlers.go b/web/srv/api_handlers.go index f1a3d48d16a4c..5fe3bdb36a781 100644 --- a/web/srv/api_handlers.go +++ b/web/srv/api_handlers.go @@ -22,7 +22,7 @@ import ( metricsPb "github.com/linkerd/linkerd2/viz/metrics-api/gen/viz" vizUtil "github.com/linkerd/linkerd2/viz/metrics-api/util" tapPb "github.com/linkerd/linkerd2/viz/tap/gen/tap" - "github.com/linkerd/linkerd2/viz/tap/pkg" + tappkg "github.com/linkerd/linkerd2/viz/tap/pkg" log "github.com/sirupsen/logrus" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/yaml" @@ -257,27 +257,27 @@ func (h *handler) handleAPITap(w http.ResponseWriter, req *http.Request, p httpr return } - var requestParams pkg.TapRequestParams + var requestParams tappkg.TapRequestParams err = json.Unmarshal(message, &requestParams) if err != nil { websocketError(ws, websocket.CloseInternalServerErr, err) return } - tapReq, err := pkg.BuildTapByResourceRequest(requestParams) + tapReq, err := tappkg.BuildTapByResourceRequest(requestParams) if err != nil { websocketError(ws, websocket.CloseInternalServerErr, err) return } go func() { - reader, body, err := pkg.Reader(req.Context(), h.k8sAPI, tapReq) + reader, body, err := tappkg.Reader(req.Context(), h.k8sAPI, tapReq) if err != nil { // If there was a [403] error when initiating a tap, close the // socket with `ClosePolicyViolation` status code so that the error // renders without the error prefix in the banner if httpErr, ok := err.(protohttp.HTTPError); ok && httpErr.Code == http.StatusForbidden { - err := fmt.Errorf("missing authorization, visit %s to remedy", pkg.TapRbacURL) + err := fmt.Errorf("missing authorization, visit %s to remedy", tappkg.TapRbacURL) websocketError(ws, websocket.ClosePolicyViolation, err) return } From bc417f14d22d43752b683ecc7177f02d6739b439 Mon Sep 17 00:00:00 2001 From: Kevin Leimkuhler Date: Wed, 3 Feb 2021 23:44:29 +0000 Subject: [PATCH 7/8] Add review feedback Signed-off-by: Kevin Leimkuhler --- bin/docker-push | 2 +- viz/tap/api/sever.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/docker-push b/bin/docker-push index 3e9e88a7a2291..6c334aff82f15 100755 --- a/bin/docker-push +++ b/bin/docker-push @@ -14,6 +14,6 @@ bindir=$( cd "${BASH_SOURCE[0]%/*}" && pwd ) # shellcheck source=_docker.sh . "$bindir"/_docker.sh -for img in cli-bin cni-plugin controller metrics-api debug grafana proxy web tap; do +for img in cli-bin cni-plugin controller metrics-api debug grafana proxy web jaeger-webhook tap; do docker_push $img "$tag" done diff --git a/viz/tap/api/sever.go b/viz/tap/api/sever.go index ae0c9eb827652..674e5df37f19a 100644 --- a/viz/tap/api/sever.go +++ b/viz/tap/api/sever.go @@ -60,7 +60,7 @@ func NewServer( } log := logrus.WithFields(logrus.Fields{ - "component": "tap API server", + "component": "tap", "addr": addr, }) From f039104ba73a90e6dc3fb609944912243093013c Mon Sep 17 00:00:00 2001 From: Kevin Leimkuhler Date: Thu, 4 Feb 2021 15:31:42 +0000 Subject: [PATCH 8/8] Rename tap.proto to viz_tap.proto Signed-off-by: Kevin Leimkuhler --- bin/protoc-go.sh | 4 +- viz/tap/gen/tap/{tap.pb.go => viz_tap.pb.go} | 642 +++++++++---------- viz/tap/proto/{tap.proto => viz_tap.proto} | 0 3 files changed, 323 insertions(+), 323 deletions(-) rename viz/tap/gen/tap/{tap.pb.go => viz_tap.pb.go} (68%) rename viz/tap/proto/{tap.proto => viz_tap.proto} (100%) diff --git a/bin/protoc-go.sh b/bin/protoc-go.sh index 0b4288174a584..cf219f76ced79 100755 --- a/bin/protoc-go.sh +++ b/bin/protoc-go.sh @@ -14,10 +14,10 @@ mkdir -p controller/gen/common/healthcheck controller/gen/common/net controller/ "$bindir"/protoc -I proto --go_out=plugins=grpc,paths=source_relative:controller/gen proto/config/config.proto "$bindir"/protoc -I proto --go_out=plugins=grpc,paths=source_relative:controller/gen proto/common/healthcheck.proto "$bindir"/protoc -I proto -I viz/metrics-api/proto --go_out=plugins=grpc,paths=source_relative:viz/metrics-api/gen viz/metrics-api/proto/viz.proto -"$bindir"/protoc -I proto -I viz/tap/proto -I viz/metrics-api/proto --go_out=plugins=grpc,paths=source_relative:viz/tap/gen viz/tap/proto/tap.proto +"$bindir"/protoc -I proto -I viz/tap/proto -I viz/metrics-api/proto --go_out=plugins=grpc,paths=source_relative:viz/tap/gen viz/tap/proto/viz_tap.proto mv controller/gen/common/net.pb.go controller/gen/common/net/ mv controller/gen/public.pb.go controller/gen/public/ mv controller/gen/common/healthcheck.pb.go controller/gen/common/healthcheck/ mv viz/metrics-api/gen/viz.pb.go viz/metrics-api/gen/viz/viz.pb.go -mv viz/tap/gen/tap.pb.go viz/tap/gen/tap/tap.pb.go +mv viz/tap/gen/viz_tap.pb.go viz/tap/gen/tap/viz_tap.pb.go diff --git a/viz/tap/gen/tap/tap.pb.go b/viz/tap/gen/tap/viz_tap.pb.go similarity index 68% rename from viz/tap/gen/tap/tap.pb.go rename to viz/tap/gen/tap/viz_tap.pb.go index 6982925270ea8..cf300cb16cd47 100644 --- a/viz/tap/gen/tap/tap.pb.go +++ b/viz/tap/gen/tap/viz_tap.pb.go @@ -2,7 +2,7 @@ // versions: // protoc-gen-go v1.24.0 // protoc v3.6.0 -// source: tap.proto +// source: viz_tap.proto package tap @@ -65,11 +65,11 @@ func (x TapEvent_ProxyDirection) String() string { } func (TapEvent_ProxyDirection) Descriptor() protoreflect.EnumDescriptor { - return file_tap_proto_enumTypes[0].Descriptor() + return file_viz_tap_proto_enumTypes[0].Descriptor() } func (TapEvent_ProxyDirection) Type() protoreflect.EnumType { - return &file_tap_proto_enumTypes[0] + return &file_viz_tap_proto_enumTypes[0] } func (x TapEvent_ProxyDirection) Number() protoreflect.EnumNumber { @@ -78,7 +78,7 @@ func (x TapEvent_ProxyDirection) Number() protoreflect.EnumNumber { // Deprecated: Use TapEvent_ProxyDirection.Descriptor instead. func (TapEvent_ProxyDirection) EnumDescriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{2, 0} + return file_viz_tap_proto_rawDescGZIP(), []int{2, 0} } // Deprecated: Do not use. @@ -106,7 +106,7 @@ type TapRequest struct { func (x *TapRequest) Reset() { *x = TapRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[0] + mi := &file_viz_tap_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -119,7 +119,7 @@ func (x *TapRequest) String() string { func (*TapRequest) ProtoMessage() {} func (x *TapRequest) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[0] + mi := &file_viz_tap_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -132,7 +132,7 @@ func (x *TapRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TapRequest.ProtoReflect.Descriptor instead. func (*TapRequest) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{0} + return file_viz_tap_proto_rawDescGZIP(), []int{0} } func (m *TapRequest) GetTarget() isTapRequest_Target { @@ -257,7 +257,7 @@ type TapByResourceRequest struct { func (x *TapByResourceRequest) Reset() { *x = TapByResourceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[1] + mi := &file_viz_tap_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -270,7 +270,7 @@ func (x *TapByResourceRequest) String() string { func (*TapByResourceRequest) ProtoMessage() {} func (x *TapByResourceRequest) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[1] + mi := &file_viz_tap_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -283,7 +283,7 @@ func (x *TapByResourceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TapByResourceRequest.ProtoReflect.Descriptor instead. func (*TapByResourceRequest) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{1} + return file_viz_tap_proto_rawDescGZIP(), []int{1} } func (x *TapByResourceRequest) GetTarget() *viz.ResourceSelection { @@ -334,7 +334,7 @@ type TapEvent struct { func (x *TapEvent) Reset() { *x = TapEvent{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[2] + mi := &file_viz_tap_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -347,7 +347,7 @@ func (x *TapEvent) String() string { func (*TapEvent) ProtoMessage() {} func (x *TapEvent) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[2] + mi := &file_viz_tap_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -360,7 +360,7 @@ func (x *TapEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use TapEvent.ProtoReflect.Descriptor instead. func (*TapEvent) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{2} + return file_viz_tap_proto_rawDescGZIP(), []int{2} } func (x *TapEvent) GetSource() *net.TcpAddress { @@ -446,7 +446,7 @@ type TapByResourceRequest_Match struct { func (x *TapByResourceRequest_Match) Reset() { *x = TapByResourceRequest_Match{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[3] + mi := &file_viz_tap_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -459,7 +459,7 @@ func (x *TapByResourceRequest_Match) String() string { func (*TapByResourceRequest_Match) ProtoMessage() {} func (x *TapByResourceRequest_Match) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[3] + mi := &file_viz_tap_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -472,7 +472,7 @@ func (x *TapByResourceRequest_Match) ProtoReflect() protoreflect.Message { // Deprecated: Use TapByResourceRequest_Match.ProtoReflect.Descriptor instead. func (*TapByResourceRequest_Match) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{1, 0} + return file_viz_tap_proto_rawDescGZIP(), []int{1, 0} } func (m *TapByResourceRequest_Match) GetMatch() isTapByResourceRequest_Match_Match { @@ -569,7 +569,7 @@ type TapByResourceRequest_Extract struct { func (x *TapByResourceRequest_Extract) Reset() { *x = TapByResourceRequest_Extract{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[4] + mi := &file_viz_tap_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -582,7 +582,7 @@ func (x *TapByResourceRequest_Extract) String() string { func (*TapByResourceRequest_Extract) ProtoMessage() {} func (x *TapByResourceRequest_Extract) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[4] + mi := &file_viz_tap_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -595,7 +595,7 @@ func (x *TapByResourceRequest_Extract) ProtoReflect() protoreflect.Message { // Deprecated: Use TapByResourceRequest_Extract.ProtoReflect.Descriptor instead. func (*TapByResourceRequest_Extract) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{1, 1} + return file_viz_tap_proto_rawDescGZIP(), []int{1, 1} } func (m *TapByResourceRequest_Extract) GetExtract() isTapByResourceRequest_Extract_Extract { @@ -633,7 +633,7 @@ type TapByResourceRequest_Match_Seq struct { func (x *TapByResourceRequest_Match_Seq) Reset() { *x = TapByResourceRequest_Match_Seq{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[5] + mi := &file_viz_tap_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -646,7 +646,7 @@ func (x *TapByResourceRequest_Match_Seq) String() string { func (*TapByResourceRequest_Match_Seq) ProtoMessage() {} func (x *TapByResourceRequest_Match_Seq) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[5] + mi := &file_viz_tap_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -659,7 +659,7 @@ func (x *TapByResourceRequest_Match_Seq) ProtoReflect() protoreflect.Message { // Deprecated: Use TapByResourceRequest_Match_Seq.ProtoReflect.Descriptor instead. func (*TapByResourceRequest_Match_Seq) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{1, 0, 0} + return file_viz_tap_proto_rawDescGZIP(), []int{1, 0, 0} } func (x *TapByResourceRequest_Match_Seq) GetMatches() []*TapByResourceRequest_Match { @@ -685,7 +685,7 @@ type TapByResourceRequest_Match_Http struct { func (x *TapByResourceRequest_Match_Http) Reset() { *x = TapByResourceRequest_Match_Http{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[6] + mi := &file_viz_tap_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -698,7 +698,7 @@ func (x *TapByResourceRequest_Match_Http) String() string { func (*TapByResourceRequest_Match_Http) ProtoMessage() {} func (x *TapByResourceRequest_Match_Http) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[6] + mi := &file_viz_tap_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -711,7 +711,7 @@ func (x *TapByResourceRequest_Match_Http) ProtoReflect() protoreflect.Message { // Deprecated: Use TapByResourceRequest_Match_Http.ProtoReflect.Descriptor instead. func (*TapByResourceRequest_Match_Http) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{1, 0, 1} + return file_viz_tap_proto_rawDescGZIP(), []int{1, 0, 1} } func (m *TapByResourceRequest_Match_Http) GetMatch() isTapByResourceRequest_Match_Http_Match { @@ -790,7 +790,7 @@ type TapByResourceRequest_Extract_Http struct { func (x *TapByResourceRequest_Extract_Http) Reset() { *x = TapByResourceRequest_Extract_Http{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[7] + mi := &file_viz_tap_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -803,7 +803,7 @@ func (x *TapByResourceRequest_Extract_Http) String() string { func (*TapByResourceRequest_Extract_Http) ProtoMessage() {} func (x *TapByResourceRequest_Extract_Http) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[7] + mi := &file_viz_tap_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -816,7 +816,7 @@ func (x *TapByResourceRequest_Extract_Http) ProtoReflect() protoreflect.Message // Deprecated: Use TapByResourceRequest_Extract_Http.ProtoReflect.Descriptor instead. func (*TapByResourceRequest_Extract_Http) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{1, 1, 0} + return file_viz_tap_proto_rawDescGZIP(), []int{1, 1, 0} } func (m *TapByResourceRequest_Extract_Http) GetExtract() isTapByResourceRequest_Extract_Http_Extract { @@ -852,7 +852,7 @@ type TapByResourceRequest_Extract_Http_Headers struct { func (x *TapByResourceRequest_Extract_Http_Headers) Reset() { *x = TapByResourceRequest_Extract_Http_Headers{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[8] + mi := &file_viz_tap_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -865,7 +865,7 @@ func (x *TapByResourceRequest_Extract_Http_Headers) String() string { func (*TapByResourceRequest_Extract_Http_Headers) ProtoMessage() {} func (x *TapByResourceRequest_Extract_Http_Headers) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[8] + mi := &file_viz_tap_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -878,7 +878,7 @@ func (x *TapByResourceRequest_Extract_Http_Headers) ProtoReflect() protoreflect. // Deprecated: Use TapByResourceRequest_Extract_Http_Headers.ProtoReflect.Descriptor instead. func (*TapByResourceRequest_Extract_Http_Headers) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{1, 1, 0, 0} + return file_viz_tap_proto_rawDescGZIP(), []int{1, 1, 0, 0} } type TapEvent_EndpointMeta struct { @@ -892,7 +892,7 @@ type TapEvent_EndpointMeta struct { func (x *TapEvent_EndpointMeta) Reset() { *x = TapEvent_EndpointMeta{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[9] + mi := &file_viz_tap_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -905,7 +905,7 @@ func (x *TapEvent_EndpointMeta) String() string { func (*TapEvent_EndpointMeta) ProtoMessage() {} func (x *TapEvent_EndpointMeta) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[9] + mi := &file_viz_tap_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -918,7 +918,7 @@ func (x *TapEvent_EndpointMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use TapEvent_EndpointMeta.ProtoReflect.Descriptor instead. func (*TapEvent_EndpointMeta) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{2, 0} + return file_viz_tap_proto_rawDescGZIP(), []int{2, 0} } func (x *TapEvent_EndpointMeta) GetLabels() map[string]string { @@ -939,7 +939,7 @@ type TapEvent_RouteMeta struct { func (x *TapEvent_RouteMeta) Reset() { *x = TapEvent_RouteMeta{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[10] + mi := &file_viz_tap_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -952,7 +952,7 @@ func (x *TapEvent_RouteMeta) String() string { func (*TapEvent_RouteMeta) ProtoMessage() {} func (x *TapEvent_RouteMeta) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[10] + mi := &file_viz_tap_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -965,7 +965,7 @@ func (x *TapEvent_RouteMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use TapEvent_RouteMeta.ProtoReflect.Descriptor instead. func (*TapEvent_RouteMeta) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{2, 1} + return file_viz_tap_proto_rawDescGZIP(), []int{2, 1} } func (x *TapEvent_RouteMeta) GetLabels() map[string]string { @@ -990,7 +990,7 @@ type TapEvent_Http struct { func (x *TapEvent_Http) Reset() { *x = TapEvent_Http{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[11] + mi := &file_viz_tap_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1003,7 +1003,7 @@ func (x *TapEvent_Http) String() string { func (*TapEvent_Http) ProtoMessage() {} func (x *TapEvent_Http) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[11] + mi := &file_viz_tap_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1016,7 +1016,7 @@ func (x *TapEvent_Http) ProtoReflect() protoreflect.Message { // Deprecated: Use TapEvent_Http.ProtoReflect.Descriptor instead. func (*TapEvent_Http) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{2, 2} + return file_viz_tap_proto_rawDescGZIP(), []int{2, 2} } func (m *TapEvent_Http) GetEvent() isTapEvent_Http_Event { @@ -1083,7 +1083,7 @@ type TapEvent_Http_StreamId struct { func (x *TapEvent_Http_StreamId) Reset() { *x = TapEvent_Http_StreamId{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[14] + mi := &file_viz_tap_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1096,7 +1096,7 @@ func (x *TapEvent_Http_StreamId) String() string { func (*TapEvent_Http_StreamId) ProtoMessage() {} func (x *TapEvent_Http_StreamId) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[14] + mi := &file_viz_tap_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1109,7 +1109,7 @@ func (x *TapEvent_Http_StreamId) ProtoReflect() protoreflect.Message { // Deprecated: Use TapEvent_Http_StreamId.ProtoReflect.Descriptor instead. func (*TapEvent_Http_StreamId) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{2, 2, 0} + return file_viz_tap_proto_rawDescGZIP(), []int{2, 2, 0} } func (x *TapEvent_Http_StreamId) GetBase() uint32 { @@ -1142,7 +1142,7 @@ type TapEvent_Http_RequestInit struct { func (x *TapEvent_Http_RequestInit) Reset() { *x = TapEvent_Http_RequestInit{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[15] + mi := &file_viz_tap_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1155,7 +1155,7 @@ func (x *TapEvent_Http_RequestInit) String() string { func (*TapEvent_Http_RequestInit) ProtoMessage() {} func (x *TapEvent_Http_RequestInit) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[15] + mi := &file_viz_tap_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1168,7 +1168,7 @@ func (x *TapEvent_Http_RequestInit) ProtoReflect() protoreflect.Message { // Deprecated: Use TapEvent_Http_RequestInit.ProtoReflect.Descriptor instead. func (*TapEvent_Http_RequestInit) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{2, 2, 1} + return file_viz_tap_proto_rawDescGZIP(), []int{2, 2, 1} } func (x *TapEvent_Http_RequestInit) GetId() *TapEvent_Http_StreamId { @@ -1227,7 +1227,7 @@ type TapEvent_Http_ResponseInit struct { func (x *TapEvent_Http_ResponseInit) Reset() { *x = TapEvent_Http_ResponseInit{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[16] + mi := &file_viz_tap_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1240,7 +1240,7 @@ func (x *TapEvent_Http_ResponseInit) String() string { func (*TapEvent_Http_ResponseInit) ProtoMessage() {} func (x *TapEvent_Http_ResponseInit) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[16] + mi := &file_viz_tap_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1253,7 +1253,7 @@ func (x *TapEvent_Http_ResponseInit) ProtoReflect() protoreflect.Message { // Deprecated: Use TapEvent_Http_ResponseInit.ProtoReflect.Descriptor instead. func (*TapEvent_Http_ResponseInit) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{2, 2, 2} + return file_viz_tap_proto_rawDescGZIP(), []int{2, 2, 2} } func (x *TapEvent_Http_ResponseInit) GetId() *TapEvent_Http_StreamId { @@ -1300,7 +1300,7 @@ type TapEvent_Http_ResponseEnd struct { func (x *TapEvent_Http_ResponseEnd) Reset() { *x = TapEvent_Http_ResponseEnd{} if protoimpl.UnsafeEnabled { - mi := &file_tap_proto_msgTypes[17] + mi := &file_viz_tap_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1313,7 +1313,7 @@ func (x *TapEvent_Http_ResponseEnd) String() string { func (*TapEvent_Http_ResponseEnd) ProtoMessage() {} func (x *TapEvent_Http_ResponseEnd) ProtoReflect() protoreflect.Message { - mi := &file_tap_proto_msgTypes[17] + mi := &file_viz_tap_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1326,7 +1326,7 @@ func (x *TapEvent_Http_ResponseEnd) ProtoReflect() protoreflect.Message { // Deprecated: Use TapEvent_Http_ResponseEnd.ProtoReflect.Descriptor instead. func (*TapEvent_Http_ResponseEnd) Descriptor() ([]byte, []int) { - return file_tap_proto_rawDescGZIP(), []int{2, 2, 3} + return file_viz_tap_proto_rawDescGZIP(), []int{2, 2, 3} } func (x *TapEvent_Http_ResponseEnd) GetId() *TapEvent_Http_StreamId { @@ -1371,251 +1371,251 @@ func (x *TapEvent_Http_ResponseEnd) GetTrailers() *viz.Headers { return nil } -var File_tap_proto protoreflect.FileDescriptor - -var file_tap_proto_rawDesc = []byte{ - 0x0a, 0x09, 0x74, 0x61, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6c, 0x69, 0x6e, - 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x09, 0x76, 0x69, 0x7a, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xaa, 0x02, 0x0a, 0x0a, 0x54, 0x61, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x03, 0x70, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x70, 0x6f, 0x64, 0x12, 0x20, 0x0a, 0x0a, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, - 0x61, 0x78, 0x52, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x6d, 0x61, 0x78, - 0x52, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x06, 0x74, 0x6f, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x6f, 0x49, 0x50, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x6f, 0x49, 0x50, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, - 0x72, 0x6f, 0x6d, 0x49, 0x50, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x72, 0x6f, - 0x6d, 0x49, 0x50, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x02, 0x18, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x22, 0xe5, 0x07, 0x0a, 0x14, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, - 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x3e, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, - 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x70, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x70, 0x73, 0x12, 0x44, 0x0a, - 0x07, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, - 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x07, 0x65, 0x78, 0x74, 0x72, - 0x61, 0x63, 0x74, 0x1a, 0xa4, 0x04, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x40, 0x0a, - 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x69, 0x6e, - 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x65, 0x71, 0x48, 0x00, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, - 0x40, 0x0a, 0x03, 0x61, 0x6e, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, - 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, +var File_viz_tap_proto protoreflect.FileDescriptor + +var file_viz_tap_proto_rawDesc = []byte{ + 0x0a, 0x0d, 0x76, 0x69, 0x7a, 0x5f, 0x74, 0x61, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x0c, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x1a, 0x1e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x09, 0x76, 0x69, 0x7a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xaa, 0x02, 0x0a, 0x0a, 0x54, + 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x03, 0x70, 0x6f, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x70, 0x6f, 0x64, 0x12, 0x20, 0x0a, + 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x06, 0x6d, 0x61, 0x78, 0x52, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x50, 0x6f, 0x72, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x74, 0x6f, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x6f, 0x49, 0x50, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x6f, 0x49, 0x50, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x66, 0x72, 0x6f, 0x6d, 0x49, 0x50, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x66, 0x72, 0x6f, 0x6d, 0x49, 0x50, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x02, 0x18, 0x01, 0x42, 0x08, 0x0a, + 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xe5, 0x07, 0x0a, 0x14, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x65, 0x71, 0x48, 0x00, 0x52, 0x03, 0x61, 0x6e, - 0x79, 0x12, 0x3c, 0x0a, 0x03, 0x6e, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x12, 0x37, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x3e, 0x0a, 0x05, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, + 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x52, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, + 0x52, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x52, 0x70, + 0x73, 0x12, 0x44, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, + 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x07, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x1a, 0xa4, 0x04, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x12, 0x40, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, 0x03, 0x6e, 0x6f, 0x74, 0x12, - 0x45, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, - 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, - 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x48, - 0x74, 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, 0x49, 0x0a, 0x03, 0x53, - 0x65, 0x71, 0x12, 0x42, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, - 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x1a, 0x79, 0x0a, 0x04, 0x48, 0x74, 0x74, 0x70, 0x12, 0x18, - 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x42, 0x07, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x42, 0x07, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x1a, 0xce, 0x01, 0x0a, 0x07, 0x45, - 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x45, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, - 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x2e, 0x48, 0x74, 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, 0x71, 0x0a, - 0x04, 0x48, 0x74, 0x74, 0x70, 0x12, 0x53, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, - 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x48, - 0x00, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x42, 0x09, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x22, 0xc2, 0x0f, 0x0a, 0x08, - 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x72, 0x64, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x54, - 0x63, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, - 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0a, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, + 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x65, 0x71, 0x48, 0x00, 0x52, 0x03, + 0x61, 0x6c, 0x6c, 0x12, 0x40, 0x0a, 0x03, 0x61, 0x6e, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, + 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x65, 0x71, 0x48, 0x00, + 0x52, 0x03, 0x61, 0x6e, 0x79, 0x12, 0x3c, 0x0a, 0x03, 0x6e, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, + 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x48, 0x00, 0x52, 0x03, + 0x6e, 0x6f, 0x74, 0x12, 0x45, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x64, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x04, 0x68, 0x74, + 0x74, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, + 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, + 0x49, 0x0a, 0x03, 0x53, 0x65, 0x71, 0x12, 0x42, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, + 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x1a, 0x79, 0x0a, 0x04, 0x48, 0x74, + 0x74, 0x70, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x06, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x1e, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x42, 0x07, 0x0a, 0x05, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x42, 0x07, 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x1a, 0xce, + 0x01, 0x0a, 0x07, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x45, 0x0a, 0x04, 0x68, 0x74, + 0x74, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, + 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, 0x74, + 0x70, 0x1a, 0x71, 0x0a, 0x04, 0x48, 0x74, 0x74, 0x70, 0x12, 0x53, 0x0a, 0x07, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, + 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x09, + 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x22, + 0xc2, 0x0f, 0x0a, 0x08, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x06, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, - 0x65, 0x74, 0x2e, 0x54, 0x63, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x10, 0x64, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, - 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x0a, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, - 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x52, 0x09, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x4e, 0x0a, 0x0f, 0x70, - 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, - 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, - 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x04, 0x68, - 0x74, 0x74, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x1a, 0x92, - 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x12, - 0x47, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, - 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x8c, 0x01, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x12, 0x44, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, - 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0xf8, 0x08, 0x0a, 0x04, 0x48, 0x74, 0x74, 0x70, 0x12, 0x4c, 0x0a, 0x0c, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, - 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x4f, 0x0a, 0x0d, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, - 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x4c, 0x0a, 0x0c, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, - 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x1a, 0x36, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x1a, 0x86, 0x02, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, - 0x12, 0x34, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, - 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, - 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x52, 0x06, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2f, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0xdf, 0x01, 0x0a, 0x0c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x34, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, - 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, - 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x47, 0x0a, 0x12, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x74, 0x74, - 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x68, 0x74, 0x74, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x69, - 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0xd6, 0x02, 0x0a, 0x0b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, - 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, - 0x48, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x47, 0x0a, 0x12, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x49, 0x0a, 0x13, 0x73, 0x69, - 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x69, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x11, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x03, - 0x65, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x6f, 0x73, 0x52, 0x03, 0x65, 0x6f, - 0x73, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, - 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x08, 0x74, 0x72, 0x61, 0x69, - 0x6c, 0x65, 0x72, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x38, 0x0a, - 0x0e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x55, 0x54, - 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x32, 0x99, 0x01, 0x0a, 0x03, 0x54, 0x61, 0x70, 0x12, 0x3e, 0x0a, 0x03, 0x54, 0x61, 0x70, 0x12, - 0x18, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, - 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x22, 0x03, 0x88, 0x02, 0x01, 0x30, 0x01, 0x12, 0x52, 0x0a, 0x0d, 0x54, 0x61, 0x70, 0x42, - 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, - 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x65, 0x74, 0x2e, 0x54, 0x63, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x06, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, + 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x63, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, + 0x0a, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, + 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0f, 0x64, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x3f, + 0x0a, 0x0a, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, + 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x52, 0x09, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, + 0x4e, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, + 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x31, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x48, 0x00, 0x52, 0x04, 0x68, 0x74, + 0x74, 0x70, 0x1a, 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4d, + 0x65, 0x74, 0x61, 0x12, 0x47, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, + 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x8c, 0x01, 0x0a, 0x09, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x44, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, + 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x6f, + 0x75, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xf8, 0x08, 0x0a, 0x04, 0x48, 0x74, 0x74, 0x70, 0x12, + 0x4c, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, + 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, + 0x74, 0x70, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x48, 0x00, + 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x4f, 0x0a, + 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, + 0x70, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x48, 0x00, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x4c, + 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, + 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, + 0x70, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x48, 0x00, 0x52, + 0x0b, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x1a, 0x36, 0x0a, 0x08, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x1a, 0x86, 0x02, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x49, 0x6e, 0x69, 0x74, 0x12, 0x34, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, + 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x06, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2f, 0x0a, 0x07, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, 0xdf, 0x01, + 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x34, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x12, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, + 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x1a, + 0xd6, 0x02, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x12, + 0x34, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x12, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x49, + 0x0a, 0x13, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x23, 0x0a, 0x03, 0x65, 0x6f, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x45, 0x6f, 0x73, + 0x52, 0x03, 0x65, 0x6f, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, + 0x64, 0x32, 0x2e, 0x76, 0x69, 0x7a, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x08, + 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x22, 0x38, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, + 0x08, 0x4f, 0x55, 0x54, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x42, 0x07, 0x0a, 0x05, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x32, 0x99, 0x01, 0x0a, 0x03, 0x54, 0x61, 0x70, 0x12, 0x3e, 0x0a, 0x03, + 0x54, 0x61, 0x70, 0x12, 0x18, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, + 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x03, 0x88, 0x02, 0x01, 0x30, 0x01, 0x12, 0x52, 0x0a, 0x0d, + 0x54, 0x61, 0x70, 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x22, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, 0x2e, 0x54, 0x61, 0x70, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x03, 0x88, 0x02, 0x01, 0x30, 0x01, 0x42, 0x2d, 0x5a, 0x2b, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x72, 0x64, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2f, 0x76, 0x69, 0x7a, 0x2f, - 0x74, 0x61, 0x70, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x74, 0x61, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x42, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2e, 0x74, 0x61, 0x70, + 0x2e, 0x54, 0x61, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x03, 0x88, 0x02, 0x01, 0x30, 0x01, + 0x42, 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2f, + 0x76, 0x69, 0x7a, 0x2f, 0x74, 0x61, 0x70, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x74, 0x61, 0x70, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_tap_proto_rawDescOnce sync.Once - file_tap_proto_rawDescData = file_tap_proto_rawDesc + file_viz_tap_proto_rawDescOnce sync.Once + file_viz_tap_proto_rawDescData = file_viz_tap_proto_rawDesc ) -func file_tap_proto_rawDescGZIP() []byte { - file_tap_proto_rawDescOnce.Do(func() { - file_tap_proto_rawDescData = protoimpl.X.CompressGZIP(file_tap_proto_rawDescData) +func file_viz_tap_proto_rawDescGZIP() []byte { + file_viz_tap_proto_rawDescOnce.Do(func() { + file_viz_tap_proto_rawDescData = protoimpl.X.CompressGZIP(file_viz_tap_proto_rawDescData) }) - return file_tap_proto_rawDescData + return file_viz_tap_proto_rawDescData } -var file_tap_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_tap_proto_msgTypes = make([]protoimpl.MessageInfo, 18) -var file_tap_proto_goTypes = []interface{}{ +var file_viz_tap_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_viz_tap_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_viz_tap_proto_goTypes = []interface{}{ (TapEvent_ProxyDirection)(0), // 0: linkerd2.tap.TapEvent.ProxyDirection (*TapRequest)(nil), // 1: linkerd2.tap.TapRequest (*TapByResourceRequest)(nil), // 2: linkerd2.tap.TapByResourceRequest @@ -1643,7 +1643,7 @@ var file_tap_proto_goTypes = []interface{}{ (*duration.Duration)(nil), // 24: google.protobuf.Duration (*viz.Eos)(nil), // 25: linkerd2.viz.Eos } -var file_tap_proto_depIdxs = []int32{ +var file_viz_tap_proto_depIdxs = []int32{ 19, // 0: linkerd2.tap.TapByResourceRequest.target:type_name -> linkerd2.viz.ResourceSelection 4, // 1: linkerd2.tap.TapByResourceRequest.match:type_name -> linkerd2.tap.TapByResourceRequest.Match 5, // 2: linkerd2.tap.TapByResourceRequest.extract:type_name -> linkerd2.tap.TapByResourceRequest.Extract @@ -1690,13 +1690,13 @@ var file_tap_proto_depIdxs = []int32{ 0, // [0:35] is the sub-list for field type_name } -func init() { file_tap_proto_init() } -func file_tap_proto_init() { - if File_tap_proto != nil { +func init() { file_viz_tap_proto_init() } +func file_viz_tap_proto_init() { + if File_viz_tap_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_tap_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapRequest); i { case 0: return &v.state @@ -1708,7 +1708,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapByResourceRequest); i { case 0: return &v.state @@ -1720,7 +1720,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapEvent); i { case 0: return &v.state @@ -1732,7 +1732,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapByResourceRequest_Match); i { case 0: return &v.state @@ -1744,7 +1744,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapByResourceRequest_Extract); i { case 0: return &v.state @@ -1756,7 +1756,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapByResourceRequest_Match_Seq); i { case 0: return &v.state @@ -1768,7 +1768,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapByResourceRequest_Match_Http); i { case 0: return &v.state @@ -1780,7 +1780,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapByResourceRequest_Extract_Http); i { case 0: return &v.state @@ -1792,7 +1792,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapByResourceRequest_Extract_Http_Headers); i { case 0: return &v.state @@ -1804,7 +1804,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapEvent_EndpointMeta); i { case 0: return &v.state @@ -1816,7 +1816,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapEvent_RouteMeta); i { case 0: return &v.state @@ -1828,7 +1828,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapEvent_Http); i { case 0: return &v.state @@ -1840,7 +1840,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapEvent_Http_StreamId); i { case 0: return &v.state @@ -1852,7 +1852,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapEvent_Http_RequestInit); i { case 0: return &v.state @@ -1864,7 +1864,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapEvent_Http_ResponseInit); i { case 0: return &v.state @@ -1876,7 +1876,7 @@ func file_tap_proto_init() { return nil } } - file_tap_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_viz_tap_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TapEvent_Http_ResponseEnd); i { case 0: return &v.state @@ -1889,33 +1889,33 @@ func file_tap_proto_init() { } } } - file_tap_proto_msgTypes[0].OneofWrappers = []interface{}{ + file_viz_tap_proto_msgTypes[0].OneofWrappers = []interface{}{ (*TapRequest_Pod)(nil), (*TapRequest_Deployment)(nil), } - file_tap_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_viz_tap_proto_msgTypes[2].OneofWrappers = []interface{}{ (*TapEvent_Http_)(nil), } - file_tap_proto_msgTypes[3].OneofWrappers = []interface{}{ + file_viz_tap_proto_msgTypes[3].OneofWrappers = []interface{}{ (*TapByResourceRequest_Match_All)(nil), (*TapByResourceRequest_Match_Any)(nil), (*TapByResourceRequest_Match_Not)(nil), (*TapByResourceRequest_Match_Destinations)(nil), (*TapByResourceRequest_Match_Http_)(nil), } - file_tap_proto_msgTypes[4].OneofWrappers = []interface{}{ + file_viz_tap_proto_msgTypes[4].OneofWrappers = []interface{}{ (*TapByResourceRequest_Extract_Http_)(nil), } - file_tap_proto_msgTypes[6].OneofWrappers = []interface{}{ + file_viz_tap_proto_msgTypes[6].OneofWrappers = []interface{}{ (*TapByResourceRequest_Match_Http_Scheme)(nil), (*TapByResourceRequest_Match_Http_Method)(nil), (*TapByResourceRequest_Match_Http_Authority)(nil), (*TapByResourceRequest_Match_Http_Path)(nil), } - file_tap_proto_msgTypes[7].OneofWrappers = []interface{}{ + file_viz_tap_proto_msgTypes[7].OneofWrappers = []interface{}{ (*TapByResourceRequest_Extract_Http_Headers_)(nil), } - file_tap_proto_msgTypes[11].OneofWrappers = []interface{}{ + file_viz_tap_proto_msgTypes[11].OneofWrappers = []interface{}{ (*TapEvent_Http_RequestInit_)(nil), (*TapEvent_Http_ResponseInit_)(nil), (*TapEvent_Http_ResponseEnd_)(nil), @@ -1924,21 +1924,21 @@ func file_tap_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_tap_proto_rawDesc, + RawDescriptor: file_viz_tap_proto_rawDesc, NumEnums: 1, NumMessages: 18, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_tap_proto_goTypes, - DependencyIndexes: file_tap_proto_depIdxs, - EnumInfos: file_tap_proto_enumTypes, - MessageInfos: file_tap_proto_msgTypes, + GoTypes: file_viz_tap_proto_goTypes, + DependencyIndexes: file_viz_tap_proto_depIdxs, + EnumInfos: file_viz_tap_proto_enumTypes, + MessageInfos: file_viz_tap_proto_msgTypes, }.Build() - File_tap_proto = out.File - file_tap_proto_rawDesc = nil - file_tap_proto_goTypes = nil - file_tap_proto_depIdxs = nil + File_viz_tap_proto = out.File + file_viz_tap_proto_rawDesc = nil + file_viz_tap_proto_goTypes = nil + file_viz_tap_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. @@ -2114,5 +2114,5 @@ var _Tap_serviceDesc = grpc.ServiceDesc{ ServerStreams: true, }, }, - Metadata: "tap.proto", + Metadata: "viz_tap.proto", } diff --git a/viz/tap/proto/tap.proto b/viz/tap/proto/viz_tap.proto similarity index 100% rename from viz/tap/proto/tap.proto rename to viz/tap/proto/viz_tap.proto