mirror of https://github.com/hashicorp/consul
mesh: make FailoverPolicy work in xdsv2 and ProxyStateTemplate (#18900)
Ensure that configuring a FailoverPolicy for a service that is reachable via a xRoute or a direct upstream causes an envoy aggregate cluster to be created for the original cluster name, but with separate clusters for each one of the possible destinations.pull/18918/head^2
parent
c8299522b5
commit
d574473fd1
|
@ -210,10 +210,9 @@ func (pr *ProxyResources) makeEnvoyPassthroughCluster(name string, protocol stri
|
||||||
func (pr *ProxyResources) makeEnvoyAggregateCluster(name string, protocol string, fg *pbproxystate.FailoverGroup) ([]*envoy_cluster_v3.Cluster, error) {
|
func (pr *ProxyResources) makeEnvoyAggregateCluster(name string, protocol string, fg *pbproxystate.FailoverGroup) ([]*envoy_cluster_v3.Cluster, error) {
|
||||||
var clusters []*envoy_cluster_v3.Cluster
|
var clusters []*envoy_cluster_v3.Cluster
|
||||||
if fg != nil {
|
if fg != nil {
|
||||||
|
|
||||||
var egNames []string
|
var egNames []string
|
||||||
for _, eg := range fg.EndpointGroups {
|
for _, eg := range fg.EndpointGroups {
|
||||||
cluster, err := pr.makeEnvoyCluster(name, protocol, eg)
|
cluster, err := pr.makeEnvoyCluster(eg.Name, protocol, eg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -230,7 +229,6 @@ func (pr *ProxyResources) makeEnvoyAggregateCluster(name string, protocol string
|
||||||
|
|
||||||
c := &envoy_cluster_v3.Cluster{
|
c := &envoy_cluster_v3.Cluster{
|
||||||
Name: name,
|
Name: name,
|
||||||
AltStatName: name,
|
|
||||||
ConnectTimeout: fg.Config.ConnectTimeout,
|
ConnectTimeout: fg.Config.ConnectTimeout,
|
||||||
LbPolicy: envoy_cluster_v3.Cluster_CLUSTER_PROVIDED,
|
LbPolicy: envoy_cluster_v3.Cluster_CLUSTER_PROVIDED,
|
||||||
ClusterDiscoveryType: &envoy_cluster_v3.Cluster_ClusterType{
|
ClusterDiscoveryType: &envoy_cluster_v3.Cluster_ClusterType{
|
||||||
|
@ -240,6 +238,9 @@ func (pr *ProxyResources) makeEnvoyAggregateCluster(name string, protocol string
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
if fg.Config.UseAltStatName {
|
||||||
|
c.AltStatName = name
|
||||||
|
}
|
||||||
err = addHttpProtocolOptions(protocol, c)
|
err = addHttpProtocolOptions(protocol, c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -174,13 +174,19 @@ func ValidateFailoverPolicy(res *pbresource.Resource) error {
|
||||||
func validateFailoverConfig(config *pbcatalog.FailoverConfig, ported bool, wrapErr func(error) error) error {
|
func validateFailoverConfig(config *pbcatalog.FailoverConfig, ported bool, wrapErr func(error) error) error {
|
||||||
var merr error
|
var merr error
|
||||||
|
|
||||||
|
if config.SamenessGroup != "" {
|
||||||
|
// TODO(v2): handle other forms of failover
|
||||||
|
merr = multierror.Append(merr, wrapErr(resource.ErrInvalidField{
|
||||||
|
Name: "sameness_group",
|
||||||
|
Wrapped: fmt.Errorf("not supported in this release"),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
// TODO(peering/v2): remove this bypass when we know what to do with
|
||||||
|
|
||||||
if (len(config.Destinations) > 0) == (config.SamenessGroup != "") {
|
if (len(config.Destinations) > 0) == (config.SamenessGroup != "") {
|
||||||
merr = multierror.Append(merr, wrapErr(resource.ErrInvalidField{
|
merr = multierror.Append(merr, wrapErr(resource.ErrInvalidField{
|
||||||
Name: "destinations",
|
Name: "destinations",
|
||||||
// Wrapped: fmt.Errorf("exactly one of destinations or sameness_group should be set"),
|
Wrapped: fmt.Errorf("exactly one of destinations or sameness_group should be set"),
|
||||||
Wrapped: fmt.Errorf("exactly one of destinations or sameness_group should be set: %v || %v",
|
|
||||||
(len(config.Destinations) > 0), (config.SamenessGroup != ""),
|
|
||||||
),
|
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
for i, dest := range config.Destinations {
|
for i, dest := range config.Destinations {
|
||||||
|
|
|
@ -233,7 +233,9 @@ func TestValidateFailoverPolicy(t *testing.T) {
|
||||||
},
|
},
|
||||||
SamenessGroup: "blah",
|
SamenessGroup: "blah",
|
||||||
},
|
},
|
||||||
expectErr: `invalid "destinations" field: exactly one of destinations or sameness_group should be set`,
|
// TODO(v2): uncomment after this is supported
|
||||||
|
// expectErr: `invalid "destinations" field: exactly one of destinations or sameness_group should be set`,
|
||||||
|
expectErr: `invalid "sameness_group" field: not supported in this release`,
|
||||||
},
|
},
|
||||||
"dest without sameness": {
|
"dest without sameness": {
|
||||||
config: &pbcatalog.FailoverConfig{
|
config: &pbcatalog.FailoverConfig{
|
||||||
|
@ -246,6 +248,8 @@ func TestValidateFailoverPolicy(t *testing.T) {
|
||||||
config: &pbcatalog.FailoverConfig{
|
config: &pbcatalog.FailoverConfig{
|
||||||
SamenessGroup: "blah",
|
SamenessGroup: "blah",
|
||||||
},
|
},
|
||||||
|
// TODO(v2): remove after this is supported
|
||||||
|
expectErr: `invalid "sameness_group" field: not supported in this release`,
|
||||||
},
|
},
|
||||||
"mode: invalid": {
|
"mode: invalid": {
|
||||||
config: &pbcatalog.FailoverConfig{
|
config: &pbcatalog.FailoverConfig{
|
||||||
|
@ -597,9 +601,20 @@ func TestSimplifyFailoverPolicy(t *testing.T) {
|
||||||
},
|
},
|
||||||
PortConfigs: map[string]*pbcatalog.FailoverConfig{
|
PortConfigs: map[string]*pbcatalog.FailoverConfig{
|
||||||
"rest": {
|
"rest": {
|
||||||
Mode: pbcatalog.FailoverMode_FAILOVER_MODE_ORDER_BY_LOCALITY,
|
// TODO(v2): uncomment when this works
|
||||||
Regions: []string{"us", "eu"},
|
// Mode: pbcatalog.FailoverMode_FAILOVER_MODE_ORDER_BY_LOCALITY,
|
||||||
SamenessGroup: "sameweb",
|
// Regions: []string{"us", "eu"},
|
||||||
|
// SamenessGroup: "sameweb",
|
||||||
|
Destinations: []*pbcatalog.FailoverDestination{
|
||||||
|
{
|
||||||
|
Ref: newRef(ServiceType, "api-backup"),
|
||||||
|
Port: "rest",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Ref: newRef(ServiceType, "api-double-backup"),
|
||||||
|
Port: "rest",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}).
|
}).
|
||||||
|
@ -620,9 +635,20 @@ func TestSimplifyFailoverPolicy(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rest": {
|
"rest": {
|
||||||
Mode: pbcatalog.FailoverMode_FAILOVER_MODE_ORDER_BY_LOCALITY,
|
// TODO(v2): uncomment when this works
|
||||||
Regions: []string{"us", "eu"},
|
// Mode: pbcatalog.FailoverMode_FAILOVER_MODE_ORDER_BY_LOCALITY,
|
||||||
SamenessGroup: "sameweb",
|
// Regions: []string{"us", "eu"},
|
||||||
|
// SamenessGroup: "sameweb",
|
||||||
|
Destinations: []*pbcatalog.FailoverDestination{
|
||||||
|
{
|
||||||
|
Ref: newRef(ServiceType, "api-backup"),
|
||||||
|
Port: "rest",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Ref: newRef(ServiceType, "api-double-backup"),
|
||||||
|
Port: "rest",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}).
|
}).
|
||||||
|
|
|
@ -27,11 +27,6 @@ func (c *ComputedRoutesCache) TrackComputedRoutes(computedRoutes *types.DecodedC
|
||||||
for _, pcr := range computedRoutes.Data.PortedConfigs {
|
for _, pcr := range computedRoutes.Data.PortedConfigs {
|
||||||
for _, details := range pcr.Targets {
|
for _, details := range pcr.Targets {
|
||||||
serviceRefs = append(serviceRefs, details.BackendRef.Ref)
|
serviceRefs = append(serviceRefs, details.BackendRef.Ref)
|
||||||
if details.FailoverConfig != nil {
|
|
||||||
for _, dest := range details.FailoverConfig.Destinations {
|
|
||||||
serviceRefs = append(serviceRefs, dest.Ref)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -108,6 +108,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("api", "tcp"): {
|
backendName("api", "tcp"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(apiServiceRef, "tcp", ""),
|
BackendRef: newBackendRef(apiServiceRef, "tcp", ""),
|
||||||
},
|
},
|
||||||
|
@ -176,6 +177,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("api", "tcp"): {
|
backendName("api", "tcp"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(apiServiceRef, "tcp", ""),
|
BackendRef: newBackendRef(apiServiceRef, "tcp", ""),
|
||||||
},
|
},
|
||||||
|
@ -202,6 +204,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("api", "http"): {
|
backendName("api", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(apiServiceRef, "http", ""),
|
BackendRef: newBackendRef(apiServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
|
@ -228,6 +231,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("api", "http2"): {
|
backendName("api", "http2"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(apiServiceRef, "http2", ""),
|
BackendRef: newBackendRef(apiServiceRef, "http2", ""),
|
||||||
},
|
},
|
||||||
|
@ -249,6 +253,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("api", "grpc"): {
|
backendName("api", "grpc"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(apiServiceRef, "grpc", ""),
|
BackendRef: newBackendRef(apiServiceRef, "grpc", ""),
|
||||||
},
|
},
|
||||||
|
@ -328,6 +333,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "tcp"): {
|
backendName("foo", "tcp"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "tcp", ""),
|
BackendRef: newBackendRef(fooServiceRef, "tcp", ""),
|
||||||
},
|
},
|
||||||
|
@ -356,6 +362,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http"): {
|
backendName("foo", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
|
@ -384,6 +391,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "grpc"): {
|
backendName("foo", "grpc"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "grpc", ""),
|
BackendRef: newBackendRef(fooServiceRef, "grpc", ""),
|
||||||
},
|
},
|
||||||
|
@ -412,6 +420,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http2"): {
|
backendName("foo", "http2"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http2", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http2", ""),
|
||||||
},
|
},
|
||||||
|
@ -515,6 +524,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "tcp"): {
|
backendName("foo", "tcp"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "tcp", ""),
|
BackendRef: newBackendRef(fooServiceRef, "tcp", ""),
|
||||||
},
|
},
|
||||||
|
@ -554,6 +564,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http"): {
|
backendName("foo", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
|
@ -594,6 +605,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "grpc"): {
|
backendName("foo", "grpc"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "grpc", ""),
|
BackendRef: newBackendRef(fooServiceRef, "grpc", ""),
|
||||||
},
|
},
|
||||||
|
@ -633,6 +645,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http2"): {
|
backendName("foo", "http2"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http2", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http2", ""),
|
||||||
},
|
},
|
||||||
|
@ -739,6 +752,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "tcp"): {
|
backendName("foo", "tcp"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "tcp", ""),
|
BackendRef: newBackendRef(fooServiceRef, "tcp", ""),
|
||||||
},
|
},
|
||||||
|
@ -767,6 +781,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http"): {
|
backendName("foo", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
|
@ -795,6 +810,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "grpc"): {
|
backendName("foo", "grpc"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "grpc", ""),
|
BackendRef: newBackendRef(fooServiceRef, "grpc", ""),
|
||||||
},
|
},
|
||||||
|
@ -823,6 +839,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http2"): {
|
backendName("foo", "http2"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http2", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http2", ""),
|
||||||
},
|
},
|
||||||
|
@ -894,6 +911,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "tcp"): {
|
backendName("foo", "tcp"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "tcp", ""),
|
BackendRef: newBackendRef(fooServiceRef, "tcp", ""),
|
||||||
},
|
},
|
||||||
|
@ -922,6 +940,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http"): {
|
backendName("foo", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
|
@ -950,6 +969,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "grpc"): {
|
backendName("foo", "grpc"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "grpc", ""),
|
BackendRef: newBackendRef(fooServiceRef, "grpc", ""),
|
||||||
},
|
},
|
||||||
|
@ -978,6 +998,7 @@ func (suite *controllerSuite) TestController() {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http2"): {
|
backendName("foo", "http2"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http2", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http2", ""),
|
||||||
},
|
},
|
||||||
|
|
|
@ -70,11 +70,13 @@ func compile(
|
||||||
|
|
||||||
var (
|
var (
|
||||||
inMesh = false
|
inMesh = false
|
||||||
|
parentMeshPort string
|
||||||
allowedPortProtocols = make(map[string]pbcatalog.Protocol)
|
allowedPortProtocols = make(map[string]pbcatalog.Protocol)
|
||||||
)
|
)
|
||||||
for _, port := range parentServiceDec.Data.Ports {
|
for _, port := range parentServiceDec.Data.Ports {
|
||||||
if port.Protocol == pbcatalog.Protocol_PROTOCOL_MESH {
|
if port.Protocol == pbcatalog.Protocol_PROTOCOL_MESH {
|
||||||
inMesh = true
|
inMesh = true
|
||||||
|
parentMeshPort = port.TargetPort
|
||||||
continue // skip
|
continue // skip
|
||||||
}
|
}
|
||||||
allowedPortProtocols[port.TargetPort] = port.Protocol
|
allowedPortProtocols[port.TargetPort] = port.Protocol
|
||||||
|
@ -170,7 +172,7 @@ func compile(
|
||||||
continue // not possible
|
continue // not possible
|
||||||
}
|
}
|
||||||
|
|
||||||
routeNode := createDefaultRouteNode(parentServiceRef, port, typ)
|
routeNode := createDefaultRouteNode(parentServiceRef, parentMeshPort, port, typ)
|
||||||
|
|
||||||
routeNodesByPort[port] = append(routeNodesByPort[port], routeNode)
|
routeNodesByPort[port] = append(routeNodesByPort[port], routeNode)
|
||||||
}
|
}
|
||||||
|
@ -272,37 +274,34 @@ func compile(
|
||||||
|
|
||||||
computedRoutes.PortedConfigs[port] = mc
|
computedRoutes.PortedConfigs[port] = mc
|
||||||
|
|
||||||
|
// The first pass collects the failover policies and generates additional targets.
|
||||||
for _, details := range mc.Targets {
|
for _, details := range mc.Targets {
|
||||||
svcRef := details.BackendRef.Ref
|
svcRef := details.BackendRef.Ref
|
||||||
|
|
||||||
svc := related.GetService(svcRef)
|
svc := related.GetService(svcRef)
|
||||||
failoverPolicy := related.GetFailoverPolicyForService(svcRef)
|
|
||||||
destPolicy := related.GetDestinationPolicyForService(svcRef)
|
|
||||||
|
|
||||||
if svc == nil {
|
if svc == nil {
|
||||||
panic("impossible at this point; should already have been handled before getting here")
|
panic("impossible at this point; should already have been handled before getting here")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the destination proxy's port.
|
failoverPolicy := related.GetFailoverPolicyForService(svcRef)
|
||||||
//
|
|
||||||
// Endpoints refs will need to route to mesh port instead of the
|
|
||||||
// destination port as that is the port of the destination's proxy.
|
|
||||||
//
|
|
||||||
// Note: we will always find a port here because we only add targets that have
|
|
||||||
// mesh ports above in shouldRouteTrafficToBackend().
|
|
||||||
for _, port := range svc.Data.Ports {
|
|
||||||
if port.Protocol == pbcatalog.Protocol_PROTOCOL_MESH {
|
|
||||||
details.MeshPort = port.TargetPort
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if failoverPolicy != nil {
|
if failoverPolicy != nil {
|
||||||
simpleFailoverPolicy := catalog.SimplifyFailoverPolicy(svc.Data, failoverPolicy.Data)
|
simpleFailoverPolicy := catalog.SimplifyFailoverPolicy(svc.Data, failoverPolicy.Data)
|
||||||
portFailoverConfig, ok := simpleFailoverPolicy.PortConfigs[details.BackendRef.Port]
|
portFailoverConfig, ok := simpleFailoverPolicy.PortConfigs[details.BackendRef.Port]
|
||||||
if ok {
|
if ok {
|
||||||
details.FailoverConfig = portFailoverConfig
|
details.FailoverConfig = compileFailoverConfig(
|
||||||
|
related,
|
||||||
|
portFailoverConfig,
|
||||||
|
mc.Targets,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do a second pass to handle shared things after we've dumped the
|
||||||
|
// failover legs into here.
|
||||||
|
for _, details := range mc.Targets {
|
||||||
|
svcRef := details.BackendRef.Ref
|
||||||
|
destPolicy := related.GetDestinationPolicyForService(svcRef)
|
||||||
if destPolicy != nil {
|
if destPolicy != nil {
|
||||||
portDestConfig, ok := destPolicy.Data.PortConfigs[details.BackendRef.Port]
|
portDestConfig, ok := destPolicy.Data.PortConfigs[details.BackendRef.Port]
|
||||||
if ok {
|
if ok {
|
||||||
|
@ -329,6 +328,58 @@ func compile(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func compileFailoverConfig(
|
||||||
|
related *loader.RelatedResources,
|
||||||
|
failoverConfig *pbcatalog.FailoverConfig,
|
||||||
|
targets map[string]*pbmesh.BackendTargetDetails,
|
||||||
|
) *pbmesh.ComputedFailoverConfig {
|
||||||
|
if failoverConfig == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
cfc := &pbmesh.ComputedFailoverConfig{
|
||||||
|
Destinations: make([]*pbmesh.ComputedFailoverDestination, 0, len(failoverConfig.Destinations)),
|
||||||
|
Mode: failoverConfig.Mode,
|
||||||
|
Regions: failoverConfig.Regions,
|
||||||
|
SamenessGroup: failoverConfig.SamenessGroup,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, dest := range failoverConfig.Destinations {
|
||||||
|
backendRef := &pbmesh.BackendReference{
|
||||||
|
Ref: dest.Ref,
|
||||||
|
Port: dest.Port,
|
||||||
|
Datacenter: dest.Datacenter,
|
||||||
|
}
|
||||||
|
|
||||||
|
destSvcRef := dest.Ref
|
||||||
|
|
||||||
|
svc := related.GetService(destSvcRef)
|
||||||
|
|
||||||
|
var backendTargetName string
|
||||||
|
ok, meshPort := shouldRouteTrafficToBackend(svc, backendRef)
|
||||||
|
if !ok {
|
||||||
|
continue // skip this leg of failover for now
|
||||||
|
}
|
||||||
|
|
||||||
|
destTargetName := types.BackendRefToComputedRoutesTarget(backendRef)
|
||||||
|
|
||||||
|
if _, exists := targets[destTargetName]; !exists {
|
||||||
|
// Add to output as an indirect target.
|
||||||
|
targets[destTargetName] = &pbmesh.BackendTargetDetails{
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_INDIRECT,
|
||||||
|
BackendRef: backendRef,
|
||||||
|
MeshPort: meshPort,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
backendTargetName = destTargetName
|
||||||
|
|
||||||
|
cfc.Destinations = append(cfc.Destinations, &pbmesh.ComputedFailoverDestination{
|
||||||
|
BackendTarget: backendTargetName,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return cfc
|
||||||
|
}
|
||||||
|
|
||||||
func compileHTTPRouteNode(
|
func compileHTTPRouteNode(
|
||||||
port string,
|
port string,
|
||||||
res *pbresource.Resource,
|
res *pbresource.Resource,
|
||||||
|
@ -376,9 +427,11 @@ func compileHTTPRouteNode(
|
||||||
backendTarget string
|
backendTarget string
|
||||||
backendSvc = serviceGetter.GetService(backendRef.BackendRef.Ref)
|
backendSvc = serviceGetter.GetService(backendRef.BackendRef.Ref)
|
||||||
)
|
)
|
||||||
if shouldRouteTrafficToBackend(backendSvc, backendRef.BackendRef) {
|
if ok, meshPort := shouldRouteTrafficToBackend(backendSvc, backendRef.BackendRef); ok {
|
||||||
details := &pbmesh.BackendTargetDetails{
|
details := &pbmesh.BackendTargetDetails{
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
BackendRef: backendRef.BackendRef,
|
BackendRef: backendRef.BackendRef,
|
||||||
|
MeshPort: meshPort,
|
||||||
}
|
}
|
||||||
backendTarget = node.AddTarget(backendRef.BackendRef, details)
|
backendTarget = node.AddTarget(backendRef.BackendRef, details)
|
||||||
} else {
|
} else {
|
||||||
|
@ -437,9 +490,11 @@ func compileGRPCRouteNode(
|
||||||
backendTarget string
|
backendTarget string
|
||||||
backendSvc = serviceGetter.GetService(backendRef.BackendRef.Ref)
|
backendSvc = serviceGetter.GetService(backendRef.BackendRef.Ref)
|
||||||
)
|
)
|
||||||
if shouldRouteTrafficToBackend(backendSvc, backendRef.BackendRef) {
|
if ok, meshPort := shouldRouteTrafficToBackend(backendSvc, backendRef.BackendRef); ok {
|
||||||
details := &pbmesh.BackendTargetDetails{
|
details := &pbmesh.BackendTargetDetails{
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
BackendRef: backendRef.BackendRef,
|
BackendRef: backendRef.BackendRef,
|
||||||
|
MeshPort: meshPort,
|
||||||
}
|
}
|
||||||
backendTarget = node.AddTarget(backendRef.BackendRef, details)
|
backendTarget = node.AddTarget(backendRef.BackendRef, details)
|
||||||
} else {
|
} else {
|
||||||
|
@ -490,9 +545,11 @@ func compileTCPRouteNode(
|
||||||
backendTarget string
|
backendTarget string
|
||||||
backendSvc = serviceGetter.GetService(backendRef.BackendRef.Ref)
|
backendSvc = serviceGetter.GetService(backendRef.BackendRef.Ref)
|
||||||
)
|
)
|
||||||
if shouldRouteTrafficToBackend(backendSvc, backendRef.BackendRef) {
|
if ok, meshPort := shouldRouteTrafficToBackend(backendSvc, backendRef.BackendRef); ok {
|
||||||
details := &pbmesh.BackendTargetDetails{
|
details := &pbmesh.BackendTargetDetails{
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
BackendRef: backendRef.BackendRef,
|
BackendRef: backendRef.BackendRef,
|
||||||
|
MeshPort: meshPort,
|
||||||
}
|
}
|
||||||
backendTarget = node.AddTarget(backendRef.BackendRef, details)
|
backendTarget = node.AddTarget(backendRef.BackendRef, details)
|
||||||
} else {
|
} else {
|
||||||
|
@ -512,18 +569,20 @@ func compileTCPRouteNode(
|
||||||
return node
|
return node
|
||||||
}
|
}
|
||||||
|
|
||||||
func shouldRouteTrafficToBackend(backendSvc *types.DecodedService, backendRef *pbmesh.BackendReference) bool {
|
func shouldRouteTrafficToBackend(backendSvc *types.DecodedService, backendRef *pbmesh.BackendReference) (bool, string) {
|
||||||
if backendSvc == nil {
|
if backendSvc == nil {
|
||||||
return false
|
return false, ""
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
found = false
|
found = false
|
||||||
inMesh = false
|
inMesh = false
|
||||||
|
meshPort string
|
||||||
)
|
)
|
||||||
for _, port := range backendSvc.Data.Ports {
|
for _, port := range backendSvc.Data.Ports {
|
||||||
if port.Protocol == pbcatalog.Protocol_PROTOCOL_MESH {
|
if port.Protocol == pbcatalog.Protocol_PROTOCOL_MESH {
|
||||||
inMesh = true
|
inMesh = true
|
||||||
|
meshPort = port.TargetPort
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if port.TargetPort == backendRef.Port {
|
if port.TargetPort == backendRef.Port {
|
||||||
|
@ -531,11 +590,12 @@ func shouldRouteTrafficToBackend(backendSvc *types.DecodedService, backendRef *p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return inMesh && found
|
return inMesh && found, meshPort
|
||||||
}
|
}
|
||||||
|
|
||||||
func createDefaultRouteNode(
|
func createDefaultRouteNode(
|
||||||
parentServiceRef *pbresource.Reference,
|
parentServiceRef *pbresource.Reference,
|
||||||
|
parentMeshPort string,
|
||||||
port string,
|
port string,
|
||||||
typ *pbresource.Type,
|
typ *pbresource.Type,
|
||||||
) *inputRouteNode {
|
) *inputRouteNode {
|
||||||
|
@ -548,7 +608,9 @@ func createDefaultRouteNode(
|
||||||
routeNode := newInputRouteNode(port)
|
routeNode := newInputRouteNode(port)
|
||||||
|
|
||||||
defaultBackendTarget := routeNode.AddTarget(defaultBackendRef, &pbmesh.BackendTargetDetails{
|
defaultBackendTarget := routeNode.AddTarget(defaultBackendRef, &pbmesh.BackendTargetDetails{
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
BackendRef: defaultBackendRef,
|
BackendRef: defaultBackendRef,
|
||||||
|
MeshPort: parentMeshPort,
|
||||||
})
|
})
|
||||||
switch {
|
switch {
|
||||||
case resource.EqualType(types.HTTPRouteType, typ):
|
case resource.EqualType(types.HTTPRouteType, typ):
|
||||||
|
|
|
@ -124,6 +124,11 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
WithTenancy(resource.DefaultNamespacedTenancy()).
|
WithTenancy(resource.DefaultNamespacedTenancy()).
|
||||||
ID()
|
ID()
|
||||||
barServiceRef = resource.Reference(barServiceID, "")
|
barServiceRef = resource.Reference(barServiceID, "")
|
||||||
|
|
||||||
|
deadServiceID = rtest.Resource(catalog.ServiceType, "dead").
|
||||||
|
WithTenancy(resource.DefaultNamespacedTenancy()).
|
||||||
|
ID()
|
||||||
|
deadServiceRef = resource.Reference(deadServiceID, "")
|
||||||
)
|
)
|
||||||
|
|
||||||
t.Run("none", func(t *testing.T) {
|
t.Run("none", func(t *testing.T) {
|
||||||
|
@ -213,6 +218,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("api", "tcp"): {
|
backendName("api", "tcp"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(apiServiceRef, "tcp", ""),
|
BackendRef: newBackendRef(apiServiceRef, "tcp", ""),
|
||||||
},
|
},
|
||||||
|
@ -269,6 +275,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: protocol,
|
Protocol: protocol,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("api", protoName): {
|
backendName("api", protoName): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(apiServiceRef, protoName, ""),
|
BackendRef: newBackendRef(apiServiceRef, protoName, ""),
|
||||||
},
|
},
|
||||||
|
@ -317,6 +324,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("api", "grpc"): {
|
backendName("api", "grpc"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(apiServiceRef, "grpc", ""),
|
BackendRef: newBackendRef(apiServiceRef, "grpc", ""),
|
||||||
},
|
},
|
||||||
|
@ -418,6 +426,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "tcp"): {
|
backendName("foo", "tcp"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "tcp", ""),
|
BackendRef: newBackendRef(fooServiceRef, "tcp", ""),
|
||||||
},
|
},
|
||||||
|
@ -446,6 +455,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http"): {
|
backendName("foo", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
|
@ -474,6 +484,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP2,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http2"): {
|
backendName("foo", "http2"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http2", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http2", ""),
|
||||||
},
|
},
|
||||||
|
@ -502,6 +513,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
Protocol: pbcatalog.Protocol_PROTOCOL_GRPC,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "grpc"): {
|
backendName("foo", "grpc"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "grpc", ""),
|
BackendRef: newBackendRef(fooServiceRef, "grpc", ""),
|
||||||
},
|
},
|
||||||
|
@ -583,6 +595,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: protocol,
|
Protocol: protocol,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", portName): {
|
backendName("foo", portName): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, portName, ""),
|
BackendRef: newBackendRef(fooServiceRef, portName, ""),
|
||||||
},
|
},
|
||||||
|
@ -683,6 +696,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("api", "http"): {
|
backendName("api", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(apiServiceRef, "http", ""),
|
BackendRef: newBackendRef(apiServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
|
@ -761,6 +775,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("api", "http"): {
|
backendName("api", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(apiServiceRef, "http", ""),
|
BackendRef: newBackendRef(apiServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
|
@ -861,6 +876,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http"): {
|
backendName("foo", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
|
@ -1005,10 +1021,12 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http"): {
|
backendName("foo", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
backendName("bar", "http"): {
|
backendName("bar", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(barServiceRef, "http", ""),
|
BackendRef: newBackendRef(barServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
|
@ -1091,6 +1109,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http"): {
|
backendName("foo", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
||||||
},
|
},
|
||||||
|
@ -1439,6 +1458,7 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http"): {
|
backendName("foo", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
||||||
DestinationConfig: portDestConfig,
|
DestinationConfig: portDestConfig,
|
||||||
|
@ -1501,16 +1521,17 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
|
|
||||||
failoverPolicy := &pbcatalog.FailoverPolicy{
|
failoverPolicy := &pbcatalog.FailoverPolicy{
|
||||||
Config: &pbcatalog.FailoverConfig{
|
Config: &pbcatalog.FailoverConfig{
|
||||||
Destinations: []*pbcatalog.FailoverDestination{{
|
Destinations: []*pbcatalog.FailoverDestination{
|
||||||
Ref: barServiceRef,
|
{Ref: barServiceRef},
|
||||||
}},
|
{Ref: deadServiceRef}, // no service
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
portFailoverConfig := &pbcatalog.FailoverConfig{
|
portFailoverConfig := &pbmesh.ComputedFailoverConfig{
|
||||||
Destinations: []*pbcatalog.FailoverDestination{{
|
Destinations: []*pbmesh.ComputedFailoverDestination{
|
||||||
Ref: barServiceRef,
|
{BackendTarget: backendName("bar", "http")},
|
||||||
Port: "http",
|
// we skip the dead route
|
||||||
}},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
related := loader.NewRelatedResources().
|
related := loader.NewRelatedResources().
|
||||||
|
@ -1551,10 +1572,16 @@ func TestGenerateComputedRoutes(t *testing.T) {
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_HTTP,
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
backendName("foo", "http"): {
|
backendName("foo", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
BackendRef: newBackendRef(fooServiceRef, "http", ""),
|
||||||
FailoverConfig: portFailoverConfig,
|
FailoverConfig: portFailoverConfig,
|
||||||
},
|
},
|
||||||
|
backendName("bar", "http"): {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_INDIRECT,
|
||||||
|
MeshPort: "mesh",
|
||||||
|
BackendRef: newBackendRef(barServiceRef, "http", ""),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -238,26 +238,41 @@ func (l *loader) loadUpstreamService(
|
||||||
}
|
}
|
||||||
if failService != nil {
|
if failService != nil {
|
||||||
l.out.AddService(failService)
|
l.out.AddService(failService)
|
||||||
|
|
||||||
|
if err := l.loadDestConfig(ctx, logger, failService.Resource.Id); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
l.mapper.UntrackFailoverPolicy(failoverPolicyID)
|
l.mapper.UntrackFailoverPolicy(failoverPolicyID)
|
||||||
}
|
}
|
||||||
|
|
||||||
destPolicyID := changeResourceType(svcID, types.DestinationPolicyType)
|
if err := l.loadDestConfig(ctx, logger, svcID); err != nil {
|
||||||
destPolicy, err := l.mem.GetDestinationPolicy(ctx, destPolicyID)
|
|
||||||
if err != nil {
|
|
||||||
logger.Error("error retrieving the destination config", "destPolicyID", destPolicyID, "error", err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if destPolicy != nil {
|
|
||||||
l.out.AddDestinationPolicy(destPolicy)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *loader) loadDestConfig(
|
||||||
|
ctx context.Context,
|
||||||
|
logger hclog.Logger,
|
||||||
|
svcID *pbresource.ID,
|
||||||
|
) error {
|
||||||
|
destPolicyID := changeResourceType(svcID, types.DestinationPolicyType)
|
||||||
|
destPolicy, err := l.mem.GetDestinationPolicy(ctx, destPolicyID)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("error retrieving the destination config", "destPolicyID", destPolicyID, "error", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if destPolicy != nil {
|
||||||
|
l.out.AddDestinationPolicy(destPolicy)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (l *loader) gatherSingleXRouteAsInput(
|
func (l *loader) gatherSingleXRouteAsInput(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
logger hclog.Logger,
|
logger hclog.Logger,
|
||||||
|
|
|
@ -354,6 +354,13 @@ func TestLoadResourcesForComputedRoutes(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
adminDestPolicy := writeDestPolicy("admin", &pbmesh.DestinationPolicy{
|
||||||
|
PortConfigs: map[string]*pbmesh.DestinationConfig{
|
||||||
|
"http": {
|
||||||
|
ConnectTimeout: durationpb.New(222 * time.Second),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
testutil.RunStep(t, "add a dest policy", func(t *testing.T) {
|
testutil.RunStep(t, "add a dest policy", func(t *testing.T) {
|
||||||
out, err := LoadResourcesForComputedRoutes(ctx, loggerFor, rt.Client, mapper, apiRoutesID)
|
out, err := LoadResourcesForComputedRoutes(ctx, loggerFor, rt.Client, mapper, apiRoutesID)
|
||||||
|
@ -367,6 +374,7 @@ func TestLoadResourcesForComputedRoutes(t *testing.T) {
|
||||||
route2,
|
route2,
|
||||||
barFailover,
|
barFailover,
|
||||||
fooDestPolicy,
|
fooDestPolicy,
|
||||||
|
adminDestPolicy, // adminDestPolicy shows up indirectly via a FailoverPolicy
|
||||||
).AddComputedRoutesIDs(apiRoutesID), out)
|
).AddComputedRoutesIDs(apiRoutesID), out)
|
||||||
require.Equal(t, doubleMap(t,
|
require.Equal(t, doubleMap(t,
|
||||||
apiSvc, route2,
|
apiSvc, route2,
|
||||||
|
|
|
@ -12,7 +12,6 @@ import (
|
||||||
"github.com/hashicorp/consul/internal/mesh/internal/controllers/routes"
|
"github.com/hashicorp/consul/internal/mesh/internal/controllers/routes"
|
||||||
"github.com/hashicorp/consul/internal/mesh/internal/controllers/routes/loader"
|
"github.com/hashicorp/consul/internal/mesh/internal/controllers/routes/loader"
|
||||||
"github.com/hashicorp/consul/internal/mesh/internal/types"
|
"github.com/hashicorp/consul/internal/mesh/internal/types"
|
||||||
"github.com/hashicorp/consul/internal/resource"
|
|
||||||
rtest "github.com/hashicorp/consul/internal/resource/resourcetest"
|
rtest "github.com/hashicorp/consul/internal/resource/resourcetest"
|
||||||
pbmesh "github.com/hashicorp/consul/proto-public/pbmesh/v1alpha1"
|
pbmesh "github.com/hashicorp/consul/proto-public/pbmesh/v1alpha1"
|
||||||
"github.com/hashicorp/consul/proto-public/pbresource"
|
"github.com/hashicorp/consul/proto-public/pbresource"
|
||||||
|
@ -41,29 +40,23 @@ func BuildComputedRoutes(
|
||||||
return makeComputedRoutes(t, nil, id, decResList...)
|
return makeComputedRoutes(t, nil, id, decResList...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func MutateTarget(
|
func MutateTargets(
|
||||||
t *testing.T,
|
t *testing.T,
|
||||||
portConfig *pbmesh.ComputedPortRoutes,
|
routes *pbmesh.ComputedRoutes,
|
||||||
ref resource.ReferenceOrID,
|
parentPort string,
|
||||||
port string,
|
mutFn func(t *testing.T, details *pbmesh.BackendTargetDetails),
|
||||||
mutFn func(details *pbmesh.BackendTargetDetails),
|
|
||||||
) *pbmesh.ComputedPortRoutes {
|
) *pbmesh.ComputedPortRoutes {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
backendRef := &pbmesh.BackendReference{
|
portConfig, ok := routes.PortedConfigs[parentPort]
|
||||||
Ref: resource.ReferenceFromReferenceOrID(ref),
|
require.True(t, ok, "port %q not found in ported_configs", parentPort)
|
||||||
Port: port,
|
|
||||||
Datacenter: "",
|
|
||||||
}
|
|
||||||
|
|
||||||
key := types.BackendRefToComputedRoutesTarget(backendRef)
|
|
||||||
|
|
||||||
portConfig = proto.Clone(portConfig).(*pbmesh.ComputedPortRoutes)
|
portConfig = proto.Clone(portConfig).(*pbmesh.ComputedPortRoutes)
|
||||||
|
|
||||||
details, ok := portConfig.Targets[key]
|
for _, details := range portConfig.Targets {
|
||||||
require.True(t, ok, "key %q not found in targets map", key)
|
mutFn(t, details)
|
||||||
|
}
|
||||||
|
|
||||||
mutFn(details)
|
|
||||||
return portConfig
|
return portConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,9 +60,23 @@ func (b *Builder) Build() *pbmesh.ProxyStateTemplate {
|
||||||
}
|
}
|
||||||
b.proxyStateTemplate.ProxyState.TrafficPermissionDefaultAllow = b.defaultAllow
|
b.proxyStateTemplate.ProxyState.TrafficPermissionDefaultAllow = b.defaultAllow
|
||||||
|
|
||||||
|
finalCleanupOfProxyStateTemplate(b.proxyStateTemplate)
|
||||||
|
|
||||||
return b.proxyStateTemplate
|
return b.proxyStateTemplate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func finalCleanupOfProxyStateTemplate(pst *pbmesh.ProxyStateTemplate) {
|
||||||
|
if pst.ProxyState != nil {
|
||||||
|
// Ensure all clusters have names by duplicating them from the map
|
||||||
|
// if the above assembly code neglected any.
|
||||||
|
for name, cluster := range pst.ProxyState.Clusters {
|
||||||
|
if cluster.Name == "" && name != "" {
|
||||||
|
cluster.Name = name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type ListenerBuilder struct {
|
type ListenerBuilder struct {
|
||||||
listener *pbproxystate.Listener
|
listener *pbproxystate.Listener
|
||||||
builder *Builder
|
builder *Builder
|
||||||
|
|
|
@ -261,6 +261,15 @@ func (b *Builder) buildDestination(
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, details := range targets {
|
for _, details := range targets {
|
||||||
|
// NOTE: we only emit clusters for DIRECT targets here. The others will
|
||||||
|
// be folded into one or more aggregate clusters somehow.
|
||||||
|
if details.Type != pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
connectTimeout := durationpb.New(5 * time.Second)
|
||||||
|
|
||||||
|
// NOTE: we collect both DIRECT and INDIRECT target information here.
|
||||||
dc := defaultDC(details.BackendRef.Datacenter)
|
dc := defaultDC(details.BackendRef.Datacenter)
|
||||||
portName := details.BackendRef.Port
|
portName := details.BackendRef.Port
|
||||||
|
|
||||||
|
@ -271,8 +280,45 @@ func (b *Builder) buildDestination(
|
||||||
)
|
)
|
||||||
clusterName := fmt.Sprintf("%s.%s", portName, sni)
|
clusterName := fmt.Sprintf("%s.%s", portName, sni)
|
||||||
|
|
||||||
b.addCluster(clusterName, sni, portName, details.IdentityRefs)
|
egBase := b.newClusterEndpointGroup("", sni, portName, details.IdentityRefs, connectTimeout)
|
||||||
|
|
||||||
|
var endpointGroups []*pbproxystate.EndpointGroup
|
||||||
|
|
||||||
|
// Original target is the first (or only) target.
|
||||||
|
endpointGroups = append(endpointGroups, egBase)
|
||||||
b.addEndpointsRef(clusterName, details.ServiceEndpointsId, details.MeshPort)
|
b.addEndpointsRef(clusterName, details.ServiceEndpointsId, details.MeshPort)
|
||||||
|
|
||||||
|
if details.FailoverConfig != nil {
|
||||||
|
failover := details.FailoverConfig
|
||||||
|
// TODO(v2): handle other forms of failover (regions/locality/etc)
|
||||||
|
|
||||||
|
for i, dest := range failover.Destinations {
|
||||||
|
if dest.BackendTarget == types.NullRouteBackend {
|
||||||
|
continue // not possible
|
||||||
|
}
|
||||||
|
destDetails, ok := targets[dest.BackendTarget]
|
||||||
|
if !ok {
|
||||||
|
continue // not possible
|
||||||
|
}
|
||||||
|
|
||||||
|
destDC := defaultDC(destDetails.BackendRef.Datacenter)
|
||||||
|
destPortName := destDetails.BackendRef.Port
|
||||||
|
|
||||||
|
destSNI := DestinationSNI(
|
||||||
|
destDetails.BackendRef.Ref,
|
||||||
|
destDC,
|
||||||
|
b.trustDomain,
|
||||||
|
)
|
||||||
|
destClusterName := fmt.Sprintf("%s%d~%s", xdscommon.FailoverClusterNamePrefix, i, clusterName)
|
||||||
|
|
||||||
|
egDest := b.newClusterEndpointGroup(destClusterName, destSNI, destPortName, destDetails.IdentityRefs, connectTimeout)
|
||||||
|
|
||||||
|
endpointGroups = append(endpointGroups, egDest)
|
||||||
|
b.addEndpointsRef(destClusterName, destDetails.ServiceEndpointsId, destDetails.MeshPort)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
b.addCluster(clusterName, endpointGroups, connectTimeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
return b
|
return b
|
||||||
|
@ -482,7 +528,44 @@ func makeRouterMatchForIPAndPort(vips []string, virtualPort uint32) *pbproxystat
|
||||||
}
|
}
|
||||||
|
|
||||||
// addCluster creates and adds a cluster to the proxyState based on the destination.
|
// addCluster creates and adds a cluster to the proxyState based on the destination.
|
||||||
func (b *Builder) addCluster(clusterName, sni, portName string, destinationIdentities []*pbresource.Reference) *Builder {
|
func (b *Builder) addCluster(
|
||||||
|
clusterName string,
|
||||||
|
endpointGroups []*pbproxystate.EndpointGroup,
|
||||||
|
connectTimeout *durationpb.Duration,
|
||||||
|
) {
|
||||||
|
cluster := &pbproxystate.Cluster{
|
||||||
|
Name: clusterName,
|
||||||
|
AltStatName: clusterName,
|
||||||
|
}
|
||||||
|
switch len(endpointGroups) {
|
||||||
|
case 0:
|
||||||
|
panic("no endpoint groups provided")
|
||||||
|
case 1:
|
||||||
|
cluster.Group = &pbproxystate.Cluster_EndpointGroup{
|
||||||
|
EndpointGroup: endpointGroups[0],
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
cluster.Group = &pbproxystate.Cluster_FailoverGroup{
|
||||||
|
FailoverGroup: &pbproxystate.FailoverGroup{
|
||||||
|
EndpointGroups: endpointGroups,
|
||||||
|
Config: &pbproxystate.FailoverGroupConfig{
|
||||||
|
UseAltStatName: true,
|
||||||
|
ConnectTimeout: connectTimeout,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
b.proxyStateTemplate.ProxyState.Clusters[cluster.Name] = cluster
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Builder) newClusterEndpointGroup(
|
||||||
|
clusterName string,
|
||||||
|
sni string,
|
||||||
|
portName string,
|
||||||
|
destinationIdentities []*pbresource.Reference,
|
||||||
|
connectTimeout *durationpb.Duration,
|
||||||
|
) *pbproxystate.EndpointGroup {
|
||||||
var spiffeIDs []string
|
var spiffeIDs []string
|
||||||
for _, identity := range destinationIdentities {
|
for _, identity := range destinationIdentities {
|
||||||
spiffeIDs = append(spiffeIDs, connect.SpiffeIDFromIdentityRef(b.trustDomain, identity))
|
spiffeIDs = append(spiffeIDs, connect.SpiffeIDFromIdentityRef(b.trustDomain, identity))
|
||||||
|
@ -492,39 +575,30 @@ func (b *Builder) addCluster(clusterName, sni, portName string, destinationIdent
|
||||||
|
|
||||||
// TODO(v2): if http2/grpc then set http2protocol options
|
// TODO(v2): if http2/grpc then set http2protocol options
|
||||||
|
|
||||||
// Create destination cluster.
|
return &pbproxystate.EndpointGroup{
|
||||||
cluster := &pbproxystate.Cluster{
|
Name: clusterName,
|
||||||
Name: clusterName,
|
Group: &pbproxystate.EndpointGroup_Dynamic{
|
||||||
AltStatName: clusterName,
|
Dynamic: &pbproxystate.DynamicEndpointGroup{
|
||||||
Group: &pbproxystate.Cluster_EndpointGroup{
|
Config: &pbproxystate.DynamicEndpointGroupConfig{
|
||||||
EndpointGroup: &pbproxystate.EndpointGroup{
|
DisablePanicThreshold: true,
|
||||||
Group: &pbproxystate.EndpointGroup_Dynamic{
|
ConnectTimeout: connectTimeout,
|
||||||
Dynamic: &pbproxystate.DynamicEndpointGroup{
|
},
|
||||||
Config: &pbproxystate.DynamicEndpointGroupConfig{
|
OutboundTls: &pbproxystate.TransportSocket{
|
||||||
DisablePanicThreshold: true,
|
ConnectionTls: &pbproxystate.TransportSocket_OutboundMesh{
|
||||||
},
|
OutboundMesh: &pbproxystate.OutboundMeshMTLS{
|
||||||
OutboundTls: &pbproxystate.TransportSocket{
|
IdentityKey: b.proxyStateTemplate.ProxyState.Identity.Name,
|
||||||
ConnectionTls: &pbproxystate.TransportSocket_OutboundMesh{
|
ValidationContext: &pbproxystate.MeshOutboundValidationContext{
|
||||||
OutboundMesh: &pbproxystate.OutboundMeshMTLS{
|
SpiffeIds: spiffeIDs,
|
||||||
IdentityKey: b.proxyStateTemplate.ProxyState.Identity.Name,
|
TrustBundlePeerNameKey: b.id.Tenancy.PeerName,
|
||||||
ValidationContext: &pbproxystate.MeshOutboundValidationContext{
|
|
||||||
SpiffeIds: spiffeIDs,
|
|
||||||
TrustBundlePeerNameKey: b.id.Tenancy.PeerName,
|
|
||||||
},
|
|
||||||
Sni: sni,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
AlpnProtocols: []string{getAlpnProtocolFromPortName(portName)},
|
Sni: sni,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
AlpnProtocols: []string{getAlpnProtocolFromPortName(portName)},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
b.proxyStateTemplate.ProxyState.Clusters[cluster.Name] = cluster
|
|
||||||
|
|
||||||
return b
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Builder) addRoute(listenerName string, route *pbproxystate.Route) {
|
func (b *Builder) addRoute(listenerName string, route *pbproxystate.Route) {
|
||||||
|
@ -534,12 +608,11 @@ func (b *Builder) addRoute(listenerName string, route *pbproxystate.Route) {
|
||||||
// addEndpointsRef creates and add an endpointRef for each serviceEndpoint for a destination and
|
// addEndpointsRef creates and add an endpointRef for each serviceEndpoint for a destination and
|
||||||
// adds it to the proxyStateTemplate so it will be processed later during reconciliation by
|
// adds it to the proxyStateTemplate so it will be processed later during reconciliation by
|
||||||
// the XDS controller.
|
// the XDS controller.
|
||||||
func (b *Builder) addEndpointsRef(clusterName string, serviceEndpointsID *pbresource.ID, destinationPort string) *Builder {
|
func (b *Builder) addEndpointsRef(clusterName string, serviceEndpointsID *pbresource.ID, destinationPort string) {
|
||||||
b.proxyStateTemplate.RequiredEndpoints[clusterName] = &pbproxystate.EndpointRef{
|
b.proxyStateTemplate.RequiredEndpoints[clusterName] = &pbproxystate.EndpointRef{
|
||||||
Id: serviceEndpointsID,
|
Id: serviceEndpointsID,
|
||||||
Port: destinationPort,
|
Port: destinationPort,
|
||||||
}
|
}
|
||||||
return b
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func orDefault(v, def string) string {
|
func orDefault(v, def string) string {
|
||||||
|
|
|
@ -143,15 +143,15 @@ func TestBuildMultiportImplicitDestinations(t *testing.T) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
portConfig, ok := computedRoutes.Data.PortedConfigs[portName]
|
|
||||||
require.True(t, ok, "port %q not found in port configs", portName)
|
|
||||||
|
|
||||||
dest := &intermediate.Destination{
|
dest := &intermediate.Destination{
|
||||||
Service: svcDec,
|
Service: svcDec,
|
||||||
ComputedPortRoutes: routestest.MutateTarget(t, portConfig, svc.Id, portName, func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(t, computedRoutes.Data, portName, func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
details.ServiceEndpointsId = endpoints.Id
|
switch {
|
||||||
details.ServiceEndpoints = seDec.Data
|
case resource.ReferenceOrIDMatch(svc.Id, details.BackendRef.Ref) && details.BackendRef.Port == portName:
|
||||||
details.IdentityRefs = identities
|
details.ServiceEndpointsId = endpoints.Id
|
||||||
|
details.ServiceEndpoints = seDec.Data
|
||||||
|
details.IdentityRefs = identities
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
VirtualIPs: virtualIPs,
|
VirtualIPs: virtualIPs,
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ var (
|
||||||
{Host: "10.0.0.1"},
|
{Host: "10.0.0.1"},
|
||||||
},
|
},
|
||||||
Ports: map[string]*pbcatalog.WorkloadPort{
|
Ports: map[string]*pbcatalog.WorkloadPort{
|
||||||
"tcp": {Port: 8080, Protocol: pbcatalog.Protocol_PROTOCOL_TCP},
|
"tcp": {Port: 7070, Protocol: pbcatalog.Protocol_PROTOCOL_TCP},
|
||||||
"http": {Port: 8080, Protocol: pbcatalog.Protocol_PROTOCOL_HTTP},
|
"http": {Port: 8080, Protocol: pbcatalog.Protocol_PROTOCOL_HTTP},
|
||||||
"mesh": {Port: 20000, Protocol: pbcatalog.Protocol_PROTOCOL_MESH},
|
"mesh": {Port: 20000, Protocol: pbcatalog.Protocol_PROTOCOL_MESH},
|
||||||
},
|
},
|
||||||
|
@ -40,7 +40,7 @@ var (
|
||||||
Ports: []*pbcatalog.ServicePort{
|
Ports: []*pbcatalog.ServicePort{
|
||||||
{
|
{
|
||||||
TargetPort: "tcp",
|
TargetPort: "tcp",
|
||||||
VirtualPort: 8080,
|
VirtualPort: 7070,
|
||||||
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -58,6 +58,10 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestBuildExplicitDestinations(t *testing.T) {
|
func TestBuildExplicitDestinations(t *testing.T) {
|
||||||
|
registry := resource.NewRegistry()
|
||||||
|
types.Register(registry)
|
||||||
|
catalog.RegisterTypes(registry)
|
||||||
|
|
||||||
api1Service := resourcetest.Resource(catalog.ServiceType, "api-1").
|
api1Service := resourcetest.Resource(catalog.ServiceType, "api-1").
|
||||||
WithTenancy(resource.DefaultNamespacedTenancy()).
|
WithTenancy(resource.DefaultNamespacedTenancy()).
|
||||||
WithData(t, serviceData).
|
WithData(t, serviceData).
|
||||||
|
@ -73,6 +77,17 @@ func TestBuildExplicitDestinations(t *testing.T) {
|
||||||
WithData(t, serviceData).
|
WithData(t, serviceData).
|
||||||
Build()
|
Build()
|
||||||
|
|
||||||
|
backup1Service := resourcetest.Resource(catalog.ServiceType, "backup-1").
|
||||||
|
WithTenancy(resource.DefaultNamespacedTenancy()).
|
||||||
|
WithData(t, serviceData).
|
||||||
|
Build()
|
||||||
|
|
||||||
|
for _, res := range []*pbresource.Resource{
|
||||||
|
api1Service, api2Service, api3Service, backup1Service,
|
||||||
|
} {
|
||||||
|
resourcetest.ValidateAndNormalize(t, registry, res)
|
||||||
|
}
|
||||||
|
|
||||||
api1Endpoints := resourcetest.Resource(catalog.ServiceEndpointsType, "api-1").
|
api1Endpoints := resourcetest.Resource(catalog.ServiceEndpointsType, "api-1").
|
||||||
WithTenancy(resource.DefaultNamespacedTenancy()).
|
WithTenancy(resource.DefaultNamespacedTenancy()).
|
||||||
WithData(t, endpointsData).
|
WithData(t, endpointsData).
|
||||||
|
@ -83,6 +98,17 @@ func TestBuildExplicitDestinations(t *testing.T) {
|
||||||
WithData(t, endpointsData).
|
WithData(t, endpointsData).
|
||||||
Build()
|
Build()
|
||||||
|
|
||||||
|
backup1Endpoints := resourcetest.Resource(catalog.ServiceEndpointsType, "backup-1").
|
||||||
|
WithTenancy(resource.DefaultNamespacedTenancy()).
|
||||||
|
WithData(t, endpointsData).
|
||||||
|
Build()
|
||||||
|
|
||||||
|
for _, res := range []*pbresource.Resource{
|
||||||
|
api1Endpoints, api2Endpoints, backup1Endpoints,
|
||||||
|
} {
|
||||||
|
resourcetest.ValidateAndNormalize(t, registry, res)
|
||||||
|
}
|
||||||
|
|
||||||
api1Identity := &pbresource.Reference{
|
api1Identity := &pbresource.Reference{
|
||||||
Name: "api1-identity",
|
Name: "api1-identity",
|
||||||
Tenancy: api1Endpoints.Id.Tenancy,
|
Tenancy: api1Endpoints.Id.Tenancy,
|
||||||
|
@ -93,6 +119,11 @@ func TestBuildExplicitDestinations(t *testing.T) {
|
||||||
Tenancy: api2Endpoints.Id.Tenancy,
|
Tenancy: api2Endpoints.Id.Tenancy,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
backup1Identity := &pbresource.Reference{
|
||||||
|
Name: "backup1-identity",
|
||||||
|
Tenancy: backup1Endpoints.Id.Tenancy,
|
||||||
|
}
|
||||||
|
|
||||||
api1HTTPRoute := resourcetest.Resource(types.HTTPRouteType, "api-1-http-route").
|
api1HTTPRoute := resourcetest.Resource(types.HTTPRouteType, "api-1-http-route").
|
||||||
WithTenancy(resource.DefaultNamespacedTenancy()).
|
WithTenancy(resource.DefaultNamespacedTenancy()).
|
||||||
WithData(t, &pbmesh.HTTPRoute{
|
WithData(t, &pbmesh.HTTPRoute{
|
||||||
|
@ -124,6 +155,22 @@ func TestBuildExplicitDestinations(t *testing.T) {
|
||||||
}},
|
}},
|
||||||
}).
|
}).
|
||||||
Build()
|
Build()
|
||||||
|
resourcetest.ValidateAndNormalize(t, registry, api1HTTPRoute)
|
||||||
|
|
||||||
|
api1FailoverPolicy := resourcetest.Resource(catalog.FailoverPolicyType, "api-1").
|
||||||
|
WithTenancy(resource.DefaultNamespacedTenancy()).
|
||||||
|
WithData(t, &pbcatalog.FailoverPolicy{
|
||||||
|
PortConfigs: map[string]*pbcatalog.FailoverConfig{
|
||||||
|
"http": {
|
||||||
|
Destinations: []*pbcatalog.FailoverDestination{{
|
||||||
|
Ref: resource.Reference(backup1Service.Id, ""),
|
||||||
|
Port: "http",
|
||||||
|
}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}).
|
||||||
|
Build()
|
||||||
|
resourcetest.ValidateAndNormalize(t, registry, api1FailoverPolicy)
|
||||||
|
|
||||||
api1TCPRoute := resourcetest.Resource(types.TCPRouteType, "api-1-tcp-route").
|
api1TCPRoute := resourcetest.Resource(types.TCPRouteType, "api-1-tcp-route").
|
||||||
WithTenancy(resource.DefaultNamespacedTenancy()).
|
WithTenancy(resource.DefaultNamespacedTenancy()).
|
||||||
|
@ -156,14 +203,17 @@ func TestBuildExplicitDestinations(t *testing.T) {
|
||||||
}},
|
}},
|
||||||
}).
|
}).
|
||||||
Build()
|
Build()
|
||||||
|
resourcetest.ValidateAndNormalize(t, registry, api1TCPRoute)
|
||||||
|
|
||||||
api1ComputedRoutesID := resource.ReplaceType(types.ComputedRoutesType, api1Service.Id)
|
api1ComputedRoutesID := resource.ReplaceType(types.ComputedRoutesType, api1Service.Id)
|
||||||
api1ComputedRoutes := routestest.BuildComputedRoutes(t, api1ComputedRoutesID,
|
api1ComputedRoutes := routestest.BuildComputedRoutes(t, api1ComputedRoutesID,
|
||||||
resourcetest.MustDecode[*pbcatalog.Service](t, api1Service),
|
resourcetest.MustDecode[*pbcatalog.Service](t, api1Service),
|
||||||
resourcetest.MustDecode[*pbcatalog.Service](t, api2Service),
|
resourcetest.MustDecode[*pbcatalog.Service](t, api2Service),
|
||||||
|
resourcetest.MustDecode[*pbcatalog.Service](t, backup1Service),
|
||||||
// notably we do NOT include api3Service here so we trigger a null route to be generated
|
// notably we do NOT include api3Service here so we trigger a null route to be generated
|
||||||
resourcetest.MustDecode[*pbmesh.HTTPRoute](t, api1HTTPRoute),
|
resourcetest.MustDecode[*pbmesh.HTTPRoute](t, api1HTTPRoute),
|
||||||
resourcetest.MustDecode[*pbmesh.TCPRoute](t, api1TCPRoute),
|
resourcetest.MustDecode[*pbmesh.TCPRoute](t, api1TCPRoute),
|
||||||
|
resourcetest.MustDecode[*pbcatalog.FailoverPolicy](t, api1FailoverPolicy),
|
||||||
)
|
)
|
||||||
require.NotNil(t, api1ComputedRoutes)
|
require.NotNil(t, api1ComputedRoutes)
|
||||||
|
|
||||||
|
@ -183,10 +233,17 @@ func TestBuildExplicitDestinations(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api1Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api1Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(t, api1ComputedRoutes.Data.PortedConfigs["tcp"], api1Service.Id, "tcp", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(t, api1ComputedRoutes.Data, "tcp", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
details.ServiceEndpointsId = api1Endpoints.Id
|
switch {
|
||||||
details.ServiceEndpoints = endpointsData
|
case resource.ReferenceOrIDMatch(api1Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp":
|
||||||
details.IdentityRefs = []*pbresource.Reference{api1Identity}
|
details.ServiceEndpointsId = api1Endpoints.Id
|
||||||
|
details.ServiceEndpoints = endpointsData
|
||||||
|
details.IdentityRefs = []*pbresource.Reference{api1Identity}
|
||||||
|
case resource.ReferenceOrIDMatch(api2Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp":
|
||||||
|
details.ServiceEndpointsId = api2Endpoints.Id
|
||||||
|
details.ServiceEndpoints = endpointsData
|
||||||
|
details.IdentityRefs = []*pbresource.Reference{api2Identity}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,10 +257,13 @@ func TestBuildExplicitDestinations(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api2Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api2Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(t, api2ComputedRoutes.Data.PortedConfigs["tcp"], api2Service.Id, "tcp", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(t, api2ComputedRoutes.Data, "tcp", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
details.ServiceEndpointsId = api2Endpoints.Id
|
switch {
|
||||||
details.ServiceEndpoints = endpointsData
|
case resource.ReferenceOrIDMatch(api2Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp":
|
||||||
details.IdentityRefs = []*pbresource.Reference{api2Identity}
|
details.ServiceEndpointsId = api2Endpoints.Id
|
||||||
|
details.ServiceEndpoints = endpointsData
|
||||||
|
details.IdentityRefs = []*pbresource.Reference{api2Identity}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,12 +277,24 @@ func TestBuildExplicitDestinations(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api1Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api1Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(t, api1ComputedRoutes.Data.PortedConfigs["http"], api1Service.Id, "http", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(t, api1ComputedRoutes.Data, "http", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
details.ServiceEndpointsId = api1Endpoints.Id
|
switch {
|
||||||
details.ServiceEndpoints = endpointsData
|
case resource.ReferenceOrIDMatch(api1Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "http":
|
||||||
details.IdentityRefs = []*pbresource.Reference{api1Identity}
|
details.ServiceEndpointsId = api1Endpoints.Id
|
||||||
|
details.ServiceEndpoints = endpointsData
|
||||||
|
details.IdentityRefs = []*pbresource.Reference{api1Identity}
|
||||||
|
case resource.ReferenceOrIDMatch(api2Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "http":
|
||||||
|
details.ServiceEndpointsId = api2Endpoints.Id
|
||||||
|
details.ServiceEndpoints = endpointsData
|
||||||
|
details.IdentityRefs = []*pbresource.Reference{api2Identity}
|
||||||
|
case resource.ReferenceOrIDMatch(backup1Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "http":
|
||||||
|
details.ServiceEndpointsId = backup1Endpoints.Id
|
||||||
|
details.ServiceEndpoints = endpointsData
|
||||||
|
details.IdentityRefs = []*pbresource.Reference{backup1Identity}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
_ = backup1Identity
|
||||||
|
|
||||||
cases := map[string]struct {
|
cases := map[string]struct {
|
||||||
destinations []*intermediate.Destination
|
destinations []*intermediate.Destination
|
||||||
|
@ -309,20 +381,26 @@ func TestBuildImplicitDestinations(t *testing.T) {
|
||||||
|
|
||||||
destination1 := &intermediate.Destination{
|
destination1 := &intermediate.Destination{
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api1Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api1Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(t, api1ComputedRoutes.Data.PortedConfigs["tcp"], api1Service.Id, "tcp", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(t, api1ComputedRoutes.Data, "tcp", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
details.ServiceEndpointsId = api1Endpoints.Id
|
switch {
|
||||||
details.ServiceEndpoints = endpointsData
|
case resource.ReferenceOrIDMatch(api1Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp":
|
||||||
details.IdentityRefs = []*pbresource.Reference{api1Identity}
|
details.ServiceEndpointsId = api1Endpoints.Id
|
||||||
|
details.ServiceEndpoints = endpointsData
|
||||||
|
details.IdentityRefs = []*pbresource.Reference{api1Identity}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
VirtualIPs: []string{"1.1.1.1"},
|
VirtualIPs: []string{"1.1.1.1"},
|
||||||
}
|
}
|
||||||
|
|
||||||
destination2 := &intermediate.Destination{
|
destination2 := &intermediate.Destination{
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api2Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api2Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(t, api2ComputedRoutes.Data.PortedConfigs["tcp"], api2Service.Id, "tcp", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(t, api2ComputedRoutes.Data, "tcp", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
details.ServiceEndpointsId = api2Endpoints.Id
|
switch {
|
||||||
details.ServiceEndpoints = endpointsData
|
case resource.ReferenceOrIDMatch(api2Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp":
|
||||||
details.IdentityRefs = []*pbresource.Reference{api2Identity}
|
details.ServiceEndpointsId = api2Endpoints.Id
|
||||||
|
details.ServiceEndpoints = endpointsData
|
||||||
|
details.IdentityRefs = []*pbresource.Reference{api2Identity}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
VirtualIPs: []string{"2.2.2.2", "3.3.3.3"},
|
VirtualIPs: []string{"2.2.2.2", "3.3.3.3"},
|
||||||
}
|
}
|
||||||
|
@ -337,10 +415,13 @@ func TestBuildImplicitDestinations(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api1Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](t, api1Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(t, api1ComputedRoutes.Data.PortedConfigs["tcp"], api1Service.Id, "tcp", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(t, api1ComputedRoutes.Data, "tcp", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
details.ServiceEndpointsId = api1Endpoints.Id
|
switch {
|
||||||
details.ServiceEndpoints = endpointsData
|
case resource.ReferenceOrIDMatch(api1Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp":
|
||||||
details.IdentityRefs = []*pbresource.Reference{api1Identity}
|
details.ServiceEndpointsId = api1Endpoints.Id
|
||||||
|
details.ServiceEndpoints = endpointsData
|
||||||
|
details.IdentityRefs = []*pbresource.Reference{api1Identity}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -32,6 +33,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -100,7 +102,7 @@
|
||||||
"statPrefix": "upstream.tcp.api-2.default.default.dc1"
|
"statPrefix": "upstream.tcp.api-2.default.default.dc1"
|
||||||
},
|
},
|
||||||
"match": {
|
"match": {
|
||||||
"destinationPort": 8080,
|
"destinationPort": 7070,
|
||||||
"prefixRanges": [
|
"prefixRanges": [
|
||||||
{
|
{
|
||||||
"addressPrefix": "2.2.2.2",
|
"addressPrefix": "2.2.2.2",
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -42,6 +43,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -32,6 +33,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -82,7 +84,7 @@
|
||||||
"statPrefix": "upstream.tcp.api-1.default.default.dc1"
|
"statPrefix": "upstream.tcp.api-1.default.default.dc1"
|
||||||
},
|
},
|
||||||
"match": {
|
"match": {
|
||||||
"destinationPort": 8080,
|
"destinationPort": 7070,
|
||||||
"prefixRanges": [
|
"prefixRanges": [
|
||||||
{
|
{
|
||||||
"addressPrefix": "1.1.1.1",
|
"addressPrefix": "1.1.1.1",
|
||||||
|
@ -99,7 +101,7 @@
|
||||||
"statPrefix": "upstream.tcp.api-2.default.default.dc1"
|
"statPrefix": "upstream.tcp.api-2.default.default.dc1"
|
||||||
},
|
},
|
||||||
"match": {
|
"match": {
|
||||||
"destinationPort": 8080,
|
"destinationPort": 7070,
|
||||||
"prefixRanges": [
|
"prefixRanges": [
|
||||||
{
|
{
|
||||||
"addressPrefix": "2.2.2.2",
|
"addressPrefix": "2.2.2.2",
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -42,6 +43,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -52,6 +54,9 @@
|
||||||
"identityKey": "test-identity",
|
"identityKey": "test-identity",
|
||||||
"sni": "api-2.default.dc1.internal.foo.consul",
|
"sni": "api-2.default.dc1.internal.foo.consul",
|
||||||
"validationContext": {
|
"validationContext": {
|
||||||
|
"spiffeIds": [
|
||||||
|
"spiffe://foo.consul/ap/default/ns/default/identity/api2-identity"
|
||||||
|
],
|
||||||
"trustBundlePeerNameKey": "local"
|
"trustBundlePeerNameKey": "local"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,6 +126,19 @@
|
||||||
"port": "mesh"
|
"port": "mesh"
|
||||||
},
|
},
|
||||||
"tcp.api-2.default.dc1.internal.foo.consul": {
|
"tcp.api-2.default.dc1.internal.foo.consul": {
|
||||||
|
"id": {
|
||||||
|
"name": "api-2",
|
||||||
|
"tenancy": {
|
||||||
|
"namespace": "default",
|
||||||
|
"partition": "default",
|
||||||
|
"peerName": "local"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"group": "catalog",
|
||||||
|
"groupVersion": "v1alpha1",
|
||||||
|
"kind": "ServiceEndpoints"
|
||||||
|
}
|
||||||
|
},
|
||||||
"port": "mesh"
|
"port": "mesh"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -56,7 +57,7 @@
|
||||||
"statPrefix": "upstream.tcp.api-1.default.default.dc1"
|
"statPrefix": "upstream.tcp.api-1.default.default.dc1"
|
||||||
},
|
},
|
||||||
"match": {
|
"match": {
|
||||||
"destinationPort": 8080,
|
"destinationPort": 7070,
|
||||||
"prefixRanges": [
|
"prefixRanges": [
|
||||||
{
|
{
|
||||||
"addressPrefix": "1.1.1.1",
|
"addressPrefix": "1.1.1.1",
|
||||||
|
|
|
@ -3,27 +3,60 @@
|
||||||
"clusters": {
|
"clusters": {
|
||||||
"http.api-1.default.dc1.internal.foo.consul": {
|
"http.api-1.default.dc1.internal.foo.consul": {
|
||||||
"altStatName": "http.api-1.default.dc1.internal.foo.consul",
|
"altStatName": "http.api-1.default.dc1.internal.foo.consul",
|
||||||
"endpointGroup": {
|
"failoverGroup": {
|
||||||
"dynamic": {
|
"config": {
|
||||||
"config": {
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"useAltStatName": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"endpointGroups": [
|
||||||
"alpnProtocols": [
|
{
|
||||||
"consul~http"
|
"dynamic": {
|
||||||
],
|
"config": {
|
||||||
"outboundMesh": {
|
"connectTimeout": "5s",
|
||||||
"identityKey": "test-identity",
|
"disablePanicThreshold": true
|
||||||
"sni": "api-1.default.dc1.internal.foo.consul",
|
},
|
||||||
"validationContext": {
|
"outboundTls": {
|
||||||
"spiffeIds": [
|
"alpnProtocols": [
|
||||||
"spiffe://foo.consul/ap/default/ns/default/identity/api1-identity"
|
"consul~http"
|
||||||
],
|
],
|
||||||
"trustBundlePeerNameKey": "local"
|
"outboundMesh": {
|
||||||
|
"identityKey": "test-identity",
|
||||||
|
"sni": "api-1.default.dc1.internal.foo.consul",
|
||||||
|
"validationContext": {
|
||||||
|
"spiffeIds": [
|
||||||
|
"spiffe://foo.consul/ap/default/ns/default/identity/api1-identity"
|
||||||
|
],
|
||||||
|
"trustBundlePeerNameKey": "local"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dynamic": {
|
||||||
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
|
"disablePanicThreshold": true
|
||||||
|
},
|
||||||
|
"outboundTls": {
|
||||||
|
"alpnProtocols": [
|
||||||
|
"consul~http"
|
||||||
|
],
|
||||||
|
"outboundMesh": {
|
||||||
|
"identityKey": "test-identity",
|
||||||
|
"sni": "backup-1.default.dc1.internal.foo.consul",
|
||||||
|
"validationContext": {
|
||||||
|
"spiffeIds": [
|
||||||
|
"spiffe://foo.consul/ap/default/ns/default/identity/backup1-identity"
|
||||||
|
],
|
||||||
|
"trustBundlePeerNameKey": "local"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"name": "failover-target~0~http.api-1.default.dc1.internal.foo.consul"
|
||||||
}
|
}
|
||||||
}
|
]
|
||||||
},
|
},
|
||||||
"name": "http.api-1.default.dc1.internal.foo.consul"
|
"name": "http.api-1.default.dc1.internal.foo.consul"
|
||||||
},
|
},
|
||||||
|
@ -32,6 +65,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -42,6 +76,9 @@
|
||||||
"identityKey": "test-identity",
|
"identityKey": "test-identity",
|
||||||
"sni": "api-2.default.dc1.internal.foo.consul",
|
"sni": "api-2.default.dc1.internal.foo.consul",
|
||||||
"validationContext": {
|
"validationContext": {
|
||||||
|
"spiffeIds": [
|
||||||
|
"spiffe://foo.consul/ap/default/ns/default/identity/api2-identity"
|
||||||
|
],
|
||||||
"trustBundlePeerNameKey": "local"
|
"trustBundlePeerNameKey": "local"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,6 +102,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -91,6 +129,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -238,6 +277,22 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"requiredEndpoints": {
|
"requiredEndpoints": {
|
||||||
|
"failover-target~0~http.api-1.default.dc1.internal.foo.consul": {
|
||||||
|
"id": {
|
||||||
|
"name": "backup-1",
|
||||||
|
"tenancy": {
|
||||||
|
"namespace": "default",
|
||||||
|
"partition": "default",
|
||||||
|
"peerName": "local"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"group": "catalog",
|
||||||
|
"groupVersion": "v1alpha1",
|
||||||
|
"kind": "ServiceEndpoints"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"port": "mesh"
|
||||||
|
},
|
||||||
"http.api-1.default.dc1.internal.foo.consul": {
|
"http.api-1.default.dc1.internal.foo.consul": {
|
||||||
"id": {
|
"id": {
|
||||||
"name": "api-1",
|
"name": "api-1",
|
||||||
|
@ -255,6 +310,19 @@
|
||||||
"port": "mesh"
|
"port": "mesh"
|
||||||
},
|
},
|
||||||
"http.api-2.default.dc1.internal.foo.consul": {
|
"http.api-2.default.dc1.internal.foo.consul": {
|
||||||
|
"id": {
|
||||||
|
"name": "api-2",
|
||||||
|
"tenancy": {
|
||||||
|
"namespace": "default",
|
||||||
|
"partition": "default",
|
||||||
|
"peerName": "local"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"group": "catalog",
|
||||||
|
"groupVersion": "v1alpha1",
|
||||||
|
"kind": "ServiceEndpoints"
|
||||||
|
}
|
||||||
|
},
|
||||||
"port": "mesh"
|
"port": "mesh"
|
||||||
},
|
},
|
||||||
"tcp.api-1.default.dc1.internal.foo.consul": {
|
"tcp.api-1.default.dc1.internal.foo.consul": {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -32,6 +33,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -58,6 +60,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -84,6 +87,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -134,7 +138,7 @@
|
||||||
"statPrefix": "upstream.tcp.api-app.default.default.dc1"
|
"statPrefix": "upstream.tcp.api-app.default.default.dc1"
|
||||||
},
|
},
|
||||||
"match": {
|
"match": {
|
||||||
"destinationPort": 8080,
|
"destinationPort": 7070,
|
||||||
"prefixRanges": [
|
"prefixRanges": [
|
||||||
{
|
{
|
||||||
"addressPrefix": "1.1.1.1",
|
"addressPrefix": "1.1.1.1",
|
||||||
|
@ -151,7 +155,7 @@
|
||||||
"statPrefix": "upstream.tcp.api-app2.default.default.dc1"
|
"statPrefix": "upstream.tcp.api-app2.default.default.dc1"
|
||||||
},
|
},
|
||||||
"match": {
|
"match": {
|
||||||
"destinationPort": 8080,
|
"destinationPort": 7070,
|
||||||
"prefixRanges": [
|
"prefixRanges": [
|
||||||
{
|
{
|
||||||
"addressPrefix": "2.2.2.2",
|
"addressPrefix": "2.2.2.2",
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -32,6 +33,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -82,7 +84,7 @@
|
||||||
"statPrefix": "upstream.tcp.api-app.default.default.dc1"
|
"statPrefix": "upstream.tcp.api-app.default.default.dc1"
|
||||||
},
|
},
|
||||||
"match": {
|
"match": {
|
||||||
"destinationPort": 8080,
|
"destinationPort": 7070,
|
||||||
"prefixRanges": [
|
"prefixRanges": [
|
||||||
{
|
{
|
||||||
"addressPrefix": "1.1.1.1",
|
"addressPrefix": "1.1.1.1",
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -32,6 +33,7 @@
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"dynamic": {
|
"dynamic": {
|
||||||
"config": {
|
"config": {
|
||||||
|
"connectTimeout": "5s",
|
||||||
"disablePanicThreshold": true
|
"disablePanicThreshold": true
|
||||||
},
|
},
|
||||||
"outboundTls": {
|
"outboundTls": {
|
||||||
|
@ -82,7 +84,7 @@
|
||||||
"statPrefix": "upstream.tcp.api-app.default.default.dc1"
|
"statPrefix": "upstream.tcp.api-app.default.default.dc1"
|
||||||
},
|
},
|
||||||
"match": {
|
"match": {
|
||||||
"destinationPort": 8080,
|
"destinationPort": 7070,
|
||||||
"prefixRanges": [
|
"prefixRanges": [
|
||||||
{
|
{
|
||||||
"addressPrefix": "1.1.1.1",
|
"addressPrefix": "1.1.1.1",
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
"local_app:port1": {
|
"local_app:port1": {
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"static": {}
|
"static": {}
|
||||||
}
|
},
|
||||||
|
"name": "local_app:port1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"endpoints": {
|
"endpoints": {
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
"local_app:port1": {
|
"local_app:port1": {
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"static": {}
|
"static": {}
|
||||||
}
|
},
|
||||||
|
"name": "local_app:port1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"endpoints": {
|
"endpoints": {
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
"local_app:port1": {
|
"local_app:port1": {
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"static": {}
|
"static": {}
|
||||||
}
|
},
|
||||||
|
"name": "local_app:port1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"endpoints": {
|
"endpoints": {
|
||||||
|
|
|
@ -4,12 +4,14 @@
|
||||||
"local_app:admin-port": {
|
"local_app:admin-port": {
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"static": {}
|
"static": {}
|
||||||
}
|
},
|
||||||
|
"name": "local_app:admin-port"
|
||||||
},
|
},
|
||||||
"local_app:api-port": {
|
"local_app:api-port": {
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"static": {}
|
"static": {}
|
||||||
}
|
},
|
||||||
|
"name": "local_app:api-port"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"endpoints": {
|
"endpoints": {
|
||||||
|
|
|
@ -4,12 +4,14 @@
|
||||||
"local_app:admin-port": {
|
"local_app:admin-port": {
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"static": {}
|
"static": {}
|
||||||
}
|
},
|
||||||
|
"name": "local_app:admin-port"
|
||||||
},
|
},
|
||||||
"local_app:api-port": {
|
"local_app:api-port": {
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"static": {}
|
"static": {}
|
||||||
}
|
},
|
||||||
|
"name": "local_app:api-port"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"endpoints": {
|
"endpoints": {
|
||||||
|
|
|
@ -4,12 +4,14 @@
|
||||||
"local_app:admin-port": {
|
"local_app:admin-port": {
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"static": {}
|
"static": {}
|
||||||
}
|
},
|
||||||
|
"name": "local_app:admin-port"
|
||||||
},
|
},
|
||||||
"local_app:api-port": {
|
"local_app:api-port": {
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"static": {}
|
"static": {}
|
||||||
}
|
},
|
||||||
|
"name": "local_app:api-port"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"endpoints": {
|
"endpoints": {
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
"black-hole-cluster": {
|
"black-hole-cluster": {
|
||||||
"endpointGroup": {
|
"endpointGroup": {
|
||||||
"static": {}
|
"static": {}
|
||||||
}
|
},
|
||||||
|
"name": "black-hole-cluster"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"identity": {
|
"identity": {
|
||||||
|
|
|
@ -227,6 +227,7 @@ func (f *Fetcher) FetchExplicitDestinationsData(
|
||||||
continue // the cache is out of sync
|
continue // the cache is out of sync
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: we collect both DIRECT and INDIRECT target information here.
|
||||||
for _, routeTarget := range d.ComputedPortRoutes.Targets {
|
for _, routeTarget := range d.ComputedPortRoutes.Targets {
|
||||||
targetServiceID := resource.IDFromReference(routeTarget.BackendRef.Ref)
|
targetServiceID := resource.IDFromReference(routeTarget.BackendRef.Ref)
|
||||||
|
|
||||||
|
@ -339,6 +340,8 @@ func (f *Fetcher) FetchImplicitDestinationsData(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch the resources that may show up duplicated.
|
// Fetch the resources that may show up duplicated.
|
||||||
|
//
|
||||||
|
// NOTE: we collect both DIRECT and INDIRECT target information here.
|
||||||
endpointsMap := make(map[resource.ReferenceKey]*types.DecodedServiceEndpoints)
|
endpointsMap := make(map[resource.ReferenceKey]*types.DecodedServiceEndpoints)
|
||||||
for _, portConfig := range computedRoutes.Data.PortedConfigs {
|
for _, portConfig := range computedRoutes.Data.PortedConfigs {
|
||||||
for _, routeTarget := range portConfig.Targets {
|
for _, routeTarget := range portConfig.Targets {
|
||||||
|
|
|
@ -781,14 +781,17 @@ func (suite *dataFetcherSuite) TestFetcher_FetchExplicitDestinationsData() {
|
||||||
{
|
{
|
||||||
Explicit: suite.webDestinationsData.Upstreams[0],
|
Explicit: suite.webDestinationsData.Upstreams[0],
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api1Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api1Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(suite.T(), api1ComputedRoutes.Data.PortedConfigs["tcp"], suite.api1Service.Id, "tcp", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(suite.T(), api1ComputedRoutes.Data, "tcp", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api1ServiceEndpoints)
|
switch {
|
||||||
details.ServiceEndpointsId = se.Resource.Id
|
case resource.ReferenceOrIDMatch(suite.api1Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp":
|
||||||
details.ServiceEndpoints = se.Data
|
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api1ServiceEndpoints)
|
||||||
details.IdentityRefs = []*pbresource.Reference{{
|
details.ServiceEndpointsId = se.Resource.Id
|
||||||
Name: "api-1-identity",
|
details.ServiceEndpoints = se.Data
|
||||||
Tenancy: suite.api1Service.Id.Tenancy,
|
details.IdentityRefs = []*pbresource.Reference{{
|
||||||
}}
|
Name: "api-1-identity",
|
||||||
|
Tenancy: suite.api1Service.Id.Tenancy,
|
||||||
|
}}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -820,40 +823,49 @@ func (suite *dataFetcherSuite) TestFetcher_FetchExplicitDestinationsData() {
|
||||||
{
|
{
|
||||||
Explicit: suite.webDestinationsData.Upstreams[0],
|
Explicit: suite.webDestinationsData.Upstreams[0],
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api1Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api1Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(suite.T(), api1ComputedRoutes.Data.PortedConfigs["tcp"], suite.api1Service.Id, "tcp", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(suite.T(), api1ComputedRoutes.Data, "tcp", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api1ServiceEndpoints)
|
switch {
|
||||||
details.ServiceEndpointsId = se.Resource.Id
|
case resource.ReferenceOrIDMatch(suite.api1Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp":
|
||||||
details.ServiceEndpoints = se.Data
|
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api1ServiceEndpoints)
|
||||||
details.IdentityRefs = []*pbresource.Reference{{
|
details.ServiceEndpointsId = se.Resource.Id
|
||||||
Name: "api-1-identity",
|
details.ServiceEndpoints = se.Data
|
||||||
Tenancy: suite.api1Service.Id.Tenancy,
|
details.IdentityRefs = []*pbresource.Reference{{
|
||||||
}}
|
Name: "api-1-identity",
|
||||||
|
Tenancy: suite.api1Service.Id.Tenancy,
|
||||||
|
}}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Explicit: suite.webDestinationsData.Upstreams[1],
|
Explicit: suite.webDestinationsData.Upstreams[1],
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api2Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api2Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(suite.T(), api2ComputedRoutes.Data.PortedConfigs["tcp1"], suite.api2Service.Id, "tcp1", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(suite.T(), api2ComputedRoutes.Data, "tcp1", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api2ServiceEndpoints)
|
switch {
|
||||||
details.ServiceEndpointsId = se.Resource.Id
|
case resource.ReferenceOrIDMatch(suite.api2Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp1":
|
||||||
details.ServiceEndpoints = se.Data
|
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api2ServiceEndpoints)
|
||||||
details.IdentityRefs = []*pbresource.Reference{{
|
details.ServiceEndpointsId = se.Resource.Id
|
||||||
Name: "api-2-identity",
|
details.ServiceEndpoints = se.Data
|
||||||
Tenancy: suite.api2Service.Id.Tenancy,
|
details.IdentityRefs = []*pbresource.Reference{{
|
||||||
}}
|
Name: "api-2-identity",
|
||||||
|
Tenancy: suite.api2Service.Id.Tenancy,
|
||||||
|
}}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Explicit: suite.webDestinationsData.Upstreams[2],
|
Explicit: suite.webDestinationsData.Upstreams[2],
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api2Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api2Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(suite.T(), api2ComputedRoutes.Data.PortedConfigs["tcp2"], suite.api2Service.Id, "tcp2", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(suite.T(), api2ComputedRoutes.Data, "tcp2", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api2ServiceEndpoints)
|
switch {
|
||||||
details.ServiceEndpointsId = se.Resource.Id
|
case resource.ReferenceOrIDMatch(suite.api2Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp2":
|
||||||
details.ServiceEndpoints = se.Data
|
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api2ServiceEndpoints)
|
||||||
details.IdentityRefs = []*pbresource.Reference{{
|
details.ServiceEndpointsId = se.Resource.Id
|
||||||
Name: "api-2-identity",
|
details.ServiceEndpoints = se.Data
|
||||||
Tenancy: suite.api2Service.Id.Tenancy,
|
details.IdentityRefs = []*pbresource.Reference{{
|
||||||
}}
|
Name: "api-2-identity",
|
||||||
|
Tenancy: suite.api2Service.Id.Tenancy,
|
||||||
|
}}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -937,53 +949,65 @@ func (suite *dataFetcherSuite) TestFetcher_FetchImplicitDestinationsData() {
|
||||||
{
|
{
|
||||||
Explicit: suite.webDestinationsData.Upstreams[0],
|
Explicit: suite.webDestinationsData.Upstreams[0],
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api1Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api1Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(suite.T(), api1ComputedRoutes.Data.PortedConfigs["tcp"], suite.api1Service.Id, "tcp", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(suite.T(), api1ComputedRoutes.Data, "tcp", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api1ServiceEndpoints)
|
switch {
|
||||||
details.ServiceEndpointsId = se.Resource.Id
|
case resource.ReferenceOrIDMatch(suite.api1Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp":
|
||||||
details.ServiceEndpoints = se.Data
|
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api1ServiceEndpoints)
|
||||||
details.IdentityRefs = []*pbresource.Reference{{
|
details.ServiceEndpointsId = se.Resource.Id
|
||||||
Name: "api-1-identity",
|
details.ServiceEndpoints = se.Data
|
||||||
Tenancy: suite.api1Service.Id.Tenancy,
|
details.IdentityRefs = []*pbresource.Reference{{
|
||||||
}}
|
Name: "api-1-identity",
|
||||||
|
Tenancy: suite.api1Service.Id.Tenancy,
|
||||||
|
}}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Explicit: suite.webDestinationsData.Upstreams[1],
|
Explicit: suite.webDestinationsData.Upstreams[1],
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api2Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api2Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(suite.T(), api2ComputedRoutes.Data.PortedConfigs["tcp1"], suite.api2Service.Id, "tcp1", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(suite.T(), api2ComputedRoutes.Data, "tcp1", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api2ServiceEndpoints)
|
switch {
|
||||||
details.ServiceEndpointsId = se.Resource.Id
|
case resource.ReferenceOrIDMatch(suite.api2Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp1":
|
||||||
details.ServiceEndpoints = se.Data
|
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api2ServiceEndpoints)
|
||||||
details.IdentityRefs = []*pbresource.Reference{{
|
details.ServiceEndpointsId = se.Resource.Id
|
||||||
Name: "api-2-identity",
|
details.ServiceEndpoints = se.Data
|
||||||
Tenancy: suite.api2Service.Id.Tenancy,
|
details.IdentityRefs = []*pbresource.Reference{{
|
||||||
}}
|
Name: "api-2-identity",
|
||||||
|
Tenancy: suite.api1Service.Id.Tenancy,
|
||||||
|
}}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Explicit: suite.webDestinationsData.Upstreams[2],
|
Explicit: suite.webDestinationsData.Upstreams[2],
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api2Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), suite.api2Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(suite.T(), api2ComputedRoutes.Data.PortedConfigs["tcp2"], suite.api2Service.Id, "tcp2", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(suite.T(), api2ComputedRoutes.Data, "tcp2", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api2ServiceEndpoints)
|
switch {
|
||||||
details.ServiceEndpointsId = se.Resource.Id
|
case resource.ReferenceOrIDMatch(suite.api2Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp2":
|
||||||
details.ServiceEndpoints = se.Data
|
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), suite.api2ServiceEndpoints)
|
||||||
details.IdentityRefs = []*pbresource.Reference{{
|
details.ServiceEndpointsId = se.Resource.Id
|
||||||
Name: "api-2-identity",
|
details.ServiceEndpoints = se.Data
|
||||||
Tenancy: suite.api2Service.Id.Tenancy,
|
details.IdentityRefs = []*pbresource.Reference{{
|
||||||
}}
|
Name: "api-2-identity",
|
||||||
|
Tenancy: suite.api1Service.Id.Tenancy,
|
||||||
|
}}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// implicit
|
// implicit
|
||||||
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), api3Service),
|
Service: resourcetest.MustDecode[*pbcatalog.Service](suite.T(), api3Service),
|
||||||
ComputedPortRoutes: routestest.MutateTarget(suite.T(), api3ComputedRoutes.Data.PortedConfigs["tcp"], api3Service.Id, "tcp", func(details *pbmesh.BackendTargetDetails) {
|
ComputedPortRoutes: routestest.MutateTargets(suite.T(), api3ComputedRoutes.Data, "tcp", func(t *testing.T, details *pbmesh.BackendTargetDetails) {
|
||||||
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), api3ServiceEndpoints)
|
switch {
|
||||||
details.ServiceEndpointsId = se.Resource.Id
|
case resource.ReferenceOrIDMatch(api3Service.Id, details.BackendRef.Ref) && details.BackendRef.Port == "tcp":
|
||||||
details.ServiceEndpoints = se.Data
|
se := resourcetest.MustDecode[*pbcatalog.ServiceEndpoints](suite.T(), api3ServiceEndpoints)
|
||||||
details.IdentityRefs = []*pbresource.Reference{{
|
details.ServiceEndpointsId = se.Resource.Id
|
||||||
Name: "api-3-identity",
|
details.ServiceEndpoints = se.Data
|
||||||
Tenancy: api3Service.Id.Tenancy,
|
details.IdentityRefs = []*pbresource.Reference{{
|
||||||
}}
|
Name: "api-3-identity",
|
||||||
|
Tenancy: suite.api1Service.Id.Tenancy,
|
||||||
|
}}
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
VirtualIPs: []string{"192.1.1.1"},
|
VirtualIPs: []string{"192.1.1.1"},
|
||||||
},
|
},
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
package types
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/hashicorp/go-multierror"
|
"github.com/hashicorp/go-multierror"
|
||||||
|
@ -82,6 +83,34 @@ func ValidateComputedRoutes(res *pbresource.Resource) error {
|
||||||
Wrapped: err,
|
Wrapped: err,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch target.Type {
|
||||||
|
case pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_UNSPECIFIED:
|
||||||
|
merr = multierror.Append(merr, wrapTargetErr(
|
||||||
|
resource.ErrInvalidField{
|
||||||
|
Name: "type",
|
||||||
|
Wrapped: resource.ErrMissing,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
case pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT:
|
||||||
|
case pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_INDIRECT:
|
||||||
|
if target.FailoverConfig != nil {
|
||||||
|
merr = multierror.Append(merr, wrapTargetErr(
|
||||||
|
resource.ErrInvalidField{
|
||||||
|
Name: "failover_config",
|
||||||
|
Wrapped: errors.New("failover_config not supported for type = INDIRECT"),
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
merr = multierror.Append(merr, wrapTargetErr(
|
||||||
|
resource.ErrInvalidField{
|
||||||
|
Name: "type",
|
||||||
|
Wrapped: fmt.Errorf("not a supported enum value: %v", target.Type),
|
||||||
|
},
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
if target.MeshPort == "" {
|
if target.MeshPort == "" {
|
||||||
merr = multierror.Append(merr, wrapTargetErr(resource.ErrInvalidField{
|
merr = multierror.Append(merr, wrapTargetErr(resource.ErrInvalidField{
|
||||||
Name: "mesh_port",
|
Name: "mesh_port",
|
||||||
|
|
|
@ -64,6 +64,7 @@ func TestValidateComputedRoutes(t *testing.T) {
|
||||||
},
|
},
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
"foo": {
|
"foo": {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "",
|
MeshPort: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -72,6 +73,60 @@ func TestValidateComputedRoutes(t *testing.T) {
|
||||||
},
|
},
|
||||||
expectErr: `invalid value of key "http" within ported_configs: invalid value of key "foo" within targets: invalid "mesh_port" field: cannot be empty`,
|
expectErr: `invalid value of key "http" within ported_configs: invalid value of key "foo" within targets: invalid "mesh_port" field: cannot be empty`,
|
||||||
},
|
},
|
||||||
|
"target/missing type": {
|
||||||
|
routes: &pbmesh.ComputedRoutes{
|
||||||
|
PortedConfigs: map[string]*pbmesh.ComputedPortRoutes{
|
||||||
|
"http": {
|
||||||
|
Config: &pbmesh.ComputedPortRoutes_Tcp{
|
||||||
|
Tcp: &pbmesh.ComputedTCPRoute{},
|
||||||
|
},
|
||||||
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
|
"foo": {
|
||||||
|
MeshPort: "mesh",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectErr: `invalid value of key "http" within ported_configs: invalid value of key "foo" within targets: invalid "type" field: missing required field`,
|
||||||
|
},
|
||||||
|
"target/bad type": {
|
||||||
|
routes: &pbmesh.ComputedRoutes{
|
||||||
|
PortedConfigs: map[string]*pbmesh.ComputedPortRoutes{
|
||||||
|
"http": {
|
||||||
|
Config: &pbmesh.ComputedPortRoutes_Tcp{
|
||||||
|
Tcp: &pbmesh.ComputedTCPRoute{},
|
||||||
|
},
|
||||||
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
|
"foo": {
|
||||||
|
Type: 99,
|
||||||
|
MeshPort: "mesh",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectErr: `invalid value of key "http" within ported_configs: invalid value of key "foo" within targets: invalid "type" field: not a supported enum value: 99`,
|
||||||
|
},
|
||||||
|
"target/indirect cannot have failover": {
|
||||||
|
routes: &pbmesh.ComputedRoutes{
|
||||||
|
PortedConfigs: map[string]*pbmesh.ComputedPortRoutes{
|
||||||
|
"http": {
|
||||||
|
Config: &pbmesh.ComputedPortRoutes_Tcp{
|
||||||
|
Tcp: &pbmesh.ComputedTCPRoute{},
|
||||||
|
},
|
||||||
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
|
"foo": {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_INDIRECT,
|
||||||
|
MeshPort: "mesh",
|
||||||
|
FailoverConfig: &pbmesh.ComputedFailoverConfig{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectErr: `invalid value of key "http" within ported_configs: invalid value of key "foo" within targets: invalid "failover_config" field: failover_config not supported for type = INDIRECT`,
|
||||||
|
},
|
||||||
"target/should not have service endpoints id": {
|
"target/should not have service endpoints id": {
|
||||||
routes: &pbmesh.ComputedRoutes{
|
routes: &pbmesh.ComputedRoutes{
|
||||||
PortedConfigs: map[string]*pbmesh.ComputedPortRoutes{
|
PortedConfigs: map[string]*pbmesh.ComputedPortRoutes{
|
||||||
|
@ -81,6 +136,7 @@ func TestValidateComputedRoutes(t *testing.T) {
|
||||||
},
|
},
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
"foo": {
|
"foo": {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
ServiceEndpointsId: &pbresource.ID{},
|
ServiceEndpointsId: &pbresource.ID{},
|
||||||
},
|
},
|
||||||
|
@ -99,6 +155,7 @@ func TestValidateComputedRoutes(t *testing.T) {
|
||||||
},
|
},
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
"foo": {
|
"foo": {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
ServiceEndpoints: &pbcatalog.ServiceEndpoints{},
|
ServiceEndpoints: &pbcatalog.ServiceEndpoints{},
|
||||||
},
|
},
|
||||||
|
@ -117,6 +174,7 @@ func TestValidateComputedRoutes(t *testing.T) {
|
||||||
},
|
},
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
"foo": {
|
"foo": {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
IdentityRefs: []*pbresource.Reference{
|
IdentityRefs: []*pbresource.Reference{
|
||||||
{},
|
{},
|
||||||
|
@ -137,6 +195,7 @@ func TestValidateComputedRoutes(t *testing.T) {
|
||||||
},
|
},
|
||||||
Targets: map[string]*pbmesh.BackendTargetDetails{
|
Targets: map[string]*pbmesh.BackendTargetDetails{
|
||||||
"foo": {
|
"foo": {
|
||||||
|
Type: pbmesh.BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT,
|
||||||
MeshPort: "mesh",
|
MeshPort: "mesh",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -124,6 +124,7 @@ func ValidateHTTPRoute(res *pbresource.Resource) error {
|
||||||
Wrapped: err,
|
Wrapped: err,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// enumcover:pbmesh.PathMatchType
|
||||||
switch match.Path.Type {
|
switch match.Path.Type {
|
||||||
case pbmesh.PathMatchType_PATH_MATCH_TYPE_UNSPECIFIED:
|
case pbmesh.PathMatchType_PATH_MATCH_TYPE_UNSPECIFIED:
|
||||||
merr = multierror.Append(merr, wrapMatchPathErr(
|
merr = multierror.Append(merr, wrapMatchPathErr(
|
||||||
|
@ -150,6 +151,15 @@ func ValidateHTTPRoute(res *pbresource.Resource) error {
|
||||||
},
|
},
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
case pbmesh.PathMatchType_PATH_MATCH_TYPE_REGEX:
|
||||||
|
if match.Path.Value == "" {
|
||||||
|
merr = multierror.Append(merr, wrapMatchPathErr(
|
||||||
|
resource.ErrInvalidField{
|
||||||
|
Name: "value",
|
||||||
|
Wrapped: resource.ErrEmpty,
|
||||||
|
},
|
||||||
|
))
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
merr = multierror.Append(merr, wrapMatchPathErr(
|
merr = multierror.Append(merr, wrapMatchPathErr(
|
||||||
resource.ErrInvalidField{
|
resource.ErrInvalidField{
|
||||||
|
@ -197,6 +207,7 @@ func ValidateHTTPRoute(res *pbresource.Resource) error {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// enumcover:pbmesh.QueryParamMatchType
|
||||||
switch qm.Type {
|
switch qm.Type {
|
||||||
case pbmesh.QueryParamMatchType_QUERY_PARAM_MATCH_TYPE_UNSPECIFIED:
|
case pbmesh.QueryParamMatchType_QUERY_PARAM_MATCH_TYPE_UNSPECIFIED:
|
||||||
merr = multierror.Append(merr, wrapMatchParamErr(
|
merr = multierror.Append(merr, wrapMatchParamErr(
|
||||||
|
|
|
@ -385,6 +385,43 @@ func TestValidateHTTPRoute(t *testing.T) {
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"regex empty path match is bad": {
|
||||||
|
route: &pbmesh.HTTPRoute{
|
||||||
|
ParentRefs: []*pbmesh.ParentReference{
|
||||||
|
newParentRef(catalog.ServiceType, "web", ""),
|
||||||
|
},
|
||||||
|
Rules: []*pbmesh.HTTPRouteRule{{
|
||||||
|
Matches: []*pbmesh.HTTPRouteMatch{{
|
||||||
|
Path: &pbmesh.HTTPPathMatch{
|
||||||
|
Type: pbmesh.PathMatchType_PATH_MATCH_TYPE_REGEX,
|
||||||
|
Value: "",
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
BackendRefs: []*pbmesh.HTTPBackendRef{{
|
||||||
|
BackendRef: newBackendRef(catalog.ServiceType, "api", ""),
|
||||||
|
}},
|
||||||
|
}},
|
||||||
|
},
|
||||||
|
expectErr: `invalid element at index 0 of list "rules": invalid element at index 0 of list "matches": invalid "path" field: invalid "value" field: cannot be empty`,
|
||||||
|
},
|
||||||
|
"regex path match is good": {
|
||||||
|
route: &pbmesh.HTTPRoute{
|
||||||
|
ParentRefs: []*pbmesh.ParentReference{
|
||||||
|
newParentRef(catalog.ServiceType, "web", ""),
|
||||||
|
},
|
||||||
|
Rules: []*pbmesh.HTTPRouteRule{{
|
||||||
|
Matches: []*pbmesh.HTTPRouteMatch{{
|
||||||
|
Path: &pbmesh.HTTPPathMatch{
|
||||||
|
Type: pbmesh.PathMatchType_PATH_MATCH_TYPE_REGEX,
|
||||||
|
Value: "/[^/]+/healthz",
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
BackendRefs: []*pbmesh.HTTPBackendRef{{
|
||||||
|
BackendRef: newBackendRef(catalog.ServiceType, "api", ""),
|
||||||
|
}},
|
||||||
|
}},
|
||||||
|
},
|
||||||
|
},
|
||||||
"header match with no type is bad": {
|
"header match with no type is bad": {
|
||||||
route: &pbmesh.HTTPRoute{
|
route: &pbmesh.HTTPRoute{
|
||||||
ParentRefs: []*pbmesh.ParentReference{
|
ParentRefs: []*pbmesh.ParentReference{
|
||||||
|
|
|
@ -4,9 +4,14 @@
|
||||||
package types
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/hashicorp/go-multierror"
|
||||||
|
|
||||||
"github.com/hashicorp/consul/acl"
|
"github.com/hashicorp/consul/acl"
|
||||||
"github.com/hashicorp/consul/internal/resource"
|
"github.com/hashicorp/consul/internal/resource"
|
||||||
pbmesh "github.com/hashicorp/consul/proto-public/pbmesh/v1alpha1"
|
pbmesh "github.com/hashicorp/consul/proto-public/pbmesh/v1alpha1"
|
||||||
|
"github.com/hashicorp/consul/proto-public/pbmesh/v1alpha1/pbproxystate"
|
||||||
"github.com/hashicorp/consul/proto-public/pbresource"
|
"github.com/hashicorp/consul/proto-public/pbresource"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -29,7 +34,7 @@ func RegisterProxyStateTemplate(r resource.Registry) {
|
||||||
Type: ProxyStateTemplateV1Alpha1Type,
|
Type: ProxyStateTemplateV1Alpha1Type,
|
||||||
Proto: &pbmesh.ProxyStateTemplate{},
|
Proto: &pbmesh.ProxyStateTemplate{},
|
||||||
Scope: resource.ScopeNamespace,
|
Scope: resource.ScopeNamespace,
|
||||||
Validate: nil,
|
Validate: ValidateProxyStateTemplate,
|
||||||
ACLs: &resource.ACLHooks{
|
ACLs: &resource.ACLHooks{
|
||||||
Read: func(authorizer acl.Authorizer, authzContext *acl.AuthorizerContext, id *pbresource.ID) error {
|
Read: func(authorizer acl.Authorizer, authzContext *acl.AuthorizerContext, id *pbresource.ID) error {
|
||||||
// Check service:read and operator:read permissions.
|
// Check service:read and operator:read permissions.
|
||||||
|
@ -61,3 +66,136 @@ func RegisterProxyStateTemplate(r resource.Registry) {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ValidateProxyStateTemplate(res *pbresource.Resource) error {
|
||||||
|
// TODO(v2): validate a lot more of this
|
||||||
|
|
||||||
|
var pst pbmesh.ProxyStateTemplate
|
||||||
|
|
||||||
|
if err := res.Data.UnmarshalTo(&pst); err != nil {
|
||||||
|
return resource.NewErrDataParse(&pst, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var merr error
|
||||||
|
|
||||||
|
if pst.ProxyState != nil {
|
||||||
|
wrapProxyStateErr := func(err error) error {
|
||||||
|
return resource.ErrInvalidField{
|
||||||
|
Name: "proxy_state",
|
||||||
|
Wrapped: err,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for name, cluster := range pst.ProxyState.Clusters {
|
||||||
|
if name == "" {
|
||||||
|
merr = multierror.Append(merr, wrapProxyStateErr(resource.ErrInvalidMapKey{
|
||||||
|
Map: "clusters",
|
||||||
|
Key: name,
|
||||||
|
Wrapped: resource.ErrEmpty,
|
||||||
|
}))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
wrapClusterErr := func(err error) error {
|
||||||
|
return wrapProxyStateErr(resource.ErrInvalidMapValue{
|
||||||
|
Map: "clusters",
|
||||||
|
Key: name,
|
||||||
|
Wrapped: err,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if name != cluster.Name {
|
||||||
|
merr = multierror.Append(merr, wrapClusterErr(resource.ErrInvalidField{
|
||||||
|
Name: "name",
|
||||||
|
Wrapped: fmt.Errorf("cluster name %q does not match map key %q", cluster.Name, name),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
wrapGroupErr := func(err error) error {
|
||||||
|
return wrapClusterErr(resource.ErrInvalidField{
|
||||||
|
Name: "group",
|
||||||
|
Wrapped: err,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if cluster.Group == nil {
|
||||||
|
merr = multierror.Append(merr, wrapGroupErr(resource.ErrMissing))
|
||||||
|
} else {
|
||||||
|
switch x := cluster.Group.(type) {
|
||||||
|
case *pbproxystate.Cluster_EndpointGroup:
|
||||||
|
wrapInnerGroupErr := func(err error) error {
|
||||||
|
return wrapGroupErr(resource.ErrInvalidField{
|
||||||
|
Name: "endpoint_group",
|
||||||
|
Wrapped: err,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if x.EndpointGroup == nil {
|
||||||
|
merr = multierror.Append(merr, wrapInnerGroupErr(resource.ErrMissing))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// The inner name field is optional, but if specified it has to
|
||||||
|
// match the enclosing cluster.
|
||||||
|
|
||||||
|
if x.EndpointGroup.Name != "" && x.EndpointGroup.Name != cluster.Name {
|
||||||
|
merr = multierror.Append(merr, wrapInnerGroupErr(resource.ErrInvalidField{
|
||||||
|
Name: "name",
|
||||||
|
Wrapped: fmt.Errorf("optional but %q does not match enclosing cluster name %q",
|
||||||
|
x.EndpointGroup.Name, cluster.Name),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
case *pbproxystate.Cluster_FailoverGroup:
|
||||||
|
wrapInnerGroupErr := func(err error) error {
|
||||||
|
return wrapGroupErr(resource.ErrInvalidField{
|
||||||
|
Name: "failover_group",
|
||||||
|
Wrapped: err,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if x.FailoverGroup == nil {
|
||||||
|
merr = multierror.Append(merr, wrapInnerGroupErr(resource.ErrMissing))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(x.FailoverGroup.EndpointGroups) == 0 {
|
||||||
|
merr = multierror.Append(merr, wrapInnerGroupErr(resource.ErrInvalidField{
|
||||||
|
Name: "endpoint_groups",
|
||||||
|
Wrapped: resource.ErrEmpty,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, eg := range x.FailoverGroup.EndpointGroups {
|
||||||
|
wrapFailoverEndpointGroupErr := func(err error) error {
|
||||||
|
return wrapInnerGroupErr(resource.ErrInvalidListElement{
|
||||||
|
Name: "endpoint_groups",
|
||||||
|
Index: i,
|
||||||
|
Wrapped: err,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// The inner name field is required and cannot match the enclosing cluster.
|
||||||
|
switch {
|
||||||
|
case eg.Name == "":
|
||||||
|
merr = multierror.Append(merr, wrapFailoverEndpointGroupErr(resource.ErrInvalidField{
|
||||||
|
Name: "name",
|
||||||
|
Wrapped: resource.ErrEmpty,
|
||||||
|
}))
|
||||||
|
case eg.Name == cluster.Name:
|
||||||
|
merr = multierror.Append(merr, wrapFailoverEndpointGroupErr(resource.ErrInvalidField{
|
||||||
|
Name: "name",
|
||||||
|
Wrapped: fmt.Errorf(
|
||||||
|
"name cannot be the same as the enclosing cluster %q",
|
||||||
|
eg.Name,
|
||||||
|
),
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
merr = multierror.Append(merr, wrapGroupErr(fmt.Errorf("unknown type: %T", cluster.Group)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return merr
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,169 @@
|
||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: BUSL-1.1
|
||||||
|
|
||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/hashicorp/consul/internal/resource/resourcetest"
|
||||||
|
pbmesh "github.com/hashicorp/consul/proto-public/pbmesh/v1alpha1"
|
||||||
|
"github.com/hashicorp/consul/proto-public/pbmesh/v1alpha1/pbproxystate"
|
||||||
|
"github.com/hashicorp/consul/proto/private/prototest"
|
||||||
|
"github.com/hashicorp/consul/sdk/testutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestValidateProxyStateTemplate(t *testing.T) {
|
||||||
|
type testcase struct {
|
||||||
|
pst *pbmesh.ProxyStateTemplate
|
||||||
|
expectErr string
|
||||||
|
}
|
||||||
|
|
||||||
|
run := func(t *testing.T, tc testcase) {
|
||||||
|
res := resourcetest.Resource(ProxyStateTemplateType, "api").
|
||||||
|
WithData(t, tc.pst).
|
||||||
|
Build()
|
||||||
|
|
||||||
|
err := ValidateProxyStateTemplate(res)
|
||||||
|
|
||||||
|
// Verify that validate didn't actually change the object.
|
||||||
|
got := resourcetest.MustDecode[*pbmesh.ProxyStateTemplate](t, res)
|
||||||
|
prototest.AssertDeepEqual(t, tc.pst, got.Data)
|
||||||
|
|
||||||
|
if tc.expectErr == "" {
|
||||||
|
require.NoError(t, err)
|
||||||
|
} else {
|
||||||
|
testutil.RequireErrorContains(t, err, tc.expectErr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pstForCluster := func(name string, cluster *pbproxystate.Cluster) *pbmesh.ProxyStateTemplate {
|
||||||
|
return &pbmesh.ProxyStateTemplate{
|
||||||
|
ProxyState: &pbmesh.ProxyState{
|
||||||
|
Clusters: map[string]*pbproxystate.Cluster{
|
||||||
|
name: cluster,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clusterForGroups := func(name string, groups ...*pbproxystate.EndpointGroup) *pbproxystate.Cluster {
|
||||||
|
cluster := &pbproxystate.Cluster{
|
||||||
|
Name: name,
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NotEmpty(t, groups)
|
||||||
|
|
||||||
|
if len(groups) == 1 {
|
||||||
|
cluster.Group = &pbproxystate.Cluster_EndpointGroup{
|
||||||
|
EndpointGroup: groups[0],
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cluster.Group = &pbproxystate.Cluster_FailoverGroup{
|
||||||
|
FailoverGroup: &pbproxystate.FailoverGroup{
|
||||||
|
EndpointGroups: groups,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cluster
|
||||||
|
}
|
||||||
|
|
||||||
|
endpointGroup := func(name string) *pbproxystate.EndpointGroup {
|
||||||
|
return &pbproxystate.EndpointGroup{
|
||||||
|
Name: name,
|
||||||
|
Group: &pbproxystate.EndpointGroup_Dynamic{
|
||||||
|
Dynamic: &pbproxystate.DynamicEndpointGroup{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// also cover clusters with names that don't match the map key
|
||||||
|
// also empty map keys
|
||||||
|
cases := map[string]testcase{
|
||||||
|
// ============== COMMON ==============
|
||||||
|
"cluster with missing cluster group": {
|
||||||
|
pst: pstForCluster("api-cluster", &pbproxystate.Cluster{
|
||||||
|
Name: "api-cluster",
|
||||||
|
}),
|
||||||
|
expectErr: `invalid "proxy_state" field: invalid value of key "api-cluster" within clusters: invalid "group" field: missing required field`,
|
||||||
|
},
|
||||||
|
// ============== STANDARD ==============
|
||||||
|
"standard cluster with empty map key": {
|
||||||
|
pst: pstForCluster("", clusterForGroups("api-cluster",
|
||||||
|
endpointGroup(""),
|
||||||
|
)),
|
||||||
|
expectErr: `invalid "proxy_state" field: map clusters contains an invalid key - "": cannot be empty`,
|
||||||
|
},
|
||||||
|
"standard cluster with missing cluster name": {
|
||||||
|
pst: pstForCluster("api-cluster", clusterForGroups("",
|
||||||
|
endpointGroup(""),
|
||||||
|
)),
|
||||||
|
expectErr: `invalid "proxy_state" field: invalid value of key "api-cluster" within clusters: invalid "name" field: cluster name "" does not match map key "api-cluster"`,
|
||||||
|
},
|
||||||
|
"standard cluster with empty endpoint group name": {
|
||||||
|
pst: pstForCluster("api-cluster", clusterForGroups("api-cluster",
|
||||||
|
endpointGroup(""),
|
||||||
|
)),
|
||||||
|
},
|
||||||
|
"standard cluster with same endpoint group name": {
|
||||||
|
pst: pstForCluster("api-cluster", clusterForGroups("api-cluster",
|
||||||
|
endpointGroup("api-cluster"),
|
||||||
|
)),
|
||||||
|
},
|
||||||
|
"standard cluster with different endpoint group name": {
|
||||||
|
pst: pstForCluster("api-cluster", clusterForGroups("api-cluster",
|
||||||
|
endpointGroup("garbage"),
|
||||||
|
)),
|
||||||
|
expectErr: `invalid "proxy_state" field: invalid value of key "api-cluster" within clusters: invalid "group" field: invalid "endpoint_group" field: invalid "name" field: optional but "garbage" does not match enclosing cluster name "api-cluster"`,
|
||||||
|
},
|
||||||
|
// ============== FAILOVER ==============
|
||||||
|
"failover cluster with empty map key": {
|
||||||
|
pst: pstForCluster("", clusterForGroups("api-cluster",
|
||||||
|
endpointGroup("api-cluster~0"),
|
||||||
|
endpointGroup("api-cluster~1"),
|
||||||
|
)),
|
||||||
|
expectErr: `invalid "proxy_state" field: map clusters contains an invalid key - "": cannot be empty`,
|
||||||
|
},
|
||||||
|
"failover cluster with missing cluster name": {
|
||||||
|
pst: pstForCluster("api-cluster", clusterForGroups("",
|
||||||
|
endpointGroup("api-cluster~0"),
|
||||||
|
endpointGroup("api-cluster~1"),
|
||||||
|
)),
|
||||||
|
expectErr: `invalid "proxy_state" field: invalid value of key "api-cluster" within clusters: invalid "name" field: cluster name "" does not match map key "api-cluster"`,
|
||||||
|
},
|
||||||
|
"failover cluster with empty endpoint group name": {
|
||||||
|
pst: pstForCluster("api-cluster", clusterForGroups("api-cluster",
|
||||||
|
endpointGroup("api-cluster~0"),
|
||||||
|
endpointGroup(""),
|
||||||
|
)),
|
||||||
|
expectErr: `invalid "proxy_state" field: invalid value of key "api-cluster" within clusters: invalid "group" field: invalid "failover_group" field: invalid element at index 1 of list "endpoint_groups": invalid "name" field: cannot be empty`,
|
||||||
|
},
|
||||||
|
"failover cluster with same endpoint group name": {
|
||||||
|
pst: pstForCluster("api-cluster", clusterForGroups("api-cluster",
|
||||||
|
endpointGroup("api-cluster~0"),
|
||||||
|
endpointGroup("api-cluster"),
|
||||||
|
)),
|
||||||
|
expectErr: `invalid "proxy_state" field: invalid value of key "api-cluster" within clusters: invalid "group" field: invalid "failover_group" field: invalid element at index 1 of list "endpoint_groups": invalid "name" field: name cannot be the same as the enclosing cluster "api-cluster"`,
|
||||||
|
},
|
||||||
|
"failover cluster with no groups": {
|
||||||
|
pst: pstForCluster("api-cluster", &pbproxystate.Cluster{
|
||||||
|
Name: "api-cluster",
|
||||||
|
Group: &pbproxystate.Cluster_FailoverGroup{
|
||||||
|
FailoverGroup: &pbproxystate.FailoverGroup{
|
||||||
|
EndpointGroups: nil,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
expectErr: `invalid "proxy_state" field: invalid value of key "api-cluster" within clusters: invalid "group" field: invalid "failover_group" field: invalid "endpoint_groups" field: cannot be empty`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, tc := range cases {
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
t.Logf("%+v", tc.pst)
|
||||||
|
run(t, tc)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -190,6 +190,7 @@ func validateBackendRef(backendRef *pbmesh.BackendReference, wrapErr func(error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateHeaderMatchType(typ pbmesh.HeaderMatchType) error {
|
func validateHeaderMatchType(typ pbmesh.HeaderMatchType) error {
|
||||||
|
// enumcover:pbmesh.HeaderMatchType
|
||||||
switch typ {
|
switch typ {
|
||||||
case pbmesh.HeaderMatchType_HEADER_MATCH_TYPE_UNSPECIFIED:
|
case pbmesh.HeaderMatchType_HEADER_MATCH_TYPE_UNSPECIFIED:
|
||||||
return resource.ErrMissing
|
return resource.ErrMissing
|
||||||
|
|
|
@ -163,6 +163,9 @@ func (b *resourceBuilder) Write(t T, client pbresource.ResourceServiceClient) *p
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotNil(t, rsp)
|
||||||
|
|
||||||
if !b.dontCleanup {
|
if !b.dontCleanup {
|
||||||
id := proto.Clone(rsp.Resource.Id).(*pbresource.ID)
|
id := proto.Clone(rsp.Resource.Id).(*pbresource.ID)
|
||||||
id.Uid = ""
|
id.Uid = ""
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func ValidateAndNormalize(t *testing.T, registry resource.Registry, res *pbresource.Resource) {
|
func ValidateAndNormalize(t *testing.T, registry resource.Registry, res *pbresource.Resource) {
|
||||||
|
t.Helper()
|
||||||
typ := res.Id.Type
|
typ := res.Id.Type
|
||||||
|
|
||||||
typeInfo, ok := registry.Resolve(typ)
|
typeInfo, ok := registry.Resolve(typ)
|
||||||
|
|
|
@ -126,3 +126,23 @@ func (msg *BackendTargetDetails) MarshalBinary() ([]byte, error) {
|
||||||
func (msg *BackendTargetDetails) UnmarshalBinary(b []byte) error {
|
func (msg *BackendTargetDetails) UnmarshalBinary(b []byte) error {
|
||||||
return proto.Unmarshal(b, msg)
|
return proto.Unmarshal(b, msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MarshalBinary implements encoding.BinaryMarshaler
|
||||||
|
func (msg *ComputedFailoverConfig) MarshalBinary() ([]byte, error) {
|
||||||
|
return proto.Marshal(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalBinary implements encoding.BinaryUnmarshaler
|
||||||
|
func (msg *ComputedFailoverConfig) UnmarshalBinary(b []byte) error {
|
||||||
|
return proto.Unmarshal(b, msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalBinary implements encoding.BinaryMarshaler
|
||||||
|
func (msg *ComputedFailoverDestination) MarshalBinary() ([]byte, error) {
|
||||||
|
return proto.Marshal(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalBinary implements encoding.BinaryUnmarshaler
|
||||||
|
func (msg *ComputedFailoverDestination) UnmarshalBinary(b []byte) error {
|
||||||
|
return proto.Unmarshal(b, msg)
|
||||||
|
}
|
||||||
|
|
|
@ -25,6 +25,60 @@ const (
|
||||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type BackendTargetDetailsType int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_UNSPECIFIED BackendTargetDetailsType = 0
|
||||||
|
// Direct means that the target is directly routable from a route. This does
|
||||||
|
// not mean that the target is not also indirect though.
|
||||||
|
BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_DIRECT BackendTargetDetailsType = 1
|
||||||
|
// Indirect means that the target is not directly routable from a route.
|
||||||
|
//
|
||||||
|
// One example would be for a FailoverPolicy destination.
|
||||||
|
BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_INDIRECT BackendTargetDetailsType = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
// Enum value maps for BackendTargetDetailsType.
|
||||||
|
var (
|
||||||
|
BackendTargetDetailsType_name = map[int32]string{
|
||||||
|
0: "BACKEND_TARGET_DETAILS_TYPE_UNSPECIFIED",
|
||||||
|
1: "BACKEND_TARGET_DETAILS_TYPE_DIRECT",
|
||||||
|
2: "BACKEND_TARGET_DETAILS_TYPE_INDIRECT",
|
||||||
|
}
|
||||||
|
BackendTargetDetailsType_value = map[string]int32{
|
||||||
|
"BACKEND_TARGET_DETAILS_TYPE_UNSPECIFIED": 0,
|
||||||
|
"BACKEND_TARGET_DETAILS_TYPE_DIRECT": 1,
|
||||||
|
"BACKEND_TARGET_DETAILS_TYPE_INDIRECT": 2,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (x BackendTargetDetailsType) Enum() *BackendTargetDetailsType {
|
||||||
|
p := new(BackendTargetDetailsType)
|
||||||
|
*p = x
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x BackendTargetDetailsType) String() string {
|
||||||
|
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (BackendTargetDetailsType) Descriptor() protoreflect.EnumDescriptor {
|
||||||
|
return file_pbmesh_v1alpha1_computed_routes_proto_enumTypes[0].Descriptor()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (BackendTargetDetailsType) Type() protoreflect.EnumType {
|
||||||
|
return &file_pbmesh_v1alpha1_computed_routes_proto_enumTypes[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x BackendTargetDetailsType) Number() protoreflect.EnumNumber {
|
||||||
|
return protoreflect.EnumNumber(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use BackendTargetDetailsType.Descriptor instead.
|
||||||
|
func (BackendTargetDetailsType) EnumDescriptor() ([]byte, []int) {
|
||||||
|
return file_pbmesh_v1alpha1_computed_routes_proto_rawDescGZIP(), []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
// This is a Resource type.
|
// This is a Resource type.
|
||||||
type ComputedRoutes struct {
|
type ComputedRoutes struct {
|
||||||
state protoimpl.MessageState
|
state protoimpl.MessageState
|
||||||
|
@ -759,11 +813,11 @@ type BackendTargetDetails struct {
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
// identity info
|
Type BackendTargetDetailsType `protobuf:"varint,1,opt,name=type,proto3,enum=hashicorp.consul.mesh.v1alpha1.BackendTargetDetailsType" json:"type,omitempty"`
|
||||||
BackendRef *BackendReference `protobuf:"bytes,1,opt,name=backend_ref,json=backendRef,proto3" json:"backend_ref,omitempty"`
|
BackendRef *BackendReference `protobuf:"bytes,2,opt,name=backend_ref,json=backendRef,proto3" json:"backend_ref,omitempty"`
|
||||||
MeshPort string `protobuf:"bytes,2,opt,name=mesh_port,json=meshPort,proto3" json:"mesh_port,omitempty"`
|
MeshPort string `protobuf:"bytes,3,opt,name=mesh_port,json=meshPort,proto3" json:"mesh_port,omitempty"`
|
||||||
FailoverConfig *v1alpha1.FailoverConfig `protobuf:"bytes,3,opt,name=failover_config,json=failoverConfig,proto3" json:"failover_config,omitempty"`
|
FailoverConfig *ComputedFailoverConfig `protobuf:"bytes,4,opt,name=failover_config,json=failoverConfig,proto3" json:"failover_config,omitempty"`
|
||||||
DestinationConfig *DestinationConfig `protobuf:"bytes,4,opt,name=destination_config,json=destinationConfig,proto3" json:"destination_config,omitempty"`
|
DestinationConfig *DestinationConfig `protobuf:"bytes,5,opt,name=destination_config,json=destinationConfig,proto3" json:"destination_config,omitempty"`
|
||||||
// ServiceEndpointsID is not populated naturally and the field exists only for
|
// ServiceEndpointsID is not populated naturally and the field exists only for
|
||||||
// downstream consumers.
|
// downstream consumers.
|
||||||
ServiceEndpointsId *pbresource.ID `protobuf:"bytes,21,opt,name=service_endpoints_id,json=serviceEndpointsId,proto3" json:"service_endpoints_id,omitempty"`
|
ServiceEndpointsId *pbresource.ID `protobuf:"bytes,21,opt,name=service_endpoints_id,json=serviceEndpointsId,proto3" json:"service_endpoints_id,omitempty"`
|
||||||
|
@ -807,6 +861,13 @@ func (*BackendTargetDetails) Descriptor() ([]byte, []int) {
|
||||||
return file_pbmesh_v1alpha1_computed_routes_proto_rawDescGZIP(), []int{11}
|
return file_pbmesh_v1alpha1_computed_routes_proto_rawDescGZIP(), []int{11}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *BackendTargetDetails) GetType() BackendTargetDetailsType {
|
||||||
|
if x != nil {
|
||||||
|
return x.Type
|
||||||
|
}
|
||||||
|
return BackendTargetDetailsType_BACKEND_TARGET_DETAILS_TYPE_UNSPECIFIED
|
||||||
|
}
|
||||||
|
|
||||||
func (x *BackendTargetDetails) GetBackendRef() *BackendReference {
|
func (x *BackendTargetDetails) GetBackendRef() *BackendReference {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.BackendRef
|
return x.BackendRef
|
||||||
|
@ -821,7 +882,7 @@ func (x *BackendTargetDetails) GetMeshPort() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *BackendTargetDetails) GetFailoverConfig() *v1alpha1.FailoverConfig {
|
func (x *BackendTargetDetails) GetFailoverConfig() *ComputedFailoverConfig {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.FailoverConfig
|
return x.FailoverConfig
|
||||||
}
|
}
|
||||||
|
@ -856,6 +917,126 @@ func (x *BackendTargetDetails) GetIdentityRefs() []*pbresource.Reference {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ComputedFailoverConfig struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
Destinations []*ComputedFailoverDestination `protobuf:"bytes,1,rep,name=destinations,proto3" json:"destinations,omitempty"`
|
||||||
|
Mode v1alpha1.FailoverMode `protobuf:"varint,2,opt,name=mode,proto3,enum=hashicorp.consul.catalog.v1alpha1.FailoverMode" json:"mode,omitempty"`
|
||||||
|
Regions []string `protobuf:"bytes,3,rep,name=regions,proto3" json:"regions,omitempty"`
|
||||||
|
// SamenessGroup specifies the sameness group to failover to.
|
||||||
|
SamenessGroup string `protobuf:"bytes,4,opt,name=sameness_group,json=samenessGroup,proto3" json:"sameness_group,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ComputedFailoverConfig) Reset() {
|
||||||
|
*x = ComputedFailoverConfig{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_pbmesh_v1alpha1_computed_routes_proto_msgTypes[12]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ComputedFailoverConfig) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*ComputedFailoverConfig) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *ComputedFailoverConfig) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_pbmesh_v1alpha1_computed_routes_proto_msgTypes[12]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use ComputedFailoverConfig.ProtoReflect.Descriptor instead.
|
||||||
|
func (*ComputedFailoverConfig) Descriptor() ([]byte, []int) {
|
||||||
|
return file_pbmesh_v1alpha1_computed_routes_proto_rawDescGZIP(), []int{12}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ComputedFailoverConfig) GetDestinations() []*ComputedFailoverDestination {
|
||||||
|
if x != nil {
|
||||||
|
return x.Destinations
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ComputedFailoverConfig) GetMode() v1alpha1.FailoverMode {
|
||||||
|
if x != nil {
|
||||||
|
return x.Mode
|
||||||
|
}
|
||||||
|
return v1alpha1.FailoverMode(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ComputedFailoverConfig) GetRegions() []string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Regions
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ComputedFailoverConfig) GetSamenessGroup() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.SamenessGroup
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type ComputedFailoverDestination struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// This must be a Service.
|
||||||
|
BackendTarget string `protobuf:"bytes,1,opt,name=backend_target,json=backendTarget,proto3" json:"backend_target,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ComputedFailoverDestination) Reset() {
|
||||||
|
*x = ComputedFailoverDestination{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_pbmesh_v1alpha1_computed_routes_proto_msgTypes[13]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ComputedFailoverDestination) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*ComputedFailoverDestination) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *ComputedFailoverDestination) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_pbmesh_v1alpha1_computed_routes_proto_msgTypes[13]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use ComputedFailoverDestination.ProtoReflect.Descriptor instead.
|
||||||
|
func (*ComputedFailoverDestination) Descriptor() ([]byte, []int) {
|
||||||
|
return file_pbmesh_v1alpha1_computed_routes_proto_rawDescGZIP(), []int{13}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *ComputedFailoverDestination) GetBackendTarget() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.BackendTarget
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
var File_pbmesh_v1alpha1_computed_routes_proto protoreflect.FileDescriptor
|
var File_pbmesh_v1alpha1_computed_routes_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
var file_pbmesh_v1alpha1_computed_routes_proto_rawDesc = []byte{
|
var file_pbmesh_v1alpha1_computed_routes_proto_rawDesc = []byte{
|
||||||
|
@ -1047,62 +1228,98 @@ var file_pbmesh_v1alpha1_computed_routes_proto_rawDesc = []byte{
|
||||||
0x25, 0x0a, 0x0e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65,
|
0x25, 0x0a, 0x0e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65,
|
||||||
0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
|
0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
|
||||||
0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74,
|
0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74,
|
||||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xc8,
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x9b,
|
||||||
0x04, 0x0a, 0x14, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
|
0x05, 0x0a, 0x14, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
|
||||||
0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x51, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x65,
|
0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
|
||||||
0x6e, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68,
|
0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72,
|
||||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31,
|
||||||
0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61,
|
0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x54, 0x61,
|
||||||
0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a,
|
0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52,
|
||||||
0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65,
|
0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x51, 0x0a, 0x0b, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
|
||||||
0x73, 0x68, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d,
|
0x5f, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73,
|
||||||
0x65, 0x73, 0x68, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5a, 0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x6f,
|
0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65,
|
||||||
0x76, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
|
0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b,
|
||||||
0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e,
|
0x65, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x62, 0x61,
|
||||||
0x73, 0x75, 0x6c, 0x2e, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c,
|
0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x73, 0x68,
|
||||||
0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e,
|
0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x73,
|
||||||
0x66, 0x69, 0x67, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e,
|
0x68, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5f, 0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65,
|
||||||
0x66, 0x69, 0x67, 0x12, 0x60, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69,
|
0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36,
|
||||||
0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75,
|
||||||
0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73,
|
0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
|
||||||
0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
|
0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72,
|
||||||
0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66,
|
0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72,
|
||||||
0x69, 0x67, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,
|
0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x60, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e,
|
||||||
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4f, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
|
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01,
|
||||||
0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x15, 0x20,
|
0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63,
|
||||||
0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e,
|
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
|
||||||
0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e,
|
0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,
|
||||||
0x49, 0x44, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f,
|
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69,
|
||||||
0x69, 0x6e, 0x74, 0x73, 0x49, 0x64, 0x12, 0x60, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
|
0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4f, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76,
|
||||||
0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28,
|
0x69, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x69, 0x64,
|
||||||
0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f,
|
0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f,
|
||||||
0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61,
|
0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
|
||||||
0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e, 0x64,
|
0x63, 0x65, 0x2e, 0x49, 0x44, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e,
|
||||||
0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45,
|
0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x49, 0x64, 0x12, 0x60, 0x0a, 0x11, 0x73, 0x65, 0x72,
|
||||||
0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x49, 0x0a, 0x0d, 0x69, 0x64, 0x65, 0x6e,
|
0x76, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x16,
|
||||||
0x74, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x66, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70,
|
||||||
0x24, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73,
|
0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x2e,
|
||||||
0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x66, 0x65,
|
0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
|
||||||
0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52,
|
0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69,
|
||||||
0x65, 0x66, 0x73, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x15, 0x42, 0x9b, 0x02, 0x0a, 0x22, 0x63, 0x6f,
|
0x63, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x49, 0x0a, 0x0d, 0x69,
|
||||||
0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73,
|
0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x66, 0x73, 0x18, 0x17, 0x20, 0x03,
|
||||||
0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
|
0x28, 0x0b, 0x32, 0x24, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63,
|
||||||
0x42, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73,
|
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52,
|
||||||
0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x45, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
|
0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69,
|
||||||
0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f,
|
0x74, 0x79, 0x52, 0x65, 0x66, 0x73, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x15, 0x22, 0xff, 0x01, 0x0a,
|
||||||
0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2d, 0x70, 0x75, 0x62, 0x6c, 0x69,
|
0x16, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65,
|
||||||
0x63, 0x2f, 0x70, 0x62, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
|
0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5f, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69,
|
||||||
0x31, 0x3b, 0x6d, 0x65, 0x73, 0x68, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02,
|
0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e,
|
||||||
0x03, 0x48, 0x43, 0x4d, 0xaa, 0x02, 0x1e, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70,
|
0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c,
|
||||||
0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x2e, 0x56, 0x31, 0x61,
|
0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43,
|
||||||
0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x1e, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72,
|
0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76, 0x65, 0x72, 0x44,
|
||||||
0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x4d, 0x65, 0x73, 0x68, 0x5c, 0x56, 0x31,
|
0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x74,
|
||||||
0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x2a, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f,
|
0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65,
|
||||||
0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x4d, 0x65, 0x73, 0x68, 0x5c, 0x56,
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f,
|
||||||
0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64,
|
0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f,
|
||||||
0x61, 0x74, 0x61, 0xea, 0x02, 0x21, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a,
|
0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x6f,
|
||||||
0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x4d, 0x65, 0x73, 0x68, 0x3a, 0x3a, 0x56,
|
0x76, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a,
|
||||||
0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07,
|
||||||
|
0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x61, 0x6d, 0x65, 0x6e,
|
||||||
|
0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x0d, 0x73, 0x61, 0x6d, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x44,
|
||||||
|
0x0a, 0x1b, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x6f, 0x76,
|
||||||
|
0x65, 0x72, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a,
|
||||||
|
0x0e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18,
|
||||||
|
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x54, 0x61,
|
||||||
|
0x72, 0x67, 0x65, 0x74, 0x2a, 0x99, 0x01, 0x0a, 0x18, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64,
|
||||||
|
0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x54, 0x79, 0x70,
|
||||||
|
0x65, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x41, 0x43, 0x4b, 0x45, 0x4e, 0x44, 0x5f, 0x54, 0x41, 0x52,
|
||||||
|
0x47, 0x45, 0x54, 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45,
|
||||||
|
0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26,
|
||||||
|
0x0a, 0x22, 0x42, 0x41, 0x43, 0x4b, 0x45, 0x4e, 0x44, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54,
|
||||||
|
0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x49,
|
||||||
|
0x52, 0x45, 0x43, 0x54, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x41, 0x43, 0x4b, 0x45, 0x4e,
|
||||||
|
0x44, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x53,
|
||||||
|
0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x10, 0x02,
|
||||||
|
0x42, 0x9b, 0x02, 0x0a, 0x22, 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, 0x42, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65,
|
||||||
|
0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 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, 0x3b, 0x6d, 0x65, 0x73, 0x68, 0x76, 0x31, 0x61,
|
||||||
|
0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x48, 0x43, 0x4d, 0xaa, 0x02, 0x1e, 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, 0xca, 0x02, 0x1e, 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, 0xe2, 0x02, 0x2a,
|
||||||
|
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, 0x47,
|
||||||
|
0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x21, 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, 0x62, 0x06,
|
||||||
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -1117,74 +1334,81 @@ func file_pbmesh_v1alpha1_computed_routes_proto_rawDescGZIP() []byte {
|
||||||
return file_pbmesh_v1alpha1_computed_routes_proto_rawDescData
|
return file_pbmesh_v1alpha1_computed_routes_proto_rawDescData
|
||||||
}
|
}
|
||||||
|
|
||||||
var file_pbmesh_v1alpha1_computed_routes_proto_msgTypes = make([]protoimpl.MessageInfo, 14)
|
var file_pbmesh_v1alpha1_computed_routes_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
|
||||||
|
var file_pbmesh_v1alpha1_computed_routes_proto_msgTypes = make([]protoimpl.MessageInfo, 16)
|
||||||
var file_pbmesh_v1alpha1_computed_routes_proto_goTypes = []interface{}{
|
var file_pbmesh_v1alpha1_computed_routes_proto_goTypes = []interface{}{
|
||||||
(*ComputedRoutes)(nil), // 0: hashicorp.consul.mesh.v1alpha1.ComputedRoutes
|
(BackendTargetDetailsType)(0), // 0: hashicorp.consul.mesh.v1alpha1.BackendTargetDetailsType
|
||||||
(*ComputedPortRoutes)(nil), // 1: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes
|
(*ComputedRoutes)(nil), // 1: hashicorp.consul.mesh.v1alpha1.ComputedRoutes
|
||||||
(*ComputedHTTPRoute)(nil), // 2: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRoute
|
(*ComputedPortRoutes)(nil), // 2: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes
|
||||||
(*ComputedHTTPRouteRule)(nil), // 3: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule
|
(*ComputedHTTPRoute)(nil), // 3: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRoute
|
||||||
(*ComputedHTTPBackendRef)(nil), // 4: hashicorp.consul.mesh.v1alpha1.ComputedHTTPBackendRef
|
(*ComputedHTTPRouteRule)(nil), // 4: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule
|
||||||
(*ComputedGRPCRoute)(nil), // 5: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRoute
|
(*ComputedHTTPBackendRef)(nil), // 5: hashicorp.consul.mesh.v1alpha1.ComputedHTTPBackendRef
|
||||||
(*ComputedGRPCRouteRule)(nil), // 6: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule
|
(*ComputedGRPCRoute)(nil), // 6: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRoute
|
||||||
(*ComputedGRPCBackendRef)(nil), // 7: hashicorp.consul.mesh.v1alpha1.ComputedGRPCBackendRef
|
(*ComputedGRPCRouteRule)(nil), // 7: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule
|
||||||
(*ComputedTCPRoute)(nil), // 8: hashicorp.consul.mesh.v1alpha1.ComputedTCPRoute
|
(*ComputedGRPCBackendRef)(nil), // 8: hashicorp.consul.mesh.v1alpha1.ComputedGRPCBackendRef
|
||||||
(*ComputedTCPRouteRule)(nil), // 9: hashicorp.consul.mesh.v1alpha1.ComputedTCPRouteRule
|
(*ComputedTCPRoute)(nil), // 9: hashicorp.consul.mesh.v1alpha1.ComputedTCPRoute
|
||||||
(*ComputedTCPBackendRef)(nil), // 10: hashicorp.consul.mesh.v1alpha1.ComputedTCPBackendRef
|
(*ComputedTCPRouteRule)(nil), // 10: hashicorp.consul.mesh.v1alpha1.ComputedTCPRouteRule
|
||||||
(*BackendTargetDetails)(nil), // 11: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails
|
(*ComputedTCPBackendRef)(nil), // 11: hashicorp.consul.mesh.v1alpha1.ComputedTCPBackendRef
|
||||||
nil, // 12: hashicorp.consul.mesh.v1alpha1.ComputedRoutes.PortedConfigsEntry
|
(*BackendTargetDetails)(nil), // 12: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails
|
||||||
nil, // 13: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.TargetsEntry
|
(*ComputedFailoverConfig)(nil), // 13: hashicorp.consul.mesh.v1alpha1.ComputedFailoverConfig
|
||||||
(*ParentReference)(nil), // 14: hashicorp.consul.mesh.v1alpha1.ParentReference
|
(*ComputedFailoverDestination)(nil), // 14: hashicorp.consul.mesh.v1alpha1.ComputedFailoverDestination
|
||||||
(v1alpha1.Protocol)(0), // 15: hashicorp.consul.catalog.v1alpha1.Protocol
|
nil, // 15: hashicorp.consul.mesh.v1alpha1.ComputedRoutes.PortedConfigsEntry
|
||||||
(*HTTPRouteMatch)(nil), // 16: hashicorp.consul.mesh.v1alpha1.HTTPRouteMatch
|
nil, // 16: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.TargetsEntry
|
||||||
(*HTTPRouteFilter)(nil), // 17: hashicorp.consul.mesh.v1alpha1.HTTPRouteFilter
|
(*ParentReference)(nil), // 17: hashicorp.consul.mesh.v1alpha1.ParentReference
|
||||||
(*HTTPRouteTimeouts)(nil), // 18: hashicorp.consul.mesh.v1alpha1.HTTPRouteTimeouts
|
(v1alpha1.Protocol)(0), // 18: hashicorp.consul.catalog.v1alpha1.Protocol
|
||||||
(*HTTPRouteRetries)(nil), // 19: hashicorp.consul.mesh.v1alpha1.HTTPRouteRetries
|
(*HTTPRouteMatch)(nil), // 19: hashicorp.consul.mesh.v1alpha1.HTTPRouteMatch
|
||||||
(*GRPCRouteMatch)(nil), // 20: hashicorp.consul.mesh.v1alpha1.GRPCRouteMatch
|
(*HTTPRouteFilter)(nil), // 20: hashicorp.consul.mesh.v1alpha1.HTTPRouteFilter
|
||||||
(*GRPCRouteFilter)(nil), // 21: hashicorp.consul.mesh.v1alpha1.GRPCRouteFilter
|
(*HTTPRouteTimeouts)(nil), // 21: hashicorp.consul.mesh.v1alpha1.HTTPRouteTimeouts
|
||||||
(*BackendReference)(nil), // 22: hashicorp.consul.mesh.v1alpha1.BackendReference
|
(*HTTPRouteRetries)(nil), // 22: hashicorp.consul.mesh.v1alpha1.HTTPRouteRetries
|
||||||
(*v1alpha1.FailoverConfig)(nil), // 23: hashicorp.consul.catalog.v1alpha1.FailoverConfig
|
(*GRPCRouteMatch)(nil), // 23: hashicorp.consul.mesh.v1alpha1.GRPCRouteMatch
|
||||||
(*DestinationConfig)(nil), // 24: hashicorp.consul.mesh.v1alpha1.DestinationConfig
|
(*GRPCRouteFilter)(nil), // 24: hashicorp.consul.mesh.v1alpha1.GRPCRouteFilter
|
||||||
(*pbresource.ID)(nil), // 25: hashicorp.consul.resource.ID
|
(*BackendReference)(nil), // 25: hashicorp.consul.mesh.v1alpha1.BackendReference
|
||||||
(*v1alpha1.ServiceEndpoints)(nil), // 26: hashicorp.consul.catalog.v1alpha1.ServiceEndpoints
|
(*DestinationConfig)(nil), // 26: hashicorp.consul.mesh.v1alpha1.DestinationConfig
|
||||||
(*pbresource.Reference)(nil), // 27: hashicorp.consul.resource.Reference
|
(*pbresource.ID)(nil), // 27: hashicorp.consul.resource.ID
|
||||||
|
(*v1alpha1.ServiceEndpoints)(nil), // 28: hashicorp.consul.catalog.v1alpha1.ServiceEndpoints
|
||||||
|
(*pbresource.Reference)(nil), // 29: hashicorp.consul.resource.Reference
|
||||||
|
(v1alpha1.FailoverMode)(0), // 30: hashicorp.consul.catalog.v1alpha1.FailoverMode
|
||||||
}
|
}
|
||||||
var file_pbmesh_v1alpha1_computed_routes_proto_depIdxs = []int32{
|
var file_pbmesh_v1alpha1_computed_routes_proto_depIdxs = []int32{
|
||||||
12, // 0: hashicorp.consul.mesh.v1alpha1.ComputedRoutes.ported_configs:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedRoutes.PortedConfigsEntry
|
15, // 0: hashicorp.consul.mesh.v1alpha1.ComputedRoutes.ported_configs:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedRoutes.PortedConfigsEntry
|
||||||
2, // 1: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.http:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedHTTPRoute
|
3, // 1: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.http:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedHTTPRoute
|
||||||
5, // 2: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.grpc:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedGRPCRoute
|
6, // 2: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.grpc:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedGRPCRoute
|
||||||
8, // 3: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.tcp:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedTCPRoute
|
9, // 3: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.tcp:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedTCPRoute
|
||||||
14, // 4: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.parent_ref:type_name -> hashicorp.consul.mesh.v1alpha1.ParentReference
|
17, // 4: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.parent_ref:type_name -> hashicorp.consul.mesh.v1alpha1.ParentReference
|
||||||
15, // 5: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.protocol:type_name -> hashicorp.consul.catalog.v1alpha1.Protocol
|
18, // 5: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.protocol:type_name -> hashicorp.consul.catalog.v1alpha1.Protocol
|
||||||
13, // 6: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.targets:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.TargetsEntry
|
16, // 6: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.targets:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.TargetsEntry
|
||||||
3, // 7: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRoute.rules:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule
|
4, // 7: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRoute.rules:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule
|
||||||
16, // 8: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule.matches:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteMatch
|
19, // 8: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule.matches:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteMatch
|
||||||
17, // 9: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule.filters:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteFilter
|
20, // 9: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule.filters:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteFilter
|
||||||
4, // 10: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule.backend_refs:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedHTTPBackendRef
|
5, // 10: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule.backend_refs:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedHTTPBackendRef
|
||||||
18, // 11: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule.timeouts:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteTimeouts
|
21, // 11: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule.timeouts:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteTimeouts
|
||||||
19, // 12: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule.retries:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteRetries
|
22, // 12: hashicorp.consul.mesh.v1alpha1.ComputedHTTPRouteRule.retries:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteRetries
|
||||||
17, // 13: hashicorp.consul.mesh.v1alpha1.ComputedHTTPBackendRef.filters:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteFilter
|
20, // 13: hashicorp.consul.mesh.v1alpha1.ComputedHTTPBackendRef.filters:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteFilter
|
||||||
6, // 14: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRoute.rules:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule
|
7, // 14: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRoute.rules:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule
|
||||||
20, // 15: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule.matches:type_name -> hashicorp.consul.mesh.v1alpha1.GRPCRouteMatch
|
23, // 15: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule.matches:type_name -> hashicorp.consul.mesh.v1alpha1.GRPCRouteMatch
|
||||||
21, // 16: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule.filters:type_name -> hashicorp.consul.mesh.v1alpha1.GRPCRouteFilter
|
24, // 16: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule.filters:type_name -> hashicorp.consul.mesh.v1alpha1.GRPCRouteFilter
|
||||||
7, // 17: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule.backend_refs:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedGRPCBackendRef
|
8, // 17: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule.backend_refs:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedGRPCBackendRef
|
||||||
18, // 18: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule.timeouts:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteTimeouts
|
21, // 18: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule.timeouts:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteTimeouts
|
||||||
19, // 19: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule.retries:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteRetries
|
22, // 19: hashicorp.consul.mesh.v1alpha1.ComputedGRPCRouteRule.retries:type_name -> hashicorp.consul.mesh.v1alpha1.HTTPRouteRetries
|
||||||
21, // 20: hashicorp.consul.mesh.v1alpha1.ComputedGRPCBackendRef.filters:type_name -> hashicorp.consul.mesh.v1alpha1.GRPCRouteFilter
|
24, // 20: hashicorp.consul.mesh.v1alpha1.ComputedGRPCBackendRef.filters:type_name -> hashicorp.consul.mesh.v1alpha1.GRPCRouteFilter
|
||||||
9, // 21: hashicorp.consul.mesh.v1alpha1.ComputedTCPRoute.rules:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedTCPRouteRule
|
10, // 21: hashicorp.consul.mesh.v1alpha1.ComputedTCPRoute.rules:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedTCPRouteRule
|
||||||
10, // 22: hashicorp.consul.mesh.v1alpha1.ComputedTCPRouteRule.backend_refs:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedTCPBackendRef
|
11, // 22: hashicorp.consul.mesh.v1alpha1.ComputedTCPRouteRule.backend_refs:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedTCPBackendRef
|
||||||
22, // 23: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.backend_ref:type_name -> hashicorp.consul.mesh.v1alpha1.BackendReference
|
0, // 23: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.type:type_name -> hashicorp.consul.mesh.v1alpha1.BackendTargetDetailsType
|
||||||
23, // 24: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.failover_config:type_name -> hashicorp.consul.catalog.v1alpha1.FailoverConfig
|
25, // 24: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.backend_ref:type_name -> hashicorp.consul.mesh.v1alpha1.BackendReference
|
||||||
24, // 25: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.destination_config:type_name -> hashicorp.consul.mesh.v1alpha1.DestinationConfig
|
13, // 25: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.failover_config:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedFailoverConfig
|
||||||
25, // 26: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.service_endpoints_id:type_name -> hashicorp.consul.resource.ID
|
26, // 26: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.destination_config:type_name -> hashicorp.consul.mesh.v1alpha1.DestinationConfig
|
||||||
26, // 27: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.service_endpoints:type_name -> hashicorp.consul.catalog.v1alpha1.ServiceEndpoints
|
27, // 27: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.service_endpoints_id:type_name -> hashicorp.consul.resource.ID
|
||||||
27, // 28: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.identity_refs:type_name -> hashicorp.consul.resource.Reference
|
28, // 28: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.service_endpoints:type_name -> hashicorp.consul.catalog.v1alpha1.ServiceEndpoints
|
||||||
1, // 29: hashicorp.consul.mesh.v1alpha1.ComputedRoutes.PortedConfigsEntry.value:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes
|
29, // 29: hashicorp.consul.mesh.v1alpha1.BackendTargetDetails.identity_refs:type_name -> hashicorp.consul.resource.Reference
|
||||||
11, // 30: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.TargetsEntry.value:type_name -> hashicorp.consul.mesh.v1alpha1.BackendTargetDetails
|
14, // 30: hashicorp.consul.mesh.v1alpha1.ComputedFailoverConfig.destinations:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedFailoverDestination
|
||||||
31, // [31:31] is the sub-list for method output_type
|
30, // 31: hashicorp.consul.mesh.v1alpha1.ComputedFailoverConfig.mode:type_name -> hashicorp.consul.catalog.v1alpha1.FailoverMode
|
||||||
31, // [31:31] is the sub-list for method input_type
|
2, // 32: hashicorp.consul.mesh.v1alpha1.ComputedRoutes.PortedConfigsEntry.value:type_name -> hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes
|
||||||
31, // [31:31] is the sub-list for extension type_name
|
12, // 33: hashicorp.consul.mesh.v1alpha1.ComputedPortRoutes.TargetsEntry.value:type_name -> hashicorp.consul.mesh.v1alpha1.BackendTargetDetails
|
||||||
31, // [31:31] is the sub-list for extension extendee
|
34, // [34:34] is the sub-list for method output_type
|
||||||
0, // [0:31] is the sub-list for field type_name
|
34, // [34:34] is the sub-list for method input_type
|
||||||
|
34, // [34:34] is the sub-list for extension type_name
|
||||||
|
34, // [34:34] is the sub-list for extension extendee
|
||||||
|
0, // [0:34] is the sub-list for field type_name
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { file_pbmesh_v1alpha1_computed_routes_proto_init() }
|
func init() { file_pbmesh_v1alpha1_computed_routes_proto_init() }
|
||||||
|
@ -1343,6 +1567,30 @@ func file_pbmesh_v1alpha1_computed_routes_proto_init() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
file_pbmesh_v1alpha1_computed_routes_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*ComputedFailoverConfig); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_pbmesh_v1alpha1_computed_routes_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*ComputedFailoverDestination); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
file_pbmesh_v1alpha1_computed_routes_proto_msgTypes[1].OneofWrappers = []interface{}{
|
file_pbmesh_v1alpha1_computed_routes_proto_msgTypes[1].OneofWrappers = []interface{}{
|
||||||
(*ComputedPortRoutes_Http)(nil),
|
(*ComputedPortRoutes_Http)(nil),
|
||||||
|
@ -1354,13 +1602,14 @@ func file_pbmesh_v1alpha1_computed_routes_proto_init() {
|
||||||
File: protoimpl.DescBuilder{
|
File: protoimpl.DescBuilder{
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
RawDescriptor: file_pbmesh_v1alpha1_computed_routes_proto_rawDesc,
|
RawDescriptor: file_pbmesh_v1alpha1_computed_routes_proto_rawDesc,
|
||||||
NumEnums: 0,
|
NumEnums: 1,
|
||||||
NumMessages: 14,
|
NumMessages: 16,
|
||||||
NumExtensions: 0,
|
NumExtensions: 0,
|
||||||
NumServices: 0,
|
NumServices: 0,
|
||||||
},
|
},
|
||||||
GoTypes: file_pbmesh_v1alpha1_computed_routes_proto_goTypes,
|
GoTypes: file_pbmesh_v1alpha1_computed_routes_proto_goTypes,
|
||||||
DependencyIndexes: file_pbmesh_v1alpha1_computed_routes_proto_depIdxs,
|
DependencyIndexes: file_pbmesh_v1alpha1_computed_routes_proto_depIdxs,
|
||||||
|
EnumInfos: file_pbmesh_v1alpha1_computed_routes_proto_enumTypes,
|
||||||
MessageInfos: file_pbmesh_v1alpha1_computed_routes_proto_msgTypes,
|
MessageInfos: file_pbmesh_v1alpha1_computed_routes_proto_msgTypes,
|
||||||
}.Build()
|
}.Build()
|
||||||
File_pbmesh_v1alpha1_computed_routes_proto = out.File
|
File_pbmesh_v1alpha1_computed_routes_proto = out.File
|
||||||
|
|
|
@ -114,14 +114,14 @@ message ComputedTCPBackendRef {
|
||||||
}
|
}
|
||||||
|
|
||||||
message BackendTargetDetails {
|
message BackendTargetDetails {
|
||||||
// identity info
|
BackendTargetDetailsType type = 1;
|
||||||
BackendReference backend_ref = 1;
|
BackendReference backend_ref = 2;
|
||||||
|
|
||||||
string mesh_port = 2;
|
string mesh_port = 3;
|
||||||
hashicorp.consul.catalog.v1alpha1.FailoverConfig failover_config = 3;
|
ComputedFailoverConfig failover_config = 4;
|
||||||
DestinationConfig destination_config = 4;
|
DestinationConfig destination_config = 5;
|
||||||
|
|
||||||
reserved 5 to 20; // leaving a gap between computed and retroactively added fields.
|
reserved 6 to 20; // leaving a gap between computed and retroactively added fields.
|
||||||
|
|
||||||
// ServiceEndpointsID is not populated naturally and the field exists only for
|
// ServiceEndpointsID is not populated naturally and the field exists only for
|
||||||
// downstream consumers.
|
// downstream consumers.
|
||||||
|
@ -135,3 +135,30 @@ message BackendTargetDetails {
|
||||||
// downstream consumers.
|
// downstream consumers.
|
||||||
repeated hashicorp.consul.resource.Reference identity_refs = 23;
|
repeated hashicorp.consul.resource.Reference identity_refs = 23;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum BackendTargetDetailsType {
|
||||||
|
BACKEND_TARGET_DETAILS_TYPE_UNSPECIFIED = 0;
|
||||||
|
|
||||||
|
// Direct means that the target is directly routable from a route. This does
|
||||||
|
// not mean that the target is not also indirect though.
|
||||||
|
BACKEND_TARGET_DETAILS_TYPE_DIRECT = 1;
|
||||||
|
|
||||||
|
// Indirect means that the target is not directly routable from a route.
|
||||||
|
//
|
||||||
|
// One example would be for a FailoverPolicy destination.
|
||||||
|
BACKEND_TARGET_DETAILS_TYPE_INDIRECT = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ComputedFailoverConfig {
|
||||||
|
repeated ComputedFailoverDestination destinations = 1;
|
||||||
|
hashicorp.consul.catalog.v1alpha1.FailoverMode mode = 2;
|
||||||
|
repeated string regions = 3;
|
||||||
|
|
||||||
|
// SamenessGroup specifies the sameness group to failover to.
|
||||||
|
string sameness_group = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ComputedFailoverDestination {
|
||||||
|
// This must be a Service.
|
||||||
|
string backend_target = 1;
|
||||||
|
}
|
||||||
|
|
|
@ -307,6 +307,8 @@ type EndpointGroup struct {
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// name is used to name the cluster created. This is only required when used inside of a FailoverGroup.
|
||||||
|
Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"`
|
||||||
// Types that are assignable to Group:
|
// Types that are assignable to Group:
|
||||||
//
|
//
|
||||||
// *EndpointGroup_Dynamic
|
// *EndpointGroup_Dynamic
|
||||||
|
@ -348,6 +350,13 @@ func (*EndpointGroup) Descriptor() ([]byte, []int) {
|
||||||
return file_pbmesh_v1alpha1_pbproxystate_cluster_proto_rawDescGZIP(), []int{3}
|
return file_pbmesh_v1alpha1_pbproxystate_cluster_proto_rawDescGZIP(), []int{3}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *EndpointGroup) GetName() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Name
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
func (m *EndpointGroup) GetGroup() isEndpointGroup_Group {
|
func (m *EndpointGroup) GetGroup() isEndpointGroup_Group {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.Group
|
return m.Group
|
||||||
|
@ -1798,355 +1807,356 @@ var file_pbmesh_v1alpha1_pbproxystate_cluster_proto_rawDesc = []byte{
|
||||||
0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
|
0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
|
||||||
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
|
0x2e, 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,
|
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, 0x91, 0x03, 0x0a, 0x0d, 0x45, 0x6e,
|
0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xa5, 0x03, 0x0a, 0x0d, 0x45, 0x6e,
|
||||||
0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x07, 0x64,
|
0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e,
|
||||||
0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x68,
|
0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
|
||||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
0x5d, 0x0a, 0x07, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
|
||||||
0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62,
|
0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e,
|
||||||
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, 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, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72,
|
|
||||||
0x6f, 0x75, 0x67, 0x68, 0x42, 0x07, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xd8, 0x01,
|
|
||||||
0x0a, 0x14, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e,
|
|
||||||
0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x5f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
|
|
||||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, 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, 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,
|
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,
|
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,
|
0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72,
|
||||||
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5f, 0x0a,
|
0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x07, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x12, 0x5a,
|
||||||
0x0c, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x02, 0x20,
|
0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40,
|
||||||
0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e,
|
0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75,
|
||||||
0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c,
|
0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
|
||||||
0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74,
|
0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x61,
|
||||||
0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65,
|
0x74, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70,
|
||||||
0x74, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x6c, 0x73, 0x22, 0x75,
|
0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x12, 0x51, 0x0a, 0x03, 0x64, 0x6e,
|
||||||
0x0a, 0x13, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
|
0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63,
|
||||||
0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x5e, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18,
|
0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e,
|
||||||
0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72,
|
0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79,
|
||||||
0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31,
|
0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x4e, 0x53, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e,
|
||||||
0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74,
|
0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x03, 0x64, 0x6e, 0x73, 0x12, 0x69, 0x0a,
|
||||||
0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69,
|
0x0b, 0x70, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x18, 0x04, 0x20, 0x01,
|
||||||
0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63,
|
0x28, 0x0b, 0x32, 0x45, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63,
|
||||||
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x28, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61,
|
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
|
||||||
0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e,
|
0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65,
|
||||||
0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22,
|
0x2e, 0x50, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x45, 0x6e, 0x64, 0x70,
|
||||||
0x7f, 0x0a, 0x16, 0x4c, 0x34, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x43, 0x6c, 0x75,
|
0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x73,
|
||||||
0x73, 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x65, 0x0a, 0x08, 0x63, 0x6c, 0x75,
|
0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x42, 0x07, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75,
|
||||||
0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x68, 0x61,
|
0x70, 0x22, 0xd8, 0x01, 0x0a, 0x14, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x45, 0x6e, 0x64,
|
||||||
0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d,
|
0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x5f, 0x0a, 0x06, 0x63, 0x6f,
|
||||||
0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70,
|
0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x68, 0x61, 0x73,
|
||||||
0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x34, 0x57, 0x65, 0x69, 0x67,
|
0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65,
|
||||||
0x68, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43,
|
0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72,
|
||||||
0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73,
|
0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63,
|
||||||
0x22, 0x7f, 0x0a, 0x16, 0x4c, 0x37, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x43, 0x6c,
|
0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x6f, 0x6e,
|
||||||
0x75, 0x73, 0x74, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x65, 0x0a, 0x08, 0x63, 0x6c,
|
0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5f, 0x0a, 0x0c, 0x6f,
|
||||||
0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x68,
|
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, 0x28, 0x0a, 0x12, 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, 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,
|
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, 0x4c, 0x37, 0x57, 0x65, 0x69,
|
0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c,
|
||||||
0x67, 0x68, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
0x69, 0x63, 0x79, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x48, 0x00, 0x52,
|
||||||
0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
|
0x0a, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x12, 0x55, 0x0a, 0x06, 0x72,
|
||||||
0x73, 0x22, 0x68, 0x0a, 0x1c, 0x4c, 0x34, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x44,
|
0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61,
|
||||||
0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65,
|
0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d,
|
||||||
0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70,
|
||||||
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18,
|
0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69,
|
||||||
0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
|
0x63, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x48, 0x00, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x64,
|
||||||
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61,
|
0x6f, 0x6d, 0x12, 0x5c, 0x0a, 0x09, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18,
|
||||||
0x6c, 0x75, 0x65, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xd0, 0x01, 0x0a, 0x1c,
|
0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72,
|
||||||
0x4c, 0x37, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e,
|
0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31,
|
||||||
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04,
|
0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74,
|
||||||
0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
|
0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x69, 0x6e, 0x67,
|
||||||
0x12, 0x34, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
|
0x48, 0x61, 0x73, 0x68, 0x48, 0x00, 0x52, 0x08, 0x72, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68,
|
||||||
0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
|
0x12, 0x55, 0x0a, 0x06, 0x6d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
|
||||||
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,
|
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,
|
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,
|
0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c,
|
||||||
0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x68,
|
0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x48, 0x00, 0x52,
|
||||||
0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x88,
|
0x06, 0x6d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x12, 0x67, 0x0a, 0x10, 0x63, 0x69, 0x72, 0x63, 0x75,
|
||||||
0x08, 0x0a, 0x1a, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69,
|
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, 0x42, 0x0a,
|
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,
|
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,
|
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,
|
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,
|
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,
|
0x74, 0x12, 0x67, 0x0a, 0x10, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x5f, 0x62, 0x72, 0x65,
|
||||||
0x69, 0x63, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01,
|
0x61, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x68, 0x61,
|
||||||
0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x6e, 0x69, 0x63,
|
0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d,
|
||||||
0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x68, 0x0a, 0x0d, 0x6c, 0x65, 0x61,
|
0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70,
|
||||||
0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
|
0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69,
|
||||||
0x32, 0x41, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e,
|
0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x0f, 0x63, 0x69, 0x72, 0x63, 0x75,
|
||||||
0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
|
0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x73, 0x2a, 0x46, 0x0a, 0x0d, 0x44, 0x69,
|
||||||
0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c,
|
0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x44,
|
||||||
0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
|
0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f,
|
||||||
0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
|
0x47, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x49, 0x53, 0x43, 0x4f,
|
||||||
0x65, 0x73, 0x74, 0x12, 0x62, 0x0a, 0x0b, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x72, 0x6f, 0x62,
|
0x56, 0x45, 0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x43, 0x54,
|
||||||
0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69,
|
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,
|
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, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52,
|
0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50,
|
||||||
0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x6f, 0x75,
|
0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x45, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
|
||||||
0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x12, 0x55, 0x0a, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f,
|
0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e,
|
||||||
0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63,
|
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, 0x68, 0x2e,
|
0x2f, 0x70, 0x62, 0x6d, 0x65, 0x73, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
|
||||||
0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79,
|
0x2f, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0xa2, 0x02, 0x05,
|
||||||
0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x61,
|
0x48, 0x43, 0x4d, 0x56, 0x50, 0xaa, 0x02, 0x2b, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72,
|
||||||
0x6e, 0x64, 0x6f, 0x6d, 0x48, 0x00, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x12, 0x5c,
|
0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x4d, 0x65, 0x73, 0x68, 0x2e, 0x56, 0x31,
|
||||||
0x0a, 0x09, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28,
|
0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74,
|
||||||
0x0b, 0x32, 0x3d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f,
|
0x61, 0x74, 0x65, 0xca, 0x02, 0x2b, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c,
|
||||||
0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
|
0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x4d, 0x65, 0x73, 0x68, 0x5c, 0x56, 0x31, 0x61, 0x6c,
|
||||||
0x61, 0x31, 0x2e, 0x70, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e,
|
0x70, 0x68, 0x61, 0x31, 0x5c, 0x50, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74,
|
||||||
0x4c, 0x42, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68,
|
0x65, 0xe2, 0x02, 0x37, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f,
|
||||||
0x48, 0x00, 0x52, 0x08, 0x72, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x12, 0x55, 0x0a, 0x06,
|
0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x4d, 0x65, 0x73, 0x68, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68,
|
||||||
0x6d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x68,
|
0x61, 0x31, 0x5c, 0x50, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5c,
|
||||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x2f, 0x48, 0x61,
|
||||||
0x6d, 0x65, 0x73, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x70, 0x62,
|
0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a,
|
||||||
0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x42, 0x50, 0x6f, 0x6c,
|
0x3a, 0x4d, 0x65, 0x73, 0x68, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3a,
|
||||||
0x69, 0x63, 0x79, 0x4d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x61, 0x67,
|
0x3a, 0x50, 0x62, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x74, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70,
|
||||||
0x6c, 0x65, 0x76, 0x12, 0x67, 0x0a, 0x10, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x5f, 0x62,
|
0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
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 (
|
||||||
|
|
|
@ -38,6 +38,8 @@ message FailoverGroupConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
message EndpointGroup {
|
message EndpointGroup {
|
||||||
|
// name is used to name the cluster created. This is only required when used inside of a FailoverGroup.
|
||||||
|
string name = 5;
|
||||||
oneof group {
|
oneof group {
|
||||||
// dynamic endpoint group is used to reach mesh destinations that are dynamically configured from Consul's catalog.
|
// dynamic endpoint group is used to reach mesh destinations that are dynamically configured from Consul's catalog.
|
||||||
DynamicEndpointGroup dynamic = 1;
|
DynamicEndpointGroup dynamic = 1;
|
||||||
|
|
Loading…
Reference in New Issue