mirror of https://github.com/hashicorp/consul
NET-4858 - xds v2 - implement base connect proxy functionality for routes (#18501)
* NET-4853 - xds v2 - implement base connect proxy functionality for clusters * NET-4853 - xds v2 - implement base connect proxy functionality for clusters * NET-4932 - xds v2 - implement base connect proxy functionality for endpoints * Update endpoints_test.go * gofmt * NET-4858 - Make connect proxy route tests pass using xds v2 * Update endpoints_test.go * Update naming.go * use alsoRunTestForV2 * remove unused makeAddress * gofmt * fixing clusterspull/18519/head
parent
97b41d946f
commit
9ea182f6ad
|
@ -96,8 +96,7 @@ func makeClusterDiscoChainTests(enterprise bool) []clusterTestCase {
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "simple-with-overrides", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "simple-with-overrides", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
// TODO(proxystate): requires routes work
|
alsoRunTestForV2: true,
|
||||||
alsoRunTestForV2: false,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-with-chain-and-failover",
|
name: "connect-proxy-with-chain-and-failover",
|
||||||
|
@ -176,16 +175,14 @@ func makeClusterDiscoChainTests(enterprise bool) []clusterTestCase {
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "splitter-with-resolver-redirect-multidc", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "splitter-with-resolver-redirect-multidc", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
// TODO(proxystate): requires routes work
|
alsoRunTestForV2: true,
|
||||||
alsoRunTestForV2: false,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-lb-in-resolver",
|
name: "connect-proxy-lb-in-resolver",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "lb-resolver", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "lb-resolver", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
// TODO(proxystate): requires routes work
|
alsoRunTestForV2: true,
|
||||||
alsoRunTestForV2: false,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import (
|
||||||
envoy_endpoint_v3 "github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3"
|
envoy_endpoint_v3 "github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3"
|
||||||
"github.com/hashicorp/consul/agent/proxycfg"
|
"github.com/hashicorp/consul/agent/proxycfg"
|
||||||
"github.com/hashicorp/consul/agent/structs"
|
"github.com/hashicorp/consul/agent/structs"
|
||||||
|
|
||||||
"github.com/hashicorp/consul/agent/xds/proxystateconverter"
|
"github.com/hashicorp/consul/agent/xds/proxystateconverter"
|
||||||
"github.com/hashicorp/consul/agent/xds/response"
|
"github.com/hashicorp/consul/agent/xds/response"
|
||||||
"github.com/hashicorp/consul/agent/xds/testcommon"
|
"github.com/hashicorp/consul/agent/xds/testcommon"
|
||||||
|
@ -267,8 +266,7 @@ func makeEndpointDiscoChainTests(enterprise bool) []endpointTestCase {
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "simple-with-overrides", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "simple-with-overrides", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
// TODO(proxystate): requires routes work
|
alsoRunTestForV2: true,
|
||||||
alsoRunTestForV2: false,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-with-chain-and-failover",
|
name: "connect-proxy-with-chain-and-failover",
|
||||||
|
@ -351,8 +349,7 @@ func makeEndpointDiscoChainTests(enterprise bool) []endpointTestCase {
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "splitter-with-resolver-redirect-multidc", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "splitter-with-resolver-redirect-multidc", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
// TODO(proxystate): requires routes work
|
alsoRunTestForV2: true,
|
||||||
alsoRunTestForV2: false,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
envoy_endpoint_v3 "github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3"
|
||||||
"google.golang.org/protobuf/types/known/durationpb"
|
"google.golang.org/protobuf/types/known/durationpb"
|
||||||
"google.golang.org/protobuf/types/known/wrapperspb"
|
"google.golang.org/protobuf/types/known/wrapperspb"
|
||||||
|
|
||||||
|
@ -1021,7 +1022,7 @@ func configureClusterWithHostnames(
|
||||||
dnsEndpointGroup.Config.DiscoveryType = pbproxystate.DiscoveryType_DISCOVERY_TYPE_STRICT
|
dnsEndpointGroup.Config.DiscoveryType = pbproxystate.DiscoveryType_DISCOVERY_TYPE_STRICT
|
||||||
}
|
}
|
||||||
|
|
||||||
endpoints := make([]*pbproxystate.Endpoint, 0, 1)
|
endpoints := make([]*envoy_endpoint_v3.LbEndpoint, 0, 1)
|
||||||
uniqueHostnames := make(map[string]bool)
|
uniqueHostnames := make(map[string]bool)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
@ -66,10 +66,12 @@ func (g *Converter) resourcesFromSnapshot(cfgSnap *proxycfg.ConfigSnapshot) erro
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
//err = g.routesFromSnapshot(cfgSnap)
|
|
||||||
//if err != nil {
|
err = g.routesFromSnapshot(cfgSnap)
|
||||||
// return err
|
if err != nil {
|
||||||
//}
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
//g.secretsFromSnapshot(cfgSnap)
|
//g.secretsFromSnapshot(cfgSnap)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,777 @@
|
||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: BUSL-1.1
|
||||||
|
|
||||||
|
package proxystateconverter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"github.com/hashicorp/consul/proto-public/pbmesh/v1alpha1/pbproxystate"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/hashicorp/consul/agent/xds/response"
|
||||||
|
|
||||||
|
"github.com/hashicorp/consul/agent/proxycfg"
|
||||||
|
"github.com/hashicorp/consul/agent/structs"
|
||||||
|
"google.golang.org/protobuf/types/known/durationpb"
|
||||||
|
)
|
||||||
|
|
||||||
|
// routesFromSnapshot returns the xDS API representation of the "routes" in the
|
||||||
|
// snapshot.
|
||||||
|
func (s *Converter) routesFromSnapshot(cfgSnap *proxycfg.ConfigSnapshot) error {
|
||||||
|
if cfgSnap == nil {
|
||||||
|
return errors.New("nil config given")
|
||||||
|
}
|
||||||
|
|
||||||
|
switch cfgSnap.Kind {
|
||||||
|
case structs.ServiceKindConnectProxy:
|
||||||
|
return s.routesForConnectProxy(cfgSnap)
|
||||||
|
// TODO(proxystate): Ingress Gateways will be added in the future.
|
||||||
|
//case structs.ServiceKindIngressGateway:
|
||||||
|
// return s.routesForIngressGateway(cfgSnap)
|
||||||
|
// TODO(proxystate): API Gateways will be added in the future.
|
||||||
|
//case structs.ServiceKindAPIGateway:
|
||||||
|
// return s.routesForAPIGateway(cfgSnap)
|
||||||
|
// TODO(proxystate): Terminating Gateways will be added in the future.
|
||||||
|
//case structs.ServiceKindTerminatingGateway:
|
||||||
|
// return s.routesForTerminatingGateway(cfgSnap)
|
||||||
|
// TODO(proxystate): Mesh Gateways will be added in the future.
|
||||||
|
//case structs.ServiceKindMeshGateway:
|
||||||
|
// return s.routesForMeshGateway(cfgSnap)
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("Invalid service kind: %v", cfgSnap.Kind)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// routesFromSnapshotConnectProxy returns the xDS API representation of the
|
||||||
|
// "routes" in the snapshot.
|
||||||
|
func (s *Converter) routesForConnectProxy(cfgSnap *proxycfg.ConfigSnapshot) error {
|
||||||
|
for uid, chain := range cfgSnap.ConnectProxy.DiscoveryChain {
|
||||||
|
if chain.Default {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
virtualHost, err := s.makeUpstreamHostForDiscoveryChain(cfgSnap, uid, chain, []string{"*"}, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if virtualHost == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
route := &pbproxystate.Route{
|
||||||
|
VirtualHosts: []*pbproxystate.VirtualHost{virtualHost},
|
||||||
|
}
|
||||||
|
s.proxyState.Routes[uid.EnvoyID()] = route
|
||||||
|
}
|
||||||
|
addressesMap := make(map[string]map[string]string)
|
||||||
|
err := cfgSnap.ConnectProxy.DestinationsUpstream.ForEachKeyE(func(uid proxycfg.UpstreamID) error {
|
||||||
|
svcConfig, ok := cfgSnap.ConnectProxy.DestinationsUpstream.Get(uid)
|
||||||
|
if !ok || svcConfig == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if !structs.IsProtocolHTTPLike(svcConfig.Protocol) {
|
||||||
|
// Routes can only be defined for HTTP services
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, address := range svcConfig.Destination.Addresses {
|
||||||
|
|
||||||
|
routeName := clusterNameForDestination(cfgSnap, "~http", fmt.Sprintf("%d", svcConfig.Destination.Port), svcConfig.NamespaceOrDefault(), svcConfig.PartitionOrDefault())
|
||||||
|
if _, ok := addressesMap[routeName]; !ok {
|
||||||
|
addressesMap[routeName] = make(map[string]string)
|
||||||
|
}
|
||||||
|
// cluster name is unique per address/port so we should not be doing any override here
|
||||||
|
clusterName := clusterNameForDestination(cfgSnap, svcConfig.Name, address, svcConfig.NamespaceOrDefault(), svcConfig.PartitionOrDefault())
|
||||||
|
addressesMap[routeName][clusterName] = address
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for routeName, clusters := range addressesMap {
|
||||||
|
route, err := s.makeRouteForAddresses(clusters)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if route != nil {
|
||||||
|
s.proxyState.Routes[routeName] = route
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(rb): make sure we don't generate an empty result
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Converter) makeRouteForAddresses(addresses map[string]string) (*pbproxystate.Route, error) {
|
||||||
|
route, err := makeAddressesRoute(addresses)
|
||||||
|
if err != nil {
|
||||||
|
s.Logger.Error("failed to make route", "cluster", "error", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return route, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(proxystate): Terminating Gateways will be added in the future.
|
||||||
|
// Functions to add from agent/xds/clusters.go:
|
||||||
|
// func routesForTerminatingGateway
|
||||||
|
|
||||||
|
// TODO(proxystate): Mesh Gateways will be added in the future.
|
||||||
|
// Functions to add from agent/xds/clusters.go:
|
||||||
|
// func routesForMeshGateway
|
||||||
|
|
||||||
|
func makeAddressesRoute(addresses map[string]string) (*pbproxystate.Route, error) {
|
||||||
|
route := &pbproxystate.Route{}
|
||||||
|
for clusterName, address := range addresses {
|
||||||
|
destination := makeRouteDestinationFromName(clusterName)
|
||||||
|
virtualHost := &pbproxystate.VirtualHost{
|
||||||
|
Name: clusterName,
|
||||||
|
Domains: []string{address},
|
||||||
|
RouteRules: []*pbproxystate.RouteRule{
|
||||||
|
{
|
||||||
|
Match: makeDefaultRouteMatch(),
|
||||||
|
Destination: destination,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
route.VirtualHosts = append(route.VirtualHosts, virtualHost)
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort virtual hosts to have a stable order
|
||||||
|
sort.SliceStable(route.VirtualHosts, func(i, j int) bool {
|
||||||
|
return route.VirtualHosts[i].Name > route.VirtualHosts[j].Name
|
||||||
|
})
|
||||||
|
return route, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// makeRouteDestinationFromName (fka makeRouteActionFromName)
|
||||||
|
func makeRouteDestinationFromName(clusterName string) *pbproxystate.RouteDestination {
|
||||||
|
return &pbproxystate.RouteDestination{
|
||||||
|
Destination: &pbproxystate.RouteDestination_Cluster{
|
||||||
|
Cluster: &pbproxystate.DestinationCluster{
|
||||||
|
Name: clusterName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(proxystate): Ingress Gateways will be added in the future.
|
||||||
|
// Functions to add from agent/xds/clusters.go:
|
||||||
|
// func routesForIngressGateway
|
||||||
|
|
||||||
|
// TODO(proxystate): API Gateways will be added in the future.
|
||||||
|
// Functions to add from agent/xds/clusters.go:
|
||||||
|
// func routesForAPIGateway
|
||||||
|
// func buildHTTPRouteUpstream
|
||||||
|
|
||||||
|
// TODO(proxystate): Ingress Gateways will be added in the future.
|
||||||
|
// Functions to add from agent/xds/clusters.go:
|
||||||
|
// func findIngressServiceMatchingUpstream
|
||||||
|
|
||||||
|
// TODO(proxystate): Ingress Gateways will be added in the future.
|
||||||
|
// Functions to add from agent/xds/clusters.go:
|
||||||
|
// func generateUpstreamIngressDomains
|
||||||
|
|
||||||
|
// TODO(proxystate): Ingress Gateways will be added in the future.
|
||||||
|
// Functions to add from agent/xds/clusters.go:
|
||||||
|
// func generateUpstreamAPIsDomains
|
||||||
|
|
||||||
|
func (s *Converter) makeUpstreamHostForDiscoveryChain(
|
||||||
|
cfgSnap *proxycfg.ConfigSnapshot,
|
||||||
|
uid proxycfg.UpstreamID,
|
||||||
|
chain *structs.CompiledDiscoveryChain,
|
||||||
|
serviceDomains []string,
|
||||||
|
forMeshGateway bool,
|
||||||
|
) (*pbproxystate.VirtualHost, error) {
|
||||||
|
var routeRules []*pbproxystate.RouteRule
|
||||||
|
|
||||||
|
startNode := chain.Nodes[chain.StartNode]
|
||||||
|
if startNode == nil {
|
||||||
|
return nil, fmt.Errorf("missing first node in compiled discovery chain for: %s", chain.ServiceName)
|
||||||
|
}
|
||||||
|
|
||||||
|
upstreamsSnapshot, err := cfgSnap.ToConfigSnapshotUpstreams()
|
||||||
|
if err != nil && !forMeshGateway {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch startNode.Type {
|
||||||
|
case structs.DiscoveryGraphNodeTypeRouter:
|
||||||
|
routeRules = make([]*pbproxystate.RouteRule, 0, len(startNode.Routes))
|
||||||
|
|
||||||
|
for _, discoveryRoute := range startNode.Routes {
|
||||||
|
routeMatch := makeRouteMatchForDiscoveryRoute(discoveryRoute)
|
||||||
|
|
||||||
|
var (
|
||||||
|
routeDestination *pbproxystate.RouteDestination
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
nextNode := chain.Nodes[discoveryRoute.NextNode]
|
||||||
|
|
||||||
|
var lb *structs.LoadBalancer
|
||||||
|
if nextNode.LoadBalancer != nil {
|
||||||
|
lb = nextNode.LoadBalancer
|
||||||
|
}
|
||||||
|
|
||||||
|
switch nextNode.Type {
|
||||||
|
case structs.DiscoveryGraphNodeTypeSplitter:
|
||||||
|
routeDestination, err = s.makeRouteDestinationForSplitter(upstreamsSnapshot, nextNode.Splits, chain, forMeshGateway)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
case structs.DiscoveryGraphNodeTypeResolver:
|
||||||
|
rd, ok := s.makeRouteDestinationForChainCluster(upstreamsSnapshot, nextNode.Resolver.Target, chain, forMeshGateway)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
routeDestination = rd
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unexpected graph node after route %q", nextNode.Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
routeDestination.DestinationConfiguration = &pbproxystate.DestinationConfiguration{}
|
||||||
|
if err := injectLBToDestinationConfiguration(lb, routeDestination.DestinationConfiguration); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to apply load balancer configuration to route action: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(rb): Better help handle the envoy case where you need (prefix=/foo/,rewrite=/) and (exact=/foo,rewrite=/) to do a full rewrite
|
||||||
|
|
||||||
|
destination := discoveryRoute.Definition.Destination
|
||||||
|
|
||||||
|
routeRule := &pbproxystate.RouteRule{}
|
||||||
|
|
||||||
|
if destination != nil {
|
||||||
|
configHandle := routeDestination.DestinationConfiguration
|
||||||
|
if destination.PrefixRewrite != "" {
|
||||||
|
configHandle.PrefixRewrite = destination.PrefixRewrite
|
||||||
|
}
|
||||||
|
|
||||||
|
if destination.RequestTimeout > 0 || destination.IdleTimeout > 0 {
|
||||||
|
configHandle.TimeoutConfig = &pbproxystate.TimeoutConfig{}
|
||||||
|
}
|
||||||
|
if destination.RequestTimeout > 0 {
|
||||||
|
configHandle.TimeoutConfig.Timeout = durationpb.New(destination.RequestTimeout)
|
||||||
|
}
|
||||||
|
if destination.IdleTimeout > 0 {
|
||||||
|
configHandle.TimeoutConfig.IdleTimeout = durationpb.New(destination.IdleTimeout)
|
||||||
|
}
|
||||||
|
|
||||||
|
if destination.HasRetryFeatures() {
|
||||||
|
configHandle.RetryPolicy = getRetryPolicyForDestination(destination)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := injectHeaderManipToRoute(destination, routeRule); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to apply header manipulation configuration to route: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
routeRule.Match = routeMatch
|
||||||
|
routeRule.Destination = routeDestination
|
||||||
|
|
||||||
|
routeRules = append(routeRules, routeRule)
|
||||||
|
}
|
||||||
|
|
||||||
|
case structs.DiscoveryGraphNodeTypeSplitter:
|
||||||
|
routeDestination, err := s.makeRouteDestinationForSplitter(upstreamsSnapshot, startNode.Splits, chain, forMeshGateway)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var lb *structs.LoadBalancer
|
||||||
|
if startNode.LoadBalancer != nil {
|
||||||
|
lb = startNode.LoadBalancer
|
||||||
|
}
|
||||||
|
routeDestination.DestinationConfiguration = &pbproxystate.DestinationConfiguration{}
|
||||||
|
if err := injectLBToDestinationConfiguration(lb, routeDestination.DestinationConfiguration); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to apply load balancer configuration to route action: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultRoute := &pbproxystate.RouteRule{
|
||||||
|
Match: makeDefaultRouteMatch(),
|
||||||
|
Destination: routeDestination,
|
||||||
|
}
|
||||||
|
|
||||||
|
routeRules = []*pbproxystate.RouteRule{defaultRoute}
|
||||||
|
|
||||||
|
case structs.DiscoveryGraphNodeTypeResolver:
|
||||||
|
routeDestination, ok := s.makeRouteDestinationForChainCluster(upstreamsSnapshot, startNode.Resolver.Target, chain, forMeshGateway)
|
||||||
|
if !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
var lb *structs.LoadBalancer
|
||||||
|
if startNode.LoadBalancer != nil {
|
||||||
|
lb = startNode.LoadBalancer
|
||||||
|
}
|
||||||
|
routeDestination.DestinationConfiguration = &pbproxystate.DestinationConfiguration{}
|
||||||
|
if err := injectLBToDestinationConfiguration(lb, routeDestination.DestinationConfiguration); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to apply load balancer configuration to route action: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if startNode.Resolver.RequestTimeout > 0 {
|
||||||
|
to := &pbproxystate.TimeoutConfig{
|
||||||
|
Timeout: durationpb.New(startNode.Resolver.RequestTimeout),
|
||||||
|
}
|
||||||
|
routeDestination.DestinationConfiguration.TimeoutConfig = to
|
||||||
|
}
|
||||||
|
defaultRoute := &pbproxystate.RouteRule{
|
||||||
|
Match: makeDefaultRouteMatch(),
|
||||||
|
Destination: routeDestination,
|
||||||
|
}
|
||||||
|
|
||||||
|
routeRules = []*pbproxystate.RouteRule{defaultRoute}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unknown first node in discovery chain of type: %s", startNode.Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
host := &pbproxystate.VirtualHost{
|
||||||
|
Name: uid.EnvoyID(),
|
||||||
|
Domains: serviceDomains,
|
||||||
|
RouteRules: routeRules,
|
||||||
|
}
|
||||||
|
|
||||||
|
return host, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getRetryPolicyForDestination(destination *structs.ServiceRouteDestination) *pbproxystate.RetryPolicy {
|
||||||
|
retryPolicy := &pbproxystate.RetryPolicy{}
|
||||||
|
if destination.NumRetries > 0 {
|
||||||
|
retryPolicy.NumRetries = response.MakeUint32Value(int(destination.NumRetries))
|
||||||
|
}
|
||||||
|
|
||||||
|
// The RetryOn magic values come from: https://www.envoyproxy.io/docs/envoy/v1.10.0/configuration/http_filters/router_filter#config-http-filters-router-x-envoy-retry-on
|
||||||
|
var retryStrings []string
|
||||||
|
|
||||||
|
if len(destination.RetryOn) > 0 {
|
||||||
|
retryStrings = append(retryStrings, destination.RetryOn...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if destination.RetryOnConnectFailure {
|
||||||
|
// connect-failure can be enabled by either adding connect-failure to the RetryOn list or by using the legacy RetryOnConnectFailure option
|
||||||
|
// Check that it's not already in the RetryOn list, so we don't set it twice
|
||||||
|
connectFailureExists := false
|
||||||
|
for _, r := range retryStrings {
|
||||||
|
if r == "connect-failure" {
|
||||||
|
connectFailureExists = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !connectFailureExists {
|
||||||
|
retryStrings = append(retryStrings, "connect-failure")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(destination.RetryOnStatusCodes) > 0 {
|
||||||
|
retryStrings = append(retryStrings, "retriable-status-codes")
|
||||||
|
retryPolicy.RetriableStatusCodes = destination.RetryOnStatusCodes
|
||||||
|
}
|
||||||
|
|
||||||
|
retryPolicy.RetryOn = strings.Join(retryStrings, ",")
|
||||||
|
|
||||||
|
return retryPolicy
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeRouteMatchForDiscoveryRoute(discoveryRoute *structs.DiscoveryRoute) *pbproxystate.RouteMatch {
|
||||||
|
match := discoveryRoute.Definition.Match
|
||||||
|
if match == nil || match.IsEmpty() {
|
||||||
|
return makeDefaultRouteMatch()
|
||||||
|
}
|
||||||
|
|
||||||
|
routeMatch := &pbproxystate.RouteMatch{}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case match.HTTP.PathExact != "":
|
||||||
|
routeMatch.PathMatch = &pbproxystate.PathMatch{
|
||||||
|
PathMatch: &pbproxystate.PathMatch_Exact{
|
||||||
|
Exact: match.HTTP.PathExact,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
case match.HTTP.PathPrefix != "":
|
||||||
|
routeMatch.PathMatch = &pbproxystate.PathMatch{
|
||||||
|
PathMatch: &pbproxystate.PathMatch_Prefix{
|
||||||
|
Prefix: match.HTTP.PathPrefix,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
case match.HTTP.PathRegex != "":
|
||||||
|
routeMatch.PathMatch = &pbproxystate.PathMatch{
|
||||||
|
PathMatch: &pbproxystate.PathMatch_Regex{
|
||||||
|
Regex: match.HTTP.PathRegex,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
routeMatch.PathMatch = &pbproxystate.PathMatch{
|
||||||
|
PathMatch: &pbproxystate.PathMatch_Prefix{
|
||||||
|
Prefix: "/",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(match.HTTP.Header) > 0 {
|
||||||
|
routeMatch.HeaderMatches = make([]*pbproxystate.HeaderMatch, 0, len(match.HTTP.Header))
|
||||||
|
for _, hdr := range match.HTTP.Header {
|
||||||
|
headerMatch := &pbproxystate.HeaderMatch{
|
||||||
|
Name: hdr.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case hdr.Exact != "":
|
||||||
|
headerMatch.Match = &pbproxystate.HeaderMatch_Exact{
|
||||||
|
Exact: hdr.Exact,
|
||||||
|
}
|
||||||
|
case hdr.Regex != "":
|
||||||
|
headerMatch.Match = &pbproxystate.HeaderMatch_Regex{
|
||||||
|
Regex: hdr.Regex,
|
||||||
|
}
|
||||||
|
case hdr.Prefix != "":
|
||||||
|
headerMatch.Match = &pbproxystate.HeaderMatch_Prefix{
|
||||||
|
Prefix: hdr.Prefix,
|
||||||
|
}
|
||||||
|
case hdr.Suffix != "":
|
||||||
|
headerMatch.Match = &pbproxystate.HeaderMatch_Suffix{
|
||||||
|
Suffix: hdr.Suffix,
|
||||||
|
}
|
||||||
|
case hdr.Present:
|
||||||
|
headerMatch.Match = &pbproxystate.HeaderMatch_Present{
|
||||||
|
Present: true,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
continue // skip this impossible situation
|
||||||
|
}
|
||||||
|
|
||||||
|
if hdr.Invert {
|
||||||
|
headerMatch.InvertMatch = true
|
||||||
|
}
|
||||||
|
|
||||||
|
routeMatch.HeaderMatches = append(routeMatch.HeaderMatches, headerMatch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(match.HTTP.Methods) > 0 {
|
||||||
|
routeMatch.MethodMatches = append(routeMatch.MethodMatches, match.HTTP.Methods...)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(match.HTTP.QueryParam) > 0 {
|
||||||
|
routeMatch.QueryParameterMatches = make([]*pbproxystate.QueryParameterMatch, 0, len(match.HTTP.QueryParam))
|
||||||
|
for _, qm := range match.HTTP.QueryParam {
|
||||||
|
|
||||||
|
queryMatcher := &pbproxystate.QueryParameterMatch{
|
||||||
|
Name: qm.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case qm.Exact != "":
|
||||||
|
queryMatcher.Match = &pbproxystate.QueryParameterMatch_Exact{
|
||||||
|
Exact: qm.Exact,
|
||||||
|
}
|
||||||
|
case qm.Regex != "":
|
||||||
|
queryMatcher.Match = &pbproxystate.QueryParameterMatch_Regex{
|
||||||
|
Regex: qm.Regex,
|
||||||
|
}
|
||||||
|
case qm.Present:
|
||||||
|
queryMatcher.Match = &pbproxystate.QueryParameterMatch_Present{
|
||||||
|
Present: true,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
continue // skip this impossible situation
|
||||||
|
}
|
||||||
|
|
||||||
|
routeMatch.QueryParameterMatches = append(routeMatch.QueryParameterMatches, queryMatcher)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return routeMatch
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeDefaultRouteMatch() *pbproxystate.RouteMatch {
|
||||||
|
return &pbproxystate.RouteMatch{
|
||||||
|
PathMatch: &pbproxystate.PathMatch{
|
||||||
|
PathMatch: &pbproxystate.PathMatch_Prefix{
|
||||||
|
Prefix: "/",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// TODO(banks) Envoy supports matching only valid GRPC
|
||||||
|
// requests which might be nice to add here for gRPC services
|
||||||
|
// but it's not supported in our current envoy SDK version
|
||||||
|
// although docs say it was supported by 1.8.0. Going to defer
|
||||||
|
// that until we've updated the deps.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Converter) makeRouteDestinationForChainCluster(
|
||||||
|
upstreamsSnapshot *proxycfg.ConfigSnapshotUpstreams,
|
||||||
|
targetID string,
|
||||||
|
chain *structs.CompiledDiscoveryChain,
|
||||||
|
forMeshGateway bool,
|
||||||
|
) (*pbproxystate.RouteDestination, bool) {
|
||||||
|
clusterName := s.getTargetClusterName(upstreamsSnapshot, chain, targetID, forMeshGateway)
|
||||||
|
if clusterName == "" {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
return makeRouteDestinationFromName(clusterName), true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Converter) makeRouteDestinationForSplitter(
|
||||||
|
upstreamsSnapshot *proxycfg.ConfigSnapshotUpstreams,
|
||||||
|
splits []*structs.DiscoverySplit,
|
||||||
|
chain *structs.CompiledDiscoveryChain,
|
||||||
|
forMeshGateway bool,
|
||||||
|
) (*pbproxystate.RouteDestination, error) {
|
||||||
|
clusters := make([]*pbproxystate.L7WeightedDestinationCluster, 0, len(splits))
|
||||||
|
for _, split := range splits {
|
||||||
|
nextNode := chain.Nodes[split.NextNode]
|
||||||
|
|
||||||
|
if nextNode.Type != structs.DiscoveryGraphNodeTypeResolver {
|
||||||
|
return nil, fmt.Errorf("unexpected splitter destination node type: %s", nextNode.Type)
|
||||||
|
}
|
||||||
|
targetID := nextNode.Resolver.Target
|
||||||
|
|
||||||
|
clusterName := s.getTargetClusterName(upstreamsSnapshot, chain, targetID, forMeshGateway)
|
||||||
|
if clusterName == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// The smallest representable weight is 1/10000 or .01% but envoy
|
||||||
|
// deals with integers so scale everything up by 100x.
|
||||||
|
weight := int(split.Weight * 100)
|
||||||
|
|
||||||
|
clusterWeight := &pbproxystate.L7WeightedDestinationCluster{
|
||||||
|
Name: clusterName,
|
||||||
|
Weight: response.MakeUint32Value(weight),
|
||||||
|
}
|
||||||
|
if err := injectHeaderManipToWeightedCluster(split.Definition, clusterWeight); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
clusters = append(clusters, clusterWeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(clusters) <= 0 {
|
||||||
|
return nil, fmt.Errorf("number of clusters in splitter must be > 0; got %d", len(clusters))
|
||||||
|
}
|
||||||
|
|
||||||
|
return &pbproxystate.RouteDestination{
|
||||||
|
Destination: &pbproxystate.RouteDestination_WeightedClusters{
|
||||||
|
WeightedClusters: &pbproxystate.L7WeightedClusterGroup{
|
||||||
|
Clusters: clusters,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func injectLBToDestinationConfiguration(lb *structs.LoadBalancer, destinationConfig *pbproxystate.DestinationConfiguration) error {
|
||||||
|
if lb == nil || !lb.IsHashBased() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
result := make([]*pbproxystate.LoadBalancerHashPolicy, 0, len(lb.HashPolicies))
|
||||||
|
for _, policy := range lb.HashPolicies {
|
||||||
|
if policy.SourceIP {
|
||||||
|
p := &pbproxystate.LoadBalancerHashPolicy{
|
||||||
|
Policy: &pbproxystate.LoadBalancerHashPolicy_ConnectionProperties{
|
||||||
|
ConnectionProperties: &pbproxystate.ConnectionPropertiesPolicy{
|
||||||
|
SourceIp: true,
|
||||||
|
Terminal: policy.Terminal,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
result = append(result, p)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch policy.Field {
|
||||||
|
case structs.HashPolicyHeader:
|
||||||
|
p := &pbproxystate.LoadBalancerHashPolicy{
|
||||||
|
Policy: &pbproxystate.LoadBalancerHashPolicy_Header{
|
||||||
|
Header: &pbproxystate.HeaderPolicy{
|
||||||
|
Name: policy.FieldValue,
|
||||||
|
Terminal: policy.Terminal,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
result = append(result, p)
|
||||||
|
|
||||||
|
case structs.HashPolicyCookie:
|
||||||
|
|
||||||
|
cookie := &pbproxystate.CookiePolicy{
|
||||||
|
Name: policy.FieldValue,
|
||||||
|
Terminal: policy.Terminal,
|
||||||
|
}
|
||||||
|
if policy.CookieConfig != nil {
|
||||||
|
cookie.Path = policy.CookieConfig.Path
|
||||||
|
|
||||||
|
if policy.CookieConfig.TTL != 0*time.Second {
|
||||||
|
cookie.Ttl = durationpb.New(policy.CookieConfig.TTL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Envoy will generate a session cookie if the ttl is present and zero.
|
||||||
|
if policy.CookieConfig.Session {
|
||||||
|
cookie.Ttl = durationpb.New(0 * time.Second)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p := &pbproxystate.LoadBalancerHashPolicy{
|
||||||
|
Policy: &pbproxystate.LoadBalancerHashPolicy_Cookie{
|
||||||
|
Cookie: cookie,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
result = append(result, p)
|
||||||
|
|
||||||
|
case structs.HashPolicyQueryParam:
|
||||||
|
p := &pbproxystate.LoadBalancerHashPolicy{
|
||||||
|
Policy: &pbproxystate.LoadBalancerHashPolicy_QueryParameter{
|
||||||
|
QueryParameter: &pbproxystate.QueryParameterPolicy{
|
||||||
|
Name: policy.FieldValue,
|
||||||
|
Terminal: policy.Terminal,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
result = append(result, p)
|
||||||
|
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unsupported load balancer hash policy field: %v", policy.Field)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destinationConfig.HashPolicies = result
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func injectHeaderManipToRoute(dest *structs.ServiceRouteDestination, r *pbproxystate.RouteRule) error {
|
||||||
|
if !dest.RequestHeaders.IsZero() {
|
||||||
|
r.HeaderMutations = append(
|
||||||
|
r.HeaderMutations,
|
||||||
|
makeRequestHeaderAdd(dest.RequestHeaders.Add, true)...,
|
||||||
|
)
|
||||||
|
r.HeaderMutations = append(
|
||||||
|
r.HeaderMutations,
|
||||||
|
makeRequestHeaderAdd(dest.RequestHeaders.Set, false)...,
|
||||||
|
)
|
||||||
|
r.HeaderMutations = append(
|
||||||
|
r.HeaderMutations,
|
||||||
|
makeRequestHeaderRemove(dest.RequestHeaders.Remove),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if !dest.ResponseHeaders.IsZero() {
|
||||||
|
r.HeaderMutations = append(
|
||||||
|
r.HeaderMutations,
|
||||||
|
makeResponseHeaderAdd(dest.ResponseHeaders.Add, true)...,
|
||||||
|
)
|
||||||
|
r.HeaderMutations = append(
|
||||||
|
r.HeaderMutations,
|
||||||
|
makeResponseHeaderAdd(dest.ResponseHeaders.Set, false)...,
|
||||||
|
)
|
||||||
|
r.HeaderMutations = append(
|
||||||
|
r.HeaderMutations,
|
||||||
|
makeResponseHeaderRemove(dest.ResponseHeaders.Remove),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func injectHeaderManipToWeightedCluster(split *structs.ServiceSplit, c *pbproxystate.L7WeightedDestinationCluster) error {
|
||||||
|
if !split.RequestHeaders.IsZero() {
|
||||||
|
c.HeaderMutations = append(
|
||||||
|
c.HeaderMutations,
|
||||||
|
makeRequestHeaderAdd(split.RequestHeaders.Add, true)...,
|
||||||
|
)
|
||||||
|
c.HeaderMutations = append(
|
||||||
|
c.HeaderMutations,
|
||||||
|
makeRequestHeaderAdd(split.RequestHeaders.Set, false)...,
|
||||||
|
)
|
||||||
|
c.HeaderMutations = append(
|
||||||
|
c.HeaderMutations,
|
||||||
|
makeRequestHeaderRemove(split.RequestHeaders.Remove),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if !split.ResponseHeaders.IsZero() {
|
||||||
|
c.HeaderMutations = append(
|
||||||
|
c.HeaderMutations,
|
||||||
|
makeResponseHeaderAdd(split.ResponseHeaders.Add, true)...,
|
||||||
|
)
|
||||||
|
c.HeaderMutations = append(
|
||||||
|
c.HeaderMutations,
|
||||||
|
makeResponseHeaderAdd(split.ResponseHeaders.Set, false)...,
|
||||||
|
)
|
||||||
|
c.HeaderMutations = append(
|
||||||
|
c.HeaderMutations,
|
||||||
|
makeResponseHeaderRemove(split.ResponseHeaders.Remove),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeRequestHeaderAdd(vals map[string]string, add bool) []*pbproxystate.HeaderMutation {
|
||||||
|
mutations := make([]*pbproxystate.HeaderMutation, 0, len(vals))
|
||||||
|
|
||||||
|
appendAction := pbproxystate.AppendAction_APPEND_ACTION_OVERWRITE_IF_EXISTS_OR_ADD
|
||||||
|
if add {
|
||||||
|
appendAction = pbproxystate.AppendAction_APPEND_ACTION_APPEND_IF_EXISTS_OR_ADD
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range vals {
|
||||||
|
m := &pbproxystate.HeaderMutation{
|
||||||
|
Action: &pbproxystate.HeaderMutation_RequestHeaderAdd{
|
||||||
|
RequestHeaderAdd: &pbproxystate.RequestHeaderAdd{
|
||||||
|
Header: &pbproxystate.Header{
|
||||||
|
Key: k,
|
||||||
|
Value: v,
|
||||||
|
},
|
||||||
|
AppendAction: appendAction,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
mutations = append(mutations, m)
|
||||||
|
}
|
||||||
|
return mutations
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeRequestHeaderRemove(values []string) *pbproxystate.HeaderMutation {
|
||||||
|
return &pbproxystate.HeaderMutation{
|
||||||
|
Action: &pbproxystate.HeaderMutation_RequestHeaderRemove{
|
||||||
|
RequestHeaderRemove: &pbproxystate.RequestHeaderRemove{
|
||||||
|
HeaderKeys: values,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeResponseHeaderAdd(vals map[string]string, add bool) []*pbproxystate.HeaderMutation {
|
||||||
|
mutations := make([]*pbproxystate.HeaderMutation, 0, len(vals))
|
||||||
|
|
||||||
|
appendAction := pbproxystate.AppendAction_APPEND_ACTION_OVERWRITE_IF_EXISTS_OR_ADD
|
||||||
|
if add {
|
||||||
|
appendAction = pbproxystate.AppendAction_APPEND_ACTION_APPEND_IF_EXISTS_OR_ADD
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range vals {
|
||||||
|
m := &pbproxystate.HeaderMutation{
|
||||||
|
Action: &pbproxystate.HeaderMutation_ResponseHeaderAdd{
|
||||||
|
ResponseHeaderAdd: &pbproxystate.ResponseHeaderAdd{
|
||||||
|
Header: &pbproxystate.Header{
|
||||||
|
Key: k,
|
||||||
|
Value: v,
|
||||||
|
},
|
||||||
|
AppendAction: appendAction,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
mutations = append(mutations, m)
|
||||||
|
}
|
||||||
|
return mutations
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeResponseHeaderRemove(values []string) *pbproxystate.HeaderMutation {
|
||||||
|
return &pbproxystate.HeaderMutation{
|
||||||
|
Action: &pbproxystate.HeaderMutation_ResponseHeaderRemove{
|
||||||
|
ResponseHeaderRemove: &pbproxystate.ResponseHeaderRemove{
|
||||||
|
HeaderKeys: values,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,8 +16,10 @@ import (
|
||||||
|
|
||||||
"github.com/hashicorp/consul/agent/proxycfg"
|
"github.com/hashicorp/consul/agent/proxycfg"
|
||||||
"github.com/hashicorp/consul/agent/structs"
|
"github.com/hashicorp/consul/agent/structs"
|
||||||
|
"github.com/hashicorp/consul/agent/xds/proxystateconverter"
|
||||||
"github.com/hashicorp/consul/agent/xds/response"
|
"github.com/hashicorp/consul/agent/xds/response"
|
||||||
"github.com/hashicorp/consul/agent/xds/testcommon"
|
"github.com/hashicorp/consul/agent/xds/testcommon"
|
||||||
|
"github.com/hashicorp/consul/agent/xdsv2"
|
||||||
"github.com/hashicorp/consul/envoyextensions/xdscommon"
|
"github.com/hashicorp/consul/envoyextensions/xdscommon"
|
||||||
"github.com/hashicorp/consul/sdk/testutil"
|
"github.com/hashicorp/consul/sdk/testutil"
|
||||||
)
|
)
|
||||||
|
@ -26,6 +28,7 @@ type routeTestCase struct {
|
||||||
name string
|
name string
|
||||||
create func(t testinf.T) *proxycfg.ConfigSnapshot
|
create func(t testinf.T) *proxycfg.ConfigSnapshot
|
||||||
overrideGoldenName string
|
overrideGoldenName string
|
||||||
|
alsoRunTestForV2 bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeRouteDiscoChainTests(enterprise bool) []routeTestCase {
|
func makeRouteDiscoChainTests(enterprise bool) []routeTestCase {
|
||||||
|
@ -35,66 +38,77 @@ func makeRouteDiscoChainTests(enterprise bool) []routeTestCase {
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "simple", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "simple", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
|
alsoRunTestForV2: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-with-chain-external-sni",
|
name: "connect-proxy-with-chain-external-sni",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "external-sni", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "external-sni", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
|
alsoRunTestForV2: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-splitter-overweight",
|
name: "connect-proxy-splitter-overweight",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "splitter-overweight", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "splitter-overweight", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
|
alsoRunTestForV2: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-with-chain-and-overrides",
|
name: "connect-proxy-with-chain-and-overrides",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "simple-with-overrides", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "simple-with-overrides", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
|
alsoRunTestForV2: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "splitter-with-resolver-redirect",
|
name: "splitter-with-resolver-redirect",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "splitter-with-resolver-redirect-multidc", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "splitter-with-resolver-redirect-multidc", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
|
alsoRunTestForV2: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-with-chain-and-splitter",
|
name: "connect-proxy-with-chain-and-splitter",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "chain-and-splitter", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "chain-and-splitter", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
|
alsoRunTestForV2: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-with-grpc-router",
|
name: "connect-proxy-with-grpc-router",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "grpc-router", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "grpc-router", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
|
alsoRunTestForV2: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-with-chain-and-router",
|
name: "connect-proxy-with-chain-and-router",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "chain-and-router", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "chain-and-router", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
|
alsoRunTestForV2: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-lb-in-resolver",
|
name: "connect-proxy-lb-in-resolver",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "lb-resolver", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "lb-resolver", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
|
alsoRunTestForV2: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-route-to-lb-resolver",
|
name: "connect-proxy-route-to-lb-resolver",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "redirect-to-lb-node", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "redirect-to-lb-node", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
|
alsoRunTestForV2: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "connect-proxy-resolver-with-lb",
|
name: "connect-proxy-resolver-with-lb",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "resolver-with-lb", enterprise, nil, nil)
|
return proxycfg.TestConfigSnapshotDiscoveryChain(t, "resolver-with-lb", enterprise, nil, nil)
|
||||||
},
|
},
|
||||||
|
alsoRunTestForV2: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,6 +129,8 @@ func TestRoutesFromSnapshot(t *testing.T) {
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotIngressGateway_NilConfigEntry(t)
|
return proxycfg.TestConfigSnapshotIngressGateway_NilConfigEntry(t)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-defaults-no-chain",
|
name: "ingress-defaults-no-chain",
|
||||||
|
@ -122,6 +138,8 @@ func TestRoutesFromSnapshot(t *testing.T) {
|
||||||
return proxycfg.TestConfigSnapshotIngressGateway(t, false, "tcp",
|
return proxycfg.TestConfigSnapshotIngressGateway(t, false, "tcp",
|
||||||
"default", nil, nil, nil)
|
"default", nil, nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-with-chain",
|
name: "ingress-with-chain",
|
||||||
|
@ -129,6 +147,8 @@ func TestRoutesFromSnapshot(t *testing.T) {
|
||||||
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "tcp",
|
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "tcp",
|
||||||
"simple", nil, nil, nil)
|
"simple", nil, nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-with-chain-external-sni",
|
name: "ingress-with-chain-external-sni",
|
||||||
|
@ -136,6 +156,8 @@ func TestRoutesFromSnapshot(t *testing.T) {
|
||||||
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "tcp",
|
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "tcp",
|
||||||
"external-sni", nil, nil, nil)
|
"external-sni", nil, nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-splitter-with-resolver-redirect",
|
name: "ingress-splitter-with-resolver-redirect",
|
||||||
|
@ -143,6 +165,8 @@ func TestRoutesFromSnapshot(t *testing.T) {
|
||||||
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "http",
|
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "http",
|
||||||
"splitter-with-resolver-redirect-multidc", nil, nil, nil)
|
"splitter-with-resolver-redirect-multidc", nil, nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-with-chain-and-splitter",
|
name: "ingress-with-chain-and-splitter",
|
||||||
|
@ -150,6 +174,8 @@ func TestRoutesFromSnapshot(t *testing.T) {
|
||||||
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "http",
|
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "http",
|
||||||
"chain-and-splitter", nil, nil, nil)
|
"chain-and-splitter", nil, nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-with-grpc-router",
|
name: "ingress-with-grpc-router",
|
||||||
|
@ -157,6 +183,8 @@ func TestRoutesFromSnapshot(t *testing.T) {
|
||||||
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "http",
|
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "http",
|
||||||
"grpc-router", nil, nil, nil)
|
"grpc-router", nil, nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-with-chain-and-router",
|
name: "ingress-with-chain-and-router",
|
||||||
|
@ -164,6 +192,8 @@ func TestRoutesFromSnapshot(t *testing.T) {
|
||||||
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "http",
|
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "http",
|
||||||
"chain-and-router", nil, nil, nil)
|
"chain-and-router", nil, nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-lb-in-resolver",
|
name: "ingress-lb-in-resolver",
|
||||||
|
@ -171,48 +201,66 @@ func TestRoutesFromSnapshot(t *testing.T) {
|
||||||
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "http",
|
return proxycfg.TestConfigSnapshotIngressGateway(t, true, "http",
|
||||||
"lb-resolver", nil, nil, nil)
|
"lb-resolver", nil, nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-http-multiple-services",
|
name: "ingress-http-multiple-services",
|
||||||
create: proxycfg.TestConfigSnapshotIngress_HTTPMultipleServices,
|
create: proxycfg.TestConfigSnapshotIngress_HTTPMultipleServices,
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-grpc-multiple-services",
|
name: "ingress-grpc-multiple-services",
|
||||||
create: proxycfg.TestConfigSnapshotIngress_GRPCMultipleServices,
|
create: proxycfg.TestConfigSnapshotIngress_GRPCMultipleServices,
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-with-chain-and-router-header-manip",
|
name: "ingress-with-chain-and-router-header-manip",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotIngressGatewayWithChain(t, "router-header-manip", nil, nil)
|
return proxycfg.TestConfigSnapshotIngressGatewayWithChain(t, "router-header-manip", nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-with-sds-listener-level",
|
name: "ingress-with-sds-listener-level",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotIngressGatewayWithChain(t, "sds-listener-level", nil, nil)
|
return proxycfg.TestConfigSnapshotIngressGatewayWithChain(t, "sds-listener-level", nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-with-sds-listener-level-wildcard",
|
name: "ingress-with-sds-listener-level-wildcard",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotIngressGatewayWithChain(t, "sds-listener-level-wildcard", nil, nil)
|
return proxycfg.TestConfigSnapshotIngressGatewayWithChain(t, "sds-listener-level-wildcard", nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-with-sds-service-level",
|
name: "ingress-with-sds-service-level",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotIngressGatewayWithChain(t, "sds-service-level", nil, nil)
|
return proxycfg.TestConfigSnapshotIngressGatewayWithChain(t, "sds-service-level", nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ingress-with-sds-service-level-mixed-tls",
|
name: "ingress-with-sds-service-level-mixed-tls",
|
||||||
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
create: func(t testinf.T) *proxycfg.ConfigSnapshot {
|
||||||
return proxycfg.TestConfigSnapshotIngressGatewayWithChain(t, "sds-service-level-mixed-tls", nil, nil)
|
return proxycfg.TestConfigSnapshotIngressGatewayWithChain(t, "sds-service-level-mixed-tls", nil, nil)
|
||||||
},
|
},
|
||||||
|
// TODO(proxystate): ingress gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "terminating-gateway-lb-config",
|
name: "terminating-gateway-lb-config",
|
||||||
create: proxycfg.TestConfigSnapshotTerminatingGatewayLBConfig,
|
create: proxycfg.TestConfigSnapshotTerminatingGatewayLBConfig,
|
||||||
|
// TODO(proxystate): terminating gateway will come at a later time
|
||||||
|
alsoRunTestForV2: false,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,7 +293,7 @@ func TestRoutesFromSnapshot(t *testing.T) {
|
||||||
r, err := response.CreateResponse(xdscommon.RouteType, "00000001", "00000001", routes)
|
r, err := response.CreateResponse(xdscommon.RouteType, "00000001", "00000001", routes)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
t.Run("current", func(t *testing.T) {
|
t.Run("current-xdsv1", func(t *testing.T) {
|
||||||
gotJSON := protoToJSON(t, r)
|
gotJSON := protoToJSON(t, r)
|
||||||
|
|
||||||
gName := tt.name
|
gName := tt.name
|
||||||
|
@ -255,6 +303,39 @@ func TestRoutesFromSnapshot(t *testing.T) {
|
||||||
|
|
||||||
require.JSONEq(t, goldenEnvoy(t, filepath.Join("routes", gName), envoyVersion, latestEnvoyVersion, gotJSON), gotJSON)
|
require.JSONEq(t, goldenEnvoy(t, filepath.Join("routes", gName), envoyVersion, latestEnvoyVersion, gotJSON), gotJSON)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if tt.alsoRunTestForV2 {
|
||||||
|
generator := xdsv2.NewResourceGenerator(testutil.Logger(t))
|
||||||
|
|
||||||
|
converter := proxystateconverter.NewConverter(testutil.Logger(t), &mockCfgFetcher{addressLan: "10.10.10.10"})
|
||||||
|
proxyState, err := converter.ProxyStateFromSnapshot(snap)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
res, err := generator.AllResourcesFromIR(proxyState)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
routes = res[xdscommon.RouteType]
|
||||||
|
// The order of routes returned via RDS isn't relevant, so it's safe
|
||||||
|
// to sort these for the purposes of test comparisons.
|
||||||
|
sort.Slice(routes, func(i, j int) bool {
|
||||||
|
return routes[i].(*envoy_route_v3.Route).Name < routes[j].(*envoy_route_v3.Route).Name
|
||||||
|
})
|
||||||
|
|
||||||
|
r, err := response.CreateResponse(xdscommon.RouteType, "00000001", "00000001", routes)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
t.Run("current-xdsv2", func(t *testing.T) {
|
||||||
|
gotJSON := protoToJSON(t, r)
|
||||||
|
|
||||||
|
gName := tt.name
|
||||||
|
if tt.overrideGoldenName != "" {
|
||||||
|
gName = tt.overrideGoldenName
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedJSON := goldenEnvoy(t, filepath.Join("routes", gName), envoyVersion, latestEnvoyVersion, gotJSON)
|
||||||
|
require.JSONEq(t, expectedJSON, gotJSON)
|
||||||
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -12,11 +12,23 @@ import (
|
||||||
envoy_aggregate_cluster_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/aggregate/v3"
|
envoy_aggregate_cluster_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/aggregate/v3"
|
||||||
envoy_upstreams_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3"
|
envoy_upstreams_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3"
|
||||||
envoy_type_v3 "github.com/envoyproxy/go-control-plane/envoy/type/v3"
|
envoy_type_v3 "github.com/envoyproxy/go-control-plane/envoy/type/v3"
|
||||||
|
|
||||||
|
"github.com/hashicorp/consul/envoyextensions/xdscommon"
|
||||||
"github.com/hashicorp/consul/proto-public/pbmesh/v1alpha1/pbproxystate"
|
"github.com/hashicorp/consul/proto-public/pbmesh/v1alpha1/pbproxystate"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
"google.golang.org/protobuf/types/known/anypb"
|
"google.golang.org/protobuf/types/known/anypb"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (pr *ProxyResources) doesEnvoyClusterAlreadyExist(name string) bool {
|
||||||
|
// TODO(proxystate): consider using a map instead of [] for this kind of lookup
|
||||||
|
for _, envoyCluster := range pr.envoyResources[xdscommon.ClusterType] {
|
||||||
|
if envoyCluster.(*envoy_cluster_v3.Cluster).Name == name {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (pr *ProxyResources) makeXDSClusters() ([]proto.Message, error) {
|
func (pr *ProxyResources) makeXDSClusters() ([]proto.Message, error) {
|
||||||
clusters := make([]proto.Message, 0)
|
clusters := make([]proto.Message, 0)
|
||||||
|
|
||||||
|
@ -39,6 +51,11 @@ func (pr *ProxyResources) makeClusters(name string) ([]proto.Message, error) {
|
||||||
return nil, fmt.Errorf("cluster %q not found", name)
|
return nil, fmt.Errorf("cluster %q not found", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if pr.doesEnvoyClusterAlreadyExist(name) {
|
||||||
|
// don't error
|
||||||
|
return []proto.Message{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
switch proxyStateCluster.Group.(type) {
|
switch proxyStateCluster.Group.(type) {
|
||||||
case *pbproxystate.Cluster_FailoverGroup:
|
case *pbproxystate.Cluster_FailoverGroup:
|
||||||
fg := proxyStateCluster.GetFailoverGroup()
|
fg := proxyStateCluster.GetFailoverGroup()
|
||||||
|
|
|
@ -43,6 +43,20 @@ const (
|
||||||
envoyHttpConnectionManagerFilterName = "envoy.filters.network.http_connection_manager"
|
envoyHttpConnectionManagerFilterName = "envoy.filters.network.http_connection_manager"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func (pr *ProxyResources) makeXDSListeners() ([]proto.Message, error) {
|
||||||
|
listeners := make([]proto.Message, 0)
|
||||||
|
|
||||||
|
for _, l := range pr.proxyState.Listeners {
|
||||||
|
protoListener, err := pr.makeListener(l)
|
||||||
|
// TODO: aggregate errors for listeners and still return any properly formed listeners.
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
listeners = append(listeners, protoListener)
|
||||||
|
}
|
||||||
|
return listeners, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (pr *ProxyResources) makeListener(listener *pbproxystate.Listener) (*envoy_listener_v3.Listener, error) {
|
func (pr *ProxyResources) makeListener(listener *pbproxystate.Listener) (*envoy_listener_v3.Listener, error) {
|
||||||
envoyListener := &envoy_listener_v3.Listener{}
|
envoyListener := &envoy_listener_v3.Listener{}
|
||||||
|
|
||||||
|
@ -399,7 +413,7 @@ func (pr *ProxyResources) makeL7Filters(l7 *pbproxystate.L7Destination) ([]*envo
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
routeConfig, err := pr.makeRoute(l7.Name)
|
routeConfig, err := pr.makeEnvoyRoute(l7.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,17 +45,11 @@ func (g *ResourceGenerator) AllResourcesFromIR(proxyState *pbmesh.ProxyState) (m
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pr *ProxyResources) generateXDSResources() error {
|
func (pr *ProxyResources) generateXDSResources() error {
|
||||||
listeners := make([]proto.Message, 0)
|
listeners, err := pr.makeXDSListeners()
|
||||||
routes := make([]proto.Message, 0)
|
|
||||||
|
|
||||||
for _, l := range pr.proxyState.Listeners {
|
|
||||||
protoListener, err := pr.makeListener(l)
|
|
||||||
// TODO: aggregate errors for listeners and still return any properly formed listeners.
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
listeners = append(listeners, protoListener)
|
pr.envoyResources[xdscommon.ListenerType] = listeners
|
||||||
}
|
|
||||||
|
|
||||||
pr.envoyResources[xdscommon.ListenerType] = listeners
|
pr.envoyResources[xdscommon.ListenerType] = listeners
|
||||||
|
|
||||||
|
@ -71,6 +65,10 @@ func (pr *ProxyResources) generateXDSResources() error {
|
||||||
}
|
}
|
||||||
pr.envoyResources[xdscommon.EndpointType] = endpoints
|
pr.envoyResources[xdscommon.EndpointType] = endpoints
|
||||||
|
|
||||||
|
routes, err := pr.makeXDSRoutes()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
pr.envoyResources[xdscommon.RouteType] = routes
|
pr.envoyResources[xdscommon.RouteType] = routes
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -5,11 +5,31 @@ package xdsv2
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
envoy_core_v3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
|
||||||
|
envoy_matcher_v3 "github.com/envoyproxy/go-control-plane/envoy/type/matcher/v3"
|
||||||
|
"github.com/hashicorp/consul/agent/xds/response"
|
||||||
|
"github.com/hashicorp/consul/envoyextensions/xdscommon"
|
||||||
|
"github.com/hashicorp/consul/proto-public/pbmesh/v1alpha1/pbproxystate"
|
||||||
|
"google.golang.org/protobuf/types/known/wrapperspb"
|
||||||
|
"strings"
|
||||||
|
|
||||||
envoy_route_v3 "github.com/envoyproxy/go-control-plane/envoy/config/route/v3"
|
envoy_route_v3 "github.com/envoyproxy/go-control-plane/envoy/config/route/v3"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (pr *ProxyResources) makeRoute(name string) (*envoy_route_v3.RouteConfiguration, error) {
|
func (pr *ProxyResources) makeXDSRoutes() ([]proto.Message, error) {
|
||||||
|
routes := make([]proto.Message, 0)
|
||||||
|
|
||||||
|
for name, r := range pr.proxyState.Routes {
|
||||||
|
protoRoute := pr.makeEnvoyRouteConfigFromProxystateRoute(name, r)
|
||||||
|
// TODO: aggregate errors for routes and still return any properly formed routes.
|
||||||
|
routes = append(routes, protoRoute)
|
||||||
|
}
|
||||||
|
|
||||||
|
return routes, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pr *ProxyResources) makeEnvoyRoute(name string) (*envoy_route_v3.RouteConfiguration, error) {
|
||||||
var route *envoy_route_v3.RouteConfiguration
|
var route *envoy_route_v3.RouteConfiguration
|
||||||
// TODO(proxystate): This will make routes in the future. This function should distinguish between static routes
|
// TODO(proxystate): This will make routes in the future. This function should distinguish between static routes
|
||||||
// inlined into listeners and non-static routes that should be added as top level Envoy resources.
|
// inlined into listeners and non-static routes that should be added as top level Envoy resources.
|
||||||
|
@ -21,3 +41,485 @@ func (pr *ProxyResources) makeRoute(name string) (*envoy_route_v3.RouteConfigura
|
||||||
}
|
}
|
||||||
return route, nil
|
return route, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// makeEnvoyRouteConfigFromProxystateRoute converts the proxystate representation of a Route into Envoy proto message
|
||||||
|
// form. We don't throw any errors here, since the proxystate has already been validated.
|
||||||
|
func (pr *ProxyResources) makeEnvoyRouteConfigFromProxystateRoute(name string, psRoute *pbproxystate.Route) *envoy_route_v3.RouteConfiguration {
|
||||||
|
|
||||||
|
envoyRouteConfig := &envoy_route_v3.RouteConfiguration{
|
||||||
|
Name: name,
|
||||||
|
// ValidateClusters defaults to true when defined statically and false
|
||||||
|
// when done via RDS. Re-set the reasonable value of true to prevent
|
||||||
|
// null-routing traffic.
|
||||||
|
ValidateClusters: response.MakeBoolValue(true),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, vh := range psRoute.GetVirtualHosts() {
|
||||||
|
envoyRouteConfig.VirtualHosts = append(envoyRouteConfig.VirtualHosts, pr.makeEnvoyVHFromProxystateVH(vh))
|
||||||
|
}
|
||||||
|
|
||||||
|
return envoyRouteConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pr *ProxyResources) makeEnvoyVHFromProxystateVH(psVirtualHost *pbproxystate.VirtualHost) *envoy_route_v3.VirtualHost {
|
||||||
|
envoyVirtualHost := &envoy_route_v3.VirtualHost{
|
||||||
|
Name: psVirtualHost.Name,
|
||||||
|
Domains: psVirtualHost.GetDomains(),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, rr := range psVirtualHost.GetRouteRules() {
|
||||||
|
envoyVirtualHost.Routes = append(envoyVirtualHost.Routes, pr.makeEnvoyRouteFromProxystateRouteRule(rr))
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, hm := range psVirtualHost.GetHeaderMutations() {
|
||||||
|
injectEnvoyVirtualHostWithProxystateHeaderMutation(envoyVirtualHost, hm)
|
||||||
|
}
|
||||||
|
|
||||||
|
return envoyVirtualHost
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pr *ProxyResources) makeEnvoyRouteFromProxystateRouteRule(psRouteRule *pbproxystate.RouteRule) *envoy_route_v3.Route {
|
||||||
|
envoyRouteRule := &envoy_route_v3.Route{
|
||||||
|
Match: makeEnvoyRouteMatchFromProxystateRouteMatch(psRouteRule.GetMatch()),
|
||||||
|
Action: pr.makeEnvoyRouteActionFromProxystateRouteDestination(psRouteRule.GetDestination()),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, hm := range psRouteRule.GetHeaderMutations() {
|
||||||
|
injectEnvoyRouteRuleWithProxystateHeaderMutation(envoyRouteRule, hm)
|
||||||
|
}
|
||||||
|
|
||||||
|
return envoyRouteRule
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeEnvoyRouteMatchFromProxystateRouteMatch(psRouteMatch *pbproxystate.RouteMatch) *envoy_route_v3.RouteMatch {
|
||||||
|
envoyRouteMatch := &envoy_route_v3.RouteMatch{}
|
||||||
|
|
||||||
|
switch psRouteMatch.PathMatch.GetPathMatch().(type) {
|
||||||
|
case *pbproxystate.PathMatch_Exact:
|
||||||
|
envoyRouteMatch.PathSpecifier = &envoy_route_v3.RouteMatch_Path{
|
||||||
|
Path: psRouteMatch.PathMatch.GetExact(),
|
||||||
|
}
|
||||||
|
case *pbproxystate.PathMatch_Prefix:
|
||||||
|
envoyRouteMatch.PathSpecifier = &envoy_route_v3.RouteMatch_Prefix{
|
||||||
|
Prefix: psRouteMatch.PathMatch.GetPrefix(),
|
||||||
|
}
|
||||||
|
case *pbproxystate.PathMatch_Regex:
|
||||||
|
envoyRouteMatch.PathSpecifier = &envoy_route_v3.RouteMatch_SafeRegex{
|
||||||
|
SafeRegex: makeEnvoyRegexMatch(psRouteMatch.PathMatch.GetRegex()),
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
// This shouldn't be possible considering the types of PathMatch
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(psRouteMatch.GetHeaderMatches()) > 0 {
|
||||||
|
envoyRouteMatch.Headers = make([]*envoy_route_v3.HeaderMatcher, 0, len(psRouteMatch.GetHeaderMatches()))
|
||||||
|
}
|
||||||
|
for _, psHM := range psRouteMatch.GetHeaderMatches() {
|
||||||
|
envoyRouteMatch.Headers = append(envoyRouteMatch.Headers, makeEnvoyHeaderMatcherFromProxystateHeaderMatch(psHM))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(psRouteMatch.MethodMatches) > 0 {
|
||||||
|
methodHeaderRegex := strings.Join(psRouteMatch.MethodMatches, "|")
|
||||||
|
|
||||||
|
eh := &envoy_route_v3.HeaderMatcher{
|
||||||
|
Name: ":method",
|
||||||
|
HeaderMatchSpecifier: &envoy_route_v3.HeaderMatcher_SafeRegexMatch{
|
||||||
|
SafeRegexMatch: makeEnvoyRegexMatch(methodHeaderRegex),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
envoyRouteMatch.Headers = append(envoyRouteMatch.Headers, eh)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(psRouteMatch.GetQueryParameterMatches()) > 0 {
|
||||||
|
envoyRouteMatch.QueryParameters = make([]*envoy_route_v3.QueryParameterMatcher, 0, len(psRouteMatch.GetQueryParameterMatches()))
|
||||||
|
}
|
||||||
|
for _, psQM := range psRouteMatch.GetQueryParameterMatches() {
|
||||||
|
envoyRouteMatch.QueryParameters = append(envoyRouteMatch.QueryParameters, makeEnvoyQueryParamFromProxystateQueryMatch(psQM))
|
||||||
|
}
|
||||||
|
|
||||||
|
return envoyRouteMatch
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeEnvoyRegexMatch(pattern string) *envoy_matcher_v3.RegexMatcher {
|
||||||
|
return &envoy_matcher_v3.RegexMatcher{
|
||||||
|
EngineType: &envoy_matcher_v3.RegexMatcher_GoogleRe2{
|
||||||
|
GoogleRe2: &envoy_matcher_v3.RegexMatcher_GoogleRE2{},
|
||||||
|
},
|
||||||
|
Regex: pattern,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeEnvoyHeaderMatcherFromProxystateHeaderMatch(psMatch *pbproxystate.HeaderMatch) *envoy_route_v3.HeaderMatcher {
|
||||||
|
envoyHeaderMatcher := &envoy_route_v3.HeaderMatcher{
|
||||||
|
Name: psMatch.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
switch psMatch.Match.(type) {
|
||||||
|
case *pbproxystate.HeaderMatch_Exact:
|
||||||
|
envoyHeaderMatcher.HeaderMatchSpecifier = &envoy_route_v3.HeaderMatcher_ExactMatch{
|
||||||
|
ExactMatch: psMatch.GetExact(),
|
||||||
|
}
|
||||||
|
case *pbproxystate.HeaderMatch_Regex:
|
||||||
|
envoyHeaderMatcher.HeaderMatchSpecifier = &envoy_route_v3.HeaderMatcher_SafeRegexMatch{
|
||||||
|
SafeRegexMatch: makeEnvoyRegexMatch(psMatch.GetRegex()),
|
||||||
|
}
|
||||||
|
case *pbproxystate.HeaderMatch_Prefix:
|
||||||
|
envoyHeaderMatcher.HeaderMatchSpecifier = &envoy_route_v3.HeaderMatcher_PrefixMatch{
|
||||||
|
PrefixMatch: psMatch.GetPrefix(),
|
||||||
|
}
|
||||||
|
case *pbproxystate.HeaderMatch_Suffix:
|
||||||
|
envoyHeaderMatcher.HeaderMatchSpecifier = &envoy_route_v3.HeaderMatcher_SuffixMatch{
|
||||||
|
SuffixMatch: psMatch.GetSuffix(),
|
||||||
|
}
|
||||||
|
case *pbproxystate.HeaderMatch_Present:
|
||||||
|
envoyHeaderMatcher.HeaderMatchSpecifier = &envoy_route_v3.HeaderMatcher_PresentMatch{
|
||||||
|
PresentMatch: true,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
// This shouldn't be possible considering the types of HeaderMatch
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if psMatch.GetInvertMatch() {
|
||||||
|
envoyHeaderMatcher.InvertMatch = true
|
||||||
|
}
|
||||||
|
|
||||||
|
return envoyHeaderMatcher
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeEnvoyQueryParamFromProxystateQueryMatch(psMatch *pbproxystate.QueryParameterMatch) *envoy_route_v3.QueryParameterMatcher {
|
||||||
|
envoyQueryParamMatcher := &envoy_route_v3.QueryParameterMatcher{
|
||||||
|
Name: psMatch.Name,
|
||||||
|
}
|
||||||
|
|
||||||
|
switch psMatch.Match.(type) {
|
||||||
|
case *pbproxystate.QueryParameterMatch_Exact:
|
||||||
|
envoyQueryParamMatcher.QueryParameterMatchSpecifier = &envoy_route_v3.QueryParameterMatcher_StringMatch{
|
||||||
|
StringMatch: &envoy_matcher_v3.StringMatcher{
|
||||||
|
MatchPattern: &envoy_matcher_v3.StringMatcher_Exact{
|
||||||
|
Exact: psMatch.GetExact(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
case *pbproxystate.QueryParameterMatch_Regex:
|
||||||
|
envoyQueryParamMatcher.QueryParameterMatchSpecifier = &envoy_route_v3.QueryParameterMatcher_StringMatch{
|
||||||
|
StringMatch: &envoy_matcher_v3.StringMatcher{
|
||||||
|
MatchPattern: &envoy_matcher_v3.StringMatcher_SafeRegex{
|
||||||
|
SafeRegex: makeEnvoyRegexMatch(psMatch.GetRegex()),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
case *pbproxystate.QueryParameterMatch_Present:
|
||||||
|
envoyQueryParamMatcher.QueryParameterMatchSpecifier = &envoy_route_v3.QueryParameterMatcher_PresentMatch{
|
||||||
|
PresentMatch: true,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
// This shouldn't be possible considering the types of QueryMatch
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return envoyQueryParamMatcher
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO (dans): Will this always be envoy_route_v3.Route_Route?
|
||||||
|
// Definitely for connect proxies this is the only option.
|
||||||
|
func (pr *ProxyResources) makeEnvoyRouteActionFromProxystateRouteDestination(psRouteDestination *pbproxystate.RouteDestination) *envoy_route_v3.Route_Route {
|
||||||
|
envoyRouteRoute := &envoy_route_v3.Route_Route{
|
||||||
|
Route: &envoy_route_v3.RouteAction{},
|
||||||
|
}
|
||||||
|
|
||||||
|
switch psRouteDestination.Destination.(type) {
|
||||||
|
case *pbproxystate.RouteDestination_Cluster:
|
||||||
|
psCluster := psRouteDestination.GetCluster()
|
||||||
|
envoyRouteRoute.Route.ClusterSpecifier = &envoy_route_v3.RouteAction_Cluster{
|
||||||
|
Cluster: psCluster.GetName(),
|
||||||
|
}
|
||||||
|
clusters, _ := pr.makeClusters(psCluster.Name)
|
||||||
|
pr.envoyResources[xdscommon.ClusterType] = append(pr.envoyResources[xdscommon.ClusterType], clusters...)
|
||||||
|
|
||||||
|
case *pbproxystate.RouteDestination_WeightedClusters:
|
||||||
|
psWeightedClusters := psRouteDestination.GetWeightedClusters()
|
||||||
|
envoyClusters := make([]*envoy_route_v3.WeightedCluster_ClusterWeight, 0, len(psWeightedClusters.GetClusters()))
|
||||||
|
totalWeight := 0
|
||||||
|
for _, psCluster := range psWeightedClusters.GetClusters() {
|
||||||
|
clusters, _ := pr.makeClusters(psCluster.Name)
|
||||||
|
pr.envoyResources[xdscommon.ClusterType] = append(pr.envoyResources[xdscommon.ClusterType], clusters...)
|
||||||
|
totalWeight += int(psCluster.Weight.GetValue())
|
||||||
|
envoyClusters = append(envoyClusters, makeEnvoyClusterWeightFromProxystateWeightedCluster(psCluster))
|
||||||
|
}
|
||||||
|
var envoyWeightScale *wrapperspb.UInt32Value
|
||||||
|
if totalWeight == 10000 {
|
||||||
|
envoyWeightScale = response.MakeUint32Value(10000)
|
||||||
|
}
|
||||||
|
|
||||||
|
envoyRouteRoute.Route.ClusterSpecifier = &envoy_route_v3.RouteAction_WeightedClusters{
|
||||||
|
WeightedClusters: &envoy_route_v3.WeightedCluster{
|
||||||
|
Clusters: envoyClusters,
|
||||||
|
TotalWeight: envoyWeightScale,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
// This shouldn't be possible considering the types of Destination
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
injectEnvoyRouteActionWithProxystateDestinationConfig(envoyRouteRoute.Route, psRouteDestination.GetDestinationConfiguration())
|
||||||
|
|
||||||
|
if psRouteDestination.GetDestinationConfiguration() != nil {
|
||||||
|
config := psRouteDestination.GetDestinationConfiguration()
|
||||||
|
action := envoyRouteRoute.Route
|
||||||
|
|
||||||
|
action.PrefixRewrite = config.GetPrefixRewrite()
|
||||||
|
|
||||||
|
if config.GetTimeoutConfig().GetTimeout() != nil {
|
||||||
|
action.Timeout = config.GetTimeoutConfig().GetTimeout()
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.GetTimeoutConfig().GetTimeout() != nil {
|
||||||
|
action.Timeout = config.GetTimeoutConfig().GetTimeout()
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.GetTimeoutConfig().GetIdleTimeout() != nil {
|
||||||
|
action.IdleTimeout = config.GetTimeoutConfig().GetIdleTimeout()
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.GetRetryPolicy() != nil {
|
||||||
|
action.RetryPolicy = makeEnvoyRetryPolicyFromProxystateRetryPolicy(config.GetRetryPolicy())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return envoyRouteRoute
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeEnvoyClusterWeightFromProxystateWeightedCluster(cluster *pbproxystate.L7WeightedDestinationCluster) *envoy_route_v3.WeightedCluster_ClusterWeight {
|
||||||
|
envoyClusterWeight := &envoy_route_v3.WeightedCluster_ClusterWeight{
|
||||||
|
Name: cluster.GetName(),
|
||||||
|
Weight: cluster.GetWeight(),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, hm := range cluster.GetHeaderMutations() {
|
||||||
|
injectEnvoyClusterWeightWithProxystateHeaderMutation(envoyClusterWeight, hm)
|
||||||
|
}
|
||||||
|
|
||||||
|
return envoyClusterWeight
|
||||||
|
}
|
||||||
|
|
||||||
|
func injectEnvoyClusterWeightWithProxystateHeaderMutation(envoyClusterWeight *envoy_route_v3.WeightedCluster_ClusterWeight, mutation *pbproxystate.HeaderMutation) {
|
||||||
|
|
||||||
|
mutation.GetAction()
|
||||||
|
switch mutation.GetAction().(type) {
|
||||||
|
case *pbproxystate.HeaderMutation_RequestHeaderAdd:
|
||||||
|
action := mutation.GetRequestHeaderAdd()
|
||||||
|
header := action.GetHeader()
|
||||||
|
app := action.GetAppendAction() == pbproxystate.AppendAction_APPEND_ACTION_APPEND_IF_EXISTS_OR_ADD
|
||||||
|
|
||||||
|
hvo := &envoy_core_v3.HeaderValueOption{
|
||||||
|
Header: &envoy_core_v3.HeaderValue{
|
||||||
|
Key: header.GetKey(),
|
||||||
|
Value: header.GetValue(),
|
||||||
|
},
|
||||||
|
Append: response.MakeBoolValue(app),
|
||||||
|
}
|
||||||
|
envoyClusterWeight.RequestHeadersToAdd = append(envoyClusterWeight.RequestHeadersToAdd, hvo)
|
||||||
|
|
||||||
|
case *pbproxystate.HeaderMutation_RequestHeaderRemove:
|
||||||
|
action := mutation.GetRequestHeaderRemove()
|
||||||
|
envoyClusterWeight.RequestHeadersToRemove = append(envoyClusterWeight.RequestHeadersToRemove, action.GetHeaderKeys()...)
|
||||||
|
|
||||||
|
case *pbproxystate.HeaderMutation_ResponseHeaderAdd:
|
||||||
|
action := mutation.GetResponseHeaderAdd()
|
||||||
|
header := action.GetHeader()
|
||||||
|
app := action.GetAppendAction() == pbproxystate.AppendAction_APPEND_ACTION_APPEND_IF_EXISTS_OR_ADD
|
||||||
|
|
||||||
|
hvo := &envoy_core_v3.HeaderValueOption{
|
||||||
|
Header: &envoy_core_v3.HeaderValue{
|
||||||
|
Key: header.GetKey(),
|
||||||
|
Value: header.GetValue(),
|
||||||
|
},
|
||||||
|
Append: response.MakeBoolValue(app),
|
||||||
|
}
|
||||||
|
envoyClusterWeight.ResponseHeadersToAdd = append(envoyClusterWeight.ResponseHeadersToAdd, hvo)
|
||||||
|
|
||||||
|
case *pbproxystate.HeaderMutation_ResponseHeaderRemove:
|
||||||
|
action := mutation.GetResponseHeaderRemove()
|
||||||
|
envoyClusterWeight.ResponseHeadersToRemove = append(envoyClusterWeight.ResponseHeadersToRemove, action.GetHeaderKeys()...)
|
||||||
|
|
||||||
|
default:
|
||||||
|
// This shouldn't be possible considering the types of Destination
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func injectEnvoyRouteActionWithProxystateDestinationConfig(envoyAction *envoy_route_v3.RouteAction, config *pbproxystate.DestinationConfiguration) {
|
||||||
|
if config == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(config.GetHashPolicies()) > 0 {
|
||||||
|
envoyAction.HashPolicy = make([]*envoy_route_v3.RouteAction_HashPolicy, 0, len(config.GetHashPolicies()))
|
||||||
|
}
|
||||||
|
for _, policy := range config.GetHashPolicies() {
|
||||||
|
envoyPolicy := makeEnvoyHashPolicyFromProxystateLBHashPolicy(policy)
|
||||||
|
envoyAction.HashPolicy = append(envoyAction.HashPolicy, envoyPolicy)
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.AutoHostRewrite != nil {
|
||||||
|
envoyAction.HostRewriteSpecifier = &envoy_route_v3.RouteAction_AutoHostRewrite{
|
||||||
|
AutoHostRewrite: config.AutoHostRewrite,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeEnvoyHashPolicyFromProxystateLBHashPolicy(psPolicy *pbproxystate.LoadBalancerHashPolicy) *envoy_route_v3.RouteAction_HashPolicy {
|
||||||
|
|
||||||
|
switch psPolicy.GetPolicy().(type) {
|
||||||
|
case *pbproxystate.LoadBalancerHashPolicy_ConnectionProperties:
|
||||||
|
return &envoy_route_v3.RouteAction_HashPolicy{
|
||||||
|
PolicySpecifier: &envoy_route_v3.RouteAction_HashPolicy_ConnectionProperties_{
|
||||||
|
ConnectionProperties: &envoy_route_v3.RouteAction_HashPolicy_ConnectionProperties{
|
||||||
|
SourceIp: true, // always true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Terminal: psPolicy.GetConnectionProperties().GetTerminal(),
|
||||||
|
}
|
||||||
|
|
||||||
|
case *pbproxystate.LoadBalancerHashPolicy_Header:
|
||||||
|
return &envoy_route_v3.RouteAction_HashPolicy{
|
||||||
|
PolicySpecifier: &envoy_route_v3.RouteAction_HashPolicy_Header_{
|
||||||
|
Header: &envoy_route_v3.RouteAction_HashPolicy_Header{
|
||||||
|
HeaderName: psPolicy.GetHeader().GetName(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Terminal: psPolicy.GetHeader().GetTerminal(),
|
||||||
|
}
|
||||||
|
|
||||||
|
case *pbproxystate.LoadBalancerHashPolicy_Cookie:
|
||||||
|
cookie := &envoy_route_v3.RouteAction_HashPolicy_Cookie{
|
||||||
|
Name: psPolicy.GetCookie().GetName(),
|
||||||
|
Path: psPolicy.GetCookie().GetPath(),
|
||||||
|
Ttl: psPolicy.GetCookie().GetTtl(),
|
||||||
|
}
|
||||||
|
|
||||||
|
return &envoy_route_v3.RouteAction_HashPolicy{
|
||||||
|
PolicySpecifier: &envoy_route_v3.RouteAction_HashPolicy_Cookie_{
|
||||||
|
Cookie: cookie,
|
||||||
|
},
|
||||||
|
Terminal: psPolicy.GetCookie().GetTerminal(),
|
||||||
|
}
|
||||||
|
|
||||||
|
case *pbproxystate.LoadBalancerHashPolicy_QueryParameter:
|
||||||
|
return &envoy_route_v3.RouteAction_HashPolicy{
|
||||||
|
PolicySpecifier: &envoy_route_v3.RouteAction_HashPolicy_QueryParameter_{
|
||||||
|
QueryParameter: &envoy_route_v3.RouteAction_HashPolicy_QueryParameter{
|
||||||
|
Name: psPolicy.GetQueryParameter().GetName(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Terminal: psPolicy.GetQueryParameter().GetTerminal(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// This shouldn't be possible considering the types of LoadBalancerPolicy
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeEnvoyRetryPolicyFromProxystateRetryPolicy(psRetryPolicy *pbproxystate.RetryPolicy) *envoy_route_v3.RetryPolicy {
|
||||||
|
return &envoy_route_v3.RetryPolicy{
|
||||||
|
NumRetries: psRetryPolicy.GetNumRetries(),
|
||||||
|
RetriableStatusCodes: psRetryPolicy.GetRetriableStatusCodes(),
|
||||||
|
RetryOn: psRetryPolicy.GetRetryOn(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func injectEnvoyRouteRuleWithProxystateHeaderMutation(envoyRouteRule *envoy_route_v3.Route, mutation *pbproxystate.HeaderMutation) {
|
||||||
|
|
||||||
|
mutation.GetAction()
|
||||||
|
switch mutation.GetAction().(type) {
|
||||||
|
case *pbproxystate.HeaderMutation_RequestHeaderAdd:
|
||||||
|
action := mutation.GetRequestHeaderAdd()
|
||||||
|
header := action.GetHeader()
|
||||||
|
app := action.GetAppendAction() == pbproxystate.AppendAction_APPEND_ACTION_APPEND_IF_EXISTS_OR_ADD
|
||||||
|
|
||||||
|
hvo := &envoy_core_v3.HeaderValueOption{
|
||||||
|
Header: &envoy_core_v3.HeaderValue{
|
||||||
|
Key: header.GetKey(),
|
||||||
|
Value: header.GetValue(),
|
||||||
|
},
|
||||||
|
Append: response.MakeBoolValue(app),
|
||||||
|
}
|
||||||
|
envoyRouteRule.RequestHeadersToAdd = append(envoyRouteRule.RequestHeadersToAdd, hvo)
|
||||||
|
|
||||||
|
case *pbproxystate.HeaderMutation_RequestHeaderRemove:
|
||||||
|
action := mutation.GetRequestHeaderRemove()
|
||||||
|
envoyRouteRule.RequestHeadersToRemove = append(envoyRouteRule.RequestHeadersToRemove, action.GetHeaderKeys()...)
|
||||||
|
|
||||||
|
case *pbproxystate.HeaderMutation_ResponseHeaderAdd:
|
||||||
|
action := mutation.GetResponseHeaderAdd()
|
||||||
|
header := action.GetHeader()
|
||||||
|
app := action.GetAppendAction() == pbproxystate.AppendAction_APPEND_ACTION_APPEND_IF_EXISTS_OR_ADD
|
||||||
|
|
||||||
|
hvo := &envoy_core_v3.HeaderValueOption{
|
||||||
|
Header: &envoy_core_v3.HeaderValue{
|
||||||
|
Key: header.GetKey(),
|
||||||
|
Value: header.GetValue(),
|
||||||
|
},
|
||||||
|
Append: response.MakeBoolValue(app),
|
||||||
|
}
|
||||||
|
envoyRouteRule.ResponseHeadersToAdd = append(envoyRouteRule.ResponseHeadersToAdd, hvo)
|
||||||
|
|
||||||
|
case *pbproxystate.HeaderMutation_ResponseHeaderRemove:
|
||||||
|
action := mutation.GetResponseHeaderRemove()
|
||||||
|
envoyRouteRule.ResponseHeadersToRemove = append(envoyRouteRule.ResponseHeadersToRemove, action.GetHeaderKeys()...)
|
||||||
|
|
||||||
|
default:
|
||||||
|
// This shouldn't be possible considering the types of Destination
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func injectEnvoyVirtualHostWithProxystateHeaderMutation(envoyVirtualHost *envoy_route_v3.VirtualHost, mutation *pbproxystate.HeaderMutation) {
|
||||||
|
|
||||||
|
mutation.GetAction()
|
||||||
|
switch mutation.GetAction().(type) {
|
||||||
|
case *pbproxystate.HeaderMutation_RequestHeaderAdd:
|
||||||
|
action := mutation.GetRequestHeaderAdd()
|
||||||
|
header := action.GetHeader()
|
||||||
|
app := action.GetAppendAction() == pbproxystate.AppendAction_APPEND_ACTION_APPEND_IF_EXISTS_OR_ADD
|
||||||
|
|
||||||
|
hvo := &envoy_core_v3.HeaderValueOption{
|
||||||
|
Header: &envoy_core_v3.HeaderValue{
|
||||||
|
Key: header.GetKey(),
|
||||||
|
Value: header.GetValue(),
|
||||||
|
},
|
||||||
|
Append: response.MakeBoolValue(app),
|
||||||
|
}
|
||||||
|
envoyVirtualHost.RequestHeadersToAdd = append(envoyVirtualHost.RequestHeadersToAdd, hvo)
|
||||||
|
|
||||||
|
case *pbproxystate.HeaderMutation_RequestHeaderRemove:
|
||||||
|
action := mutation.GetRequestHeaderRemove()
|
||||||
|
envoyVirtualHost.RequestHeadersToRemove = append(envoyVirtualHost.RequestHeadersToRemove, action.GetHeaderKeys()...)
|
||||||
|
|
||||||
|
case *pbproxystate.HeaderMutation_ResponseHeaderAdd:
|
||||||
|
action := mutation.GetResponseHeaderAdd()
|
||||||
|
header := action.GetHeader()
|
||||||
|
app := action.GetAppendAction() == pbproxystate.AppendAction_APPEND_ACTION_APPEND_IF_EXISTS_OR_ADD
|
||||||
|
|
||||||
|
hvo := &envoy_core_v3.HeaderValueOption{
|
||||||
|
Header: &envoy_core_v3.HeaderValue{
|
||||||
|
Key: header.GetKey(),
|
||||||
|
Value: header.GetValue(),
|
||||||
|
},
|
||||||
|
Append: response.MakeBoolValue(app),
|
||||||
|
}
|
||||||
|
envoyVirtualHost.ResponseHeadersToAdd = append(envoyVirtualHost.ResponseHeadersToAdd, hvo)
|
||||||
|
|
||||||
|
case *pbproxystate.HeaderMutation_ResponseHeaderRemove:
|
||||||
|
action := mutation.GetResponseHeaderRemove()
|
||||||
|
envoyVirtualHost.ResponseHeadersToRemove = append(envoyVirtualHost.ResponseHeadersToRemove, action.GetHeaderKeys()...)
|
||||||
|
|
||||||
|
default:
|
||||||
|
// This shouldn't be possible considering the types of Destination
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -77,6 +77,8 @@ type Cluster struct {
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// name is the name of the cluster.
|
||||||
|
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
|
||||||
// group is either a failover group or endpoint group. If this cluster needs to failover to other clusters, use the failover group. If this cluster routes directly to endpoints, use the endpoint group.
|
// group is either a failover group or endpoint group. If this cluster needs to failover to other clusters, use the failover group. If this cluster routes directly to endpoints, use the endpoint group.
|
||||||
//
|
//
|
||||||
// Types that are assignable to Group:
|
// Types that are assignable to Group:
|
||||||
|
@ -85,11 +87,11 @@ type Cluster struct {
|
||||||
// *Cluster_EndpointGroup
|
// *Cluster_EndpointGroup
|
||||||
Group isCluster_Group `protobuf_oneof:"group"`
|
Group isCluster_Group `protobuf_oneof:"group"`
|
||||||
// escape_hatch_cluster_json configures a user configured escape hatch cluster.
|
// escape_hatch_cluster_json configures a user configured escape hatch cluster.
|
||||||
EscapeHatchClusterJson string `protobuf:"bytes,3,opt,name=escape_hatch_cluster_json,json=escapeHatchClusterJson,proto3" json:"escape_hatch_cluster_json,omitempty"`
|
EscapeHatchClusterJson string `protobuf:"bytes,4,opt,name=escape_hatch_cluster_json,json=escapeHatchClusterJson,proto3" json:"escape_hatch_cluster_json,omitempty"`
|
||||||
// alt_stat_name is the name used for observability in place of cluster name if provided.
|
// alt_stat_name is the name used for observability in place of cluster name if provided.
|
||||||
AltStatName string `protobuf:"bytes,4,opt,name=alt_stat_name,json=altStatName,proto3" json:"alt_stat_name,omitempty"`
|
AltStatName string `protobuf:"bytes,5,opt,name=alt_stat_name,json=altStatName,proto3" json:"alt_stat_name,omitempty"`
|
||||||
// protocol is the local path protocol or the service protocol.
|
// protocol is the local path protocol or the service protocol.
|
||||||
Protocol string `protobuf:"bytes,5,opt,name=protocol,proto3" json:"protocol,omitempty"`
|
Protocol string `protobuf:"bytes,6,opt,name=protocol,proto3" json:"protocol,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *Cluster) Reset() {
|
func (x *Cluster) Reset() {
|
||||||
|
@ -124,6 +126,13 @@ func (*Cluster) Descriptor() ([]byte, []int) {
|
||||||
return file_pbmesh_v1alpha1_pbproxystate_cluster_proto_rawDescGZIP(), []int{0}
|
return file_pbmesh_v1alpha1_pbproxystate_cluster_proto_rawDescGZIP(), []int{0}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *Cluster) GetName() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Name
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Cluster) GetGroup() isCluster_Group {
|
func (m *Cluster) GetGroup() isCluster_Group {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.Group
|
return m.Group
|
||||||
|
@ -171,11 +180,11 @@ type isCluster_Group interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Cluster_FailoverGroup struct {
|
type Cluster_FailoverGroup struct {
|
||||||
FailoverGroup *FailoverGroup `protobuf:"bytes,1,opt,name=failover_group,json=failoverGroup,proto3,oneof"`
|
FailoverGroup *FailoverGroup `protobuf:"bytes,2,opt,name=failover_group,json=failoverGroup,proto3,oneof"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Cluster_EndpointGroup struct {
|
type Cluster_EndpointGroup struct {
|
||||||
EndpointGroup *EndpointGroup `protobuf:"bytes,2,opt,name=endpoint_group,json=endpointGroup,proto3,oneof"`
|
EndpointGroup *EndpointGroup `protobuf:"bytes,3,opt,name=endpoint_group,json=endpointGroup,proto3,oneof"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*Cluster_FailoverGroup) isCluster_Group() {}
|
func (*Cluster_FailoverGroup) isCluster_Group() {}
|
||||||
|
@ -1697,395 +1706,396 @@ var file_pbmesh_v1alpha1_pbproxystate_cluster_proto_rawDesc = []byte{
|
||||||
0x70, 0x62, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f,
|
0x70, 0x62, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f,
|
||||||
0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x74, 0x72, 0x61,
|
0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x74, 0x72, 0x61,
|
||||||
0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x72,
|
0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x72,
|
||||||
0x6f, 0x74, 0x6f, 0x22, 0xd7, 0x02, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12,
|
0x6f, 0x74, 0x6f, 0x22, 0xeb, 0x02, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12,
|
||||||
0x63, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75,
|
0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
|
||||||
0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63,
|
0x61, 0x6d, 0x65, 0x12, 0x63, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x5f,
|
||||||
0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e,
|
0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61,
|
||||||
0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79,
|
0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d,
|
||||||
0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x47, 0x72,
|
0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70,
|
||||||
0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x47,
|
0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76,
|
||||||
0x72, 0x6f, 0x75, 0x70, 0x12, 0x63, 0x0a, 0x0e, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
|
0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x6f,
|
||||||
0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68,
|
0x76, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x63, 0x0a, 0x0e, 0x65, 0x6e, 0x64, 0x70,
|
||||||
|
0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
|
||||||
|
0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e,
|
||||||
|
0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
|
||||||
|
0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x45,
|
||||||
|
0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d,
|
||||||
|
0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x39, 0x0a,
|
||||||
|
0x19, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x5f, 0x68, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x6c,
|
||||||
|
0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
|
||||||
|
0x52, 0x16, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x48, 0x61, 0x74, 0x63, 0x68, 0x43, 0x6c, 0x75,
|
||||||
|
0x73, 0x74, 0x65, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x6c, 0x74, 0x5f,
|
||||||
|
0x73, 0x74, 0x61, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x0b, 0x61, 0x6c, 0x74, 0x53, 0x74, 0x61, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08,
|
||||||
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
|
||||||
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75,
|
||||||
|
0x70, 0x22, 0xce, 0x01, 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x47, 0x72,
|
||||||
|
0x6f, 0x75, 0x70, 0x12, 0x63, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f,
|
||||||
|
0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68,
|
||||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
||||||
0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62,
|
0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62,
|
||||||
0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f,
|
0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f,
|
||||||
0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6e, 0x64, 0x70,
|
0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x0e, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69,
|
||||||
0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x39, 0x0a, 0x19, 0x65, 0x73, 0x63,
|
0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x58, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66,
|
||||||
0x61, 0x70, 0x65, 0x5f, 0x68, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65,
|
0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69,
|
||||||
0x72, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x65, 0x73,
|
|
||||||
0x63, 0x61, 0x70, 0x65, 0x48, 0x61, 0x74, 0x63, 0x68, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
|
|
||||||
0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74,
|
|
||||||
0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x6c, 0x74,
|
|
||||||
0x53, 0x74, 0x61, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74,
|
|
||||||
0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74,
|
|
||||||
0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xce, 0x01,
|
|
||||||
0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12,
|
|
||||||
0x63, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75,
|
|
||||||
0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69,
|
|
||||||
0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68,
|
0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68,
|
||||||
0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78,
|
0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78,
|
||||||
0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47,
|
0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x47,
|
||||||
0x72, 0x6f, 0x75, 0x70, 0x52, 0x0e, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72,
|
0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66,
|
||||||
0x6f, 0x75, 0x70, 0x73, 0x12, 0x58, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02,
|
0x69, 0x67, 0x22, 0x84, 0x01, 0x0a, 0x13, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x47,
|
||||||
0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70,
|
0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x29, 0x0a, 0x11, 0x75, 0x73,
|
||||||
0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61,
|
0x65, 0x5f, 0x61, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
|
||||||
0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61,
|
0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x41, 0x6c, 0x74, 0x53, 0x74, 0x61,
|
||||||
0x74, 0x65, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70,
|
0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
|
||||||
0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x84,
|
0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
|
||||||
0x01, 0x0a, 0x13, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70,
|
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
|
||||||
0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x29, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x6c,
|
0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
|
||||||
0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
|
0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x91, 0x03, 0x0a, 0x0d, 0x45, 0x6e,
|
||||||
0x08, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x41, 0x6c, 0x74, 0x53, 0x74, 0x61, 0x74, 0x4e, 0x61, 0x6d,
|
0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x07, 0x64,
|
||||||
0x65, 0x12, 0x42, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x69, 0x6d,
|
0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68,
|
||||||
0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
|
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
||||||
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,
|
0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62,
|
||||||
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69,
|
0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d,
|
||||||
0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x91, 0x03, 0x0a, 0x0d, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69,
|
0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48,
|
||||||
0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x07, 0x64, 0x79, 0x6e, 0x61, 0x6d,
|
0x00, 0x52, 0x07, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x12, 0x5a, 0x0a, 0x06, 0x73, 0x74,
|
||||||
0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69,
|
0x61, 0x74, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73,
|
||||||
0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68,
|
|
||||||
0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78,
|
|
||||||
0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x45, 0x6e,
|
|
||||||
0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x07, 0x64,
|
|
||||||
0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x12, 0x5a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63,
|
|
||||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f,
|
|
||||||
0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76,
|
|
||||||
0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73,
|
|
||||||
0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f,
|
|
||||||
0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74,
|
|
||||||
0x69, 0x63, 0x12, 0x51, 0x0a, 0x03, 0x64, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
|
||||||
0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73,
|
|
||||||
0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
|
|
||||||
0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x4e,
|
|
||||||
0x53, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00,
|
|
||||||
0x52, 0x03, 0x64, 0x6e, 0x73, 0x12, 0x69, 0x0a, 0x0b, 0x70, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72,
|
|
||||||
0x6f, 0x75, 0x67, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x68, 0x61, 0x73,
|
|
||||||
0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65,
|
0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65,
|
||||||
0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72,
|
0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72,
|
||||||
0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72,
|
0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x45,
|
||||||
0x6f, 0x75, 0x67, 0x68, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75,
|
0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x06,
|
||||||
0x70, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68,
|
0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x12, 0x51, 0x0a, 0x03, 0x64, 0x6e, 0x73, 0x18, 0x03, 0x20,
|
||||||
0x42, 0x07, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xd8, 0x01, 0x0a, 0x14, 0x44, 0x79,
|
0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e,
|
||||||
0x6e, 0x61, 0x6d, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f,
|
0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c,
|
||||||
0x75, 0x70, 0x12, 0x5f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01,
|
0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74,
|
||||||
0x28, 0x0b, 0x32, 0x47, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63,
|
0x65, 0x2e, 0x44, 0x4e, 0x53, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f,
|
||||||
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
|
0x75, 0x70, 0x48, 0x00, 0x52, 0x03, 0x64, 0x6e, 0x73, 0x12, 0x69, 0x0a, 0x0b, 0x70, 0x61, 0x73,
|
||||||
0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65,
|
0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45,
|
||||||
0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
|
|
||||||
0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e,
|
|
||||||
0x66, 0x69, 0x67, 0x12, 0x5f, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f,
|
|
||||||
0x74, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68,
|
|
||||||
0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73,
|
|
||||||
0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f,
|
|
||||||
0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
|
|
||||||
0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e,
|
|
||||||
0x64, 0x54, 0x6c, 0x73, 0x22, 0xe0, 0x01, 0x0a, 0x18, 0x50, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72,
|
|
||||||
0x6f, 0x75, 0x67, 0x68, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75,
|
|
||||||
0x70, 0x12, 0x63, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28,
|
|
||||||
0x0b, 0x32, 0x4b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f,
|
|
||||||
0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
|
|
||||||
0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e,
|
|
||||||
0x50, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x45, 0x6e, 0x64, 0x70, 0x6f,
|
|
||||||
0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06,
|
|
||||||
0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5f, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75,
|
|
||||||
0x6e, 0x64, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68,
|
|
||||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
|
||||||
0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62,
|
|
||||||
0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73,
|
|
||||||
0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x62,
|
|
||||||
0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6c, 0x73, 0x22, 0xd0, 0x01, 0x0a, 0x10, 0x44, 0x4e, 0x53, 0x45,
|
|
||||||
0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x5b, 0x0a, 0x06,
|
|
||||||
0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x68,
|
|
||||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
|
||||||
0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62,
|
|
||||||
0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x4e, 0x53, 0x45, 0x6e,
|
|
||||||
0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69,
|
|
||||||
0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5f, 0x0a, 0x0c, 0x6f, 0x75, 0x74,
|
|
||||||
0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
|
||||||
0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73,
|
|
||||||
0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
|
|
||||||
0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72,
|
|
||||||
0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0b, 0x6f,
|
|
||||||
0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6c, 0x73, 0x22, 0x75, 0x0a, 0x13, 0x53, 0x74,
|
|
||||||
0x61, 0x74, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75,
|
|
||||||
0x70, 0x12, 0x5e, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28,
|
|
||||||
0x0b, 0x32, 0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f,
|
|
||||||
0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
|
|
||||||
0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e,
|
|
||||||
0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72,
|
|
||||||
0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69,
|
|
||||||
0x67, 0x22, 0x7f, 0x0a, 0x16, 0x4c, 0x34, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x43,
|
|
||||||
0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x65, 0x0a, 0x08, 0x63,
|
|
||||||
0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e,
|
|
||||||
0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c,
|
|
||||||
0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70,
|
|
||||||
0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x34, 0x57, 0x65,
|
|
||||||
0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
|
|
||||||
0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65,
|
|
||||||
0x72, 0x73, 0x22, 0x7f, 0x0a, 0x16, 0x4c, 0x37, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64,
|
|
||||||
0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x65, 0x0a, 0x08,
|
|
||||||
0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49,
|
|
||||||
0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75,
|
0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75,
|
||||||
0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
|
0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
|
||||||
0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x37, 0x57,
|
0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x61, 0x73,
|
||||||
0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69,
|
0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
|
||||||
0x6f, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74,
|
0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72,
|
||||||
0x65, 0x72, 0x73, 0x22, 0x68, 0x0a, 0x1c, 0x4c, 0x34, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65,
|
0x6f, 0x75, 0x67, 0x68, 0x42, 0x07, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xd8, 0x01,
|
||||||
0x64, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x75, 0x73,
|
0x0a, 0x14, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e,
|
||||||
0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
|
0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x5f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
|
||||||
0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68,
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f,
|
||||||
0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
|
0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76,
|
||||||
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32,
|
0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73,
|
||||||
0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xd0, 0x01,
|
0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70,
|
||||||
0x0a, 0x1c, 0x4c, 0x37, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, 0x74,
|
0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52,
|
||||||
0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x12,
|
0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5f, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x62, 0x6f,
|
||||||
0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
|
0x75, 0x6e, 0x64, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e,
|
||||||
0x6d, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01,
|
0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c,
|
||||||
0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70,
|
||||||
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65,
|
0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e,
|
||||||
0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x66, 0x0a, 0x10, 0x68, 0x65, 0x61, 0x64,
|
0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0b, 0x6f, 0x75, 0x74,
|
||||||
0x65, 0x72, 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03,
|
0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6c, 0x73, 0x22, 0xe0, 0x01, 0x0a, 0x18, 0x50, 0x61, 0x73,
|
||||||
|
0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
|
||||||
|
0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x63, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18,
|
||||||
|
0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72,
|
||||||
|
0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31,
|
||||||
|
0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74,
|
||||||
|
0x61, 0x74, 0x65, 0x2e, 0x50, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x45,
|
||||||
|
0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66,
|
||||||
|
0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5f, 0x0a, 0x0c, 0x6f, 0x75,
|
||||||
|
0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
|
||||||
|
0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e,
|
||||||
|
0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
|
||||||
|
0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54,
|
||||||
|
0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0b,
|
||||||
|
0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6c, 0x73, 0x22, 0xd0, 0x01, 0x0a, 0x10,
|
||||||
|
0x44, 0x4e, 0x53, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70,
|
||||||
|
0x12, 0x5b, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
|
||||||
|
0x32, 0x43, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e,
|
||||||
|
0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
|
||||||
|
0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44,
|
||||||
|
0x4e, 0x53, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43,
|
||||||
|
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5f, 0x0a,
|
||||||
|
0x0c, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x02, 0x20,
|
||||||
|
0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e,
|
||||||
|
0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c,
|
||||||
|
0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74,
|
||||||
|
0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65,
|
||||||
|
0x74, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6c, 0x73, 0x22, 0x75,
|
||||||
|
0x0a, 0x13, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
|
||||||
|
0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x5e, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18,
|
||||||
|
0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72,
|
||||||
|
0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31,
|
||||||
|
0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74,
|
||||||
|
0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69,
|
||||||
|
0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63,
|
||||||
|
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x7f, 0x0a, 0x16, 0x4c, 0x34, 0x57, 0x65, 0x69, 0x67, 0x68,
|
||||||
|
0x74, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12,
|
||||||
|
0x65, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
|
||||||
|
0x0b, 0x32, 0x49, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f,
|
||||||
|
0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
|
||||||
|
0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e,
|
||||||
|
0x4c, 0x34, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e,
|
||||||
|
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c,
|
||||||
|
0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0x7f, 0x0a, 0x16, 0x4c, 0x37, 0x57, 0x65, 0x69, 0x67,
|
||||||
|
0x68, 0x74, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70,
|
||||||
|
0x12, 0x65, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03,
|
||||||
|
0x28, 0x0b, 0x32, 0x49, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63,
|
||||||
|
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
|
||||||
|
0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65,
|
||||||
|
0x2e, 0x4c, 0x37, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, 0x74, 0x69,
|
||||||
|
0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63,
|
||||||
|
0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0x68, 0x0a, 0x1c, 0x4c, 0x34, 0x57, 0x65, 0x69,
|
||||||
|
0x67, 0x68, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
||||||
|
0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
|
||||||
|
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x77,
|
||||||
|
0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,
|
||||||
|
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49,
|
||||||
|
0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68,
|
||||||
|
0x74, 0x22, 0xd0, 0x01, 0x0a, 0x1c, 0x4c, 0x37, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64,
|
||||||
|
0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74,
|
||||||
|
0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
||||||
|
0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74,
|
||||||
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
|
||||||
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56,
|
||||||
|
0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x66, 0x0a, 0x10,
|
||||||
|
0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
|
||||||
|
0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f,
|
||||||
|
0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76,
|
||||||
|
0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73,
|
||||||
|
0x74, 0x61, 0x74, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74,
|
||||||
|
0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74,
|
||||||
|
0x69, 0x6f, 0x6e, 0x73, 0x22, 0x88, 0x08, 0x0a, 0x1a, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63,
|
||||||
|
0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e,
|
||||||
|
0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74,
|
||||||
|
0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 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, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
|
||||||
|
0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x61, 0x62,
|
||||||
|
0x6c, 0x65, 0x5f, 0x70, 0x61, 0x6e, 0x69, 0x63, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f,
|
||||||
|
0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c,
|
||||||
|
0x65, 0x50, 0x61, 0x6e, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12,
|
||||||
|
0x68, 0x0a, 0x0d, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||||
|
0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f,
|
||||||
|
0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76,
|
||||||
|
0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73,
|
||||||
|
0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4c, 0x65, 0x61,
|
||||||
|
0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x6c, 0x65, 0x61,
|
||||||
|
0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x62, 0x0a, 0x0b, 0x72, 0x6f, 0x75,
|
||||||
|
0x6e, 0x64, 0x5f, 0x72, 0x6f, 0x62, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f,
|
||||||
|
0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75,
|
||||||
|
0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
|
||||||
|
0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50,
|
||||||
|
0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x48,
|
||||||
|
0x00, 0x52, 0x0a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x12, 0x55, 0x0a,
|
||||||
|
0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e,
|
||||||
|
0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c,
|
||||||
|
0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70,
|
||||||
|
0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50, 0x6f,
|
||||||
|
0x6c, 0x69, 0x63, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x48, 0x00, 0x52, 0x06, 0x72, 0x61,
|
||||||
|
0x6e, 0x64, 0x6f, 0x6d, 0x12, 0x5c, 0x0a, 0x09, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x73,
|
||||||
|
0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63,
|
||||||
|
0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e,
|
||||||
|
0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79,
|
||||||
|
0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x69,
|
||||||
|
0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x48, 0x00, 0x52, 0x08, 0x72, 0x69, 0x6e, 0x67, 0x48, 0x61,
|
||||||
|
0x73, 0x68, 0x12, 0x55, 0x0a, 0x06, 0x6d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x18, 0x07, 0x20, 0x01,
|
||||||
0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63,
|
0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63,
|
||||||
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
|
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
|
||||||
0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65,
|
0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65,
|
||||||
0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52,
|
0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x48,
|
||||||
0x0f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
|
0x00, 0x52, 0x06, 0x6d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x12, 0x67, 0x0a, 0x10, 0x63, 0x69, 0x72,
|
||||||
0x22, 0x88, 0x08, 0x0a, 0x1a, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70,
|
0x63, 0x75, 0x69, 0x74, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20,
|
||||||
|
0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e,
|
||||||
|
0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c,
|
||||||
|
0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74,
|
||||||
|
0x65, 0x2e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72,
|
||||||
|
0x73, 0x52, 0x0f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65,
|
||||||
|
0x72, 0x73, 0x12, 0x6a, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x5f, 0x64, 0x65,
|
||||||
|
0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e,
|
||||||
|
0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c,
|
||||||
|
0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70,
|
||||||
|
0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x6c,
|
||||||
|
0x69, 0x65, 0x72, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x6f, 0x75,
|
||||||
|
0x74, 0x6c, 0x69, 0x65, 0x72, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x86,
|
||||||
|
0x01, 0x0a, 0x1b, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x6e,
|
||||||
|
0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a,
|
||||||
|
0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70,
|
||||||
|
0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61,
|
||||||
|
0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61,
|
||||||
|
0x74, 0x65, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65,
|
||||||
|
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x19, 0x75, 0x70,
|
||||||
|
0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
|
||||||
|
0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x5f, 0x61,
|
||||||
|
0x6c, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01,
|
||||||
|
0x28, 0x08, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x41, 0x6c, 0x74, 0x53, 0x74, 0x61, 0x74, 0x4e, 0x61,
|
||||||
|
0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x6c, 0x62, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22,
|
||||||
|
0x57, 0x0a, 0x14, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4c, 0x65, 0x61, 0x73, 0x74,
|
||||||
|
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0c, 0x63, 0x68, 0x6f, 0x69, 0x63,
|
||||||
|
0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
|
||||||
|
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
|
||||||
|
0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x63, 0x68, 0x6f,
|
||||||
|
0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x42, 0x50, 0x6f,
|
||||||
|
0x6c, 0x69, 0x63, 0x79, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x22, 0x10,
|
||||||
|
0x0a, 0x0e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d,
|
||||||
|
0x22, 0xa6, 0x01, 0x0a, 0x10, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x69, 0x6e,
|
||||||
|
0x67, 0x48, 0x61, 0x73, 0x68, 0x12, 0x48, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d,
|
||||||
|
0x5f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
|
||||||
|
0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
|
||||||
|
0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f,
|
||||||
|
0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12,
|
||||||
|
0x48, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x5f,
|
||||||
|
0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f,
|
||||||
|
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e,
|
||||||
|
0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75,
|
||||||
|
0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x10, 0x0a, 0x0e, 0x4c, 0x42, 0x50,
|
||||||
|
0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x22, 0x77, 0x0a, 0x0f, 0x43,
|
||||||
|
0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x64,
|
||||||
|
0x0a, 0x0f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74,
|
||||||
|
0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63,
|
||||||
|
0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e,
|
||||||
|
0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79,
|
||||||
|
0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69,
|
||||||
|
0x6d, 0x69, 0x74, 0x73, 0x52, 0x0e, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69,
|
||||||
|
0x6d, 0x69, 0x74, 0x73, 0x22, 0xfd, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61,
|
||||||
|
0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x63,
|
||||||
|
0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
|
||||||
|
0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
|
||||||
|
0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e,
|
||||||
|
0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4e,
|
||||||
|
0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65,
|
||||||
|
0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67,
|
||||||
|
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55,
|
||||||
|
0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x50,
|
||||||
|
0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x54,
|
||||||
|
0x0a, 0x17, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74,
|
||||||
|
0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||||
|
0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
|
||||||
|
0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x6d,
|
||||||
|
0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75,
|
||||||
|
0x65, 0x73, 0x74, 0x73, 0x22, 0x83, 0x03, 0x0a, 0x10, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72,
|
||||||
|
0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x6e, 0x74,
|
||||||
|
0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 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, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c,
|
||||||
|
0x12, 0x45, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x5f,
|
||||||
|
0x35, 0x78, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
|
||||||
|
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74,
|
||||||
|
0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75,
|
||||||
|
0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x12, 0x58, 0x0a, 0x19, 0x65, 0x6e, 0x66, 0x6f, 0x72,
|
||||||
|
0x63, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65,
|
||||||
|
0x5f, 0x35, 0x78, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f,
|
||||||
|
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e,
|
||||||
|
0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x17, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63,
|
||||||
|
0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78,
|
||||||
|
0x78, 0x12, 0x4e, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||||
|
0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
|
||||||
|
0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x6d,
|
||||||
|
0x61, 0x78, 0x45, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e,
|
||||||
|
0x74, 0x12, 0x47, 0x0a, 0x12, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69,
|
||||||
|
0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 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, 0x62, 0x61, 0x73, 0x65, 0x45, 0x6a,
|
||||||
|
0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x55,
|
||||||
|
0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4a, 0x0a, 0x12, 0x74, 0x63, 0x70, 0x5f,
|
||||||
|
0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01,
|
||||||
|
0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
|
||||||
|
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c,
|
||||||
|
0x75, 0x65, 0x52, 0x10, 0x74, 0x63, 0x70, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65,
|
||||||
|
0x54, 0x69, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x16, 0x74, 0x63, 0x70, 0x5f, 0x6b, 0x65, 0x65, 0x70,
|
||||||
|
0x61, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02,
|
||||||
|
0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
|
||||||
|
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c,
|
||||||
|
0x75, 0x65, 0x52, 0x14, 0x74, 0x63, 0x70, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65,
|
||||||
|
0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x4e, 0x0a, 0x14, 0x74, 0x63, 0x70, 0x5f,
|
||||||
|
0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x73,
|
||||||
|
0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
|
||||||
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56,
|
||||||
|
0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x74, 0x63, 0x70, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69,
|
||||||
|
0x76, 0x65, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x73, 0x22, 0x64, 0x0a, 0x1e, 0x50, 0x61, 0x73, 0x73,
|
||||||
|
0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47,
|
||||||
|
0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x0f, 0x63, 0x6f,
|
||||||
|
0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 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, 0x0e,
|
||||||
|
0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x80,
|
||||||
|
0x05, 0x0a, 0x16, 0x44, 0x4e, 0x53, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72,
|
||||||
|
0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x0f, 0x63, 0x6f, 0x6e,
|
||||||
|
0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 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, 0x0e, 0x63,
|
||||||
|
0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x36, 0x0a,
|
||||||
|
0x17, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x6e, 0x69, 0x63, 0x5f, 0x74,
|
||||||
|
0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15,
|
||||||
|
0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x6e, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65,
|
||||||
|
0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x61, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65,
|
||||||
|
0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e,
|
||||||
|
0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c,
|
||||||
|
0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70,
|
||||||
|
0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x63,
|
||||||
|
0x6f, 0x76, 0x65, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x6f,
|
||||||
|
0x76, 0x65, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x67, 0x0a, 0x10, 0x63, 0x69, 0x72, 0x63,
|
||||||
|
0x75, 0x69, 0x74, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01,
|
||||||
|
0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63,
|
||||||
|
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
|
||||||
|
0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65,
|
||||||
|
0x2e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73,
|
||||||
|
0x52, 0x0f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72,
|
||||||
|
0x73, 0x12, 0x6a, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x74,
|
||||||
|
0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68,
|
||||||
|
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
||||||
|
0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62,
|
||||||
|
0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x6c, 0x69,
|
||||||
|
0x65, 0x72, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x6f, 0x75, 0x74,
|
||||||
|
0x6c, 0x69, 0x65, 0x72, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x86, 0x01,
|
||||||
|
0x0a, 0x1b, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
|
||||||
|
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20,
|
||||||
|
0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e,
|
||||||
|
0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c,
|
||||||
|
0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74,
|
||||||
|
0x65, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
|
||||||
|
0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x19, 0x75, 0x70, 0x73,
|
||||||
|
0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f,
|
||||||
|
0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x6c,
|
||||||
|
0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28,
|
||||||
|
0x08, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x41, 0x6c, 0x74, 0x53, 0x74, 0x61, 0x74, 0x4e, 0x61, 0x6d,
|
||||||
|
0x65, 0x22, 0xc8, 0x01, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70,
|
||||||
0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
|
0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
|
||||||
0x42, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f,
|
0x42, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f,
|
||||||
0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
|
0x75, 0x74, 0x18, 0x01, 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,
|
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74,
|
||||||
0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65,
|
0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65,
|
||||||
0x6f, 0x75, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70,
|
0x6f, 0x75, 0x74, 0x12, 0x67, 0x0a, 0x10, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x5f, 0x62,
|
||||||
0x61, 0x6e, 0x69, 0x63, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02,
|
0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e,
|
||||||
0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x6e,
|
0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c,
|
||||||
0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x68, 0x0a, 0x0d, 0x6c,
|
0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70,
|
||||||
0x65, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01,
|
0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x69, 0x72, 0x63,
|
||||||
0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63,
|
0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x0f, 0x63, 0x69, 0x72,
|
||||||
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
|
0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x2a, 0x46, 0x0a, 0x0d,
|
||||||
0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65,
|
0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a,
|
||||||
0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65,
|
0x16, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,
|
||||||
0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65,
|
0x4c, 0x4f, 0x47, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x49, 0x53,
|
||||||
0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x62, 0x0a, 0x0b, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x72,
|
0x43, 0x4f, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49,
|
||||||
0x6f, 0x62, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73,
|
0x43, 0x54, 0x10, 0x01, 0x42, 0xd8, 0x02, 0x0a, 0x2f, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73,
|
||||||
0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65,
|
0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65,
|
||||||
0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72,
|
0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72,
|
||||||
0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63,
|
0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65,
|
||||||
0x79, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x72,
|
0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x45, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
|
||||||
0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x12, 0x55, 0x0a, 0x06, 0x72, 0x61, 0x6e,
|
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63,
|
||||||
0x64, 0x6f, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68,
|
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c,
|
||||||
0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73,
|
0x69, 0x63, 0x2f, 0x70, 0x62, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
|
||||||
0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f,
|
0x61, 0x31, 0x2f, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0xa2,
|
||||||
0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
|
0x02, 0x05, 0x48, 0x43, 0x4d, 0x56, 0x50, 0xaa, 0x02, 0x2b, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63,
|
||||||
0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x48, 0x00, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d,
|
0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x2e,
|
||||||
0x12, 0x5c, 0x0a, 0x09, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20,
|
0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79,
|
||||||
0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e,
|
0x73, 0x74, 0x61, 0x74, 0x65, 0xca, 0x02, 0x2b, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72,
|
||||||
0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c,
|
0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x4d, 0x65, 0x73, 0x68, 0x5c, 0x56, 0x31,
|
||||||
0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74,
|
0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x50, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74,
|
||||||
0x65, 0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61,
|
0x61, 0x74, 0x65, 0xe2, 0x02, 0x37, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c,
|
||||||
0x73, 0x68, 0x48, 0x00, 0x52, 0x08, 0x72, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x12, 0x55,
|
0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x4d, 0x65, 0x73, 0x68, 0x5c, 0x56, 0x31, 0x61, 0x6c,
|
||||||
0x0a, 0x06, 0x6d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b,
|
0x70, 0x68, 0x61, 0x31, 0x5c, 0x50, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74,
|
||||||
0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75,
|
0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x2f,
|
||||||
0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
|
0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75,
|
||||||
0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50,
|
0x6c, 0x3a, 0x3a, 0x4d, 0x65, 0x73, 0x68, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
|
||||||
0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x48, 0x00, 0x52, 0x06, 0x6d,
|
0x31, 0x3a, 0x3a, 0x50, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x62,
|
||||||
0x61, 0x67, 0x6c, 0x65, 0x76, 0x12, 0x67, 0x0a, 0x10, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74,
|
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
|
||||||
0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73,
|
|
||||||
0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
|
|
||||||
0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x69,
|
|
||||||
0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x0f, 0x63,
|
|
||||||
0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x6a,
|
|
||||||
0x0a, 0x11, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74,
|
|
||||||
0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68,
|
|
||||||
0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73,
|
|
||||||
0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f,
|
|
||||||
0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x44,
|
|
||||||
0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65,
|
|
||||||
0x72, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x86, 0x01, 0x0a, 0x1b, 0x75,
|
|
||||||
0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69,
|
|
||||||
0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b,
|
|
||||||
0x32, 0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e,
|
|
||||||
0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
|
|
||||||
0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x55,
|
|
||||||
0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
|
|
||||||
0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x19, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65,
|
|
||||||
0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69,
|
|
||||||
0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x6c, 0x74, 0x5f, 0x73,
|
|
||||||
0x74, 0x61, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e,
|
|
||||||
0x75, 0x73, 0x65, 0x41, 0x6c, 0x74, 0x53, 0x74, 0x61, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x0b,
|
|
||||||
0x0a, 0x09, 0x6c, 0x62, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x57, 0x0a, 0x14, 0x4c,
|
|
||||||
0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
|
|
||||||
0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x0c, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f,
|
|
||||||
0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
|
|
||||||
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74,
|
|
||||||
0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43,
|
|
||||||
0x6f, 0x75, 0x6e, 0x74, 0x22, 0x14, 0x0a, 0x12, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
|
|
||||||
0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x22, 0x10, 0x0a, 0x0e, 0x4c, 0x42,
|
|
||||||
0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x22, 0xa6, 0x01, 0x0a,
|
|
||||||
0x10, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73,
|
|
||||||
0x68, 0x12, 0x48, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x72, 0x69, 0x6e,
|
|
||||||
0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67,
|
|
||||||
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55,
|
|
||||||
0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x69,
|
|
||||||
0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x48, 0x0a, 0x11, 0x6d,
|
|
||||||
0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65,
|
|
||||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
|
|
||||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56,
|
|
||||||
0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e,
|
|
||||||
0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x10, 0x0a, 0x0e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63,
|
|
||||||
0x79, 0x4d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x22, 0x77, 0x0a, 0x0f, 0x43, 0x69, 0x72, 0x63, 0x75,
|
|
||||||
0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x64, 0x0a, 0x0f, 0x75, 0x70,
|
|
||||||
0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20,
|
|
||||||
0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e,
|
|
||||||
0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c,
|
|
||||||
0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74,
|
|
||||||
0x65, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73,
|
|
||||||
0x52, 0x0e, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73,
|
|
||||||
0x22, 0xfd, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4c, 0x69, 0x6d,
|
|
||||||
0x69, 0x74, 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
|
|
||||||
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67,
|
|
||||||
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55,
|
|
||||||
0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43,
|
|
||||||
0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4e, 0x0a, 0x14, 0x6d, 0x61,
|
|
||||||
0x78, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
|
|
||||||
0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
|
|
||||||
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33,
|
|
||||||
0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x50, 0x65, 0x6e, 0x64, 0x69,
|
|
||||||
0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x17, 0x6d, 0x61,
|
|
||||||
0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71,
|
|
||||||
0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,
|
|
||||||
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49,
|
|
||||||
0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x43, 0x6f,
|
|
||||||
0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73,
|
|
||||||
0x22, 0x83, 0x03, 0x0a, 0x10, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x44, 0x65, 0x74, 0x65,
|
|
||||||
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,
|
|
||||||
0x6c, 0x18, 0x01, 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, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x45, 0x0a, 0x0f,
|
|
||||||
0x63, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x35, 0x78, 0x78, 0x18,
|
|
||||||
0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
|
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61,
|
|
||||||
0x6c, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65,
|
|
||||||
0x35, 0x78, 0x78, 0x12, 0x58, 0x0a, 0x19, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67,
|
|
||||||
0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x35, 0x78, 0x78,
|
|
||||||
0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
|
|
||||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56,
|
|
||||||
0x61, 0x6c, 0x75, 0x65, 0x52, 0x17, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x69, 0x6e, 0x67, 0x43,
|
|
||||||
0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x35, 0x78, 0x78, 0x12, 0x4e, 0x0a,
|
|
||||||
0x14, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65,
|
|
||||||
0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f,
|
|
||||||
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49,
|
|
||||||
0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x45, 0x6a,
|
|
||||||
0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a,
|
|
||||||
0x12, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74,
|
|
||||||
0x69, 0x6d, 0x65, 0x18, 0x05, 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, 0x62, 0x61, 0x73, 0x65, 0x45, 0x6a, 0x65, 0x63, 0x74, 0x69,
|
|
||||||
0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x55, 0x70, 0x73, 0x74, 0x72,
|
|
||||||
0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74,
|
|
||||||
0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4a, 0x0a, 0x12, 0x74, 0x63, 0x70, 0x5f, 0x6b, 0x65, 0x65, 0x70,
|
|
||||||
0x61, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
|
|
||||||
0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
|
|
||||||
0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10,
|
|
||||||
0x74, 0x63, 0x70, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65,
|
|
||||||
0x12, 0x52, 0x0a, 0x16, 0x74, 0x63, 0x70, 0x5f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76,
|
|
||||||
0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
|
|
||||||
0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
|
|
||||||
0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14,
|
|
||||||
0x74, 0x63, 0x70, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x65,
|
|
||||||
0x72, 0x76, 0x61, 0x6c, 0x12, 0x4e, 0x0a, 0x14, 0x74, 0x63, 0x70, 0x5f, 0x6b, 0x65, 0x65, 0x70,
|
|
||||||
0x61, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01,
|
|
||||||
0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
|
||||||
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65,
|
|
||||||
0x52, 0x12, 0x74, 0x63, 0x70, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x50, 0x72,
|
|
||||||
0x6f, 0x62, 0x65, 0x73, 0x22, 0x64, 0x0a, 0x1e, 0x50, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f,
|
|
||||||
0x75, 0x67, 0x68, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70,
|
|
||||||
0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63,
|
|
||||||
0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 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, 0x0e, 0x63, 0x6f, 0x6e, 0x6e,
|
|
||||||
0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x80, 0x05, 0x0a, 0x16, 0x44,
|
|
||||||
0x4e, 0x53, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43,
|
|
||||||
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
|
|
||||||
0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 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, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
|
|
||||||
0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73,
|
|
||||||
0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x6e, 0x69, 0x63, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73,
|
|
||||||
0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61,
|
|
||||||
0x62, 0x6c, 0x65, 0x50, 0x61, 0x6e, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c,
|
|
||||||
0x64, 0x12, 0x61, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x74,
|
|
||||||
0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x68, 0x61, 0x73, 0x68,
|
|
||||||
0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73,
|
|
||||||
0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f,
|
|
||||||
0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72,
|
|
||||||
0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79,
|
|
||||||
0x54, 0x79, 0x70, 0x65, 0x12, 0x67, 0x0a, 0x10, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x5f,
|
|
||||||
0x62, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c,
|
|
||||||
0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75,
|
|
||||||
0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
|
|
||||||
0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x69, 0x72,
|
|
||||||
0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x0f, 0x63, 0x69,
|
|
||||||
0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x6a, 0x0a,
|
|
||||||
0x11, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69,
|
|
||||||
0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69,
|
|
||||||
0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68,
|
|
||||||
0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78,
|
|
||||||
0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x44, 0x65,
|
|
||||||
0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72,
|
|
||||||
0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x86, 0x01, 0x0a, 0x1b, 0x75, 0x70,
|
|
||||||
0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
|
|
||||||
0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
|
||||||
0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73,
|
|
||||||
0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
|
|
||||||
0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x70,
|
|
||||||
0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
|
|
||||||
0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x19, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61,
|
|
||||||
0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f,
|
|
||||||
0x6e, 0x73, 0x12, 0x29, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x6c, 0x74, 0x5f, 0x73, 0x74,
|
|
||||||
0x61, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x75,
|
|
||||||
0x73, 0x65, 0x41, 0x6c, 0x74, 0x53, 0x74, 0x61, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc8, 0x01,
|
|
||||||
0x0a, 0x19, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
|
|
||||||
0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x0f, 0x63,
|
|
||||||
0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01,
|
|
||||||
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,
|
|
||||||
0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12,
|
|
||||||
0x67, 0x0a, 0x10, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b,
|
|
||||||
0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68,
|
|
||||||
0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73,
|
|
||||||
0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f,
|
|
||||||
0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42,
|
|
||||||
0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x0f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74,
|
|
||||||
0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x2a, 0x46, 0x0a, 0x0d, 0x44, 0x69, 0x73, 0x63,
|
|
||||||
0x6f, 0x76, 0x65, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x44, 0x49, 0x53,
|
|
||||||
0x43, 0x4f, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x47, 0x49,
|
|
||||||
0x43, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45,
|
|
||||||
0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x43, 0x54, 0x10, 0x01,
|
|
||||||
0x42, 0xd8, 0x02, 0x0a, 0x2f, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f,
|
|
||||||
0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76,
|
|
||||||
0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73,
|
|
||||||
0x74, 0x61, 0x74, 0x65, 0x42, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f,
|
|
||||||
0x74, 0x6f, 0x50, 0x01, 0x5a, 0x45, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
|
|
||||||
0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75,
|
|
||||||
0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x70,
|
|
||||||
0x62, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x70,
|
|
||||||
0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0xa2, 0x02, 0x05, 0x48, 0x43,
|
|
||||||
0x4d, 0x56, 0x50, 0xaa, 0x02, 0x2b, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e,
|
|
||||||
0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x2e, 0x56, 0x31, 0x61, 0x6c,
|
|
||||||
0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74,
|
|
||||||
0x65, 0xca, 0x02, 0x2b, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f,
|
|
||||||
0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x4d, 0x65, 0x73, 0x68, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68,
|
|
||||||
0x61, 0x31, 0x5c, 0x50, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0xe2,
|
|
||||||
0x02, 0x37, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73,
|
|
||||||
0x75, 0x6c, 0x5c, 0x4d, 0x65, 0x73, 0x68, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
|
|
||||||
0x5c, 0x50, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5c, 0x47, 0x50,
|
|
||||||
0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x2f, 0x48, 0x61, 0x73, 0x68,
|
|
||||||
0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x4d,
|
|
||||||
0x65, 0x73, 0x68, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3a, 0x3a, 0x50,
|
|
||||||
0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f,
|
|
||||||
0x74, 0x6f, 0x33,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
@ -11,17 +11,19 @@ import "pbmesh/v1alpha1/pbproxystate/header_mutations.proto";
|
||||||
import "pbmesh/v1alpha1/pbproxystate/transport_socket.proto";
|
import "pbmesh/v1alpha1/pbproxystate/transport_socket.proto";
|
||||||
|
|
||||||
message Cluster {
|
message Cluster {
|
||||||
|
// name is the name of the cluster.
|
||||||
|
string name = 1;
|
||||||
// group is either a failover group or endpoint group. If this cluster needs to failover to other clusters, use the failover group. If this cluster routes directly to endpoints, use the endpoint group.
|
// group is either a failover group or endpoint group. If this cluster needs to failover to other clusters, use the failover group. If this cluster routes directly to endpoints, use the endpoint group.
|
||||||
oneof group {
|
oneof group {
|
||||||
FailoverGroup failover_group = 1;
|
FailoverGroup failover_group = 2;
|
||||||
EndpointGroup endpoint_group = 2;
|
EndpointGroup endpoint_group = 3;
|
||||||
}
|
}
|
||||||
// escape_hatch_cluster_json configures a user configured escape hatch cluster.
|
// escape_hatch_cluster_json configures a user configured escape hatch cluster.
|
||||||
string escape_hatch_cluster_json = 3;
|
string escape_hatch_cluster_json = 4;
|
||||||
// alt_stat_name is the name used for observability in place of cluster name if provided.
|
// alt_stat_name is the name used for observability in place of cluster name if provided.
|
||||||
string alt_stat_name = 4;
|
string alt_stat_name = 5;
|
||||||
// protocol is the local path protocol or the service protocol.
|
// protocol is the local path protocol or the service protocol.
|
||||||
string protocol = 5;
|
string protocol = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
message FailoverGroup {
|
message FailoverGroup {
|
||||||
|
|
|
@ -105,7 +105,7 @@ type ProxyState struct {
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
// identity is a reference to the WorkloadIdentity associated with this proxy.
|
// identity is a reference to the identity of the workload this proxy is for.
|
||||||
Identity *pbresource.Reference `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"`
|
Identity *pbresource.Reference `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"`
|
||||||
// listeners is a list of listeners for this proxy.
|
// listeners is a list of listeners for this proxy.
|
||||||
Listeners []*pbproxystate.Listener `protobuf:"bytes,2,rep,name=listeners,proto3" json:"listeners,omitempty"`
|
Listeners []*pbproxystate.Listener `protobuf:"bytes,2,rep,name=listeners,proto3" json:"listeners,omitempty"`
|
||||||
|
|
|
@ -30,7 +30,7 @@ message ProxyStateTemplate {
|
||||||
}
|
}
|
||||||
|
|
||||||
message ProxyState {
|
message ProxyState {
|
||||||
// identity is a reference to the WorkloadIdentity associated with this proxy.
|
// identity is a reference to the identity of the workload this proxy is for.
|
||||||
hashicorp.consul.resource.Reference identity = 1;
|
hashicorp.consul.resource.Reference identity = 1;
|
||||||
// listeners is a list of listeners for this proxy.
|
// listeners is a list of listeners for this proxy.
|
||||||
repeated pbproxystate.Listener listeners = 2;
|
repeated pbproxystate.Listener listeners = 2;
|
||||||
|
|
Loading…
Reference in New Issue