diff --git a/Cargo.toml b/Cargo.toml index 30ca233df..27da83f4b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ http-route = ["http-types"] http-types = ["http", "thiserror"] identity = ["prost-types", "tonic/codegen"] inbound = ["grpc-route", "http-route", "meta", "net", "prost-types", "tonic/codegen"] +outbound = ["grpc-route", "destination", "http-route", "meta", "net", "prost-types", "tonic/codegen"] meta = [] net = ["ipnet", "thiserror"] tap = ["h2", "http-types", "net", "prost-types", "tonic/codegen"] diff --git a/go/meta/meta.pb.go b/go/meta/meta.pb.go index df42a6960..95423dd81 100644 --- a/go/meta/meta.pb.go +++ b/go/meta/meta.pb.go @@ -113,9 +113,11 @@ type Resource struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` - Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + Section string `protobuf:"bytes,5,opt,name=section,proto3" json:"section,omitempty"` } func (x *Resource) Reset() { @@ -171,6 +173,20 @@ func (x *Resource) GetName() string { return "" } +func (x *Resource) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *Resource) GetSection() string { + if x != nil { + return x.Section + } + return "" +} + var File_meta_proto protoreflect.FileDescriptor var file_meta_proto_rawDesc = []byte{ @@ -183,15 +199,18 @@ var file_meta_proto_rawDesc = []byte{ 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x22, 0x48, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x2f, 0x5a, 0x2d, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x65, - 0x72, 0x64, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2d, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x32, 0x2d, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, + 0x6f, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/go/outbound/outbound.pb.go b/go/outbound/outbound.pb.go new file mode 100644 index 000000000..2c4d647b4 --- /dev/null +++ b/go/outbound/outbound.pb.go @@ -0,0 +1,3619 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.20.3 +// source: outbound.proto + +package outbound + +import ( + duration "github.com/golang/protobuf/ptypes/duration" + destination "github.com/linkerd/linkerd2-proxy-api/go/destination" + grpc_route "github.com/linkerd/linkerd2-proxy-api/go/grpc_route" + http_route "github.com/linkerd/linkerd2-proxy-api/go/http_route" + meta "github.com/linkerd/linkerd2-proxy-api/go/meta" + net "github.com/linkerd/linkerd2-proxy-api/go/net" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type TrafficSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Uniquely identifies the source proxy workload (e.g., pod name) to the + // control plane. + SourceWorkload string `protobuf:"bytes,1,opt,name=source_workload,json=sourceWorkload,proto3" json:"source_workload,omitempty"` + // Describes a target address, as observed by the proxy. + // + // Types that are assignable to Target: + // *TrafficSpec_Addr + // *TrafficSpec_Authority + Target isTrafficSpec_Target `protobuf_oneof:"target"` +} + +func (x *TrafficSpec) Reset() { + *x = TrafficSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TrafficSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrafficSpec) ProtoMessage() {} + +func (x *TrafficSpec) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TrafficSpec.ProtoReflect.Descriptor instead. +func (*TrafficSpec) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{0} +} + +func (x *TrafficSpec) GetSourceWorkload() string { + if x != nil { + return x.SourceWorkload + } + return "" +} + +func (m *TrafficSpec) GetTarget() isTrafficSpec_Target { + if m != nil { + return m.Target + } + return nil +} + +func (x *TrafficSpec) GetAddr() *net.TcpAddress { + if x, ok := x.GetTarget().(*TrafficSpec_Addr); ok { + return x.Addr + } + return nil +} + +func (x *TrafficSpec) GetAuthority() string { + if x, ok := x.GetTarget().(*TrafficSpec_Authority); ok { + return x.Authority + } + return "" +} + +type isTrafficSpec_Target interface { + isTrafficSpec_Target() +} + +type TrafficSpec_Addr struct { + // Indicates the proxy is connecting to a specific IP:port. + Addr *net.TcpAddress `protobuf:"bytes,2,opt,name=addr,proto3,oneof"` +} + +type TrafficSpec_Authority struct { + // Indicates the proxy is connecting to a named address (like an HTTP + // authority). + Authority string `protobuf:"bytes,3,opt,name=authority,proto3,oneof"` +} + +func (*TrafficSpec_Addr) isTrafficSpec_Target() {} + +func (*TrafficSpec_Authority) isTrafficSpec_Target() {} + +// Outbound policy for a given traffic spec. +type OutboundPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Indicates the protocol to use for this target. This will be set to Opaque + // if the target has been marked as opaque and will be Discover otherwise. + Protocol *ProxyProtocol `protobuf:"bytes,1,opt,name=protocol,proto3" json:"protocol,omitempty"` +} + +func (x *OutboundPolicy) Reset() { + *x = OutboundPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OutboundPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OutboundPolicy) ProtoMessage() {} + +func (x *OutboundPolicy) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OutboundPolicy.ProtoReflect.Descriptor instead. +func (*OutboundPolicy) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{1} +} + +func (x *OutboundPolicy) GetProtocol() *ProxyProtocol { + if x != nil { + return x.Protocol + } + return nil +} + +type ProxyProtocol struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Kind: + // *ProxyProtocol_Detect_ + // *ProxyProtocol_Opaque_ + // *ProxyProtocol_Http1_ + // *ProxyProtocol_Http2_ + // *ProxyProtocol_Grpc_ + Kind isProxyProtocol_Kind `protobuf_oneof:"kind"` +} + +func (x *ProxyProtocol) Reset() { + *x = ProxyProtocol{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyProtocol) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyProtocol) ProtoMessage() {} + +func (x *ProxyProtocol) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyProtocol.ProtoReflect.Descriptor instead. +func (*ProxyProtocol) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{2} +} + +func (m *ProxyProtocol) GetKind() isProxyProtocol_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (x *ProxyProtocol) GetDetect() *ProxyProtocol_Detect { + if x, ok := x.GetKind().(*ProxyProtocol_Detect_); ok { + return x.Detect + } + return nil +} + +func (x *ProxyProtocol) GetOpaque() *ProxyProtocol_Opaque { + if x, ok := x.GetKind().(*ProxyProtocol_Opaque_); ok { + return x.Opaque + } + return nil +} + +func (x *ProxyProtocol) GetHttp1() *ProxyProtocol_Http1 { + if x, ok := x.GetKind().(*ProxyProtocol_Http1_); ok { + return x.Http1 + } + return nil +} + +func (x *ProxyProtocol) GetHttp2() *ProxyProtocol_Http2 { + if x, ok := x.GetKind().(*ProxyProtocol_Http2_); ok { + return x.Http2 + } + return nil +} + +func (x *ProxyProtocol) GetGrpc() *ProxyProtocol_Grpc { + if x, ok := x.GetKind().(*ProxyProtocol_Grpc_); ok { + return x.Grpc + } + return nil +} + +type isProxyProtocol_Kind interface { + isProxyProtocol_Kind() +} + +type ProxyProtocol_Detect_ struct { + Detect *ProxyProtocol_Detect `protobuf:"bytes,1,opt,name=detect,proto3,oneof"` +} + +type ProxyProtocol_Opaque_ struct { + Opaque *ProxyProtocol_Opaque `protobuf:"bytes,2,opt,name=opaque,proto3,oneof"` +} + +type ProxyProtocol_Http1_ struct { + // HTTP/1 policy configuration. + Http1 *ProxyProtocol_Http1 `protobuf:"bytes,3,opt,name=http1,proto3,oneof"` +} + +type ProxyProtocol_Http2_ struct { + // HTTP/2 policy configuration. + Http2 *ProxyProtocol_Http2 `protobuf:"bytes,4,opt,name=http2,proto3,oneof"` +} + +type ProxyProtocol_Grpc_ struct { + // gRPC policy configuration. + Grpc *ProxyProtocol_Grpc `protobuf:"bytes,5,opt,name=grpc,proto3,oneof"` +} + +func (*ProxyProtocol_Detect_) isProxyProtocol_Kind() {} + +func (*ProxyProtocol_Opaque_) isProxyProtocol_Kind() {} + +func (*ProxyProtocol_Http1_) isProxyProtocol_Kind() {} + +func (*ProxyProtocol_Http2_) isProxyProtocol_Kind() {} + +func (*ProxyProtocol_Grpc_) isProxyProtocol_Kind() {} + +// Outbound-specific HTTP route configuration (based on the [Gateway API][api]). +// +// [api]: https://gateway-api.sigs.k8s.io/v1alpha2/references/spec/#gateway.networking.k8s.io/v1alpha2.HTTPRoute +type HttpRoute struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metadata *meta.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + // If empty, the host value is ignored. + Hosts []*http_route.HostMatch `protobuf:"bytes,2,rep,name=hosts,proto3" json:"hosts,omitempty"` + // Must have at least one rule. + Rules []*HttpRoute_Rule `protobuf:"bytes,3,rep,name=rules,proto3" json:"rules,omitempty"` +} + +func (x *HttpRoute) Reset() { + *x = HttpRoute{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HttpRoute) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HttpRoute) ProtoMessage() {} + +func (x *HttpRoute) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HttpRoute.ProtoReflect.Descriptor instead. +func (*HttpRoute) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{3} +} + +func (x *HttpRoute) GetMetadata() *meta.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *HttpRoute) GetHosts() []*http_route.HostMatch { + if x != nil { + return x.Hosts + } + return nil +} + +func (x *HttpRoute) GetRules() []*HttpRoute_Rule { + if x != nil { + return x.Rules + } + return nil +} + +type GrpcRoute struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metadata *meta.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + // If empty, the host value is ignored. + Hosts []*http_route.HostMatch `protobuf:"bytes,2,rep,name=hosts,proto3" json:"hosts,omitempty"` + // Must have at least one rule. + Rules []*GrpcRoute_Rule `protobuf:"bytes,3,rep,name=rules,proto3" json:"rules,omitempty"` +} + +func (x *GrpcRoute) Reset() { + *x = GrpcRoute{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GrpcRoute) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrpcRoute) ProtoMessage() {} + +func (x *GrpcRoute) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GrpcRoute.ProtoReflect.Descriptor instead. +func (*GrpcRoute) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{4} +} + +func (x *GrpcRoute) GetMetadata() *meta.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *GrpcRoute) GetHosts() []*http_route.HostMatch { + if x != nil { + return x.Hosts + } + return nil +} + +func (x *GrpcRoute) GetRules() []*GrpcRoute_Rule { + if x != nil { + return x.Rules + } + return nil +} + +type OpaqueRoute struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metadata *meta.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + // Must have at least one rule. + Rules []*OpaqueRoute_Rule `protobuf:"bytes,3,rep,name=rules,proto3" json:"rules,omitempty"` +} + +func (x *OpaqueRoute) Reset() { + *x = OpaqueRoute{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpaqueRoute) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpaqueRoute) ProtoMessage() {} + +func (x *OpaqueRoute) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OpaqueRoute.ProtoReflect.Descriptor instead. +func (*OpaqueRoute) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{5} +} + +func (x *OpaqueRoute) GetMetadata() *meta.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *OpaqueRoute) GetRules() []*OpaqueRoute_Rule { + if x != nil { + return x.Rules + } + return nil +} + +type Backend struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metadata *meta.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + // Types that are assignable to Kind: + // *Backend_Forward + // *Backend_Balancer + Kind isBackend_Kind `protobuf_oneof:"kind"` + // Describes queue configuration for a backend. + Queue *Queue `protobuf:"bytes,4,opt,name=queue,proto3" json:"queue,omitempty"` +} + +func (x *Backend) Reset() { + *x = Backend{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Backend) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Backend) ProtoMessage() {} + +func (x *Backend) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Backend.ProtoReflect.Descriptor instead. +func (*Backend) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{6} +} + +func (x *Backend) GetMetadata() *meta.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (m *Backend) GetKind() isBackend_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (x *Backend) GetForward() *destination.WeightedAddr { + if x, ok := x.GetKind().(*Backend_Forward); ok { + return x.Forward + } + return nil +} + +func (x *Backend) GetBalancer() *Backend_BalanceP2C { + if x, ok := x.GetKind().(*Backend_Balancer); ok { + return x.Balancer + } + return nil +} + +func (x *Backend) GetQueue() *Queue { + if x != nil { + return x.Queue + } + return nil +} + +type isBackend_Kind interface { + isBackend_Kind() +} + +type Backend_Forward struct { + // A backend that consists of a single endpoint. + Forward *destination.WeightedAddr `protobuf:"bytes,2,opt,name=forward,proto3,oneof"` +} + +type Backend_Balancer struct { + // A backend that comprises a load balanced service. + Balancer *Backend_BalanceP2C `protobuf:"bytes,3,opt,name=balancer,proto3,oneof"` +} + +func (*Backend_Forward) isBackend_Kind() {} + +func (*Backend_Balancer) isBackend_Kind() {} + +type Queue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The number of requests that may be held in a queue before backpressure is + // exerted. + Capacity uint32 `protobuf:"varint,1,opt,name=capacity,proto3" json:"capacity,omitempty"` + // A timeout that limits how long a backend may remain unready before any + // requests in its queue are failed. + FailfastTimeout *duration.Duration `protobuf:"bytes,2,opt,name=failfast_timeout,json=failfastTimeout,proto3" json:"failfast_timeout,omitempty"` +} + +func (x *Queue) Reset() { + *x = Queue{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Queue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Queue) ProtoMessage() {} + +func (x *Queue) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Queue.ProtoReflect.Descriptor instead. +func (*Queue) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{7} +} + +func (x *Queue) GetCapacity() uint32 { + if x != nil { + return x.Capacity + } + return 0 +} + +func (x *Queue) GetFailfastTimeout() *duration.Duration { + if x != nil { + return x.FailfastTimeout + } + return nil +} + +type ProxyProtocol_Detect struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Protocol detection timeout. + Timeout *duration.Duration `protobuf:"bytes,1,opt,name=timeout,proto3" json:"timeout,omitempty"` + Opaque *ProxyProtocol_Opaque `protobuf:"bytes,2,opt,name=opaque,proto3" json:"opaque,omitempty"` + // HTTP/1 policy configuration. + Http1 *ProxyProtocol_Http1 `protobuf:"bytes,3,opt,name=http1,proto3" json:"http1,omitempty"` + // HTTP/2 policy configuration. + Http2 *ProxyProtocol_Http2 `protobuf:"bytes,4,opt,name=http2,proto3" json:"http2,omitempty"` +} + +func (x *ProxyProtocol_Detect) Reset() { + *x = ProxyProtocol_Detect{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyProtocol_Detect) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyProtocol_Detect) ProtoMessage() {} + +func (x *ProxyProtocol_Detect) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyProtocol_Detect.ProtoReflect.Descriptor instead. +func (*ProxyProtocol_Detect) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{2, 0} +} + +func (x *ProxyProtocol_Detect) GetTimeout() *duration.Duration { + if x != nil { + return x.Timeout + } + return nil +} + +func (x *ProxyProtocol_Detect) GetOpaque() *ProxyProtocol_Opaque { + if x != nil { + return x.Opaque + } + return nil +} + +func (x *ProxyProtocol_Detect) GetHttp1() *ProxyProtocol_Http1 { + if x != nil { + return x.Http1 + } + return nil +} + +func (x *ProxyProtocol_Detect) GetHttp2() *ProxyProtocol_Http2 { + if x != nil { + return x.Http2 + } + return nil +} + +type ProxyProtocol_Opaque struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Routes []*OpaqueRoute `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"` +} + +func (x *ProxyProtocol_Opaque) Reset() { + *x = ProxyProtocol_Opaque{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyProtocol_Opaque) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyProtocol_Opaque) ProtoMessage() {} + +func (x *ProxyProtocol_Opaque) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyProtocol_Opaque.ProtoReflect.Descriptor instead. +func (*ProxyProtocol_Opaque) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{2, 1} +} + +func (x *ProxyProtocol_Opaque) GetRoutes() []*OpaqueRoute { + if x != nil { + return x.Routes + } + return nil +} + +type ProxyProtocol_Http1 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Routes []*HttpRoute `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"` +} + +func (x *ProxyProtocol_Http1) Reset() { + *x = ProxyProtocol_Http1{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyProtocol_Http1) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyProtocol_Http1) ProtoMessage() {} + +func (x *ProxyProtocol_Http1) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyProtocol_Http1.ProtoReflect.Descriptor instead. +func (*ProxyProtocol_Http1) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{2, 2} +} + +func (x *ProxyProtocol_Http1) GetRoutes() []*HttpRoute { + if x != nil { + return x.Routes + } + return nil +} + +type ProxyProtocol_Http2 struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Routes []*HttpRoute `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"` +} + +func (x *ProxyProtocol_Http2) Reset() { + *x = ProxyProtocol_Http2{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyProtocol_Http2) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyProtocol_Http2) ProtoMessage() {} + +func (x *ProxyProtocol_Http2) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProxyProtocol_Http2.ProtoReflect.Descriptor instead. +func (*ProxyProtocol_Http2) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{2, 3} +} + +func (x *ProxyProtocol_Http2) GetRoutes() []*HttpRoute { + if x != nil { + return x.Routes + } + return nil +} + +type ProxyProtocol_Grpc struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Routes []*GrpcRoute `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"` +} + +func (x *ProxyProtocol_Grpc) Reset() { + *x = ProxyProtocol_Grpc{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProxyProtocol_Grpc) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProxyProtocol_Grpc) ProtoMessage() {} + +func (x *ProxyProtocol_Grpc) ProtoReflect() protoreflect.Message { + mi := &file_outbound_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 ProxyProtocol_Grpc.ProtoReflect.Descriptor instead. +func (*ProxyProtocol_Grpc) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{2, 4} +} + +func (x *ProxyProtocol_Grpc) GetRoutes() []*GrpcRoute { + if x != nil { + return x.Routes + } + return nil +} + +type HttpRoute_Rule struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Matches []*http_route.HttpRouteMatch `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` + Filters []*HttpRoute_Filter `protobuf:"bytes,2,rep,name=filters,proto3" json:"filters,omitempty"` + Backends *HttpRoute_Distribution `protobuf:"bytes,3,opt,name=backends,proto3" json:"backends,omitempty"` +} + +func (x *HttpRoute_Rule) Reset() { + *x = HttpRoute_Rule{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HttpRoute_Rule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HttpRoute_Rule) ProtoMessage() {} + +func (x *HttpRoute_Rule) ProtoReflect() protoreflect.Message { + mi := &file_outbound_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 HttpRoute_Rule.ProtoReflect.Descriptor instead. +func (*HttpRoute_Rule) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{3, 0} +} + +func (x *HttpRoute_Rule) GetMatches() []*http_route.HttpRouteMatch { + if x != nil { + return x.Matches + } + return nil +} + +func (x *HttpRoute_Rule) GetFilters() []*HttpRoute_Filter { + if x != nil { + return x.Filters + } + return nil +} + +func (x *HttpRoute_Rule) GetBackends() *HttpRoute_Distribution { + if x != nil { + return x.Backends + } + return nil +} + +type HttpRoute_Filter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Kind: + // *HttpRoute_Filter_FailureInjector + // *HttpRoute_Filter_RequestHeaderModifier + // *HttpRoute_Filter_Redirect + Kind isHttpRoute_Filter_Kind `protobuf_oneof:"kind"` +} + +func (x *HttpRoute_Filter) Reset() { + *x = HttpRoute_Filter{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HttpRoute_Filter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HttpRoute_Filter) ProtoMessage() {} + +func (x *HttpRoute_Filter) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HttpRoute_Filter.ProtoReflect.Descriptor instead. +func (*HttpRoute_Filter) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{3, 1} +} + +func (m *HttpRoute_Filter) GetKind() isHttpRoute_Filter_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (x *HttpRoute_Filter) GetFailureInjector() *http_route.HttpFailureInjector { + if x, ok := x.GetKind().(*HttpRoute_Filter_FailureInjector); ok { + return x.FailureInjector + } + return nil +} + +func (x *HttpRoute_Filter) GetRequestHeaderModifier() *http_route.RequestHeaderModifier { + if x, ok := x.GetKind().(*HttpRoute_Filter_RequestHeaderModifier); ok { + return x.RequestHeaderModifier + } + return nil +} + +func (x *HttpRoute_Filter) GetRedirect() *http_route.RequestRedirect { + if x, ok := x.GetKind().(*HttpRoute_Filter_Redirect); ok { + return x.Redirect + } + return nil +} + +type isHttpRoute_Filter_Kind interface { + isHttpRoute_Filter_Kind() +} + +type HttpRoute_Filter_FailureInjector struct { + FailureInjector *http_route.HttpFailureInjector `protobuf:"bytes,1,opt,name=failure_injector,json=failureInjector,proto3,oneof"` +} + +type HttpRoute_Filter_RequestHeaderModifier struct { + RequestHeaderModifier *http_route.RequestHeaderModifier `protobuf:"bytes,2,opt,name=request_header_modifier,json=requestHeaderModifier,proto3,oneof"` +} + +type HttpRoute_Filter_Redirect struct { + Redirect *http_route.RequestRedirect `protobuf:"bytes,3,opt,name=redirect,proto3,oneof"` +} + +func (*HttpRoute_Filter_FailureInjector) isHttpRoute_Filter_Kind() {} + +func (*HttpRoute_Filter_RequestHeaderModifier) isHttpRoute_Filter_Kind() {} + +func (*HttpRoute_Filter_Redirect) isHttpRoute_Filter_Kind() {} + +type HttpRoute_Distribution struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Kind: + // *HttpRoute_Distribution_Empty_ + // *HttpRoute_Distribution_FirstAvailable_ + // *HttpRoute_Distribution_RandomAvailable_ + Kind isHttpRoute_Distribution_Kind `protobuf_oneof:"kind"` +} + +func (x *HttpRoute_Distribution) Reset() { + *x = HttpRoute_Distribution{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HttpRoute_Distribution) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HttpRoute_Distribution) ProtoMessage() {} + +func (x *HttpRoute_Distribution) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HttpRoute_Distribution.ProtoReflect.Descriptor instead. +func (*HttpRoute_Distribution) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{3, 2} +} + +func (m *HttpRoute_Distribution) GetKind() isHttpRoute_Distribution_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (x *HttpRoute_Distribution) GetEmpty() *HttpRoute_Distribution_Empty { + if x, ok := x.GetKind().(*HttpRoute_Distribution_Empty_); ok { + return x.Empty + } + return nil +} + +func (x *HttpRoute_Distribution) GetFirstAvailable() *HttpRoute_Distribution_FirstAvailable { + if x, ok := x.GetKind().(*HttpRoute_Distribution_FirstAvailable_); ok { + return x.FirstAvailable + } + return nil +} + +func (x *HttpRoute_Distribution) GetRandomAvailable() *HttpRoute_Distribution_RandomAvailable { + if x, ok := x.GetKind().(*HttpRoute_Distribution_RandomAvailable_); ok { + return x.RandomAvailable + } + return nil +} + +type isHttpRoute_Distribution_Kind interface { + isHttpRoute_Distribution_Kind() +} + +type HttpRoute_Distribution_Empty_ struct { + Empty *HttpRoute_Distribution_Empty `protobuf:"bytes,1,opt,name=empty,proto3,oneof"` +} + +type HttpRoute_Distribution_FirstAvailable_ struct { + // Use the first available backend in the list. + FirstAvailable *HttpRoute_Distribution_FirstAvailable `protobuf:"bytes,2,opt,name=first_available,json=firstAvailable,proto3,oneof"` +} + +type HttpRoute_Distribution_RandomAvailable_ struct { + RandomAvailable *HttpRoute_Distribution_RandomAvailable `protobuf:"bytes,3,opt,name=random_available,json=randomAvailable,proto3,oneof"` +} + +func (*HttpRoute_Distribution_Empty_) isHttpRoute_Distribution_Kind() {} + +func (*HttpRoute_Distribution_FirstAvailable_) isHttpRoute_Distribution_Kind() {} + +func (*HttpRoute_Distribution_RandomAvailable_) isHttpRoute_Distribution_Kind() {} + +type HttpRoute_RouteBackend struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backend *Backend `protobuf:"bytes,1,opt,name=backend,proto3" json:"backend,omitempty"` + Filters []*HttpRoute_Filter `protobuf:"bytes,3,rep,name=filters,proto3" json:"filters,omitempty"` +} + +func (x *HttpRoute_RouteBackend) Reset() { + *x = HttpRoute_RouteBackend{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HttpRoute_RouteBackend) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HttpRoute_RouteBackend) ProtoMessage() {} + +func (x *HttpRoute_RouteBackend) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HttpRoute_RouteBackend.ProtoReflect.Descriptor instead. +func (*HttpRoute_RouteBackend) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{3, 3} +} + +func (x *HttpRoute_RouteBackend) GetBackend() *Backend { + if x != nil { + return x.Backend + } + return nil +} + +func (x *HttpRoute_RouteBackend) GetFilters() []*HttpRoute_Filter { + if x != nil { + return x.Filters + } + return nil +} + +type HttpRoute_WeightedRouteBackend struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backend *HttpRoute_RouteBackend `protobuf:"bytes,1,opt,name=backend,proto3" json:"backend,omitempty"` + Weight uint32 `protobuf:"varint,2,opt,name=weight,proto3" json:"weight,omitempty"` +} + +func (x *HttpRoute_WeightedRouteBackend) Reset() { + *x = HttpRoute_WeightedRouteBackend{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HttpRoute_WeightedRouteBackend) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HttpRoute_WeightedRouteBackend) ProtoMessage() {} + +func (x *HttpRoute_WeightedRouteBackend) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HttpRoute_WeightedRouteBackend.ProtoReflect.Descriptor instead. +func (*HttpRoute_WeightedRouteBackend) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{3, 4} +} + +func (x *HttpRoute_WeightedRouteBackend) GetBackend() *HttpRoute_RouteBackend { + if x != nil { + return x.Backend + } + return nil +} + +func (x *HttpRoute_WeightedRouteBackend) GetWeight() uint32 { + if x != nil { + return x.Weight + } + return 0 +} + +type HttpRoute_Distribution_Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *HttpRoute_Distribution_Empty) Reset() { + *x = HttpRoute_Distribution_Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HttpRoute_Distribution_Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HttpRoute_Distribution_Empty) ProtoMessage() {} + +func (x *HttpRoute_Distribution_Empty) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[18] + 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 HttpRoute_Distribution_Empty.ProtoReflect.Descriptor instead. +func (*HttpRoute_Distribution_Empty) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{3, 2, 0} +} + +type HttpRoute_Distribution_FirstAvailable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backends []*HttpRoute_RouteBackend `protobuf:"bytes,1,rep,name=backends,proto3" json:"backends,omitempty"` +} + +func (x *HttpRoute_Distribution_FirstAvailable) Reset() { + *x = HttpRoute_Distribution_FirstAvailable{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HttpRoute_Distribution_FirstAvailable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HttpRoute_Distribution_FirstAvailable) ProtoMessage() {} + +func (x *HttpRoute_Distribution_FirstAvailable) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[19] + 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 HttpRoute_Distribution_FirstAvailable.ProtoReflect.Descriptor instead. +func (*HttpRoute_Distribution_FirstAvailable) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{3, 2, 1} +} + +func (x *HttpRoute_Distribution_FirstAvailable) GetBackends() []*HttpRoute_RouteBackend { + if x != nil { + return x.Backends + } + return nil +} + +type HttpRoute_Distribution_RandomAvailable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backends []*HttpRoute_WeightedRouteBackend `protobuf:"bytes,1,rep,name=backends,proto3" json:"backends,omitempty"` +} + +func (x *HttpRoute_Distribution_RandomAvailable) Reset() { + *x = HttpRoute_Distribution_RandomAvailable{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HttpRoute_Distribution_RandomAvailable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HttpRoute_Distribution_RandomAvailable) ProtoMessage() {} + +func (x *HttpRoute_Distribution_RandomAvailable) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[20] + 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 HttpRoute_Distribution_RandomAvailable.ProtoReflect.Descriptor instead. +func (*HttpRoute_Distribution_RandomAvailable) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{3, 2, 2} +} + +func (x *HttpRoute_Distribution_RandomAvailable) GetBackends() []*HttpRoute_WeightedRouteBackend { + if x != nil { + return x.Backends + } + return nil +} + +type GrpcRoute_Rule struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Matches []*grpc_route.GrpcRouteMatch `protobuf:"bytes,1,rep,name=matches,proto3" json:"matches,omitempty"` + Filters []*GrpcRoute_Filter `protobuf:"bytes,2,rep,name=filters,proto3" json:"filters,omitempty"` + Backends *GrpcRoute_Distribution `protobuf:"bytes,3,opt,name=backends,proto3" json:"backends,omitempty"` +} + +func (x *GrpcRoute_Rule) Reset() { + *x = GrpcRoute_Rule{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GrpcRoute_Rule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrpcRoute_Rule) ProtoMessage() {} + +func (x *GrpcRoute_Rule) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[21] + 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 GrpcRoute_Rule.ProtoReflect.Descriptor instead. +func (*GrpcRoute_Rule) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{4, 0} +} + +func (x *GrpcRoute_Rule) GetMatches() []*grpc_route.GrpcRouteMatch { + if x != nil { + return x.Matches + } + return nil +} + +func (x *GrpcRoute_Rule) GetFilters() []*GrpcRoute_Filter { + if x != nil { + return x.Filters + } + return nil +} + +func (x *GrpcRoute_Rule) GetBackends() *GrpcRoute_Distribution { + if x != nil { + return x.Backends + } + return nil +} + +type GrpcRoute_Filter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Kind: + // *GrpcRoute_Filter_FailureInjector + // *GrpcRoute_Filter_RequestHeaderModifier + Kind isGrpcRoute_Filter_Kind `protobuf_oneof:"kind"` +} + +func (x *GrpcRoute_Filter) Reset() { + *x = GrpcRoute_Filter{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GrpcRoute_Filter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrpcRoute_Filter) ProtoMessage() {} + +func (x *GrpcRoute_Filter) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[22] + 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 GrpcRoute_Filter.ProtoReflect.Descriptor instead. +func (*GrpcRoute_Filter) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{4, 1} +} + +func (m *GrpcRoute_Filter) GetKind() isGrpcRoute_Filter_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (x *GrpcRoute_Filter) GetFailureInjector() *grpc_route.GrpcFailureInjector { + if x, ok := x.GetKind().(*GrpcRoute_Filter_FailureInjector); ok { + return x.FailureInjector + } + return nil +} + +func (x *GrpcRoute_Filter) GetRequestHeaderModifier() *http_route.RequestHeaderModifier { + if x, ok := x.GetKind().(*GrpcRoute_Filter_RequestHeaderModifier); ok { + return x.RequestHeaderModifier + } + return nil +} + +type isGrpcRoute_Filter_Kind interface { + isGrpcRoute_Filter_Kind() +} + +type GrpcRoute_Filter_FailureInjector struct { + FailureInjector *grpc_route.GrpcFailureInjector `protobuf:"bytes,1,opt,name=failure_injector,json=failureInjector,proto3,oneof"` +} + +type GrpcRoute_Filter_RequestHeaderModifier struct { + RequestHeaderModifier *http_route.RequestHeaderModifier `protobuf:"bytes,2,opt,name=request_header_modifier,json=requestHeaderModifier,proto3,oneof"` +} + +func (*GrpcRoute_Filter_FailureInjector) isGrpcRoute_Filter_Kind() {} + +func (*GrpcRoute_Filter_RequestHeaderModifier) isGrpcRoute_Filter_Kind() {} + +type GrpcRoute_Distribution struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Kind: + // *GrpcRoute_Distribution_Empty_ + // *GrpcRoute_Distribution_FirstAvailable_ + // *GrpcRoute_Distribution_RandomAvailable_ + Kind isGrpcRoute_Distribution_Kind `protobuf_oneof:"kind"` +} + +func (x *GrpcRoute_Distribution) Reset() { + *x = GrpcRoute_Distribution{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GrpcRoute_Distribution) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrpcRoute_Distribution) ProtoMessage() {} + +func (x *GrpcRoute_Distribution) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[23] + 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 GrpcRoute_Distribution.ProtoReflect.Descriptor instead. +func (*GrpcRoute_Distribution) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{4, 2} +} + +func (m *GrpcRoute_Distribution) GetKind() isGrpcRoute_Distribution_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (x *GrpcRoute_Distribution) GetEmpty() *GrpcRoute_Distribution_Empty { + if x, ok := x.GetKind().(*GrpcRoute_Distribution_Empty_); ok { + return x.Empty + } + return nil +} + +func (x *GrpcRoute_Distribution) GetFirstAvailable() *GrpcRoute_Distribution_FirstAvailable { + if x, ok := x.GetKind().(*GrpcRoute_Distribution_FirstAvailable_); ok { + return x.FirstAvailable + } + return nil +} + +func (x *GrpcRoute_Distribution) GetRandomAvailable() *GrpcRoute_Distribution_RandomAvailable { + if x, ok := x.GetKind().(*GrpcRoute_Distribution_RandomAvailable_); ok { + return x.RandomAvailable + } + return nil +} + +type isGrpcRoute_Distribution_Kind interface { + isGrpcRoute_Distribution_Kind() +} + +type GrpcRoute_Distribution_Empty_ struct { + Empty *GrpcRoute_Distribution_Empty `protobuf:"bytes,1,opt,name=empty,proto3,oneof"` +} + +type GrpcRoute_Distribution_FirstAvailable_ struct { + // Use the first available backend in the list. + FirstAvailable *GrpcRoute_Distribution_FirstAvailable `protobuf:"bytes,2,opt,name=first_available,json=firstAvailable,proto3,oneof"` +} + +type GrpcRoute_Distribution_RandomAvailable_ struct { + RandomAvailable *GrpcRoute_Distribution_RandomAvailable `protobuf:"bytes,3,opt,name=random_available,json=randomAvailable,proto3,oneof"` +} + +func (*GrpcRoute_Distribution_Empty_) isGrpcRoute_Distribution_Kind() {} + +func (*GrpcRoute_Distribution_FirstAvailable_) isGrpcRoute_Distribution_Kind() {} + +func (*GrpcRoute_Distribution_RandomAvailable_) isGrpcRoute_Distribution_Kind() {} + +type GrpcRoute_RouteBackend struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backend *Backend `protobuf:"bytes,1,opt,name=backend,proto3" json:"backend,omitempty"` + Filters []*GrpcRoute_Filter `protobuf:"bytes,3,rep,name=filters,proto3" json:"filters,omitempty"` +} + +func (x *GrpcRoute_RouteBackend) Reset() { + *x = GrpcRoute_RouteBackend{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GrpcRoute_RouteBackend) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrpcRoute_RouteBackend) ProtoMessage() {} + +func (x *GrpcRoute_RouteBackend) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[24] + 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 GrpcRoute_RouteBackend.ProtoReflect.Descriptor instead. +func (*GrpcRoute_RouteBackend) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{4, 3} +} + +func (x *GrpcRoute_RouteBackend) GetBackend() *Backend { + if x != nil { + return x.Backend + } + return nil +} + +func (x *GrpcRoute_RouteBackend) GetFilters() []*GrpcRoute_Filter { + if x != nil { + return x.Filters + } + return nil +} + +type GrpcRoute_WeightedRouteBackend struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backend *GrpcRoute_RouteBackend `protobuf:"bytes,1,opt,name=backend,proto3" json:"backend,omitempty"` + Weight uint32 `protobuf:"varint,2,opt,name=weight,proto3" json:"weight,omitempty"` +} + +func (x *GrpcRoute_WeightedRouteBackend) Reset() { + *x = GrpcRoute_WeightedRouteBackend{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GrpcRoute_WeightedRouteBackend) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrpcRoute_WeightedRouteBackend) ProtoMessage() {} + +func (x *GrpcRoute_WeightedRouteBackend) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[25] + 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 GrpcRoute_WeightedRouteBackend.ProtoReflect.Descriptor instead. +func (*GrpcRoute_WeightedRouteBackend) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{4, 4} +} + +func (x *GrpcRoute_WeightedRouteBackend) GetBackend() *GrpcRoute_RouteBackend { + if x != nil { + return x.Backend + } + return nil +} + +func (x *GrpcRoute_WeightedRouteBackend) GetWeight() uint32 { + if x != nil { + return x.Weight + } + return 0 +} + +type GrpcRoute_Distribution_Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GrpcRoute_Distribution_Empty) Reset() { + *x = GrpcRoute_Distribution_Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GrpcRoute_Distribution_Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrpcRoute_Distribution_Empty) ProtoMessage() {} + +func (x *GrpcRoute_Distribution_Empty) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[26] + 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 GrpcRoute_Distribution_Empty.ProtoReflect.Descriptor instead. +func (*GrpcRoute_Distribution_Empty) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{4, 2, 0} +} + +type GrpcRoute_Distribution_FirstAvailable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backends []*GrpcRoute_RouteBackend `protobuf:"bytes,1,rep,name=backends,proto3" json:"backends,omitempty"` +} + +func (x *GrpcRoute_Distribution_FirstAvailable) Reset() { + *x = GrpcRoute_Distribution_FirstAvailable{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GrpcRoute_Distribution_FirstAvailable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrpcRoute_Distribution_FirstAvailable) ProtoMessage() {} + +func (x *GrpcRoute_Distribution_FirstAvailable) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[27] + 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 GrpcRoute_Distribution_FirstAvailable.ProtoReflect.Descriptor instead. +func (*GrpcRoute_Distribution_FirstAvailable) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{4, 2, 1} +} + +func (x *GrpcRoute_Distribution_FirstAvailable) GetBackends() []*GrpcRoute_RouteBackend { + if x != nil { + return x.Backends + } + return nil +} + +type GrpcRoute_Distribution_RandomAvailable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backends []*GrpcRoute_WeightedRouteBackend `protobuf:"bytes,1,rep,name=backends,proto3" json:"backends,omitempty"` +} + +func (x *GrpcRoute_Distribution_RandomAvailable) Reset() { + *x = GrpcRoute_Distribution_RandomAvailable{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GrpcRoute_Distribution_RandomAvailable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GrpcRoute_Distribution_RandomAvailable) ProtoMessage() {} + +func (x *GrpcRoute_Distribution_RandomAvailable) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[28] + 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 GrpcRoute_Distribution_RandomAvailable.ProtoReflect.Descriptor instead. +func (*GrpcRoute_Distribution_RandomAvailable) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{4, 2, 2} +} + +func (x *GrpcRoute_Distribution_RandomAvailable) GetBackends() []*GrpcRoute_WeightedRouteBackend { + if x != nil { + return x.Backends + } + return nil +} + +type OpaqueRoute_Rule struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backends *OpaqueRoute_Distribution `protobuf:"bytes,1,opt,name=backends,proto3" json:"backends,omitempty"` +} + +func (x *OpaqueRoute_Rule) Reset() { + *x = OpaqueRoute_Rule{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpaqueRoute_Rule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpaqueRoute_Rule) ProtoMessage() {} + +func (x *OpaqueRoute_Rule) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[29] + 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 OpaqueRoute_Rule.ProtoReflect.Descriptor instead. +func (*OpaqueRoute_Rule) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{5, 0} +} + +func (x *OpaqueRoute_Rule) GetBackends() *OpaqueRoute_Distribution { + if x != nil { + return x.Backends + } + return nil +} + +type OpaqueRoute_Distribution struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Kind: + // *OpaqueRoute_Distribution_Empty_ + // *OpaqueRoute_Distribution_FirstAvailable_ + // *OpaqueRoute_Distribution_RandomAvailable_ + Kind isOpaqueRoute_Distribution_Kind `protobuf_oneof:"kind"` +} + +func (x *OpaqueRoute_Distribution) Reset() { + *x = OpaqueRoute_Distribution{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpaqueRoute_Distribution) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpaqueRoute_Distribution) ProtoMessage() {} + +func (x *OpaqueRoute_Distribution) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[30] + 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 OpaqueRoute_Distribution.ProtoReflect.Descriptor instead. +func (*OpaqueRoute_Distribution) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{5, 1} +} + +func (m *OpaqueRoute_Distribution) GetKind() isOpaqueRoute_Distribution_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (x *OpaqueRoute_Distribution) GetEmpty() *OpaqueRoute_Distribution_Empty { + if x, ok := x.GetKind().(*OpaqueRoute_Distribution_Empty_); ok { + return x.Empty + } + return nil +} + +func (x *OpaqueRoute_Distribution) GetFirstAvailable() *OpaqueRoute_Distribution_FirstAvailable { + if x, ok := x.GetKind().(*OpaqueRoute_Distribution_FirstAvailable_); ok { + return x.FirstAvailable + } + return nil +} + +func (x *OpaqueRoute_Distribution) GetRandomAvailable() *OpaqueRoute_Distribution_RandomAvailable { + if x, ok := x.GetKind().(*OpaqueRoute_Distribution_RandomAvailable_); ok { + return x.RandomAvailable + } + return nil +} + +type isOpaqueRoute_Distribution_Kind interface { + isOpaqueRoute_Distribution_Kind() +} + +type OpaqueRoute_Distribution_Empty_ struct { + Empty *OpaqueRoute_Distribution_Empty `protobuf:"bytes,1,opt,name=empty,proto3,oneof"` +} + +type OpaqueRoute_Distribution_FirstAvailable_ struct { + // Use the first available backend in the list. + FirstAvailable *OpaqueRoute_Distribution_FirstAvailable `protobuf:"bytes,2,opt,name=first_available,json=firstAvailable,proto3,oneof"` +} + +type OpaqueRoute_Distribution_RandomAvailable_ struct { + RandomAvailable *OpaqueRoute_Distribution_RandomAvailable `protobuf:"bytes,3,opt,name=random_available,json=randomAvailable,proto3,oneof"` +} + +func (*OpaqueRoute_Distribution_Empty_) isOpaqueRoute_Distribution_Kind() {} + +func (*OpaqueRoute_Distribution_FirstAvailable_) isOpaqueRoute_Distribution_Kind() {} + +func (*OpaqueRoute_Distribution_RandomAvailable_) isOpaqueRoute_Distribution_Kind() {} + +type OpaqueRoute_RouteBackend struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backend *Backend `protobuf:"bytes,1,opt,name=backend,proto3" json:"backend,omitempty"` +} + +func (x *OpaqueRoute_RouteBackend) Reset() { + *x = OpaqueRoute_RouteBackend{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpaqueRoute_RouteBackend) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpaqueRoute_RouteBackend) ProtoMessage() {} + +func (x *OpaqueRoute_RouteBackend) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[31] + 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 OpaqueRoute_RouteBackend.ProtoReflect.Descriptor instead. +func (*OpaqueRoute_RouteBackend) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{5, 2} +} + +func (x *OpaqueRoute_RouteBackend) GetBackend() *Backend { + if x != nil { + return x.Backend + } + return nil +} + +type OpaqueRoute_WeightedRouteBackend struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backend *OpaqueRoute_RouteBackend `protobuf:"bytes,1,opt,name=backend,proto3" json:"backend,omitempty"` + Weight uint32 `protobuf:"varint,2,opt,name=weight,proto3" json:"weight,omitempty"` +} + +func (x *OpaqueRoute_WeightedRouteBackend) Reset() { + *x = OpaqueRoute_WeightedRouteBackend{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpaqueRoute_WeightedRouteBackend) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpaqueRoute_WeightedRouteBackend) ProtoMessage() {} + +func (x *OpaqueRoute_WeightedRouteBackend) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[32] + 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 OpaqueRoute_WeightedRouteBackend.ProtoReflect.Descriptor instead. +func (*OpaqueRoute_WeightedRouteBackend) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{5, 3} +} + +func (x *OpaqueRoute_WeightedRouteBackend) GetBackend() *OpaqueRoute_RouteBackend { + if x != nil { + return x.Backend + } + return nil +} + +func (x *OpaqueRoute_WeightedRouteBackend) GetWeight() uint32 { + if x != nil { + return x.Weight + } + return 0 +} + +type OpaqueRoute_Distribution_Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *OpaqueRoute_Distribution_Empty) Reset() { + *x = OpaqueRoute_Distribution_Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpaqueRoute_Distribution_Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpaqueRoute_Distribution_Empty) ProtoMessage() {} + +func (x *OpaqueRoute_Distribution_Empty) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[33] + 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 OpaqueRoute_Distribution_Empty.ProtoReflect.Descriptor instead. +func (*OpaqueRoute_Distribution_Empty) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{5, 1, 0} +} + +type OpaqueRoute_Distribution_FirstAvailable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backends []*OpaqueRoute_RouteBackend `protobuf:"bytes,1,rep,name=backends,proto3" json:"backends,omitempty"` +} + +func (x *OpaqueRoute_Distribution_FirstAvailable) Reset() { + *x = OpaqueRoute_Distribution_FirstAvailable{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpaqueRoute_Distribution_FirstAvailable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpaqueRoute_Distribution_FirstAvailable) ProtoMessage() {} + +func (x *OpaqueRoute_Distribution_FirstAvailable) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[34] + 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 OpaqueRoute_Distribution_FirstAvailable.ProtoReflect.Descriptor instead. +func (*OpaqueRoute_Distribution_FirstAvailable) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{5, 1, 1} +} + +func (x *OpaqueRoute_Distribution_FirstAvailable) GetBackends() []*OpaqueRoute_RouteBackend { + if x != nil { + return x.Backends + } + return nil +} + +type OpaqueRoute_Distribution_RandomAvailable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Backends []*OpaqueRoute_WeightedRouteBackend `protobuf:"bytes,1,rep,name=backends,proto3" json:"backends,omitempty"` +} + +func (x *OpaqueRoute_Distribution_RandomAvailable) Reset() { + *x = OpaqueRoute_Distribution_RandomAvailable{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OpaqueRoute_Distribution_RandomAvailable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpaqueRoute_Distribution_RandomAvailable) ProtoMessage() {} + +func (x *OpaqueRoute_Distribution_RandomAvailable) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OpaqueRoute_Distribution_RandomAvailable.ProtoReflect.Descriptor instead. +func (*OpaqueRoute_Distribution_RandomAvailable) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{5, 1, 2} +} + +func (x *OpaqueRoute_Distribution_RandomAvailable) GetBackends() []*OpaqueRoute_WeightedRouteBackend { + if x != nil { + return x.Backends + } + return nil +} + +// A strategy for discovering endpoints for a service. +type Backend_EndpointDiscovery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Kind: + // *Backend_EndpointDiscovery_Dst + Kind isBackend_EndpointDiscovery_Kind `protobuf_oneof:"kind"` +} + +func (x *Backend_EndpointDiscovery) Reset() { + *x = Backend_EndpointDiscovery{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Backend_EndpointDiscovery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Backend_EndpointDiscovery) ProtoMessage() {} + +func (x *Backend_EndpointDiscovery) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Backend_EndpointDiscovery.ProtoReflect.Descriptor instead. +func (*Backend_EndpointDiscovery) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{6, 0} +} + +func (m *Backend_EndpointDiscovery) GetKind() isBackend_EndpointDiscovery_Kind { + if m != nil { + return m.Kind + } + return nil +} + +func (x *Backend_EndpointDiscovery) GetDst() *Backend_EndpointDiscovery_DestinationGet { + if x, ok := x.GetKind().(*Backend_EndpointDiscovery_Dst); ok { + return x.Dst + } + return nil +} + +type isBackend_EndpointDiscovery_Kind interface { + isBackend_EndpointDiscovery_Kind() +} + +type Backend_EndpointDiscovery_Dst struct { + // Use the `Destination` service to discover endpoints for this service. + Dst *Backend_EndpointDiscovery_DestinationGet `protobuf:"bytes,1,opt,name=dst,proto3,oneof"` +} + +func (*Backend_EndpointDiscovery_Dst) isBackend_EndpointDiscovery_Kind() {} + +// Describes a power-of-two-choices (P2C) load balancer configuration for a +// backend. +type Backend_BalanceP2C struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Discovery *Backend_EndpointDiscovery `protobuf:"bytes,1,opt,name=discovery,proto3" json:"discovery,omitempty"` + // The load estimation strategy used by this load balancer. + // + // Types that are assignable to Load: + // *Backend_BalanceP2C_PeakEwma_ + Load isBackend_BalanceP2C_Load `protobuf_oneof:"load"` +} + +func (x *Backend_BalanceP2C) Reset() { + *x = Backend_BalanceP2C{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Backend_BalanceP2C) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Backend_BalanceP2C) ProtoMessage() {} + +func (x *Backend_BalanceP2C) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Backend_BalanceP2C.ProtoReflect.Descriptor instead. +func (*Backend_BalanceP2C) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{6, 1} +} + +func (x *Backend_BalanceP2C) GetDiscovery() *Backend_EndpointDiscovery { + if x != nil { + return x.Discovery + } + return nil +} + +func (m *Backend_BalanceP2C) GetLoad() isBackend_BalanceP2C_Load { + if m != nil { + return m.Load + } + return nil +} + +func (x *Backend_BalanceP2C) GetPeakEwma() *Backend_BalanceP2C_PeakEwma { + if x, ok := x.GetLoad().(*Backend_BalanceP2C_PeakEwma_); ok { + return x.PeakEwma + } + return nil +} + +type isBackend_BalanceP2C_Load interface { + isBackend_BalanceP2C_Load() +} + +type Backend_BalanceP2C_PeakEwma_ struct { + // This load balancer uses peak EWMA (exponentially weighted moving + // average) load estimates. + PeakEwma *Backend_BalanceP2C_PeakEwma `protobuf:"bytes,2,opt,name=peak_ewma,json=peakEwma,proto3,oneof"` +} + +func (*Backend_BalanceP2C_PeakEwma_) isBackend_BalanceP2C_Load() {} + +type Backend_EndpointDiscovery_DestinationGet struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` +} + +func (x *Backend_EndpointDiscovery_DestinationGet) Reset() { + *x = Backend_EndpointDiscovery_DestinationGet{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Backend_EndpointDiscovery_DestinationGet) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Backend_EndpointDiscovery_DestinationGet) ProtoMessage() {} + +func (x *Backend_EndpointDiscovery_DestinationGet) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Backend_EndpointDiscovery_DestinationGet.ProtoReflect.Descriptor instead. +func (*Backend_EndpointDiscovery_DestinationGet) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{6, 0, 0} +} + +func (x *Backend_EndpointDiscovery_DestinationGet) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +// Parameters configuring peak EWMA load estimation. +type Backend_BalanceP2C_PeakEwma struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Initial latency value used when no latencies have been + // recorded for an endpoint. + DefaultRtt *duration.Duration `protobuf:"bytes,1,opt,name=default_rtt,json=defaultRtt,proto3" json:"default_rtt,omitempty"` + // The duration of the moving window over which latency is observed. + Decay *duration.Duration `protobuf:"bytes,2,opt,name=decay,proto3" json:"decay,omitempty"` +} + +func (x *Backend_BalanceP2C_PeakEwma) Reset() { + *x = Backend_BalanceP2C_PeakEwma{} + if protoimpl.UnsafeEnabled { + mi := &file_outbound_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Backend_BalanceP2C_PeakEwma) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Backend_BalanceP2C_PeakEwma) ProtoMessage() {} + +func (x *Backend_BalanceP2C_PeakEwma) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Backend_BalanceP2C_PeakEwma.ProtoReflect.Descriptor instead. +func (*Backend_BalanceP2C_PeakEwma) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{6, 1, 0} +} + +func (x *Backend_BalanceP2C_PeakEwma) GetDefaultRtt() *duration.Duration { + if x != nil { + return x.DefaultRtt + } + return nil +} + +func (x *Backend_BalanceP2C_PeakEwma) GetDecay() *duration.Duration { + if x != nil { + return x.Decay + } + return nil +} + +var File_outbound_proto protoreflect.FileDescriptor + +var file_outbound_proto_rawDesc = []byte{ + 0x0a, 0x0e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x19, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x09, 0x6e, 0x65, 0x74, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0a, 0x6d, 0x65, 0x74, 0x61, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x98, 0x01, 0x0a, 0x0b, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x36, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x63, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x48, 0x00, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1e, 0x0a, 0x09, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x42, 0x08, 0x0a, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x22, 0x56, 0x0a, 0x0e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x44, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0xb5, 0x07, 0x0a, + 0x0d, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x49, + 0x0a, 0x06, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x48, + 0x00, 0x52, 0x06, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x12, 0x49, 0x0a, 0x06, 0x6f, 0x70, 0x61, + 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x70, + 0x61, 0x71, 0x75, 0x65, 0x12, 0x46, 0x0a, 0x05, 0x68, 0x74, 0x74, 0x70, 0x31, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x48, 0x74, + 0x74, 0x70, 0x31, 0x48, 0x00, 0x52, 0x05, 0x68, 0x74, 0x74, 0x70, 0x31, 0x12, 0x46, 0x0a, 0x05, + 0x68, 0x74, 0x74, 0x70, 0x32, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6f, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x32, 0x48, 0x00, 0x52, 0x05, 0x68, + 0x74, 0x74, 0x70, 0x32, 0x12, 0x43, 0x0a, 0x04, 0x67, 0x72, 0x70, 0x63, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x47, 0x72, 0x70, + 0x63, 0x48, 0x00, 0x52, 0x04, 0x67, 0x72, 0x70, 0x63, 0x1a, 0x92, 0x02, 0x0a, 0x06, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x12, 0x33, 0x0a, 0x07, 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, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x06, 0x6f, 0x70, 0x61, + 0x71, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x52, 0x06, 0x6f, 0x70, 0x61, 0x71, + 0x75, 0x65, 0x12, 0x44, 0x0a, 0x05, 0x68, 0x74, 0x74, 0x70, 0x31, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x48, 0x74, 0x74, 0x70, + 0x31, 0x52, 0x05, 0x68, 0x74, 0x74, 0x70, 0x31, 0x12, 0x44, 0x0a, 0x05, 0x68, 0x74, 0x74, 0x70, + 0x32, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x32, 0x52, 0x05, 0x68, 0x74, 0x74, 0x70, 0x32, 0x1a, 0x48, + 0x0a, 0x06, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x45, 0x0a, 0x05, 0x48, 0x74, 0x74, 0x70, + 0x31, 0x12, 0x3c, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, + 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x1a, + 0x45, 0x0a, 0x05, 0x48, 0x74, 0x74, 0x70, 0x32, 0x12, 0x3c, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x44, 0x0a, 0x04, 0x47, 0x72, 0x70, 0x63, 0x12, 0x3c, + 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x42, 0x06, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x87, 0x0c, 0x0a, 0x09, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, + 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x3c, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x48, 0x6f, 0x73, + 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x3f, 0x0a, + 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, + 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0xe3, + 0x01, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x45, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x45, + 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, 0x70, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4d, 0x0a, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x44, 0x69, + 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x73, 0x1a, 0xa9, 0x02, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, + 0x5d, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x6a, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x68, 0x74, 0x74, + 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x66, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x6c, + 0x0a, 0x17, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x32, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x08, + 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x08, + 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x1a, 0x98, 0x04, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x4f, 0x0a, 0x05, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x37, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, + 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x05, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x6b, 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6f, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, + 0x69, 0x72, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, + 0x0e, 0x66, 0x69, 0x72, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x6e, 0x0a, 0x10, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, + 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x6e, + 0x64, 0x6f, 0x6d, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x0f, + 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x1a, + 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x5f, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x4d, 0x0a, 0x08, 0x62, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, + 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, + 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x1a, 0x68, 0x0a, 0x0f, 0x52, 0x61, 0x6e, + 0x64, 0x6f, 0x6d, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x55, 0x0a, 0x08, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, + 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0x93, 0x01, 0x0a, 0x0c, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x3c, 0x0a, 0x07, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x07, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6f, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x1a, 0x7b, 0x0a, 0x14, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x4b, 0x0a, 0x07, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6f, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, + 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x07, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 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, 0xbb, + 0x0b, 0x0a, 0x09, 0x47, 0x72, 0x70, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3c, 0x0a, 0x05, 0x68, 0x6f, 0x73, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x75, 0x6c, + 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0xe3, 0x01, 0x0a, 0x04, 0x52, 0x75, 0x6c, + 0x65, 0x12, 0x45, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x2e, 0x47, 0x72, 0x70, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, + 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x4d, 0x0a, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x47, 0x72, + 0x70, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x1a, 0xdd, + 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x10, 0x66, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, + 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x49, 0x6e, 0x6a, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x6c, 0x0a, 0x17, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x68, 0x74, 0x74, + 0x70, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x15, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0x98, + 0x04, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x4f, 0x0a, 0x05, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, + 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x48, 0x00, 0x52, 0x05, 0x65, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x6b, 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, + 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x6e, 0x0a, + 0x10, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x44, 0x69, + 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x61, + 0x6e, 0x64, 0x6f, 0x6d, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x5f, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x4d, 0x0a, 0x08, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6f, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, + 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x08, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x1a, 0x68, 0x0a, 0x0f, 0x52, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x55, 0x0a, 0x08, 0x62, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, + 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x2e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x73, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0x93, 0x01, 0x0a, 0x0c, 0x52, 0x6f, + 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x3c, 0x0a, 0x07, 0x62, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6f, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, + 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x45, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, + 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x1a, + 0x7b, 0x0a, 0x14, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x4b, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x07, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 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, 0xd8, 0x07, 0x0a, + 0x0b, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x05, 0x72, 0x75, 0x6c, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, + 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x2e, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x57, 0x0a, 0x04, + 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x44, + 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x1a, 0xa2, 0x04, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x05, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, + 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x44, 0x69, + 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x48, 0x00, 0x52, 0x05, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x6d, 0x0a, 0x0f, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x4f, + 0x70, 0x61, 0x71, 0x75, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x69, 0x72, 0x73, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x70, 0x0a, 0x10, 0x72, 0x61, 0x6e, 0x64, + 0x6f, 0x6d, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x4f, + 0x70, 0x61, 0x71, 0x75, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x72, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x1a, 0x07, 0x0a, 0x05, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x61, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, + 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x08, 0x62, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x1a, 0x6a, 0x0a, 0x0f, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x57, 0x0a, 0x08, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6f, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x4f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x52, 0x6f, + 0x75, 0x74, 0x65, 0x2e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0x4c, 0x0a, 0x0c, 0x52, 0x6f, + 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x3c, 0x0a, 0x07, 0x62, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6f, + 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, + 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x1a, 0x7d, 0x0a, 0x14, 0x57, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x12, 0x4d, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x4f, 0x70, + 0x61, 0x71, 0x75, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 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, 0xf3, 0x05, 0x0a, 0x07, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, + 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x46, 0x0a, 0x07, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x48, 0x00, 0x52, + 0x07, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4b, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6f, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, + 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x32, 0x63, 0x48, 0x00, 0x52, 0x08, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x75, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, + 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x52, 0x05, 0x71, 0x75, 0x65, 0x75, 0x65, 0x1a, 0x9a, 0x01, + 0x0a, 0x11, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x12, 0x57, 0x0a, 0x03, 0x64, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x43, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x48, 0x00, 0x52, 0x03, 0x64, 0x73, 0x74, 0x1a, 0x24, 0x0a, 0x0e, + 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x65, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0xb8, 0x02, 0x0a, 0x0a, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x32, 0x63, 0x12, 0x52, 0x0a, 0x09, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, + 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x55, 0x0a, + 0x09, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x65, 0x77, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x36, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x32, 0x63, 0x2e, + 0x50, 0x65, 0x61, 0x6b, 0x45, 0x77, 0x6d, 0x61, 0x48, 0x00, 0x52, 0x08, 0x70, 0x65, 0x61, 0x6b, + 0x45, 0x77, 0x6d, 0x61, 0x1a, 0x77, 0x0a, 0x08, 0x50, 0x65, 0x61, 0x6b, 0x45, 0x77, 0x6d, 0x61, + 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x74, 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, 0x0a, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x74, 0x74, 0x12, 0x2f, 0x0a, 0x05, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x64, 0x65, 0x63, 0x61, 0x79, 0x42, 0x06, 0x0a, + 0x04, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x69, 0x0a, + 0x05, 0x51, 0x75, 0x65, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x12, 0x44, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x66, 0x61, 0x73, 0x74, 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, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x66, 0x61, 0x73, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x32, 0xce, 0x01, 0x0a, 0x10, 0x4f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x5a, 0x0a, + 0x03, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, + 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x70, 0x65, 0x63, 0x1a, 0x29, 0x2e, 0x69, + 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x05, 0x57, 0x61, 0x74, + 0x63, 0x68, 0x12, 0x26, 0x2e, 0x69, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x53, 0x70, 0x65, 0x63, 0x1a, 0x29, 0x2e, 0x69, 0x6f, 0x2e, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6f, 0x75, + 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x00, 0x30, 0x01, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x2f, + 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x64, 0x32, 0x2d, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61, + 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_outbound_proto_rawDescOnce sync.Once + file_outbound_proto_rawDescData = file_outbound_proto_rawDesc +) + +func file_outbound_proto_rawDescGZIP() []byte { + file_outbound_proto_rawDescOnce.Do(func() { + file_outbound_proto_rawDescData = protoimpl.X.CompressGZIP(file_outbound_proto_rawDescData) + }) + return file_outbound_proto_rawDescData +} + +var file_outbound_proto_msgTypes = make([]protoimpl.MessageInfo, 40) +var file_outbound_proto_goTypes = []interface{}{ + (*TrafficSpec)(nil), // 0: io.linkerd.proxy.outbound.TrafficSpec + (*OutboundPolicy)(nil), // 1: io.linkerd.proxy.outbound.OutboundPolicy + (*ProxyProtocol)(nil), // 2: io.linkerd.proxy.outbound.ProxyProtocol + (*HttpRoute)(nil), // 3: io.linkerd.proxy.outbound.HttpRoute + (*GrpcRoute)(nil), // 4: io.linkerd.proxy.outbound.GrpcRoute + (*OpaqueRoute)(nil), // 5: io.linkerd.proxy.outbound.OpaqueRoute + (*Backend)(nil), // 6: io.linkerd.proxy.outbound.Backend + (*Queue)(nil), // 7: io.linkerd.proxy.outbound.Queue + (*ProxyProtocol_Detect)(nil), // 8: io.linkerd.proxy.outbound.ProxyProtocol.Detect + (*ProxyProtocol_Opaque)(nil), // 9: io.linkerd.proxy.outbound.ProxyProtocol.Opaque + (*ProxyProtocol_Http1)(nil), // 10: io.linkerd.proxy.outbound.ProxyProtocol.Http1 + (*ProxyProtocol_Http2)(nil), // 11: io.linkerd.proxy.outbound.ProxyProtocol.Http2 + (*ProxyProtocol_Grpc)(nil), // 12: io.linkerd.proxy.outbound.ProxyProtocol.Grpc + (*HttpRoute_Rule)(nil), // 13: io.linkerd.proxy.outbound.HttpRoute.Rule + (*HttpRoute_Filter)(nil), // 14: io.linkerd.proxy.outbound.HttpRoute.Filter + (*HttpRoute_Distribution)(nil), // 15: io.linkerd.proxy.outbound.HttpRoute.Distribution + (*HttpRoute_RouteBackend)(nil), // 16: io.linkerd.proxy.outbound.HttpRoute.RouteBackend + (*HttpRoute_WeightedRouteBackend)(nil), // 17: io.linkerd.proxy.outbound.HttpRoute.WeightedRouteBackend + (*HttpRoute_Distribution_Empty)(nil), // 18: io.linkerd.proxy.outbound.HttpRoute.Distribution.Empty + (*HttpRoute_Distribution_FirstAvailable)(nil), // 19: io.linkerd.proxy.outbound.HttpRoute.Distribution.FirstAvailable + (*HttpRoute_Distribution_RandomAvailable)(nil), // 20: io.linkerd.proxy.outbound.HttpRoute.Distribution.RandomAvailable + (*GrpcRoute_Rule)(nil), // 21: io.linkerd.proxy.outbound.GrpcRoute.Rule + (*GrpcRoute_Filter)(nil), // 22: io.linkerd.proxy.outbound.GrpcRoute.Filter + (*GrpcRoute_Distribution)(nil), // 23: io.linkerd.proxy.outbound.GrpcRoute.Distribution + (*GrpcRoute_RouteBackend)(nil), // 24: io.linkerd.proxy.outbound.GrpcRoute.RouteBackend + (*GrpcRoute_WeightedRouteBackend)(nil), // 25: io.linkerd.proxy.outbound.GrpcRoute.WeightedRouteBackend + (*GrpcRoute_Distribution_Empty)(nil), // 26: io.linkerd.proxy.outbound.GrpcRoute.Distribution.Empty + (*GrpcRoute_Distribution_FirstAvailable)(nil), // 27: io.linkerd.proxy.outbound.GrpcRoute.Distribution.FirstAvailable + (*GrpcRoute_Distribution_RandomAvailable)(nil), // 28: io.linkerd.proxy.outbound.GrpcRoute.Distribution.RandomAvailable + (*OpaqueRoute_Rule)(nil), // 29: io.linkerd.proxy.outbound.OpaqueRoute.Rule + (*OpaqueRoute_Distribution)(nil), // 30: io.linkerd.proxy.outbound.OpaqueRoute.Distribution + (*OpaqueRoute_RouteBackend)(nil), // 31: io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend + (*OpaqueRoute_WeightedRouteBackend)(nil), // 32: io.linkerd.proxy.outbound.OpaqueRoute.WeightedRouteBackend + (*OpaqueRoute_Distribution_Empty)(nil), // 33: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.Empty + (*OpaqueRoute_Distribution_FirstAvailable)(nil), // 34: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.FirstAvailable + (*OpaqueRoute_Distribution_RandomAvailable)(nil), // 35: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.RandomAvailable + (*Backend_EndpointDiscovery)(nil), // 36: io.linkerd.proxy.outbound.Backend.EndpointDiscovery + (*Backend_BalanceP2C)(nil), // 37: io.linkerd.proxy.outbound.Backend.BalanceP2c + (*Backend_EndpointDiscovery_DestinationGet)(nil), // 38: io.linkerd.proxy.outbound.Backend.EndpointDiscovery.DestinationGet + (*Backend_BalanceP2C_PeakEwma)(nil), // 39: io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma + (*net.TcpAddress)(nil), // 40: io.linkerd.proxy.net.TcpAddress + (*meta.Metadata)(nil), // 41: io.linkerd.proxy.meta.Metadata + (*http_route.HostMatch)(nil), // 42: io.linkerd.proxy.http_route.HostMatch + (*destination.WeightedAddr)(nil), // 43: io.linkerd.proxy.destination.WeightedAddr + (*duration.Duration)(nil), // 44: google.protobuf.Duration + (*http_route.HttpRouteMatch)(nil), // 45: io.linkerd.proxy.http_route.HttpRouteMatch + (*http_route.HttpFailureInjector)(nil), // 46: io.linkerd.proxy.http_route.HttpFailureInjector + (*http_route.RequestHeaderModifier)(nil), // 47: io.linkerd.proxy.http_route.RequestHeaderModifier + (*http_route.RequestRedirect)(nil), // 48: io.linkerd.proxy.http_route.RequestRedirect + (*grpc_route.GrpcRouteMatch)(nil), // 49: io.linkerd.proxy.grpc_route.GrpcRouteMatch + (*grpc_route.GrpcFailureInjector)(nil), // 50: io.linkerd.proxy.grpc_route.GrpcFailureInjector +} +var file_outbound_proto_depIdxs = []int32{ + 40, // 0: io.linkerd.proxy.outbound.TrafficSpec.addr:type_name -> io.linkerd.proxy.net.TcpAddress + 2, // 1: io.linkerd.proxy.outbound.OutboundPolicy.protocol:type_name -> io.linkerd.proxy.outbound.ProxyProtocol + 8, // 2: io.linkerd.proxy.outbound.ProxyProtocol.detect:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Detect + 9, // 3: io.linkerd.proxy.outbound.ProxyProtocol.opaque:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Opaque + 10, // 4: io.linkerd.proxy.outbound.ProxyProtocol.http1:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http1 + 11, // 5: io.linkerd.proxy.outbound.ProxyProtocol.http2:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http2 + 12, // 6: io.linkerd.proxy.outbound.ProxyProtocol.grpc:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Grpc + 41, // 7: io.linkerd.proxy.outbound.HttpRoute.metadata:type_name -> io.linkerd.proxy.meta.Metadata + 42, // 8: io.linkerd.proxy.outbound.HttpRoute.hosts:type_name -> io.linkerd.proxy.http_route.HostMatch + 13, // 9: io.linkerd.proxy.outbound.HttpRoute.rules:type_name -> io.linkerd.proxy.outbound.HttpRoute.Rule + 41, // 10: io.linkerd.proxy.outbound.GrpcRoute.metadata:type_name -> io.linkerd.proxy.meta.Metadata + 42, // 11: io.linkerd.proxy.outbound.GrpcRoute.hosts:type_name -> io.linkerd.proxy.http_route.HostMatch + 21, // 12: io.linkerd.proxy.outbound.GrpcRoute.rules:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Rule + 41, // 13: io.linkerd.proxy.outbound.OpaqueRoute.metadata:type_name -> io.linkerd.proxy.meta.Metadata + 29, // 14: io.linkerd.proxy.outbound.OpaqueRoute.rules:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Rule + 41, // 15: io.linkerd.proxy.outbound.Backend.metadata:type_name -> io.linkerd.proxy.meta.Metadata + 43, // 16: io.linkerd.proxy.outbound.Backend.forward:type_name -> io.linkerd.proxy.destination.WeightedAddr + 37, // 17: io.linkerd.proxy.outbound.Backend.balancer:type_name -> io.linkerd.proxy.outbound.Backend.BalanceP2c + 7, // 18: io.linkerd.proxy.outbound.Backend.queue:type_name -> io.linkerd.proxy.outbound.Queue + 44, // 19: io.linkerd.proxy.outbound.Queue.failfast_timeout:type_name -> google.protobuf.Duration + 44, // 20: io.linkerd.proxy.outbound.ProxyProtocol.Detect.timeout:type_name -> google.protobuf.Duration + 9, // 21: io.linkerd.proxy.outbound.ProxyProtocol.Detect.opaque:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Opaque + 10, // 22: io.linkerd.proxy.outbound.ProxyProtocol.Detect.http1:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http1 + 11, // 23: io.linkerd.proxy.outbound.ProxyProtocol.Detect.http2:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http2 + 5, // 24: io.linkerd.proxy.outbound.ProxyProtocol.Opaque.routes:type_name -> io.linkerd.proxy.outbound.OpaqueRoute + 3, // 25: io.linkerd.proxy.outbound.ProxyProtocol.Http1.routes:type_name -> io.linkerd.proxy.outbound.HttpRoute + 3, // 26: io.linkerd.proxy.outbound.ProxyProtocol.Http2.routes:type_name -> io.linkerd.proxy.outbound.HttpRoute + 4, // 27: io.linkerd.proxy.outbound.ProxyProtocol.Grpc.routes:type_name -> io.linkerd.proxy.outbound.GrpcRoute + 45, // 28: io.linkerd.proxy.outbound.HttpRoute.Rule.matches:type_name -> io.linkerd.proxy.http_route.HttpRouteMatch + 14, // 29: io.linkerd.proxy.outbound.HttpRoute.Rule.filters:type_name -> io.linkerd.proxy.outbound.HttpRoute.Filter + 15, // 30: io.linkerd.proxy.outbound.HttpRoute.Rule.backends:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution + 46, // 31: io.linkerd.proxy.outbound.HttpRoute.Filter.failure_injector:type_name -> io.linkerd.proxy.http_route.HttpFailureInjector + 47, // 32: io.linkerd.proxy.outbound.HttpRoute.Filter.request_header_modifier:type_name -> io.linkerd.proxy.http_route.RequestHeaderModifier + 48, // 33: io.linkerd.proxy.outbound.HttpRoute.Filter.redirect:type_name -> io.linkerd.proxy.http_route.RequestRedirect + 18, // 34: io.linkerd.proxy.outbound.HttpRoute.Distribution.empty:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution.Empty + 19, // 35: io.linkerd.proxy.outbound.HttpRoute.Distribution.first_available:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution.FirstAvailable + 20, // 36: io.linkerd.proxy.outbound.HttpRoute.Distribution.random_available:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution.RandomAvailable + 6, // 37: io.linkerd.proxy.outbound.HttpRoute.RouteBackend.backend:type_name -> io.linkerd.proxy.outbound.Backend + 14, // 38: io.linkerd.proxy.outbound.HttpRoute.RouteBackend.filters:type_name -> io.linkerd.proxy.outbound.HttpRoute.Filter + 16, // 39: io.linkerd.proxy.outbound.HttpRoute.WeightedRouteBackend.backend:type_name -> io.linkerd.proxy.outbound.HttpRoute.RouteBackend + 16, // 40: io.linkerd.proxy.outbound.HttpRoute.Distribution.FirstAvailable.backends:type_name -> io.linkerd.proxy.outbound.HttpRoute.RouteBackend + 17, // 41: io.linkerd.proxy.outbound.HttpRoute.Distribution.RandomAvailable.backends:type_name -> io.linkerd.proxy.outbound.HttpRoute.WeightedRouteBackend + 49, // 42: io.linkerd.proxy.outbound.GrpcRoute.Rule.matches:type_name -> io.linkerd.proxy.grpc_route.GrpcRouteMatch + 22, // 43: io.linkerd.proxy.outbound.GrpcRoute.Rule.filters:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Filter + 23, // 44: io.linkerd.proxy.outbound.GrpcRoute.Rule.backends:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution + 50, // 45: io.linkerd.proxy.outbound.GrpcRoute.Filter.failure_injector:type_name -> io.linkerd.proxy.grpc_route.GrpcFailureInjector + 47, // 46: io.linkerd.proxy.outbound.GrpcRoute.Filter.request_header_modifier:type_name -> io.linkerd.proxy.http_route.RequestHeaderModifier + 26, // 47: io.linkerd.proxy.outbound.GrpcRoute.Distribution.empty:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution.Empty + 27, // 48: io.linkerd.proxy.outbound.GrpcRoute.Distribution.first_available:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution.FirstAvailable + 28, // 49: io.linkerd.proxy.outbound.GrpcRoute.Distribution.random_available:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution.RandomAvailable + 6, // 50: io.linkerd.proxy.outbound.GrpcRoute.RouteBackend.backend:type_name -> io.linkerd.proxy.outbound.Backend + 22, // 51: io.linkerd.proxy.outbound.GrpcRoute.RouteBackend.filters:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Filter + 24, // 52: io.linkerd.proxy.outbound.GrpcRoute.WeightedRouteBackend.backend:type_name -> io.linkerd.proxy.outbound.GrpcRoute.RouteBackend + 24, // 53: io.linkerd.proxy.outbound.GrpcRoute.Distribution.FirstAvailable.backends:type_name -> io.linkerd.proxy.outbound.GrpcRoute.RouteBackend + 25, // 54: io.linkerd.proxy.outbound.GrpcRoute.Distribution.RandomAvailable.backends:type_name -> io.linkerd.proxy.outbound.GrpcRoute.WeightedRouteBackend + 30, // 55: io.linkerd.proxy.outbound.OpaqueRoute.Rule.backends:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution + 33, // 56: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.empty:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution.Empty + 34, // 57: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.first_available:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution.FirstAvailable + 35, // 58: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.random_available:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution.RandomAvailable + 6, // 59: io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend.backend:type_name -> io.linkerd.proxy.outbound.Backend + 31, // 60: io.linkerd.proxy.outbound.OpaqueRoute.WeightedRouteBackend.backend:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend + 31, // 61: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.FirstAvailable.backends:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend + 32, // 62: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.RandomAvailable.backends:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.WeightedRouteBackend + 38, // 63: io.linkerd.proxy.outbound.Backend.EndpointDiscovery.dst:type_name -> io.linkerd.proxy.outbound.Backend.EndpointDiscovery.DestinationGet + 36, // 64: io.linkerd.proxy.outbound.Backend.BalanceP2c.discovery:type_name -> io.linkerd.proxy.outbound.Backend.EndpointDiscovery + 39, // 65: io.linkerd.proxy.outbound.Backend.BalanceP2c.peak_ewma:type_name -> io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma + 44, // 66: io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma.default_rtt:type_name -> google.protobuf.Duration + 44, // 67: io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma.decay:type_name -> google.protobuf.Duration + 0, // 68: io.linkerd.proxy.outbound.OutboundPolicies.Get:input_type -> io.linkerd.proxy.outbound.TrafficSpec + 0, // 69: io.linkerd.proxy.outbound.OutboundPolicies.Watch:input_type -> io.linkerd.proxy.outbound.TrafficSpec + 1, // 70: io.linkerd.proxy.outbound.OutboundPolicies.Get:output_type -> io.linkerd.proxy.outbound.OutboundPolicy + 1, // 71: io.linkerd.proxy.outbound.OutboundPolicies.Watch:output_type -> io.linkerd.proxy.outbound.OutboundPolicy + 70, // [70:72] is the sub-list for method output_type + 68, // [68:70] is the sub-list for method input_type + 68, // [68:68] is the sub-list for extension type_name + 68, // [68:68] is the sub-list for extension extendee + 0, // [0:68] is the sub-list for field type_name +} + +func init() { file_outbound_proto_init() } +func file_outbound_proto_init() { + if File_outbound_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_outbound_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TrafficSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OutboundPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyProtocol); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HttpRoute); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrpcRoute); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpaqueRoute); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Backend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Queue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyProtocol_Detect); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyProtocol_Opaque); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyProtocol_Http1); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyProtocol_Http2); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProxyProtocol_Grpc); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HttpRoute_Rule); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HttpRoute_Filter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HttpRoute_Distribution); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HttpRoute_RouteBackend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HttpRoute_WeightedRouteBackend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HttpRoute_Distribution_Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HttpRoute_Distribution_FirstAvailable); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HttpRoute_Distribution_RandomAvailable); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrpcRoute_Rule); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrpcRoute_Filter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrpcRoute_Distribution); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrpcRoute_RouteBackend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrpcRoute_WeightedRouteBackend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrpcRoute_Distribution_Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrpcRoute_Distribution_FirstAvailable); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GrpcRoute_Distribution_RandomAvailable); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpaqueRoute_Rule); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpaqueRoute_Distribution); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpaqueRoute_RouteBackend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpaqueRoute_WeightedRouteBackend); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpaqueRoute_Distribution_Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpaqueRoute_Distribution_FirstAvailable); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpaqueRoute_Distribution_RandomAvailable); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Backend_EndpointDiscovery); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Backend_BalanceP2C); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Backend_EndpointDiscovery_DestinationGet); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_outbound_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Backend_BalanceP2C_PeakEwma); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_outbound_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*TrafficSpec_Addr)(nil), + (*TrafficSpec_Authority)(nil), + } + file_outbound_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*ProxyProtocol_Detect_)(nil), + (*ProxyProtocol_Opaque_)(nil), + (*ProxyProtocol_Http1_)(nil), + (*ProxyProtocol_Http2_)(nil), + (*ProxyProtocol_Grpc_)(nil), + } + file_outbound_proto_msgTypes[6].OneofWrappers = []interface{}{ + (*Backend_Forward)(nil), + (*Backend_Balancer)(nil), + } + file_outbound_proto_msgTypes[14].OneofWrappers = []interface{}{ + (*HttpRoute_Filter_FailureInjector)(nil), + (*HttpRoute_Filter_RequestHeaderModifier)(nil), + (*HttpRoute_Filter_Redirect)(nil), + } + file_outbound_proto_msgTypes[15].OneofWrappers = []interface{}{ + (*HttpRoute_Distribution_Empty_)(nil), + (*HttpRoute_Distribution_FirstAvailable_)(nil), + (*HttpRoute_Distribution_RandomAvailable_)(nil), + } + file_outbound_proto_msgTypes[22].OneofWrappers = []interface{}{ + (*GrpcRoute_Filter_FailureInjector)(nil), + (*GrpcRoute_Filter_RequestHeaderModifier)(nil), + } + file_outbound_proto_msgTypes[23].OneofWrappers = []interface{}{ + (*GrpcRoute_Distribution_Empty_)(nil), + (*GrpcRoute_Distribution_FirstAvailable_)(nil), + (*GrpcRoute_Distribution_RandomAvailable_)(nil), + } + file_outbound_proto_msgTypes[30].OneofWrappers = []interface{}{ + (*OpaqueRoute_Distribution_Empty_)(nil), + (*OpaqueRoute_Distribution_FirstAvailable_)(nil), + (*OpaqueRoute_Distribution_RandomAvailable_)(nil), + } + file_outbound_proto_msgTypes[36].OneofWrappers = []interface{}{ + (*Backend_EndpointDiscovery_Dst)(nil), + } + file_outbound_proto_msgTypes[37].OneofWrappers = []interface{}{ + (*Backend_BalanceP2C_PeakEwma_)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_outbound_proto_rawDesc, + NumEnums: 0, + NumMessages: 40, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_outbound_proto_goTypes, + DependencyIndexes: file_outbound_proto_depIdxs, + MessageInfos: file_outbound_proto_msgTypes, + }.Build() + File_outbound_proto = out.File + file_outbound_proto_rawDesc = nil + file_outbound_proto_goTypes = nil + file_outbound_proto_depIdxs = nil +} diff --git a/go/outbound/outbound_grpc.pb.go b/go/outbound/outbound_grpc.pb.go new file mode 100644 index 000000000..e5718f419 --- /dev/null +++ b/go/outbound/outbound_grpc.pb.go @@ -0,0 +1,174 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v3.20.3 +// source: outbound.proto + +package outbound + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + OutboundPolicies_Get_FullMethodName = "/io.linkerd.proxy.outbound.OutboundPolicies/Get" + OutboundPolicies_Watch_FullMethodName = "/io.linkerd.proxy.outbound.OutboundPolicies/Watch" +) + +// OutboundPoliciesClient is the client API for OutboundPolicies service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type OutboundPoliciesClient interface { + Get(ctx context.Context, in *TrafficSpec, opts ...grpc.CallOption) (*OutboundPolicy, error) + Watch(ctx context.Context, in *TrafficSpec, opts ...grpc.CallOption) (OutboundPolicies_WatchClient, error) +} + +type outboundPoliciesClient struct { + cc grpc.ClientConnInterface +} + +func NewOutboundPoliciesClient(cc grpc.ClientConnInterface) OutboundPoliciesClient { + return &outboundPoliciesClient{cc} +} + +func (c *outboundPoliciesClient) Get(ctx context.Context, in *TrafficSpec, opts ...grpc.CallOption) (*OutboundPolicy, error) { + out := new(OutboundPolicy) + err := c.cc.Invoke(ctx, OutboundPolicies_Get_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *outboundPoliciesClient) Watch(ctx context.Context, in *TrafficSpec, opts ...grpc.CallOption) (OutboundPolicies_WatchClient, error) { + stream, err := c.cc.NewStream(ctx, &OutboundPolicies_ServiceDesc.Streams[0], OutboundPolicies_Watch_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &outboundPoliciesWatchClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type OutboundPolicies_WatchClient interface { + Recv() (*OutboundPolicy, error) + grpc.ClientStream +} + +type outboundPoliciesWatchClient struct { + grpc.ClientStream +} + +func (x *outboundPoliciesWatchClient) Recv() (*OutboundPolicy, error) { + m := new(OutboundPolicy) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// OutboundPoliciesServer is the server API for OutboundPolicies service. +// All implementations must embed UnimplementedOutboundPoliciesServer +// for forward compatibility +type OutboundPoliciesServer interface { + Get(context.Context, *TrafficSpec) (*OutboundPolicy, error) + Watch(*TrafficSpec, OutboundPolicies_WatchServer) error + mustEmbedUnimplementedOutboundPoliciesServer() +} + +// UnimplementedOutboundPoliciesServer must be embedded to have forward compatible implementations. +type UnimplementedOutboundPoliciesServer struct { +} + +func (UnimplementedOutboundPoliciesServer) Get(context.Context, *TrafficSpec) (*OutboundPolicy, error) { + return nil, status.Errorf(codes.Unimplemented, "method Get not implemented") +} +func (UnimplementedOutboundPoliciesServer) Watch(*TrafficSpec, OutboundPolicies_WatchServer) error { + return status.Errorf(codes.Unimplemented, "method Watch not implemented") +} +func (UnimplementedOutboundPoliciesServer) mustEmbedUnimplementedOutboundPoliciesServer() {} + +// UnsafeOutboundPoliciesServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to OutboundPoliciesServer will +// result in compilation errors. +type UnsafeOutboundPoliciesServer interface { + mustEmbedUnimplementedOutboundPoliciesServer() +} + +func RegisterOutboundPoliciesServer(s grpc.ServiceRegistrar, srv OutboundPoliciesServer) { + s.RegisterService(&OutboundPolicies_ServiceDesc, srv) +} + +func _OutboundPolicies_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TrafficSpec) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OutboundPoliciesServer).Get(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: OutboundPolicies_Get_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OutboundPoliciesServer).Get(ctx, req.(*TrafficSpec)) + } + return interceptor(ctx, in, info, handler) +} + +func _OutboundPolicies_Watch_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(TrafficSpec) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(OutboundPoliciesServer).Watch(m, &outboundPoliciesWatchServer{stream}) +} + +type OutboundPolicies_WatchServer interface { + Send(*OutboundPolicy) error + grpc.ServerStream +} + +type outboundPoliciesWatchServer struct { + grpc.ServerStream +} + +func (x *outboundPoliciesWatchServer) Send(m *OutboundPolicy) error { + return x.ServerStream.SendMsg(m) +} + +// OutboundPolicies_ServiceDesc is the grpc.ServiceDesc for OutboundPolicies service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var OutboundPolicies_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "io.linkerd.proxy.outbound.OutboundPolicies", + HandlerType: (*OutboundPoliciesServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Get", + Handler: _OutboundPolicies_Get_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "Watch", + Handler: _OutboundPolicies_Watch_Handler, + ServerStreams: true, + }, + }, + Metadata: "outbound.proto", +} diff --git a/proto/meta.proto b/proto/meta.proto index 38816bcdb..fae64536c 100644 --- a/proto/meta.proto +++ b/proto/meta.proto @@ -24,4 +24,6 @@ message Resource { string group = 1; string kind = 2; string name = 3; + string namespace = 4; + string section = 5; } diff --git a/proto/outbound.proto b/proto/outbound.proto new file mode 100644 index 000000000..fdad99c1f --- /dev/null +++ b/proto/outbound.proto @@ -0,0 +1,286 @@ +syntax = "proto3"; + +package io.linkerd.proxy.outbound; + +option go_package = "github.com/linkerd/linkerd2-proxy-api/go/outbound"; + +import "net.proto"; +import "destination.proto"; +import "meta.proto"; +import "grpc_route.proto"; +import "http_route.proto"; +import "google/protobuf/duration.proto"; + +service OutboundPolicies { + rpc Get(TrafficSpec) returns (OutboundPolicy) {} + + rpc Watch(TrafficSpec) returns (stream OutboundPolicy) {} +} + +message TrafficSpec { + // Uniquely identifies the source proxy workload (e.g., pod name) to the + // control plane. + string source_workload = 1; + + // Describes a target address, as observed by the proxy. + oneof target { + // Indicates the proxy is connecting to a specific IP:port. + io.linkerd.proxy.net.TcpAddress addr = 2; + + // Indicates the proxy is connecting to a named address (like an HTTP + // authority). + string authority = 3; + } +} + +// Outbound policy for a given traffic spec. +message OutboundPolicy { + // Indicates the protocol to use for this target. This will be set to Opaque + // if the target has been marked as opaque and will be Discover otherwise. + ProxyProtocol protocol = 1; +} + +message ProxyProtocol { + oneof kind { + Detect detect = 1; + + Opaque opaque = 2; + + // HTTP/1 policy configuration. + Http1 http1 = 3; + + // HTTP/2 policy configuration. + Http2 http2 = 4; + + // gRPC policy configuration. + Grpc grpc = 5; + } + + message Detect { + // Protocol detection timeout. + google.protobuf.Duration timeout = 1; + + Opaque opaque = 2; + + // HTTP/1 policy configuration. + Http1 http1 = 3; + + // HTTP/2 policy configuration. + Http2 http2 = 4; + } + + message Opaque { + repeated OpaqueRoute routes = 1; + } + + message Http1 { + repeated HttpRoute routes = 1; + } + + message Http2 { + repeated HttpRoute routes = 1; + } + + message Grpc { + repeated GrpcRoute routes = 1; + } +} + +// Outbound-specific HTTP route configuration (based on the [Gateway API][api]). +// +// [api]: https://gateway-api.sigs.k8s.io/v1alpha2/references/spec/#gateway.networking.k8s.io/v1alpha2.HTTPRoute +message HttpRoute { + io.linkerd.proxy.meta.Metadata metadata = 1; + + // If empty, the host value is ignored. + repeated io.linkerd.proxy.http_route.HostMatch hosts = 2; + + // Must have at least one rule. + repeated Rule rules = 3; + message Rule { + repeated io.linkerd.proxy.http_route.HttpRouteMatch matches = 1; + repeated Filter filters = 2; + Distribution backends = 3; + } + + message Filter { + oneof kind { + io.linkerd.proxy.http_route.HttpFailureInjector failure_injector = 1; + io.linkerd.proxy.http_route.RequestHeaderModifier request_header_modifier = 2; + io.linkerd.proxy.http_route.RequestRedirect redirect = 3; + } + } + + message Distribution { + oneof kind { + Empty empty = 1; + // Use the first available backend in the list. + FirstAvailable first_available = 2; + RandomAvailable random_available = 3; + } + + message Empty {} + message FirstAvailable { + repeated RouteBackend backends = 1; + } + message RandomAvailable { + repeated WeightedRouteBackend backends = 1; + } + } + + message RouteBackend { + Backend backend = 1; + repeated Filter filters = 3; + } + + message WeightedRouteBackend { + RouteBackend backend = 1; + uint32 weight = 2; + } +} + +message GrpcRoute { + io.linkerd.proxy.meta.Metadata metadata = 1; + + // If empty, the host value is ignored. + repeated io.linkerd.proxy.http_route.HostMatch hosts = 2; + + // Must have at least one rule. + repeated Rule rules = 3; + message Rule { + repeated io.linkerd.proxy.grpc_route.GrpcRouteMatch matches = 1; + repeated Filter filters = 2; + Distribution backends = 3; + } + + message Filter { + oneof kind { + io.linkerd.proxy.grpc_route.GrpcFailureInjector failure_injector = 1; + io.linkerd.proxy.http_route.RequestHeaderModifier request_header_modifier = 2; + } + } + + message Distribution { + oneof kind { + Empty empty = 1; + // Use the first available backend in the list. + FirstAvailable first_available = 2; + RandomAvailable random_available = 3; + } + + message Empty {} + message FirstAvailable { + repeated RouteBackend backends = 1; + } + message RandomAvailable { + repeated WeightedRouteBackend backends = 1; + } + } + + message RouteBackend { + Backend backend = 1; + repeated Filter filters = 3; + } + + message WeightedRouteBackend { + RouteBackend backend = 1; + uint32 weight = 2; + } +} + +message OpaqueRoute { + io.linkerd.proxy.meta.Metadata metadata = 1; + + // Must have at least one rule. + repeated Rule rules = 3; + message Rule { + Distribution backends = 1; + } + + message Distribution { + oneof kind { + Empty empty = 1; + // Use the first available backend in the list. + FirstAvailable first_available = 2; + RandomAvailable random_available = 3; + } + + message Empty {} + message FirstAvailable { + repeated RouteBackend backends = 1; + } + message RandomAvailable { + repeated WeightedRouteBackend backends = 1; + } + } + + message RouteBackend { + Backend backend = 1; + } + + message WeightedRouteBackend { + RouteBackend backend = 1; + uint32 weight = 2; + } +} + +message Backend { + io.linkerd.proxy.meta.Metadata metadata = 1; + + oneof kind { + // A backend that consists of a single endpoint. + io.linkerd.proxy.destination.WeightedAddr forward = 2; + + // A backend that comprises a load balanced service. + BalanceP2c balancer = 3; + } + + // Describes queue configuration for a backend. + Queue queue = 4; + + // A strategy for discovering endpoints for a service. + message EndpointDiscovery { + oneof kind { + // Use the `Destination` service to discover endpoints for this service. + DestinationGet dst = 1; + } + + message DestinationGet { + string path = 1; + } + } + + // Describes a power-of-two-choices (P2C) load balancer configuration for a + // backend. + message BalanceP2c { + EndpointDiscovery discovery = 1; + + // The load estimation strategy used by this load balancer. + oneof load { + // This load balancer uses peak EWMA (exponentially weighted moving + // average) load estimates. + PeakEwma peak_ewma = 2; + } + + // Parameters configuring peak EWMA load estimation. + message PeakEwma { + // Initial latency value used when no latencies have been + // recorded for an endpoint. + google.protobuf.Duration default_rtt = 1; + + // The duration of the moving window over which latency is observed. + google.protobuf.Duration decay = 2; + } + } +} + +message Queue { + // The number of requests that may be held in a queue before backpressure is + // exerted. + uint32 capacity = 1; + + // A timeout that limits how long a backend may remain unready before any + // requests in its queue are failed. + google.protobuf.Duration failfast_timeout = 2; +} + diff --git a/src/gen/io.linkerd.proxy.meta.rs b/src/gen/io.linkerd.proxy.meta.rs index c77693a85..a86a9cc1e 100644 --- a/src/gen/io.linkerd.proxy.meta.rs +++ b/src/gen/io.linkerd.proxy.meta.rs @@ -32,4 +32,8 @@ pub struct Resource { pub kind: ::prost::alloc::string::String, #[prost(string, tag = "3")] pub name: ::prost::alloc::string::String, + #[prost(string, tag = "4")] + pub namespace: ::prost::alloc::string::String, + #[prost(string, tag = "5")] + pub section: ::prost::alloc::string::String, } diff --git a/src/gen/io.linkerd.proxy.outbound.rs b/src/gen/io.linkerd.proxy.outbound.rs new file mode 100644 index 000000000..026c921e7 --- /dev/null +++ b/src/gen/io.linkerd.proxy.outbound.rs @@ -0,0 +1,753 @@ +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct TrafficSpec { + /// Uniquely identifies the source proxy workload (e.g., pod name) to the + /// control plane. + #[prost(string, tag = "1")] + pub source_workload: ::prost::alloc::string::String, + /// Describes a target address, as observed by the proxy. + #[prost(oneof = "traffic_spec::Target", tags = "2, 3")] + pub target: ::core::option::Option, +} +/// Nested message and enum types in `TrafficSpec`. +pub mod traffic_spec { + /// Describes a target address, as observed by the proxy. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Target { + /// Indicates the proxy is connecting to a specific IP:port. + #[prost(message, tag = "2")] + Addr(super::super::net::TcpAddress), + /// Indicates the proxy is connecting to a named address (like an HTTP + /// authority). + #[prost(string, tag = "3")] + Authority(::prost::alloc::string::String), + } +} +/// Outbound policy for a given traffic spec. +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct OutboundPolicy { + /// Indicates the protocol to use for this target. This will be set to Opaque + /// if the target has been marked as opaque and will be Discover otherwise. + #[prost(message, optional, tag = "1")] + pub protocol: ::core::option::Option, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct ProxyProtocol { + #[prost(oneof = "proxy_protocol::Kind", tags = "1, 2, 3, 4, 5")] + pub kind: ::core::option::Option, +} +/// Nested message and enum types in `ProxyProtocol`. +pub mod proxy_protocol { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Detect { + /// Protocol detection timeout. + #[prost(message, optional, tag = "1")] + pub timeout: ::core::option::Option<::prost_types::Duration>, + #[prost(message, optional, tag = "2")] + pub opaque: ::core::option::Option, + /// HTTP/1 policy configuration. + #[prost(message, optional, tag = "3")] + pub http1: ::core::option::Option, + /// HTTP/2 policy configuration. + #[prost(message, optional, tag = "4")] + pub http2: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Opaque { + #[prost(message, repeated, tag = "1")] + pub routes: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Http1 { + #[prost(message, repeated, tag = "1")] + pub routes: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Http2 { + #[prost(message, repeated, tag = "1")] + pub routes: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Grpc { + #[prost(message, repeated, tag = "1")] + pub routes: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Kind { + #[prost(message, tag = "1")] + Detect(Detect), + #[prost(message, tag = "2")] + Opaque(Opaque), + /// HTTP/1 policy configuration. + #[prost(message, tag = "3")] + Http1(Http1), + /// HTTP/2 policy configuration. + #[prost(message, tag = "4")] + Http2(Http2), + /// gRPC policy configuration. + #[prost(message, tag = "5")] + Grpc(Grpc), + } +} +/// Outbound-specific HTTP route configuration (based on the [Gateway API]\[api\]). +/// +/// \[api\]: +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct HttpRoute { + #[prost(message, optional, tag = "1")] + pub metadata: ::core::option::Option, + /// If empty, the host value is ignored. + #[prost(message, repeated, tag = "2")] + pub hosts: ::prost::alloc::vec::Vec, + /// Must have at least one rule. + #[prost(message, repeated, tag = "3")] + pub rules: ::prost::alloc::vec::Vec, +} +/// Nested message and enum types in `HttpRoute`. +pub mod http_route { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Rule { + #[prost(message, repeated, tag = "1")] + pub matches: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "2")] + pub filters: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "3")] + pub backends: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Filter { + #[prost(oneof = "filter::Kind", tags = "1, 2, 3")] + pub kind: ::core::option::Option, + } + /// Nested message and enum types in `Filter`. + pub mod filter { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Kind { + #[prost(message, tag = "1")] + FailureInjector(super::super::super::http_route::HttpFailureInjector), + #[prost(message, tag = "2")] + RequestHeaderModifier( + super::super::super::http_route::RequestHeaderModifier, + ), + #[prost(message, tag = "3")] + Redirect(super::super::super::http_route::RequestRedirect), + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Distribution { + #[prost(oneof = "distribution::Kind", tags = "1, 2, 3")] + pub kind: ::core::option::Option, + } + /// Nested message and enum types in `Distribution`. + pub mod distribution { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Empty {} + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct FirstAvailable { + #[prost(message, repeated, tag = "1")] + pub backends: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RandomAvailable { + #[prost(message, repeated, tag = "1")] + pub backends: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Kind { + #[prost(message, tag = "1")] + Empty(Empty), + /// Use the first available backend in the list. + #[prost(message, tag = "2")] + FirstAvailable(FirstAvailable), + #[prost(message, tag = "3")] + RandomAvailable(RandomAvailable), + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RouteBackend { + #[prost(message, optional, tag = "1")] + pub backend: ::core::option::Option, + #[prost(message, repeated, tag = "3")] + pub filters: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct WeightedRouteBackend { + #[prost(message, optional, tag = "1")] + pub backend: ::core::option::Option, + #[prost(uint32, tag = "2")] + pub weight: u32, + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GrpcRoute { + #[prost(message, optional, tag = "1")] + pub metadata: ::core::option::Option, + /// If empty, the host value is ignored. + #[prost(message, repeated, tag = "2")] + pub hosts: ::prost::alloc::vec::Vec, + /// Must have at least one rule. + #[prost(message, repeated, tag = "3")] + pub rules: ::prost::alloc::vec::Vec, +} +/// Nested message and enum types in `GrpcRoute`. +pub mod grpc_route { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Rule { + #[prost(message, repeated, tag = "1")] + pub matches: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "2")] + pub filters: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "3")] + pub backends: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Filter { + #[prost(oneof = "filter::Kind", tags = "1, 2")] + pub kind: ::core::option::Option, + } + /// Nested message and enum types in `Filter`. + pub mod filter { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Kind { + #[prost(message, tag = "1")] + FailureInjector(super::super::super::grpc_route::GrpcFailureInjector), + #[prost(message, tag = "2")] + RequestHeaderModifier( + super::super::super::http_route::RequestHeaderModifier, + ), + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Distribution { + #[prost(oneof = "distribution::Kind", tags = "1, 2, 3")] + pub kind: ::core::option::Option, + } + /// Nested message and enum types in `Distribution`. + pub mod distribution { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Empty {} + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct FirstAvailable { + #[prost(message, repeated, tag = "1")] + pub backends: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RandomAvailable { + #[prost(message, repeated, tag = "1")] + pub backends: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Kind { + #[prost(message, tag = "1")] + Empty(Empty), + /// Use the first available backend in the list. + #[prost(message, tag = "2")] + FirstAvailable(FirstAvailable), + #[prost(message, tag = "3")] + RandomAvailable(RandomAvailable), + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RouteBackend { + #[prost(message, optional, tag = "1")] + pub backend: ::core::option::Option, + #[prost(message, repeated, tag = "3")] + pub filters: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct WeightedRouteBackend { + #[prost(message, optional, tag = "1")] + pub backend: ::core::option::Option, + #[prost(uint32, tag = "2")] + pub weight: u32, + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct OpaqueRoute { + #[prost(message, optional, tag = "1")] + pub metadata: ::core::option::Option, + /// Must have at least one rule. + #[prost(message, repeated, tag = "3")] + pub rules: ::prost::alloc::vec::Vec, +} +/// Nested message and enum types in `OpaqueRoute`. +pub mod opaque_route { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Rule { + #[prost(message, optional, tag = "1")] + pub backends: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Distribution { + #[prost(oneof = "distribution::Kind", tags = "1, 2, 3")] + pub kind: ::core::option::Option, + } + /// Nested message and enum types in `Distribution`. + pub mod distribution { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct Empty {} + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct FirstAvailable { + #[prost(message, repeated, tag = "1")] + pub backends: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RandomAvailable { + #[prost(message, repeated, tag = "1")] + pub backends: ::prost::alloc::vec::Vec, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Kind { + #[prost(message, tag = "1")] + Empty(Empty), + /// Use the first available backend in the list. + #[prost(message, tag = "2")] + FirstAvailable(FirstAvailable), + #[prost(message, tag = "3")] + RandomAvailable(RandomAvailable), + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct RouteBackend { + #[prost(message, optional, tag = "1")] + pub backend: ::core::option::Option, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct WeightedRouteBackend { + #[prost(message, optional, tag = "1")] + pub backend: ::core::option::Option, + #[prost(uint32, tag = "2")] + pub weight: u32, + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Backend { + #[prost(message, optional, tag = "1")] + pub metadata: ::core::option::Option, + /// Describes queue configuration for a backend. + #[prost(message, optional, tag = "4")] + pub queue: ::core::option::Option, + #[prost(oneof = "backend::Kind", tags = "2, 3")] + pub kind: ::core::option::Option, +} +/// Nested message and enum types in `Backend`. +pub mod backend { + /// A strategy for discovering endpoints for a service. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct EndpointDiscovery { + #[prost(oneof = "endpoint_discovery::Kind", tags = "1")] + pub kind: ::core::option::Option, + } + /// Nested message and enum types in `EndpointDiscovery`. + pub mod endpoint_discovery { + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct DestinationGet { + #[prost(string, tag = "1")] + pub path: ::prost::alloc::string::String, + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Kind { + /// Use the `Destination` service to discover endpoints for this service. + #[prost(message, tag = "1")] + Dst(DestinationGet), + } + } + /// Describes a power-of-two-choices (P2C) load balancer configuration for a + /// backend. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BalanceP2c { + #[prost(message, optional, tag = "1")] + pub discovery: ::core::option::Option, + /// The load estimation strategy used by this load balancer. + #[prost(oneof = "balance_p2c::Load", tags = "2")] + pub load: ::core::option::Option, + } + /// Nested message and enum types in `BalanceP2c`. + pub mod balance_p2c { + /// Parameters configuring peak EWMA load estimation. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct PeakEwma { + /// Initial latency value used when no latencies have been + /// recorded for an endpoint. + #[prost(message, optional, tag = "1")] + pub default_rtt: ::core::option::Option<::prost_types::Duration>, + /// The duration of the moving window over which latency is observed. + #[prost(message, optional, tag = "2")] + pub decay: ::core::option::Option<::prost_types::Duration>, + } + /// The load estimation strategy used by this load balancer. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Load { + /// This load balancer uses peak EWMA (exponentially weighted moving + /// average) load estimates. + #[prost(message, tag = "2")] + PeakEwma(PeakEwma), + } + } + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Oneof)] + pub enum Kind { + /// A backend that consists of a single endpoint. + #[prost(message, tag = "2")] + Forward(super::super::destination::WeightedAddr), + /// A backend that comprises a load balanced service. + #[prost(message, tag = "3")] + Balancer(BalanceP2c), + } +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Queue { + /// The number of requests that may be held in a queue before backpressure is + /// exerted. + #[prost(uint32, tag = "1")] + pub capacity: u32, + /// A timeout that limits how long a backend may remain unready before any + /// requests in its queue are failed. + #[prost(message, optional, tag = "2")] + pub failfast_timeout: ::core::option::Option<::prost_types::Duration>, +} +/// Generated client implementations. +pub mod outbound_policies_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct OutboundPoliciesClient { + inner: tonic::client::Grpc, + } + impl OutboundPoliciesClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> OutboundPoliciesClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + OutboundPoliciesClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + pub async fn get( + &mut self, + request: impl tonic::IntoRequest, + ) -> Result, tonic::Status> { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/io.linkerd.proxy.outbound.OutboundPolicies/Get", + ); + self.inner.unary(request.into_request(), path, codec).await + } + pub async fn watch( + &mut self, + request: impl tonic::IntoRequest, + ) -> Result< + tonic::Response>, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/io.linkerd.proxy.outbound.OutboundPolicies/Watch", + ); + self.inner.server_streaming(request.into_request(), path, codec).await + } + } +} +/// Generated server implementations. +pub mod outbound_policies_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with OutboundPoliciesServer. + #[async_trait] + pub trait OutboundPolicies: Send + Sync + 'static { + async fn get( + &self, + request: tonic::Request, + ) -> Result, tonic::Status>; + /// Server streaming response type for the Watch method. + type WatchStream: futures_core::Stream< + Item = Result, + > + + Send + + 'static; + async fn watch( + &self, + request: tonic::Request, + ) -> Result, tonic::Status>; + } + #[derive(Debug)] + pub struct OutboundPoliciesServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + } + struct _Inner(Arc); + impl OutboundPoliciesServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + } + impl tonic::codegen::Service> for OutboundPoliciesServer + where + T: OutboundPolicies, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/io.linkerd.proxy.outbound.OutboundPolicies/Get" => { + #[allow(non_camel_case_types)] + struct GetSvc(pub Arc); + impl< + T: OutboundPolicies, + > tonic::server::UnaryService for GetSvc { + type Response = super::OutboundPolicy; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = self.0.clone(); + let fut = async move { (*inner).get(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = GetSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/io.linkerd.proxy.outbound.OutboundPolicies/Watch" => { + #[allow(non_camel_case_types)] + struct WatchSvc(pub Arc); + impl< + T: OutboundPolicies, + > tonic::server::ServerStreamingService + for WatchSvc { + type Response = super::OutboundPolicy; + type ResponseStream = T::WatchStream; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = self.0.clone(); + let fut = async move { (*inner).watch(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = WatchSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ); + let res = grpc.server_streaming(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for OutboundPoliciesServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(self.0.clone()) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for OutboundPoliciesServer { + const NAME: &'static str = "io.linkerd.proxy.outbound.OutboundPolicies"; + } +} diff --git a/src/lib.rs b/src/lib.rs index e685f2abb..1b250ec73 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,6 +30,11 @@ pub mod inbound { include!("gen/io.linkerd.proxy.inbound.rs"); } +#[cfg(feature = "outbound")] +pub mod outbound { + include!("gen/io.linkerd.proxy.outbound.rs"); +} + #[cfg(feature = "meta")] pub mod meta { include!("gen/io.linkerd.proxy.meta.rs");