mirror of
https://github.com/v2fly/v2ray-core.git
synced 2024-12-21 09:36:34 -05:00
incorporate changes in router implementation
This commit is contained in:
parent
24a5e34ce0
commit
ea5bb04acf
@ -8,16 +8,19 @@ import (
|
||||
|
||||
"github.com/v2fly/v2ray-core/v4/features/extension"
|
||||
"github.com/v2fly/v2ray-core/v4/features/outbound"
|
||||
"github.com/v2fly/v2ray-core/v4/features/routing"
|
||||
)
|
||||
|
||||
type BalancingStrategy interface {
|
||||
PickOutbound([]string) string
|
||||
}
|
||||
|
||||
type BalancingPrincipleTarget interface {
|
||||
GetPrincipleTarget([]string) []string
|
||||
}
|
||||
|
||||
type Balancer struct {
|
||||
selectors []string
|
||||
strategy routing.BalancingStrategy
|
||||
strategy BalancingStrategy
|
||||
ohm outbound.Manager
|
||||
fallbackTag string
|
||||
|
||||
@ -35,10 +38,10 @@ func (b *Balancer) PickOutbound() (string, error) {
|
||||
return "", err
|
||||
}
|
||||
var tag string
|
||||
if o := b.override.Get(); o != nil {
|
||||
tag = b.strategy.Pick(o.selects)
|
||||
if o := b.override.Get(); o != "" {
|
||||
tag = o
|
||||
} else {
|
||||
tag = b.strategy.SelectAndPick(candidates)
|
||||
tag = b.strategy.PickOutbound(candidates)
|
||||
}
|
||||
if tag == "" {
|
||||
if b.fallbackTag != "" {
|
||||
@ -66,3 +69,35 @@ func (b *Balancer) SelectOutbounds() ([]string, error) {
|
||||
tags := hs.Select(b.selectors)
|
||||
return tags, nil
|
||||
}
|
||||
|
||||
// GetPrincipleTarget implements routing.BalancerPrincipleTarget
|
||||
func (r *Router) GetPrincipleTarget(tag string) ([]string, error) {
|
||||
if b, ok := r.balancers[tag]; ok {
|
||||
if s, ok := b.strategy.(BalancingPrincipleTarget); ok {
|
||||
candidates, err := b.SelectOutbounds()
|
||||
if err != nil {
|
||||
return nil, newError("unable to select outbounds").Base(err)
|
||||
}
|
||||
return s.GetPrincipleTarget(candidates), nil
|
||||
}
|
||||
return nil, newError("unsupported GetPrincipleTarget")
|
||||
}
|
||||
return nil, newError("cannot find tag")
|
||||
}
|
||||
|
||||
// SetOverrideTarget implements routing.BalancerOverrider
|
||||
func (r *Router) SetOverrideTarget(tag, target string) error {
|
||||
if b, ok := r.balancers[tag]; ok {
|
||||
b.override.Put(target)
|
||||
return nil
|
||||
}
|
||||
return newError("cannot find tag")
|
||||
}
|
||||
|
||||
// GetOverrideTarget implements routing.BalancerOverrider
|
||||
func (r *Router) GetOverrideTarget(tag string) (string, error) {
|
||||
if b, ok := r.balancers[tag]; ok {
|
||||
return b.override.Get(), nil
|
||||
}
|
||||
return "", newError("cannot find tag")
|
||||
}
|
||||
|
@ -2,30 +2,9 @@ package router
|
||||
|
||||
import (
|
||||
sync "sync"
|
||||
"time"
|
||||
|
||||
"github.com/v2fly/v2ray-core/v4/features/outbound"
|
||||
)
|
||||
|
||||
func (b *Balancer) overrideSelecting(selects []string, validity time.Duration) error {
|
||||
if validity <= 0 {
|
||||
b.override.Clear()
|
||||
return nil
|
||||
}
|
||||
hs, ok := b.ohm.(outbound.HandlerSelector)
|
||||
if !ok {
|
||||
return newError("outbound.Manager is not a HandlerSelector")
|
||||
}
|
||||
tags := hs.Select(selects)
|
||||
if len(tags) == 0 {
|
||||
return newError("no outbound selected")
|
||||
}
|
||||
b.override.Put(tags, time.Now().Add(validity))
|
||||
return nil
|
||||
}
|
||||
|
||||
// OverrideSelecting implements routing.BalancingOverrider
|
||||
func (r *Router) OverrideSelecting(balancer string, selects []string, validity time.Duration) error {
|
||||
func (r *Router) OverrideBalancer(balancer string, target string) error {
|
||||
var b *Balancer
|
||||
for tag, bl := range r.balancers {
|
||||
if tag == balancer {
|
||||
@ -36,16 +15,12 @@ func (r *Router) OverrideSelecting(balancer string, selects []string, validity t
|
||||
if b == nil {
|
||||
return newError("balancer '", balancer, "' not found")
|
||||
}
|
||||
err := b.overrideSelecting(selects, validity)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
b.override.Put(target)
|
||||
return nil
|
||||
}
|
||||
|
||||
type overrideSettings struct {
|
||||
selects []string
|
||||
until time.Time
|
||||
target string
|
||||
}
|
||||
|
||||
type override struct {
|
||||
@ -54,30 +29,22 @@ type override struct {
|
||||
}
|
||||
|
||||
// Get gets the override settings
|
||||
func (o *override) Get() *overrideSettings {
|
||||
func (o *override) Get() string {
|
||||
o.access.RLock()
|
||||
defer o.access.RUnlock()
|
||||
if len(o.settings.selects) == 0 || time.Now().After(o.settings.until) {
|
||||
return nil
|
||||
}
|
||||
return &overrideSettings{
|
||||
selects: o.settings.selects,
|
||||
until: o.settings.until,
|
||||
}
|
||||
return o.settings.target
|
||||
}
|
||||
|
||||
// Put updates the override settings
|
||||
func (o *override) Put(selects []string, until time.Time) {
|
||||
func (o *override) Put(target string) {
|
||||
o.access.Lock()
|
||||
defer o.access.Unlock()
|
||||
o.settings.selects = selects
|
||||
o.settings.until = until
|
||||
o.settings.target = target
|
||||
}
|
||||
|
||||
// Clear clears the override settings
|
||||
func (o *override) Clear() {
|
||||
o.access.Lock()
|
||||
defer o.access.Unlock()
|
||||
o.settings.selects = nil
|
||||
o.settings.until = time.Time{}
|
||||
o.settings.target = ""
|
||||
}
|
||||
|
@ -6,14 +6,11 @@ import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
|
||||
core "github.com/v2fly/v2ray-core/v4"
|
||||
"github.com/v2fly/v2ray-core/v4/common"
|
||||
"github.com/v2fly/v2ray-core/v4/features/routing"
|
||||
"github.com/v2fly/v2ray-core/v4/features/stats"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
// routingServer is an implementation of RoutingService.
|
||||
@ -22,6 +19,41 @@ type routingServer struct {
|
||||
routingStats stats.Channel
|
||||
}
|
||||
|
||||
func (s *routingServer) GetBalancerInfo(ctx context.Context, request *GetBalancerInfoRequest) (*GetBalancerInfoResponse, error) {
|
||||
var ret GetBalancerInfoResponse
|
||||
ret.Balancer = &BalancerMsg{}
|
||||
if bo, ok := s.router.(routing.BalancerOverrider); ok {
|
||||
{
|
||||
res, err := bo.GetOverrideTarget(request.GetTag())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ret.Balancer.Override = &OverrideInfo{
|
||||
Target: res,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if pt, ok := s.router.(routing.BalancerPrincipleTarget); ok {
|
||||
{
|
||||
res, err := pt.GetPrincipleTarget(request.GetTag())
|
||||
if err != nil {
|
||||
newError("unable to obtain principle target").Base(err).AtInfo().WriteToLog()
|
||||
} else {
|
||||
ret.Balancer.PrincipleTarget = &PrincipleTargetInfo{Tag: res}
|
||||
}
|
||||
}
|
||||
}
|
||||
return &ret, nil
|
||||
}
|
||||
|
||||
func (s *routingServer) OverrideBalancerTarget(ctx context.Context, request *OverrideBalancerTargetRequest) (*OverrideBalancerTargetResponse, error) {
|
||||
if bo, ok := s.router.(routing.BalancerOverrider); ok {
|
||||
return &OverrideBalancerTargetResponse{}, bo.SetOverrideTarget(request.BalancerTag, request.Target)
|
||||
}
|
||||
return nil, newError("unsupported router implementation")
|
||||
}
|
||||
|
||||
// NewRoutingServer creates a statistics service with statistics manager.
|
||||
func NewRoutingServer(router routing.Router, routingStats stats.Channel) RoutingServiceServer {
|
||||
return &routingServer{
|
||||
@ -75,80 +107,6 @@ func (s *routingServer) SubscribeRoutingStats(request *SubscribeRoutingStatsRequ
|
||||
}
|
||||
}
|
||||
|
||||
func (s *routingServer) GetBalancers(ctx context.Context, request *GetBalancersRequest) (*GetBalancersResponse, error) {
|
||||
h, ok := s.router.(routing.RouterChecker)
|
||||
if !ok {
|
||||
return nil, status.Errorf(codes.Unavailable, "current router is not a health checker")
|
||||
}
|
||||
results, err := h.GetBalancersInfo(request.BalancerTags)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
rsp := &GetBalancersResponse{
|
||||
Balancers: make([]*BalancerMsg, 0),
|
||||
}
|
||||
for _, result := range results {
|
||||
var override *OverrideSelectingMsg
|
||||
if result.Override != nil {
|
||||
override = &OverrideSelectingMsg{
|
||||
Until: result.Override.Until.Local().String(),
|
||||
Selects: result.Override.Selects,
|
||||
}
|
||||
}
|
||||
stat := &BalancerMsg{
|
||||
Tag: result.Tag,
|
||||
StrategySettings: result.Strategy.Settings,
|
||||
Titles: result.Strategy.ValueTitles,
|
||||
Override: override,
|
||||
Selects: make([]*OutboundMsg, 0),
|
||||
Others: make([]*OutboundMsg, 0),
|
||||
}
|
||||
for _, item := range result.Strategy.Selects {
|
||||
stat.Selects = append(stat.Selects, &OutboundMsg{
|
||||
Tag: item.Tag,
|
||||
Values: item.Values,
|
||||
})
|
||||
}
|
||||
for _, item := range result.Strategy.Others {
|
||||
stat.Others = append(stat.Others, &OutboundMsg{
|
||||
Tag: item.Tag,
|
||||
Values: item.Values,
|
||||
})
|
||||
}
|
||||
rsp.Balancers = append(rsp.Balancers, stat)
|
||||
}
|
||||
return rsp, nil
|
||||
}
|
||||
func (s *routingServer) CheckBalancers(ctx context.Context, request *CheckBalancersRequest) (*CheckBalancersResponse, error) {
|
||||
h, ok := s.router.(routing.RouterChecker)
|
||||
if !ok {
|
||||
return nil, status.Errorf(codes.Unavailable, "current router is not a health checker")
|
||||
}
|
||||
go func() {
|
||||
err := h.CheckBalancers(request.BalancerTags)
|
||||
if err != nil {
|
||||
newError("CheckBalancers error:", err).AtInfo().WriteToLog()
|
||||
}
|
||||
}()
|
||||
return &CheckBalancersResponse{}, nil
|
||||
}
|
||||
|
||||
func (s *routingServer) OverrideSelecting(ctx context.Context, request *OverrideSelectingRequest) (*OverrideSelectingResponse, error) {
|
||||
bo, ok := s.router.(routing.BalancingOverrider)
|
||||
if !ok {
|
||||
return nil, status.Errorf(codes.Unavailable, "current router doesn't support balancing override")
|
||||
}
|
||||
err := bo.OverrideSelecting(
|
||||
request.BalancerTag,
|
||||
request.Selectors,
|
||||
time.Duration(request.Validity),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
return &OverrideSelectingResponse{}, nil
|
||||
}
|
||||
|
||||
func (s *routingServer) mustEmbedUnimplementedRoutingServiceServer() {}
|
||||
|
||||
type service struct {
|
||||
|
@ -340,17 +340,16 @@ func (x *GetBalancersRequest) GetBalancerTags() []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
type OutboundMsg struct {
|
||||
type PrincipleTargetInfo struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
|
||||
Values []string `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty"`
|
||||
Tag []string `protobuf:"bytes,1,rep,name=tag,proto3" json:"tag,omitempty"`
|
||||
}
|
||||
|
||||
func (x *OutboundMsg) Reset() {
|
||||
*x = OutboundMsg{}
|
||||
func (x *PrincipleTargetInfo) Reset() {
|
||||
*x = PrincipleTargetInfo{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[4]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -358,13 +357,13 @@ func (x *OutboundMsg) Reset() {
|
||||
}
|
||||
}
|
||||
|
||||
func (x *OutboundMsg) String() string {
|
||||
func (x *PrincipleTargetInfo) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*OutboundMsg) ProtoMessage() {}
|
||||
func (*PrincipleTargetInfo) ProtoMessage() {}
|
||||
|
||||
func (x *OutboundMsg) ProtoReflect() protoreflect.Message {
|
||||
func (x *PrincipleTargetInfo) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[4]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -376,36 +375,28 @@ func (x *OutboundMsg) ProtoReflect() protoreflect.Message {
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use OutboundMsg.ProtoReflect.Descriptor instead.
|
||||
func (*OutboundMsg) Descriptor() ([]byte, []int) {
|
||||
// Deprecated: Use PrincipleTargetInfo.ProtoReflect.Descriptor instead.
|
||||
func (*PrincipleTargetInfo) Descriptor() ([]byte, []int) {
|
||||
return file_app_router_command_command_proto_rawDescGZIP(), []int{4}
|
||||
}
|
||||
|
||||
func (x *OutboundMsg) GetTag() string {
|
||||
func (x *PrincipleTargetInfo) GetTag() []string {
|
||||
if x != nil {
|
||||
return x.Tag
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *OutboundMsg) GetValues() []string {
|
||||
if x != nil {
|
||||
return x.Values
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type OverrideSelectingMsg struct {
|
||||
type OverrideInfo struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Until string `protobuf:"bytes,1,opt,name=until,proto3" json:"until,omitempty"`
|
||||
Selects []string `protobuf:"bytes,2,rep,name=selects,proto3" json:"selects,omitempty"`
|
||||
Target string `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"`
|
||||
}
|
||||
|
||||
func (x *OverrideSelectingMsg) Reset() {
|
||||
*x = OverrideSelectingMsg{}
|
||||
func (x *OverrideInfo) Reset() {
|
||||
*x = OverrideInfo{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[5]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -413,13 +404,13 @@ func (x *OverrideSelectingMsg) Reset() {
|
||||
}
|
||||
}
|
||||
|
||||
func (x *OverrideSelectingMsg) String() string {
|
||||
func (x *OverrideInfo) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*OverrideSelectingMsg) ProtoMessage() {}
|
||||
func (*OverrideInfo) ProtoMessage() {}
|
||||
|
||||
func (x *OverrideSelectingMsg) ProtoReflect() protoreflect.Message {
|
||||
func (x *OverrideInfo) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[5]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -431,36 +422,25 @@ func (x *OverrideSelectingMsg) ProtoReflect() protoreflect.Message {
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use OverrideSelectingMsg.ProtoReflect.Descriptor instead.
|
||||
func (*OverrideSelectingMsg) Descriptor() ([]byte, []int) {
|
||||
// Deprecated: Use OverrideInfo.ProtoReflect.Descriptor instead.
|
||||
func (*OverrideInfo) Descriptor() ([]byte, []int) {
|
||||
return file_app_router_command_command_proto_rawDescGZIP(), []int{5}
|
||||
}
|
||||
|
||||
func (x *OverrideSelectingMsg) GetUntil() string {
|
||||
func (x *OverrideInfo) GetTarget() string {
|
||||
if x != nil {
|
||||
return x.Until
|
||||
return x.Target
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *OverrideSelectingMsg) GetSelects() []string {
|
||||
if x != nil {
|
||||
return x.Selects
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type BalancerMsg struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
|
||||
StrategySettings []string `protobuf:"bytes,2,rep,name=strategySettings,proto3" json:"strategySettings,omitempty"`
|
||||
Titles []string `protobuf:"bytes,4,rep,name=titles,proto3" json:"titles,omitempty"`
|
||||
Override *OverrideSelectingMsg `protobuf:"bytes,5,opt,name=override,proto3" json:"override,omitempty"`
|
||||
Selects []*OutboundMsg `protobuf:"bytes,6,rep,name=selects,proto3" json:"selects,omitempty"`
|
||||
Others []*OutboundMsg `protobuf:"bytes,7,rep,name=others,proto3" json:"others,omitempty"`
|
||||
Override *OverrideInfo `protobuf:"bytes,5,opt,name=override,proto3" json:"override,omitempty"`
|
||||
PrincipleTarget *PrincipleTargetInfo `protobuf:"bytes,6,opt,name=principle_target,json=principleTarget,proto3" json:"principle_target,omitempty"`
|
||||
}
|
||||
|
||||
func (x *BalancerMsg) Reset() {
|
||||
@ -495,58 +475,30 @@ func (*BalancerMsg) Descriptor() ([]byte, []int) {
|
||||
return file_app_router_command_command_proto_rawDescGZIP(), []int{6}
|
||||
}
|
||||
|
||||
func (x *BalancerMsg) GetTag() string {
|
||||
if x != nil {
|
||||
return x.Tag
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *BalancerMsg) GetStrategySettings() []string {
|
||||
if x != nil {
|
||||
return x.StrategySettings
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *BalancerMsg) GetTitles() []string {
|
||||
if x != nil {
|
||||
return x.Titles
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *BalancerMsg) GetOverride() *OverrideSelectingMsg {
|
||||
func (x *BalancerMsg) GetOverride() *OverrideInfo {
|
||||
if x != nil {
|
||||
return x.Override
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *BalancerMsg) GetSelects() []*OutboundMsg {
|
||||
func (x *BalancerMsg) GetPrincipleTarget() *PrincipleTargetInfo {
|
||||
if x != nil {
|
||||
return x.Selects
|
||||
return x.PrincipleTarget
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *BalancerMsg) GetOthers() []*OutboundMsg {
|
||||
if x != nil {
|
||||
return x.Others
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type GetBalancersResponse struct {
|
||||
type GetBalancerInfoRequest struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Balancers []*BalancerMsg `protobuf:"bytes,1,rep,name=balancers,proto3" json:"balancers,omitempty"`
|
||||
Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
|
||||
}
|
||||
|
||||
func (x *GetBalancersResponse) Reset() {
|
||||
*x = GetBalancersResponse{}
|
||||
func (x *GetBalancerInfoRequest) Reset() {
|
||||
*x = GetBalancerInfoRequest{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[7]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -554,13 +506,13 @@ func (x *GetBalancersResponse) Reset() {
|
||||
}
|
||||
}
|
||||
|
||||
func (x *GetBalancersResponse) String() string {
|
||||
func (x *GetBalancerInfoRequest) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*GetBalancersResponse) ProtoMessage() {}
|
||||
func (*GetBalancerInfoRequest) ProtoMessage() {}
|
||||
|
||||
func (x *GetBalancersResponse) ProtoReflect() protoreflect.Message {
|
||||
func (x *GetBalancerInfoRequest) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[7]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -572,28 +524,28 @@ func (x *GetBalancersResponse) ProtoReflect() protoreflect.Message {
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use GetBalancersResponse.ProtoReflect.Descriptor instead.
|
||||
func (*GetBalancersResponse) Descriptor() ([]byte, []int) {
|
||||
// Deprecated: Use GetBalancerInfoRequest.ProtoReflect.Descriptor instead.
|
||||
func (*GetBalancerInfoRequest) Descriptor() ([]byte, []int) {
|
||||
return file_app_router_command_command_proto_rawDescGZIP(), []int{7}
|
||||
}
|
||||
|
||||
func (x *GetBalancersResponse) GetBalancers() []*BalancerMsg {
|
||||
func (x *GetBalancerInfoRequest) GetTag() string {
|
||||
if x != nil {
|
||||
return x.Balancers
|
||||
return x.Tag
|
||||
}
|
||||
return nil
|
||||
return ""
|
||||
}
|
||||
|
||||
type CheckBalancersRequest struct {
|
||||
type GetBalancerInfoResponse struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
BalancerTags []string `protobuf:"bytes,1,rep,name=balancerTags,proto3" json:"balancerTags,omitempty"`
|
||||
Balancer *BalancerMsg `protobuf:"bytes,1,opt,name=balancer,proto3" json:"balancer,omitempty"`
|
||||
}
|
||||
|
||||
func (x *CheckBalancersRequest) Reset() {
|
||||
*x = CheckBalancersRequest{}
|
||||
func (x *GetBalancerInfoResponse) Reset() {
|
||||
*x = GetBalancerInfoResponse{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[8]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -601,13 +553,13 @@ func (x *CheckBalancersRequest) Reset() {
|
||||
}
|
||||
}
|
||||
|
||||
func (x *CheckBalancersRequest) String() string {
|
||||
func (x *GetBalancerInfoResponse) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*CheckBalancersRequest) ProtoMessage() {}
|
||||
func (*GetBalancerInfoResponse) ProtoMessage() {}
|
||||
|
||||
func (x *CheckBalancersRequest) ProtoReflect() protoreflect.Message {
|
||||
func (x *GetBalancerInfoResponse) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[8]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -619,26 +571,29 @@ func (x *CheckBalancersRequest) ProtoReflect() protoreflect.Message {
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use CheckBalancersRequest.ProtoReflect.Descriptor instead.
|
||||
func (*CheckBalancersRequest) Descriptor() ([]byte, []int) {
|
||||
// Deprecated: Use GetBalancerInfoResponse.ProtoReflect.Descriptor instead.
|
||||
func (*GetBalancerInfoResponse) Descriptor() ([]byte, []int) {
|
||||
return file_app_router_command_command_proto_rawDescGZIP(), []int{8}
|
||||
}
|
||||
|
||||
func (x *CheckBalancersRequest) GetBalancerTags() []string {
|
||||
func (x *GetBalancerInfoResponse) GetBalancer() *BalancerMsg {
|
||||
if x != nil {
|
||||
return x.BalancerTags
|
||||
return x.Balancer
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type CheckBalancersResponse struct {
|
||||
type OverrideBalancerTargetRequest struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
BalancerTag string `protobuf:"bytes,1,opt,name=balancerTag,proto3" json:"balancerTag,omitempty"`
|
||||
Target string `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"`
|
||||
}
|
||||
|
||||
func (x *CheckBalancersResponse) Reset() {
|
||||
*x = CheckBalancersResponse{}
|
||||
func (x *OverrideBalancerTargetRequest) Reset() {
|
||||
*x = OverrideBalancerTargetRequest{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[9]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -646,13 +601,13 @@ func (x *CheckBalancersResponse) Reset() {
|
||||
}
|
||||
}
|
||||
|
||||
func (x *CheckBalancersResponse) String() string {
|
||||
func (x *OverrideBalancerTargetRequest) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*CheckBalancersResponse) ProtoMessage() {}
|
||||
func (*OverrideBalancerTargetRequest) ProtoMessage() {}
|
||||
|
||||
func (x *CheckBalancersResponse) ProtoReflect() protoreflect.Message {
|
||||
func (x *OverrideBalancerTargetRequest) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[9]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -664,23 +619,33 @@ func (x *CheckBalancersResponse) ProtoReflect() protoreflect.Message {
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use CheckBalancersResponse.ProtoReflect.Descriptor instead.
|
||||
func (*CheckBalancersResponse) Descriptor() ([]byte, []int) {
|
||||
// Deprecated: Use OverrideBalancerTargetRequest.ProtoReflect.Descriptor instead.
|
||||
func (*OverrideBalancerTargetRequest) Descriptor() ([]byte, []int) {
|
||||
return file_app_router_command_command_proto_rawDescGZIP(), []int{9}
|
||||
}
|
||||
|
||||
type OverrideSelectingRequest struct {
|
||||
func (x *OverrideBalancerTargetRequest) GetBalancerTag() string {
|
||||
if x != nil {
|
||||
return x.BalancerTag
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *OverrideBalancerTargetRequest) GetTarget() string {
|
||||
if x != nil {
|
||||
return x.Target
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type OverrideBalancerTargetResponse struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
BalancerTag string `protobuf:"bytes,1,opt,name=balancerTag,proto3" json:"balancerTag,omitempty"`
|
||||
Selectors []string `protobuf:"bytes,2,rep,name=selectors,proto3" json:"selectors,omitempty"`
|
||||
Validity int64 `protobuf:"varint,3,opt,name=validity,proto3" json:"validity,omitempty"`
|
||||
}
|
||||
|
||||
func (x *OverrideSelectingRequest) Reset() {
|
||||
*x = OverrideSelectingRequest{}
|
||||
func (x *OverrideBalancerTargetResponse) Reset() {
|
||||
*x = OverrideBalancerTargetResponse{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[10]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -688,13 +653,13 @@ func (x *OverrideSelectingRequest) Reset() {
|
||||
}
|
||||
}
|
||||
|
||||
func (x *OverrideSelectingRequest) String() string {
|
||||
func (x *OverrideBalancerTargetResponse) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*OverrideSelectingRequest) ProtoMessage() {}
|
||||
func (*OverrideBalancerTargetResponse) ProtoMessage() {}
|
||||
|
||||
func (x *OverrideSelectingRequest) ProtoReflect() protoreflect.Message {
|
||||
func (x *OverrideBalancerTargetResponse) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[10]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
@ -706,70 +671,11 @@ func (x *OverrideSelectingRequest) ProtoReflect() protoreflect.Message {
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use OverrideSelectingRequest.ProtoReflect.Descriptor instead.
|
||||
func (*OverrideSelectingRequest) Descriptor() ([]byte, []int) {
|
||||
// Deprecated: Use OverrideBalancerTargetResponse.ProtoReflect.Descriptor instead.
|
||||
func (*OverrideBalancerTargetResponse) Descriptor() ([]byte, []int) {
|
||||
return file_app_router_command_command_proto_rawDescGZIP(), []int{10}
|
||||
}
|
||||
|
||||
func (x *OverrideSelectingRequest) GetBalancerTag() string {
|
||||
if x != nil {
|
||||
return x.BalancerTag
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *OverrideSelectingRequest) GetSelectors() []string {
|
||||
if x != nil {
|
||||
return x.Selectors
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *OverrideSelectingRequest) GetValidity() int64 {
|
||||
if x != nil {
|
||||
return x.Validity
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type OverrideSelectingResponse struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
}
|
||||
|
||||
func (x *OverrideSelectingResponse) Reset() {
|
||||
*x = OverrideSelectingResponse{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[11]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *OverrideSelectingResponse) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*OverrideSelectingResponse) ProtoMessage() {}
|
||||
|
||||
func (x *OverrideSelectingResponse) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_app_router_command_command_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 OverrideSelectingResponse.ProtoReflect.Descriptor instead.
|
||||
func (*OverrideSelectingResponse) Descriptor() ([]byte, []int) {
|
||||
return file_app_router_command_command_proto_rawDescGZIP(), []int{11}
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
@ -779,7 +685,7 @@ type Config struct {
|
||||
func (x *Config) Reset() {
|
||||
*x = Config{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[12]
|
||||
mi := &file_app_router_command_command_proto_msgTypes[11]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
@ -792,7 +698,7 @@ func (x *Config) String() string {
|
||||
func (*Config) ProtoMessage() {}
|
||||
|
||||
func (x *Config) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_app_router_command_command_proto_msgTypes[12]
|
||||
mi := &file_app_router_command_command_proto_msgTypes[11]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
@ -805,7 +711,7 @@ func (x *Config) ProtoReflect() protoreflect.Message {
|
||||
|
||||
// Deprecated: Use Config.ProtoReflect.Descriptor instead.
|
||||
func (*Config) Descriptor() ([]byte, []int) {
|
||||
return file_app_router_command_command_proto_rawDescGZIP(), []int{12}
|
||||
return file_app_router_command_command_proto_rawDescGZIP(), []int{11}
|
||||
}
|
||||
|
||||
var File_app_router_command_command_proto protoreflect.FileDescriptor
|
||||
@ -871,106 +777,83 @@ var file_app_router_command_command_proto_rawDesc = []byte{
|
||||
0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
|
||||
0x22, 0x0a, 0x0c, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x18,
|
||||
0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54,
|
||||
0x61, 0x67, 0x73, 0x22, 0x37, 0x0a, 0x0b, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d,
|
||||
0x73, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x03, 0x74, 0x61, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02,
|
||||
0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x14,
|
||||
0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6e,
|
||||
0x67, 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x01, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65,
|
||||
0x6c, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x6c,
|
||||
0x65, 0x63, 0x74, 0x73, 0x22, 0xbe, 0x02, 0x0a, 0x0b, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65,
|
||||
0x72, 0x4d, 0x73, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65,
|
||||
0x67, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
|
||||
0x52, 0x10, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e,
|
||||
0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03,
|
||||
0x28, 0x09, 0x52, 0x06, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x6f, 0x76,
|
||||
0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76,
|
||||
0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f,
|
||||
0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4f, 0x76, 0x65,
|
||||
0x72, 0x72, 0x69, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x73,
|
||||
0x67, 0x52, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x07, 0x73,
|
||||
0x65, 0x6c, 0x65, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76,
|
||||
0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f,
|
||||
0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4f, 0x75, 0x74,
|
||||
0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x07, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74,
|
||||
0x73, 0x12, 0x42, 0x0a, 0x06, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28,
|
||||
0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61,
|
||||
0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
|
||||
0x64, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x73, 0x67, 0x52, 0x06, 0x6f,
|
||||
0x74, 0x68, 0x65, 0x72, 0x73, 0x22, 0x60, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61,
|
||||
0x6e, 0x63, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a,
|
||||
0x09, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
|
||||
0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70,
|
||||
0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
|
||||
0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x4d, 0x73, 0x67, 0x52, 0x09, 0x62, 0x61,
|
||||
0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x73, 0x22, 0x3b, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b,
|
||||
0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||
0x12, 0x22, 0x0a, 0x0c, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73,
|
||||
0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72,
|
||||
0x54, 0x61, 0x67, 0x73, 0x22, 0x18, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x61, 0x6c,
|
||||
0x61, 0x6e, 0x63, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x76,
|
||||
0x0a, 0x18, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74,
|
||||
0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x61,
|
||||
0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x0b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54, 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x09,
|
||||
0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52,
|
||||
0x09, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x61,
|
||||
0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x76, 0x61,
|
||||
0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x22, 0x1b, 0x0a, 0x19, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69,
|
||||
0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
||||
0x6e, 0x73, 0x65, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x32, 0x90, 0x05,
|
||||
0x0a, 0x0e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
|
||||
0x12, 0x87, 0x01, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x6f,
|
||||
0x75, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x76, 0x32, 0x72,
|
||||
0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74,
|
||||
0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63,
|
||||
0x72, 0x69, 0x62, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73,
|
||||
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
|
||||
0x61, 0x67, 0x73, 0x22, 0x27, 0x0a, 0x13, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x6c, 0x65,
|
||||
0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61,
|
||||
0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x26, 0x0a, 0x0c,
|
||||
0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06,
|
||||
0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61,
|
||||
0x72, 0x67, 0x65, 0x74, 0x22, 0xb5, 0x01, 0x0a, 0x0b, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65,
|
||||
0x72, 0x4d, 0x73, 0x67, 0x12, 0x47, 0x0a, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65,
|
||||
0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
|
||||
0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63,
|
||||
0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x49,
|
||||
0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x5d, 0x0a,
|
||||
0x10, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65,
|
||||
0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
|
||||
0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e,
|
||||
0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43,
|
||||
0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6d, 0x0a, 0x09, 0x54, 0x65,
|
||||
0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e,
|
||||
0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e,
|
||||
0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74,
|
||||
0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79,
|
||||
0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72,
|
||||
0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67,
|
||||
0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x0c, 0x47, 0x65, 0x74,
|
||||
0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x73, 0x12, 0x32, 0x2e, 0x76, 0x32, 0x72, 0x61,
|
||||
0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x6c,
|
||||
0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x70, 0x72, 0x69,
|
||||
0x6e, 0x63, 0x69, 0x70, 0x6c, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x2a, 0x0a, 0x16,
|
||||
0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52,
|
||||
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x61, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x42,
|
||||
0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
||||
0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x18,
|
||||
0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
|
||||
0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f,
|
||||
0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x4d, 0x73,
|
||||
0x67, 0x52, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x22, 0x59, 0x0a, 0x1d, 0x4f,
|
||||
0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54,
|
||||
0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b,
|
||||
0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x0b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54, 0x61, 0x67, 0x12, 0x16,
|
||||
0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
|
||||
0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x20, 0x0a, 0x1e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69,
|
||||
0x64, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
|
||||
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66,
|
||||
0x69, 0x67, 0x32, 0xa8, 0x04, 0x0a, 0x0e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65,
|
||||
0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72,
|
||||
0x69, 0x62, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12,
|
||||
0x3b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70,
|
||||
0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e,
|
||||
0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67,
|
||||
0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76,
|
||||
0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f,
|
||||
0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x6f, 0x75,
|
||||
0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12,
|
||||
0x6d, 0x0a, 0x09, 0x54, 0x65, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x76,
|
||||
0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f,
|
||||
0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x54, 0x65, 0x73,
|
||||
0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e,
|
||||
0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72,
|
||||
0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x6f,
|
||||
0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x00, 0x12, 0x82,
|
||||
0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e,
|
||||
0x66, 0x6f, 0x12, 0x35, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
|
||||
0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61,
|
||||
0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e,
|
||||
0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x76, 0x32, 0x72, 0x61,
|
||||
0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65,
|
||||
0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x6c,
|
||||
0x61, 0x6e, 0x63, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e,
|
||||
0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72,
|
||||
0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x47, 0x65,
|
||||
0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
|
||||
0x73, 0x65, 0x22, 0x00, 0x12, 0x7f, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x61, 0x6c,
|
||||
0x61, 0x6e, 0x63, 0x65, 0x72, 0x73, 0x12, 0x34, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63,
|
||||
0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63,
|
||||
0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x61, 0x6c, 0x61,
|
||||
0x6e, 0x63, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x76,
|
||||
0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
|
||||
0x65, 0x22, 0x00, 0x12, 0x97, 0x01, 0x0a, 0x16, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65,
|
||||
0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x3c,
|
||||
0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e,
|
||||
0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4f,
|
||||
0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54,
|
||||
0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x76,
|
||||
0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f,
|
||||
0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x43, 0x68, 0x65,
|
||||
0x63, 0x6b, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
||||
0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x11, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69,
|
||||
0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x37, 0x2e, 0x76, 0x32,
|
||||
0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75,
|
||||
0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4f, 0x76, 0x65, 0x72,
|
||||
0x72, 0x69, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71,
|
||||
0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72,
|
||||
0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d,
|
||||
0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x53, 0x65, 0x6c,
|
||||
0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00,
|
||||
0x42, 0x78, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f,
|
||||
0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f,
|
||||
0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e,
|
||||
0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x32, 0x66, 0x6c, 0x79, 0x2f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2d,
|
||||
0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x6f, 0x75, 0x74,
|
||||
0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0xaa, 0x02, 0x1d, 0x56, 0x32, 0x52,
|
||||
0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x52, 0x6f, 0x75, 0x74,
|
||||
0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x33,
|
||||
0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x4f, 0x76, 0x65,
|
||||
0x72, 0x72, 0x69, 0x64, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x54, 0x61, 0x72,
|
||||
0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x78, 0x0a,
|
||||
0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
|
||||
0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61,
|
||||
0x6e, 0x64, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
|
||||
0x2f, 0x76, 0x32, 0x66, 0x6c, 0x79, 0x2f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72,
|
||||
0x65, 0x2f, 0x76, 0x34, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2f,
|
||||
0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0xaa, 0x02, 0x1d, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e,
|
||||
0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e,
|
||||
0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
@ -985,47 +868,43 @@ func file_app_router_command_command_proto_rawDescGZIP() []byte {
|
||||
return file_app_router_command_command_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_app_router_command_command_proto_msgTypes = make([]protoimpl.MessageInfo, 14)
|
||||
var file_app_router_command_command_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
|
||||
var file_app_router_command_command_proto_goTypes = []interface{}{
|
||||
(*RoutingContext)(nil), // 0: v2ray.core.app.router.command.RoutingContext
|
||||
(*SubscribeRoutingStatsRequest)(nil), // 1: v2ray.core.app.router.command.SubscribeRoutingStatsRequest
|
||||
(*TestRouteRequest)(nil), // 2: v2ray.core.app.router.command.TestRouteRequest
|
||||
(*GetBalancersRequest)(nil), // 3: v2ray.core.app.router.command.GetBalancersRequest
|
||||
(*OutboundMsg)(nil), // 4: v2ray.core.app.router.command.OutboundMsg
|
||||
(*OverrideSelectingMsg)(nil), // 5: v2ray.core.app.router.command.OverrideSelectingMsg
|
||||
(*BalancerMsg)(nil), // 6: v2ray.core.app.router.command.BalancerMsg
|
||||
(*GetBalancersResponse)(nil), // 7: v2ray.core.app.router.command.GetBalancersResponse
|
||||
(*CheckBalancersRequest)(nil), // 8: v2ray.core.app.router.command.CheckBalancersRequest
|
||||
(*CheckBalancersResponse)(nil), // 9: v2ray.core.app.router.command.CheckBalancersResponse
|
||||
(*OverrideSelectingRequest)(nil), // 10: v2ray.core.app.router.command.OverrideSelectingRequest
|
||||
(*OverrideSelectingResponse)(nil), // 11: v2ray.core.app.router.command.OverrideSelectingResponse
|
||||
(*Config)(nil), // 12: v2ray.core.app.router.command.Config
|
||||
nil, // 13: v2ray.core.app.router.command.RoutingContext.AttributesEntry
|
||||
(net.Network)(0), // 14: v2ray.core.common.net.Network
|
||||
(*RoutingContext)(nil), // 0: v2ray.core.app.router.command.RoutingContext
|
||||
(*SubscribeRoutingStatsRequest)(nil), // 1: v2ray.core.app.router.command.SubscribeRoutingStatsRequest
|
||||
(*TestRouteRequest)(nil), // 2: v2ray.core.app.router.command.TestRouteRequest
|
||||
(*GetBalancersRequest)(nil), // 3: v2ray.core.app.router.command.GetBalancersRequest
|
||||
(*PrincipleTargetInfo)(nil), // 4: v2ray.core.app.router.command.PrincipleTargetInfo
|
||||
(*OverrideInfo)(nil), // 5: v2ray.core.app.router.command.OverrideInfo
|
||||
(*BalancerMsg)(nil), // 6: v2ray.core.app.router.command.BalancerMsg
|
||||
(*GetBalancerInfoRequest)(nil), // 7: v2ray.core.app.router.command.GetBalancerInfoRequest
|
||||
(*GetBalancerInfoResponse)(nil), // 8: v2ray.core.app.router.command.GetBalancerInfoResponse
|
||||
(*OverrideBalancerTargetRequest)(nil), // 9: v2ray.core.app.router.command.OverrideBalancerTargetRequest
|
||||
(*OverrideBalancerTargetResponse)(nil), // 10: v2ray.core.app.router.command.OverrideBalancerTargetResponse
|
||||
(*Config)(nil), // 11: v2ray.core.app.router.command.Config
|
||||
nil, // 12: v2ray.core.app.router.command.RoutingContext.AttributesEntry
|
||||
(net.Network)(0), // 13: v2ray.core.common.net.Network
|
||||
}
|
||||
var file_app_router_command_command_proto_depIdxs = []int32{
|
||||
14, // 0: v2ray.core.app.router.command.RoutingContext.Network:type_name -> v2ray.core.common.net.Network
|
||||
13, // 1: v2ray.core.app.router.command.RoutingContext.Attributes:type_name -> v2ray.core.app.router.command.RoutingContext.AttributesEntry
|
||||
13, // 0: v2ray.core.app.router.command.RoutingContext.Network:type_name -> v2ray.core.common.net.Network
|
||||
12, // 1: v2ray.core.app.router.command.RoutingContext.Attributes:type_name -> v2ray.core.app.router.command.RoutingContext.AttributesEntry
|
||||
0, // 2: v2ray.core.app.router.command.TestRouteRequest.RoutingContext:type_name -> v2ray.core.app.router.command.RoutingContext
|
||||
5, // 3: v2ray.core.app.router.command.BalancerMsg.override:type_name -> v2ray.core.app.router.command.OverrideSelectingMsg
|
||||
4, // 4: v2ray.core.app.router.command.BalancerMsg.selects:type_name -> v2ray.core.app.router.command.OutboundMsg
|
||||
4, // 5: v2ray.core.app.router.command.BalancerMsg.others:type_name -> v2ray.core.app.router.command.OutboundMsg
|
||||
6, // 6: v2ray.core.app.router.command.GetBalancersResponse.balancers:type_name -> v2ray.core.app.router.command.BalancerMsg
|
||||
1, // 7: v2ray.core.app.router.command.RoutingService.SubscribeRoutingStats:input_type -> v2ray.core.app.router.command.SubscribeRoutingStatsRequest
|
||||
2, // 8: v2ray.core.app.router.command.RoutingService.TestRoute:input_type -> v2ray.core.app.router.command.TestRouteRequest
|
||||
3, // 9: v2ray.core.app.router.command.RoutingService.GetBalancers:input_type -> v2ray.core.app.router.command.GetBalancersRequest
|
||||
8, // 10: v2ray.core.app.router.command.RoutingService.CheckBalancers:input_type -> v2ray.core.app.router.command.CheckBalancersRequest
|
||||
10, // 11: v2ray.core.app.router.command.RoutingService.OverrideSelecting:input_type -> v2ray.core.app.router.command.OverrideSelectingRequest
|
||||
0, // 12: v2ray.core.app.router.command.RoutingService.SubscribeRoutingStats:output_type -> v2ray.core.app.router.command.RoutingContext
|
||||
0, // 13: v2ray.core.app.router.command.RoutingService.TestRoute:output_type -> v2ray.core.app.router.command.RoutingContext
|
||||
7, // 14: v2ray.core.app.router.command.RoutingService.GetBalancers:output_type -> v2ray.core.app.router.command.GetBalancersResponse
|
||||
9, // 15: v2ray.core.app.router.command.RoutingService.CheckBalancers:output_type -> v2ray.core.app.router.command.CheckBalancersResponse
|
||||
11, // 16: v2ray.core.app.router.command.RoutingService.OverrideSelecting:output_type -> v2ray.core.app.router.command.OverrideSelectingResponse
|
||||
12, // [12:17] is the sub-list for method output_type
|
||||
7, // [7:12] is the sub-list for method input_type
|
||||
7, // [7:7] is the sub-list for extension type_name
|
||||
7, // [7:7] is the sub-list for extension extendee
|
||||
0, // [0:7] is the sub-list for field type_name
|
||||
5, // 3: v2ray.core.app.router.command.BalancerMsg.override:type_name -> v2ray.core.app.router.command.OverrideInfo
|
||||
4, // 4: v2ray.core.app.router.command.BalancerMsg.principle_target:type_name -> v2ray.core.app.router.command.PrincipleTargetInfo
|
||||
6, // 5: v2ray.core.app.router.command.GetBalancerInfoResponse.balancer:type_name -> v2ray.core.app.router.command.BalancerMsg
|
||||
1, // 6: v2ray.core.app.router.command.RoutingService.SubscribeRoutingStats:input_type -> v2ray.core.app.router.command.SubscribeRoutingStatsRequest
|
||||
2, // 7: v2ray.core.app.router.command.RoutingService.TestRoute:input_type -> v2ray.core.app.router.command.TestRouteRequest
|
||||
7, // 8: v2ray.core.app.router.command.RoutingService.GetBalancerInfo:input_type -> v2ray.core.app.router.command.GetBalancerInfoRequest
|
||||
9, // 9: v2ray.core.app.router.command.RoutingService.OverrideBalancerTarget:input_type -> v2ray.core.app.router.command.OverrideBalancerTargetRequest
|
||||
0, // 10: v2ray.core.app.router.command.RoutingService.SubscribeRoutingStats:output_type -> v2ray.core.app.router.command.RoutingContext
|
||||
0, // 11: v2ray.core.app.router.command.RoutingService.TestRoute:output_type -> v2ray.core.app.router.command.RoutingContext
|
||||
8, // 12: v2ray.core.app.router.command.RoutingService.GetBalancerInfo:output_type -> v2ray.core.app.router.command.GetBalancerInfoResponse
|
||||
10, // 13: v2ray.core.app.router.command.RoutingService.OverrideBalancerTarget:output_type -> v2ray.core.app.router.command.OverrideBalancerTargetResponse
|
||||
10, // [10:14] is the sub-list for method output_type
|
||||
6, // [6:10] is the sub-list for method input_type
|
||||
6, // [6:6] is the sub-list for extension type_name
|
||||
6, // [6:6] is the sub-list for extension extendee
|
||||
0, // [0:6] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_app_router_command_command_proto_init() }
|
||||
@ -1083,7 +962,7 @@ func file_app_router_command_command_proto_init() {
|
||||
}
|
||||
}
|
||||
file_app_router_command_command_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*OutboundMsg); i {
|
||||
switch v := v.(*PrincipleTargetInfo); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
@ -1095,7 +974,7 @@ func file_app_router_command_command_proto_init() {
|
||||
}
|
||||
}
|
||||
file_app_router_command_command_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*OverrideSelectingMsg); i {
|
||||
switch v := v.(*OverrideInfo); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
@ -1119,7 +998,7 @@ func file_app_router_command_command_proto_init() {
|
||||
}
|
||||
}
|
||||
file_app_router_command_command_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*GetBalancersResponse); i {
|
||||
switch v := v.(*GetBalancerInfoRequest); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
@ -1131,7 +1010,7 @@ func file_app_router_command_command_proto_init() {
|
||||
}
|
||||
}
|
||||
file_app_router_command_command_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*CheckBalancersRequest); i {
|
||||
switch v := v.(*GetBalancerInfoResponse); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
@ -1143,7 +1022,7 @@ func file_app_router_command_command_proto_init() {
|
||||
}
|
||||
}
|
||||
file_app_router_command_command_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*CheckBalancersResponse); i {
|
||||
switch v := v.(*OverrideBalancerTargetRequest); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
@ -1155,7 +1034,7 @@ func file_app_router_command_command_proto_init() {
|
||||
}
|
||||
}
|
||||
file_app_router_command_command_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*OverrideSelectingRequest); i {
|
||||
switch v := v.(*OverrideBalancerTargetResponse); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
@ -1167,18 +1046,6 @@ func file_app_router_command_command_proto_init() {
|
||||
}
|
||||
}
|
||||
file_app_router_command_command_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*OverrideSelectingResponse); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_app_router_command_command_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Config); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
@ -1197,7 +1064,7 @@ func file_app_router_command_command_proto_init() {
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_app_router_command_command_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 14,
|
||||
NumMessages: 13,
|
||||
NumExtensions: 0,
|
||||
NumServices: 1,
|
||||
},
|
||||
|
@ -64,51 +64,41 @@ message GetBalancersRequest {
|
||||
repeated string balancerTags = 1;
|
||||
}
|
||||
|
||||
message OutboundMsg {
|
||||
string tag = 1;
|
||||
repeated string values = 2;
|
||||
message PrincipleTargetInfo {
|
||||
repeated string tag = 1;
|
||||
}
|
||||
|
||||
message OverrideSelectingMsg {
|
||||
string until = 1;
|
||||
repeated string selects = 2;
|
||||
message OverrideInfo {
|
||||
string target = 2;
|
||||
}
|
||||
|
||||
message BalancerMsg {
|
||||
OverrideInfo override = 5;
|
||||
PrincipleTargetInfo principle_target = 6;
|
||||
}
|
||||
|
||||
message GetBalancerInfoRequest {
|
||||
string tag = 1;
|
||||
repeated string strategySettings = 2;
|
||||
repeated string titles = 4;
|
||||
OverrideSelectingMsg override = 5;
|
||||
repeated OutboundMsg selects = 6;
|
||||
repeated OutboundMsg others = 7;
|
||||
}
|
||||
|
||||
message GetBalancersResponse {
|
||||
repeated BalancerMsg balancers = 1;
|
||||
message GetBalancerInfoResponse {
|
||||
BalancerMsg balancer = 1;
|
||||
}
|
||||
|
||||
message CheckBalancersRequest {
|
||||
repeated string balancerTags = 1;
|
||||
}
|
||||
|
||||
message CheckBalancersResponse {}
|
||||
|
||||
|
||||
message OverrideSelectingRequest {
|
||||
message OverrideBalancerTargetRequest {
|
||||
string balancerTag = 1;
|
||||
repeated string selectors = 2;
|
||||
int64 validity = 3;
|
||||
string target = 2;
|
||||
}
|
||||
|
||||
message OverrideSelectingResponse {}
|
||||
message OverrideBalancerTargetResponse {}
|
||||
|
||||
service RoutingService {
|
||||
rpc SubscribeRoutingStats(SubscribeRoutingStatsRequest)
|
||||
returns (stream RoutingContext) {}
|
||||
rpc TestRoute(TestRouteRequest) returns (RoutingContext) {}
|
||||
rpc GetBalancers(GetBalancersRequest) returns (GetBalancersResponse) {}
|
||||
rpc CheckBalancers(CheckBalancersRequest) returns (CheckBalancersResponse) {}
|
||||
rpc OverrideSelecting(OverrideSelectingRequest) returns (OverrideSelectingResponse) {}
|
||||
|
||||
rpc GetBalancerInfo(GetBalancerInfoRequest) returns (GetBalancerInfoResponse){}
|
||||
rpc OverrideBalancerTarget(OverrideBalancerTargetRequest) returns (OverrideBalancerTargetResponse) {}
|
||||
}
|
||||
|
||||
message Config {}
|
||||
|
@ -20,9 +20,8 @@ const _ = grpc.SupportPackageIsVersion7
|
||||
type RoutingServiceClient interface {
|
||||
SubscribeRoutingStats(ctx context.Context, in *SubscribeRoutingStatsRequest, opts ...grpc.CallOption) (RoutingService_SubscribeRoutingStatsClient, error)
|
||||
TestRoute(ctx context.Context, in *TestRouteRequest, opts ...grpc.CallOption) (*RoutingContext, error)
|
||||
GetBalancers(ctx context.Context, in *GetBalancersRequest, opts ...grpc.CallOption) (*GetBalancersResponse, error)
|
||||
CheckBalancers(ctx context.Context, in *CheckBalancersRequest, opts ...grpc.CallOption) (*CheckBalancersResponse, error)
|
||||
OverrideSelecting(ctx context.Context, in *OverrideSelectingRequest, opts ...grpc.CallOption) (*OverrideSelectingResponse, error)
|
||||
GetBalancerInfo(ctx context.Context, in *GetBalancerInfoRequest, opts ...grpc.CallOption) (*GetBalancerInfoResponse, error)
|
||||
OverrideBalancerTarget(ctx context.Context, in *OverrideBalancerTargetRequest, opts ...grpc.CallOption) (*OverrideBalancerTargetResponse, error)
|
||||
}
|
||||
|
||||
type routingServiceClient struct {
|
||||
@ -74,27 +73,18 @@ func (c *routingServiceClient) TestRoute(ctx context.Context, in *TestRouteReque
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *routingServiceClient) GetBalancers(ctx context.Context, in *GetBalancersRequest, opts ...grpc.CallOption) (*GetBalancersResponse, error) {
|
||||
out := new(GetBalancersResponse)
|
||||
err := c.cc.Invoke(ctx, "/v2ray.core.app.router.command.RoutingService/GetBalancers", in, out, opts...)
|
||||
func (c *routingServiceClient) GetBalancerInfo(ctx context.Context, in *GetBalancerInfoRequest, opts ...grpc.CallOption) (*GetBalancerInfoResponse, error) {
|
||||
out := new(GetBalancerInfoResponse)
|
||||
err := c.cc.Invoke(ctx, "/v2ray.core.app.router.command.RoutingService/GetBalancerInfo", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *routingServiceClient) CheckBalancers(ctx context.Context, in *CheckBalancersRequest, opts ...grpc.CallOption) (*CheckBalancersResponse, error) {
|
||||
out := new(CheckBalancersResponse)
|
||||
err := c.cc.Invoke(ctx, "/v2ray.core.app.router.command.RoutingService/CheckBalancers", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *routingServiceClient) OverrideSelecting(ctx context.Context, in *OverrideSelectingRequest, opts ...grpc.CallOption) (*OverrideSelectingResponse, error) {
|
||||
out := new(OverrideSelectingResponse)
|
||||
err := c.cc.Invoke(ctx, "/v2ray.core.app.router.command.RoutingService/OverrideSelecting", in, out, opts...)
|
||||
func (c *routingServiceClient) OverrideBalancerTarget(ctx context.Context, in *OverrideBalancerTargetRequest, opts ...grpc.CallOption) (*OverrideBalancerTargetResponse, error) {
|
||||
out := new(OverrideBalancerTargetResponse)
|
||||
err := c.cc.Invoke(ctx, "/v2ray.core.app.router.command.RoutingService/OverrideBalancerTarget", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -107,9 +97,8 @@ func (c *routingServiceClient) OverrideSelecting(ctx context.Context, in *Overri
|
||||
type RoutingServiceServer interface {
|
||||
SubscribeRoutingStats(*SubscribeRoutingStatsRequest, RoutingService_SubscribeRoutingStatsServer) error
|
||||
TestRoute(context.Context, *TestRouteRequest) (*RoutingContext, error)
|
||||
GetBalancers(context.Context, *GetBalancersRequest) (*GetBalancersResponse, error)
|
||||
CheckBalancers(context.Context, *CheckBalancersRequest) (*CheckBalancersResponse, error)
|
||||
OverrideSelecting(context.Context, *OverrideSelectingRequest) (*OverrideSelectingResponse, error)
|
||||
GetBalancerInfo(context.Context, *GetBalancerInfoRequest) (*GetBalancerInfoResponse, error)
|
||||
OverrideBalancerTarget(context.Context, *OverrideBalancerTargetRequest) (*OverrideBalancerTargetResponse, error)
|
||||
mustEmbedUnimplementedRoutingServiceServer()
|
||||
}
|
||||
|
||||
@ -123,14 +112,11 @@ func (UnimplementedRoutingServiceServer) SubscribeRoutingStats(*SubscribeRouting
|
||||
func (UnimplementedRoutingServiceServer) TestRoute(context.Context, *TestRouteRequest) (*RoutingContext, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method TestRoute not implemented")
|
||||
}
|
||||
func (UnimplementedRoutingServiceServer) GetBalancers(context.Context, *GetBalancersRequest) (*GetBalancersResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method GetBalancers not implemented")
|
||||
func (UnimplementedRoutingServiceServer) GetBalancerInfo(context.Context, *GetBalancerInfoRequest) (*GetBalancerInfoResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method GetBalancerInfo not implemented")
|
||||
}
|
||||
func (UnimplementedRoutingServiceServer) CheckBalancers(context.Context, *CheckBalancersRequest) (*CheckBalancersResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method CheckBalancers not implemented")
|
||||
}
|
||||
func (UnimplementedRoutingServiceServer) OverrideSelecting(context.Context, *OverrideSelectingRequest) (*OverrideSelectingResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method OverrideSelecting not implemented")
|
||||
func (UnimplementedRoutingServiceServer) OverrideBalancerTarget(context.Context, *OverrideBalancerTargetRequest) (*OverrideBalancerTargetResponse, error) {
|
||||
return nil, status.Errorf(codes.Unimplemented, "method OverrideBalancerTarget not implemented")
|
||||
}
|
||||
func (UnimplementedRoutingServiceServer) mustEmbedUnimplementedRoutingServiceServer() {}
|
||||
|
||||
@ -184,56 +170,38 @@ func _RoutingService_TestRoute_Handler(srv interface{}, ctx context.Context, dec
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _RoutingService_GetBalancers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(GetBalancersRequest)
|
||||
func _RoutingService_GetBalancerInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(GetBalancerInfoRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(RoutingServiceServer).GetBalancers(ctx, in)
|
||||
return srv.(RoutingServiceServer).GetBalancerInfo(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/v2ray.core.app.router.command.RoutingService/GetBalancers",
|
||||
FullMethod: "/v2ray.core.app.router.command.RoutingService/GetBalancerInfo",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(RoutingServiceServer).GetBalancers(ctx, req.(*GetBalancersRequest))
|
||||
return srv.(RoutingServiceServer).GetBalancerInfo(ctx, req.(*GetBalancerInfoRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _RoutingService_CheckBalancers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(CheckBalancersRequest)
|
||||
func _RoutingService_OverrideBalancerTarget_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(OverrideBalancerTargetRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(RoutingServiceServer).CheckBalancers(ctx, in)
|
||||
return srv.(RoutingServiceServer).OverrideBalancerTarget(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/v2ray.core.app.router.command.RoutingService/CheckBalancers",
|
||||
FullMethod: "/v2ray.core.app.router.command.RoutingService/OverrideBalancerTarget",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(RoutingServiceServer).CheckBalancers(ctx, req.(*CheckBalancersRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _RoutingService_OverrideSelecting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(OverrideSelectingRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(RoutingServiceServer).OverrideSelecting(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/v2ray.core.app.router.command.RoutingService/OverrideSelecting",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(RoutingServiceServer).OverrideSelecting(ctx, req.(*OverrideSelectingRequest))
|
||||
return srv.(RoutingServiceServer).OverrideBalancerTarget(ctx, req.(*OverrideBalancerTargetRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
@ -250,16 +218,12 @@ var RoutingService_ServiceDesc = grpc.ServiceDesc{
|
||||
Handler: _RoutingService_TestRoute_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "GetBalancers",
|
||||
Handler: _RoutingService_GetBalancers_Handler,
|
||||
MethodName: "GetBalancerInfo",
|
||||
Handler: _RoutingService_GetBalancerInfo_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "CheckBalancers",
|
||||
Handler: _RoutingService_CheckBalancers_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "OverrideSelecting",
|
||||
Handler: _RoutingService_OverrideSelecting_Handler,
|
||||
MethodName: "OverrideBalancerTarget",
|
||||
Handler: _RoutingService_OverrideBalancerTarget_Handler,
|
||||
},
|
||||
},
|
||||
Streams: []grpc.StreamDesc{
|
||||
|
@ -175,7 +175,7 @@ func (br *BalancingRule) Build(ohm outbound.Manager, dispatcher routing.Dispatch
|
||||
if !ok {
|
||||
return nil, newError("not a StrategyLeastLoadConfig").AtError()
|
||||
}
|
||||
leastLoadStrategy := NewLeastLoadStrategy(s, dispatcher)
|
||||
leastLoadStrategy := NewLeastLoadStrategy(s)
|
||||
return &Balancer{
|
||||
selectors: br.OutboundSelector,
|
||||
ohm: ohm, fallbackTag: br.FallbackTag,
|
||||
|
@ -1,118 +0,0 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
|
||||
"github.com/v2fly/v2ray-core/v4/features/routing"
|
||||
)
|
||||
|
||||
// CheckHanlders implements routing.RouterChecker.
|
||||
func (r *Router) CheckHanlders(tags []string) error {
|
||||
errs := make([]error, 0)
|
||||
for _, b := range r.balancers {
|
||||
checker, ok := b.strategy.(routing.HealthChecker)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
all, err := b.SelectOutbounds()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ts := getCheckTags(tags, all)
|
||||
err = checker.Check(ts)
|
||||
if err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
if len(errs) == 0 {
|
||||
return nil
|
||||
}
|
||||
return getCollectError(errs)
|
||||
}
|
||||
|
||||
func getCheckTags(tags, all []string) []string {
|
||||
ts := make([]string, 0)
|
||||
for _, t := range tags {
|
||||
if findSliceIndex(all, t) >= 0 && findSliceIndex(ts, t) < 0 {
|
||||
ts = append(ts, t)
|
||||
}
|
||||
}
|
||||
return ts
|
||||
}
|
||||
|
||||
// CheckBalancers implements routing.RouterChecker.
|
||||
func (r *Router) CheckBalancers(tags []string) error {
|
||||
errs := make([]error, 0)
|
||||
for t, b := range r.balancers {
|
||||
if len(tags) > 0 && findSliceIndex(tags, t) < 0 {
|
||||
continue
|
||||
}
|
||||
checker, ok := b.strategy.(routing.HealthChecker)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
tags, err := b.SelectOutbounds()
|
||||
if err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
err = checker.Check(tags)
|
||||
if err != nil {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
if len(errs) == 0 {
|
||||
return nil
|
||||
}
|
||||
return getCollectError(errs)
|
||||
}
|
||||
|
||||
func getCollectError(errs []error) error {
|
||||
sb := new(strings.Builder)
|
||||
sb.WriteString("collect errors:\n")
|
||||
for _, err := range errs {
|
||||
sb.WriteString(" * ")
|
||||
sb.WriteString(err.Error())
|
||||
sb.WriteString("\n")
|
||||
}
|
||||
return errors.New(sb.String())
|
||||
}
|
||||
|
||||
// GetBalancersInfo implements routing.RouterChecker.
|
||||
func (r *Router) GetBalancersInfo(tags []string) (resp []*routing.BalancerInfo, err error) {
|
||||
resp = make([]*routing.BalancerInfo, 0)
|
||||
for t, b := range r.balancers {
|
||||
if len(tags) > 0 && findSliceIndex(tags, t) < 0 {
|
||||
continue
|
||||
}
|
||||
all, err := b.SelectOutbounds()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var override *routing.BalancingOverrideInfo
|
||||
if o := b.override.Get(); o != nil {
|
||||
override = &routing.BalancingOverrideInfo{
|
||||
Until: o.until,
|
||||
Selects: o.selects,
|
||||
}
|
||||
}
|
||||
stat := &routing.BalancerInfo{
|
||||
Tag: t,
|
||||
Override: override,
|
||||
Strategy: b.strategy.GetInformation(all),
|
||||
}
|
||||
resp = append(resp, stat)
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func findSliceIndex(slice []string, find string) int {
|
||||
index := -1
|
||||
for i, v := range slice {
|
||||
if find == v {
|
||||
index = i
|
||||
break
|
||||
}
|
||||
}
|
||||
return index
|
||||
}
|
@ -9,7 +9,6 @@ import (
|
||||
. "github.com/v2fly/v2ray-core/v4/app/router"
|
||||
"github.com/v2fly/v2ray-core/v4/common"
|
||||
"github.com/v2fly/v2ray-core/v4/common/net"
|
||||
serial "github.com/v2fly/v2ray-core/v4/common/serial"
|
||||
"github.com/v2fly/v2ray-core/v4/common/session"
|
||||
"github.com/v2fly/v2ray-core/v4/features/outbound"
|
||||
routing_session "github.com/v2fly/v2ray-core/v4/features/routing/session"
|
||||
@ -95,6 +94,10 @@ func TestSimpleBalancer(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Do not work right now: need a full client setup
|
||||
|
||||
func TestLeastLoadBalancer(t *testing.T) {
|
||||
config := &Config{
|
||||
Rule: []*RoutingRule{
|
||||
@ -111,7 +114,6 @@ func TestLeastLoadBalancer(t *testing.T) {
|
||||
OutboundSelector: []string{"test-"},
|
||||
Strategy: "leastLoad",
|
||||
StrategySettings: serial.ToTypedMessage(&StrategyLeastLoadConfig{
|
||||
HealthCheck: nil,
|
||||
Baselines: nil,
|
||||
Expected: 1,
|
||||
}),
|
||||
@ -139,7 +141,7 @@ func TestLeastLoadBalancer(t *testing.T) {
|
||||
if tag := route.GetOutboundTag(); tag != "test1" {
|
||||
t.Error("expect tag 'test1', bug actually ", tag)
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
func TestIPOnDemand(t *testing.T) {
|
||||
config := &Config{
|
||||
|
@ -1,25 +1,29 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/v2fly/v2ray-core/v4/app/observatory/burst"
|
||||
"context"
|
||||
core "github.com/v2fly/v2ray-core/v4"
|
||||
"github.com/v2fly/v2ray-core/v4/app/observatory"
|
||||
"github.com/v2fly/v2ray-core/v4/common"
|
||||
"math"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/v2fly/v2ray-core/v4/common/dice"
|
||||
"github.com/v2fly/v2ray-core/v4/features/routing"
|
||||
)
|
||||
|
||||
// LeastLoadStrategy represents a least load balancing strategy
|
||||
type LeastLoadStrategy struct {
|
||||
settings *StrategyLeastLoadConfig
|
||||
costs *WeightManager
|
||||
|
||||
observer *observatory.Observer
|
||||
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
// NewLeastLoadStrategy creates a new LeastLoadStrategy with settings
|
||||
func NewLeastLoadStrategy(settings *StrategyLeastLoadConfig, dispatcher routing.Dispatcher) *LeastLoadStrategy {
|
||||
func NewLeastLoadStrategy(settings *StrategyLeastLoadConfig) *LeastLoadStrategy {
|
||||
return &LeastLoadStrategy{
|
||||
settings: settings,
|
||||
costs: NewWeightManager(
|
||||
@ -41,30 +45,18 @@ type node struct {
|
||||
RTTAverage time.Duration
|
||||
RTTDeviation time.Duration
|
||||
RTTDeviationCost time.Duration
|
||||
|
||||
applied time.Duration
|
||||
}
|
||||
|
||||
// GetInformation implements the routing.BalancingStrategy.
|
||||
func (s *LeastLoadStrategy) GetInformation(tags []string) *routing.StrategyInfo {
|
||||
qualified, others := s.getNodes(tags, time.Duration(s.settings.MaxRTT))
|
||||
selects := s.selectLeastLoad(qualified)
|
||||
// append qualified but not selected outbounds to others
|
||||
others = append(others, qualified[len(selects):]...)
|
||||
leastloadSort(others)
|
||||
titles, sl := s.getNodesInfo(selects)
|
||||
_, ot := s.getNodesInfo(others)
|
||||
return &routing.StrategyInfo{
|
||||
Settings: s.getSettings(),
|
||||
ValueTitles: titles,
|
||||
Selects: sl,
|
||||
Others: ot,
|
||||
}
|
||||
func (l *LeastLoadStrategy) InjectContext(ctx context.Context) {
|
||||
l.ctx = ctx
|
||||
|
||||
common.Must(core.RequireFeatures(ctx, func(observerInstance *observatory.Observer) {
|
||||
l.observer = observerInstance
|
||||
}))
|
||||
}
|
||||
|
||||
// SelectAndPick implements the routing.BalancingStrategy.
|
||||
func (s *LeastLoadStrategy) SelectAndPick(candidates []string) string {
|
||||
qualified, _ := s.getNodes(candidates, time.Duration(s.settings.MaxRTT))
|
||||
func (s *LeastLoadStrategy) PickOutbound(candidates []string) string {
|
||||
qualified := s.getNodes(candidates, time.Duration(s.settings.MaxRTT))
|
||||
selects := s.selectLeastLoad(qualified)
|
||||
count := len(selects)
|
||||
if count == 0 {
|
||||
@ -74,19 +66,9 @@ func (s *LeastLoadStrategy) SelectAndPick(candidates []string) string {
|
||||
return selects[dice.Roll(count)].Tag
|
||||
}
|
||||
|
||||
// Pick implements the routing.BalancingStrategy.
|
||||
func (s *LeastLoadStrategy) Pick(candidates []string) string {
|
||||
count := len(candidates)
|
||||
if count == 0 {
|
||||
// goes to fallbackTag
|
||||
return ""
|
||||
}
|
||||
return candidates[dice.Roll(count)]
|
||||
}
|
||||
|
||||
// selectLeastLoad selects nodes according to Baselines and Expected Count.
|
||||
//
|
||||
// The strategy always improves network response speed, not matter which mode below is configurated.
|
||||
// The strategy always improves network response speed, not matter which mode below is configured.
|
||||
// But they can still have different priorities.
|
||||
//
|
||||
// 1. Bandwidth priority: no Baseline + Expected Count > 0.: selects `Expected Count` of nodes.
|
||||
@ -123,7 +105,7 @@ func (s *LeastLoadStrategy) selectLeastLoad(nodes []*node) []*node {
|
||||
for _, b := range s.settings.Baselines {
|
||||
baseline := time.Duration(b)
|
||||
for i := 0; i < availableCount; i++ {
|
||||
if nodes[i].applied > baseline {
|
||||
if nodes[i].RTTDeviationCost > baseline {
|
||||
break
|
||||
}
|
||||
count = i + 1
|
||||
@ -140,163 +122,49 @@ func (s *LeastLoadStrategy) selectLeastLoad(nodes []*node) []*node {
|
||||
return nodes[:count]
|
||||
}
|
||||
|
||||
func (s *LeastLoadStrategy) getNodes(candidates []string, maxRTT time.Duration) ([]*node, []*node) {
|
||||
s.access.Lock()
|
||||
defer s.access.Unlock()
|
||||
results := s.Results
|
||||
qualified := make([]*node, 0)
|
||||
unqualified := make([]*node, 0)
|
||||
failed := make([]*node, 0)
|
||||
untested := make([]*node, 0)
|
||||
others := make([]*node, 0)
|
||||
for _, tag := range candidates {
|
||||
r, ok := results[tag]
|
||||
if !ok {
|
||||
untested = append(untested, &node{
|
||||
Tag: tag,
|
||||
RTTDeviationCost: 0,
|
||||
RTTDeviation: 0,
|
||||
RTTAverage: 0,
|
||||
applied: rttUntested,
|
||||
})
|
||||
continue
|
||||
}
|
||||
stats := r.Get()
|
||||
node := &node{
|
||||
Tag: tag,
|
||||
RTTDeviationCost: time.Duration(s.costs.Apply(tag, float64(stats.Deviation))),
|
||||
RTTDeviation: stats.Deviation,
|
||||
RTTAverage: stats.Average,
|
||||
CountAll: stats.All,
|
||||
CountFail: stats.Fail,
|
||||
}
|
||||
switch {
|
||||
case stats.All == 0:
|
||||
node.applied = rttUntested
|
||||
untested = append(untested, node)
|
||||
case maxRTT > 0 && stats.Average > maxRTT:
|
||||
node.applied = rttUnqualified
|
||||
unqualified = append(unqualified, node)
|
||||
case float64(stats.Fail)/float64(stats.All) > float64(s.settings.Tolerance):
|
||||
node.applied = rttFailed
|
||||
if stats.All-stats.Fail == 0 {
|
||||
// no good, put them after has-good nodes
|
||||
node.RTTDeviationCost = rttFailed
|
||||
node.RTTDeviation = rttFailed
|
||||
node.RTTAverage = rttFailed
|
||||
}
|
||||
failed = append(failed, node)
|
||||
default:
|
||||
node.applied = node.RTTDeviationCost
|
||||
qualified = append(qualified, node)
|
||||
}
|
||||
func (s *LeastLoadStrategy) getNodes(candidates []string, maxRTT time.Duration) []*node {
|
||||
observeResult, err := s.observer.GetObservation(s.ctx)
|
||||
if err != nil {
|
||||
newError("cannot get observation").Base(err)
|
||||
}
|
||||
if len(qualified) > 0 {
|
||||
leastloadSort(qualified)
|
||||
others = append(others, unqualified...)
|
||||
others = append(others, untested...)
|
||||
others = append(others, failed...)
|
||||
} else {
|
||||
qualified = untested
|
||||
others = append(others, unqualified...)
|
||||
others = append(others, failed...)
|
||||
}
|
||||
return qualified, others
|
||||
}
|
||||
|
||||
func (s *LeastLoadStrategy) getSettings() []string {
|
||||
settings := make([]string, 0)
|
||||
sb := new(strings.Builder)
|
||||
for i, b := range s.settings.Baselines {
|
||||
if i > 0 {
|
||||
sb.WriteByte(' ')
|
||||
}
|
||||
sb.WriteString(time.Duration(b).String())
|
||||
}
|
||||
baselines := sb.String()
|
||||
if baselines == "" {
|
||||
baselines = "none"
|
||||
}
|
||||
maxRTT := time.Duration(s.settings.MaxRTT).String()
|
||||
if s.settings.MaxRTT == 0 {
|
||||
maxRTT = "none"
|
||||
}
|
||||
settings = append(settings, fmt.Sprintf(
|
||||
"leastload, expected: %d, baselines: %s, max rtt: %s, tolerance: %.2f",
|
||||
s.settings.Expected,
|
||||
baselines,
|
||||
maxRTT,
|
||||
s.settings.Tolerance,
|
||||
))
|
||||
settings = append(settings, fmt.Sprintf(
|
||||
"health ping, interval: %s, sampling: %d, timeout: %s, destination: %s",
|
||||
s.HealthPing.Settings.Interval,
|
||||
s.HealthPing.Settings.SamplingCount,
|
||||
s.HealthPing.Settings.Timeout,
|
||||
s.HealthPing.Settings.Destination,
|
||||
))
|
||||
return settings
|
||||
}
|
||||
results := observeResult.(*observatory.ObservationResult)
|
||||
|
||||
func (s *LeastLoadStrategy) getNodesInfo(nodes []*node) ([]string, []*routing.OutboundInfo) {
|
||||
titles := []string{" ", "RTT STD+C ", "RTT STD. ", "RTT Avg. ", "Hit ", "Cost "}
|
||||
hasCost := len(s.settings.Costs) > 0
|
||||
if !hasCost {
|
||||
titles = []string{" ", "RTT STD. ", "RTT Avg. ", "Hit "}
|
||||
}
|
||||
items := make([]*routing.OutboundInfo, 0)
|
||||
for _, node := range nodes {
|
||||
item := &routing.OutboundInfo{
|
||||
Tag: node.Tag,
|
||||
}
|
||||
var status string
|
||||
cost := fmt.Sprintf("%.2f", s.costs.Get(node.Tag))
|
||||
switch node.applied {
|
||||
case rttFailed:
|
||||
status = "x"
|
||||
case rttUntested:
|
||||
status = "?"
|
||||
case rttUnqualified:
|
||||
status = ">"
|
||||
default:
|
||||
status = "OK"
|
||||
}
|
||||
if hasCost {
|
||||
item.Values = []string{
|
||||
status,
|
||||
durationString(node.RTTDeviationCost),
|
||||
durationString(node.RTTDeviation),
|
||||
durationString(node.RTTAverage),
|
||||
fmt.Sprintf("%d/%d", node.CountAll-node.CountFail, node.CountAll),
|
||||
cost,
|
||||
}
|
||||
} else {
|
||||
item.Values = []string{
|
||||
status,
|
||||
durationString(node.RTTDeviation),
|
||||
durationString(node.RTTAverage),
|
||||
fmt.Sprintf("%d/%d", node.CountAll-node.CountFail, node.CountAll),
|
||||
}
|
||||
}
|
||||
items = append(items, item)
|
||||
}
|
||||
return titles, items
|
||||
}
|
||||
outboundlist := outboundList(candidates)
|
||||
|
||||
func durationString(d time.Duration) string {
|
||||
if d <= 0 || d > time.Hour {
|
||||
return "-"
|
||||
var ret []*node
|
||||
|
||||
for _, v := range results.Status {
|
||||
if v.Alive && v.Delay < maxRTT.Milliseconds() && outboundlist.contains(v.OutboundTag) {
|
||||
record := &node{
|
||||
Tag: v.OutboundTag,
|
||||
CountAll: 1,
|
||||
CountFail: 1,
|
||||
RTTAverage: time.Duration(v.Delay) * time.Millisecond,
|
||||
RTTDeviation: time.Duration(v.Delay) * time.Millisecond,
|
||||
RTTDeviationCost: time.Duration(s.costs.Apply(v.OutboundTag, float64(time.Duration(v.Delay)*time.Millisecond))),
|
||||
}
|
||||
|
||||
if v.HealthPing != nil {
|
||||
record.RTTAverage = time.Duration(v.HealthPing.Average)
|
||||
record.RTTDeviation = time.Duration(v.HealthPing.Deviation)
|
||||
record.RTTDeviationCost = time.Duration(s.costs.Apply(v.OutboundTag, float64(v.HealthPing.Deviation)))
|
||||
record.CountAll = int(v.HealthPing.All)
|
||||
record.CountFail = int(v.HealthPing.Fail)
|
||||
|
||||
}
|
||||
ret = append(ret, record)
|
||||
}
|
||||
}
|
||||
return d.String()
|
||||
|
||||
leastloadSort(ret)
|
||||
return ret
|
||||
}
|
||||
|
||||
func leastloadSort(nodes []*node) {
|
||||
sort.Slice(nodes, func(i, j int) bool {
|
||||
left := nodes[i]
|
||||
right := nodes[j]
|
||||
if left.applied != right.applied {
|
||||
return left.applied < right.applied
|
||||
}
|
||||
if left.RTTDeviationCost != right.RTTDeviationCost {
|
||||
return left.RTTDeviationCost < right.RTTDeviationCost
|
||||
}
|
||||
|
@ -2,9 +2,11 @@ package router
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
/*
|
||||
Split into multiple package, need to be tested separately
|
||||
|
||||
func TestSelectLeastLoad(t *testing.T) {
|
||||
settings := &StrategyLeastLoadConfig{
|
||||
HealthCheck: &HealthPingConfig{
|
||||
@ -13,7 +15,7 @@ func TestSelectLeastLoad(t *testing.T) {
|
||||
Expected: 1,
|
||||
MaxRTT: int64(time.Millisecond * time.Duration(800)),
|
||||
}
|
||||
strategy := NewLeastLoadStrategy(settings, nil)
|
||||
strategy := NewLeastLoadStrategy(settings)
|
||||
// std 40
|
||||
strategy.PutResult("a", time.Millisecond*time.Duration(60))
|
||||
strategy.PutResult("a", time.Millisecond*time.Duration(140))
|
||||
@ -63,7 +65,7 @@ func TestSelectLeastLoadWithCost(t *testing.T) {
|
||||
t.Errorf("expected: %v, actual: %v", expected, actual)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
func TestSelectLeastExpected(t *testing.T) {
|
||||
strategy := &LeastLoadStrategy{
|
||||
settings: &StrategyLeastLoadConfig{
|
||||
@ -72,10 +74,10 @@ func TestSelectLeastExpected(t *testing.T) {
|
||||
},
|
||||
}
|
||||
nodes := []*node{
|
||||
{Tag: "a", applied: 100},
|
||||
{Tag: "b", applied: 200},
|
||||
{Tag: "c", applied: 300},
|
||||
{Tag: "d", applied: 350},
|
||||
{Tag: "a", RTTDeviationCost: 100},
|
||||
{Tag: "b", RTTDeviationCost: 200},
|
||||
{Tag: "c", RTTDeviationCost: 300},
|
||||
{Tag: "d", RTTDeviationCost: 350},
|
||||
}
|
||||
expected := 3
|
||||
ns := strategy.selectLeastLoad(nodes)
|
||||
@ -91,8 +93,8 @@ func TestSelectLeastExpected2(t *testing.T) {
|
||||
},
|
||||
}
|
||||
nodes := []*node{
|
||||
{Tag: "a", applied: 100},
|
||||
{Tag: "b", applied: 200},
|
||||
{Tag: "a", RTTDeviationCost: 100},
|
||||
{Tag: "b", RTTDeviationCost: 200},
|
||||
}
|
||||
expected := 2
|
||||
ns := strategy.selectLeastLoad(nodes)
|
||||
@ -108,11 +110,11 @@ func TestSelectLeastExpectedAndBaselines(t *testing.T) {
|
||||
},
|
||||
}
|
||||
nodes := []*node{
|
||||
{Tag: "a", applied: 100},
|
||||
{Tag: "b", applied: 200},
|
||||
{Tag: "c", applied: 250},
|
||||
{Tag: "d", applied: 300},
|
||||
{Tag: "e", applied: 310},
|
||||
{Tag: "a", RTTDeviationCost: 100},
|
||||
{Tag: "b", RTTDeviationCost: 200},
|
||||
{Tag: "c", RTTDeviationCost: 250},
|
||||
{Tag: "d", RTTDeviationCost: 300},
|
||||
{Tag: "e", RTTDeviationCost: 310},
|
||||
}
|
||||
expected := 4
|
||||
ns := strategy.selectLeastLoad(nodes)
|
||||
@ -128,11 +130,11 @@ func TestSelectLeastExpectedAndBaselines2(t *testing.T) {
|
||||
},
|
||||
}
|
||||
nodes := []*node{
|
||||
{Tag: "a", applied: 500},
|
||||
{Tag: "b", applied: 600},
|
||||
{Tag: "c", applied: 700},
|
||||
{Tag: "d", applied: 800},
|
||||
{Tag: "e", applied: 900},
|
||||
{Tag: "a", RTTDeviationCost: 500},
|
||||
{Tag: "b", RTTDeviationCost: 600},
|
||||
{Tag: "c", RTTDeviationCost: 700},
|
||||
{Tag: "d", RTTDeviationCost: 800},
|
||||
{Tag: "e", RTTDeviationCost: 900},
|
||||
}
|
||||
expected := 3
|
||||
ns := strategy.selectLeastLoad(nodes)
|
||||
@ -148,9 +150,9 @@ func TestSelectLeastLoadBaselines(t *testing.T) {
|
||||
},
|
||||
}
|
||||
nodes := []*node{
|
||||
{Tag: "a", applied: 100},
|
||||
{Tag: "b", applied: 200},
|
||||
{Tag: "c", applied: 300},
|
||||
{Tag: "a", RTTDeviationCost: 100},
|
||||
{Tag: "b", RTTDeviationCost: 200},
|
||||
{Tag: "c", RTTDeviationCost: 300},
|
||||
}
|
||||
expected := 2
|
||||
ns := strategy.selectLeastLoad(nodes)
|
||||
@ -166,8 +168,8 @@ func TestSelectLeastLoadBaselinesNoQualified(t *testing.T) {
|
||||
},
|
||||
}
|
||||
nodes := []*node{
|
||||
{Tag: "a", applied: 800},
|
||||
{Tag: "b", applied: 1000},
|
||||
{Tag: "a", RTTDeviationCost: 800},
|
||||
{Tag: "b", RTTDeviationCost: 1000},
|
||||
}
|
||||
expected := 0
|
||||
ns := strategy.selectLeastLoad(nodes)
|
||||
|
@ -10,7 +10,6 @@ import (
|
||||
"github.com/v2fly/v2ray-core/v4/app/observatory"
|
||||
"github.com/v2fly/v2ray-core/v4/common"
|
||||
"github.com/v2fly/v2ray-core/v4/features/extension"
|
||||
"github.com/v2fly/v2ray-core/v4/features/routing"
|
||||
)
|
||||
|
||||
type LeastPingStrategy struct {
|
||||
@ -18,20 +17,6 @@ type LeastPingStrategy struct {
|
||||
observatory extension.Observatory
|
||||
}
|
||||
|
||||
// TODO Fix PlaceHolder
|
||||
|
||||
func (l *LeastPingStrategy) Pick(candidates []string) string {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (l *LeastPingStrategy) SelectAndPick(candidates []string) string {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (l *LeastPingStrategy) GetInformation(tags []string) *routing.StrategyInfo {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (l *LeastPingStrategy) InjectContext(ctx context.Context) {
|
||||
l.ctx = ctx
|
||||
}
|
||||
|
@ -2,33 +2,12 @@ package router
|
||||
|
||||
import (
|
||||
"github.com/v2fly/v2ray-core/v4/common/dice"
|
||||
"github.com/v2fly/v2ray-core/v4/features/routing"
|
||||
)
|
||||
|
||||
// RandomStrategy represents a random balancing strategy
|
||||
type RandomStrategy struct{}
|
||||
|
||||
// GetInformation implements the routing.BalancingStrategy.
|
||||
func (s *RandomStrategy) GetInformation(tags []string) *routing.StrategyInfo {
|
||||
items := make([]*routing.OutboundInfo, 0)
|
||||
for _, tag := range tags {
|
||||
items = append(items, &routing.OutboundInfo{Tag: tag})
|
||||
}
|
||||
return &routing.StrategyInfo{
|
||||
Settings: []string{"random"},
|
||||
ValueTitles: nil,
|
||||
Selects: items,
|
||||
Others: nil,
|
||||
}
|
||||
}
|
||||
|
||||
// SelectAndPick implements the routing.BalancingStrategy.
|
||||
func (s *RandomStrategy) SelectAndPick(candidates []string) string {
|
||||
return s.Pick(candidates)
|
||||
}
|
||||
|
||||
// Pick implements the routing.BalancingStrategy.
|
||||
func (s *RandomStrategy) Pick(candidates []string) string {
|
||||
func (s *RandomStrategy) PickOutbound(candidates []string) string {
|
||||
count := len(candidates)
|
||||
if count == 0 {
|
||||
// goes to fallbackTag
|
||||
|
10
features/routing/balancer.go
Normal file
10
features/routing/balancer.go
Normal file
@ -0,0 +1,10 @@
|
||||
package routing
|
||||
|
||||
type BalancerOverrider interface {
|
||||
SetOverrideTarget(tag, target string) error
|
||||
GetOverrideTarget(tag string) (string, error)
|
||||
}
|
||||
|
||||
type BalancerPrincipleTarget interface {
|
||||
GetPrincipleTarget(tag string) ([]string, error)
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
package routing
|
||||
|
||||
import "time"
|
||||
|
||||
// HealthChecker is the interface for health checkers
|
||||
type HealthChecker interface {
|
||||
// StartScheduler starts the check scheduler
|
||||
StartScheduler(selector func() ([]string, error))
|
||||
// StopScheduler stops the check scheduler
|
||||
StopScheduler()
|
||||
// Check start the health checking for given tags.
|
||||
Check(tags []string) error
|
||||
}
|
||||
|
||||
// OutboundInfo holds information of an outbound
|
||||
type OutboundInfo struct {
|
||||
Tag string // Tag of the outbound
|
||||
Values []string // Information of the outbound, which can be different between strategies, like health ping RTT
|
||||
}
|
||||
|
||||
// StrategyInfo holds strategy running information, like selected handlers and others
|
||||
type StrategyInfo struct {
|
||||
Settings []string // Strategy settings
|
||||
ValueTitles []string // Value titles of OutboundInfo.Values
|
||||
Selects []*OutboundInfo // Selects of the strategy
|
||||
Others []*OutboundInfo // Other outbounds
|
||||
}
|
||||
|
||||
// BalancingOverrideInfo holds balancing override information
|
||||
type BalancingOverrideInfo struct {
|
||||
Until time.Time
|
||||
Selects []string
|
||||
}
|
||||
|
||||
// BalancerInfo holds information of a balancer
|
||||
type BalancerInfo struct {
|
||||
Tag string // Tag of the balancer
|
||||
Override *BalancingOverrideInfo
|
||||
Strategy *StrategyInfo // Strategy and its running information
|
||||
}
|
||||
|
||||
// RouterChecker represents a router that is able to perform checks for its balancers, and get statistics.
|
||||
type RouterChecker interface {
|
||||
// CheckHanlders performs a health check for specified outbound hanlders.
|
||||
CheckHanlders(tags []string) error
|
||||
// CheckBalancers performs health checks for specified balancers,
|
||||
// if not specified, check them all.
|
||||
CheckBalancers(tags []string) error
|
||||
// GetBalancersInfo get health info of specific balancer, if balancer not specified, get all
|
||||
GetBalancersInfo(tags []string) ([]*BalancerInfo, error)
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
package routing
|
||||
|
||||
import "time"
|
||||
|
||||
// BalancingStrategy is the interface for balancing strategies
|
||||
type BalancingStrategy interface {
|
||||
// Pick pick one outbound from candidates. Unlike the SelectAndPick(),
|
||||
// it skips the select procedure (select all & pick one).
|
||||
Pick(candidates []string) string
|
||||
// SelectAndPick selects qualified nodes from candidates then pick one.
|
||||
SelectAndPick(candidates []string) string
|
||||
// GetInformation gets information of the strategy
|
||||
GetInformation(tags []string) *StrategyInfo
|
||||
}
|
||||
|
||||
// BalancingOverrider is the interface of those who can override
|
||||
// the selecting of its balancers
|
||||
type BalancingOverrider interface {
|
||||
// OverrideSelecting overrides the selects of specified balancer, for 'validity'
|
||||
// duration of time.
|
||||
OverrideSelecting(balancer string, selects []string, validity time.Duration) error
|
||||
}
|
Loading…
Reference in New Issue
Block a user