github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/grpc/xds/internal/testutils/protos.go (about)

     1  /*
     2   *
     3   * Copyright 2020 gRPC authors.
     4   *
     5   * Licensed under the Apache License, Version 2.0 (the "License");
     6   * you may not use this file except in compliance with the License.
     7   * You may obtain a copy of the License at
     8   *
     9   *     http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17  
    18  package testutils
    19  
    20  import (
    21  	"net"
    22  	"strconv"
    23  
    24  	wrapperspb "github.com/golang/protobuf/ptypes/wrappers"
    25  	v2xdspb "github.com/hxx258456/ccgo/go-control-plane/envoy/api/v2"
    26  	v2corepb "github.com/hxx258456/ccgo/go-control-plane/envoy/api/v2/core"
    27  	v2endpointpb "github.com/hxx258456/ccgo/go-control-plane/envoy/api/v2/endpoint"
    28  	v3corepb "github.com/hxx258456/ccgo/go-control-plane/envoy/config/core/v3"
    29  	v2typepb "github.com/hxx258456/ccgo/go-control-plane/envoy/type"
    30  	"github.com/hxx258456/ccgo/grpc/xds/internal"
    31  )
    32  
    33  // EmptyNodeProtoV2 is a v2 Node proto with no fields set.
    34  var EmptyNodeProtoV2 = &v2corepb.Node{}
    35  
    36  // EmptyNodeProtoV3 is a v3 Node proto with no fields set.
    37  var EmptyNodeProtoV3 = &v3corepb.Node{}
    38  
    39  // LocalityIDToProto converts a LocalityID to its proto representation.
    40  func LocalityIDToProto(l internal.LocalityID) *v2corepb.Locality {
    41  	return &v2corepb.Locality{
    42  		Region:  l.Region,
    43  		Zone:    l.Zone,
    44  		SubZone: l.SubZone,
    45  	}
    46  }
    47  
    48  // The helper structs/functions related to EDS protos are used in EDS balancer
    49  // tests now, to generate test inputs. Eventually, EDS balancer tests should
    50  // generate EndpointsUpdate directly, instead of generating and parsing the
    51  // proto message.
    52  // TODO: Once EDS balancer tests don't use these, these can be moved to v2 client code.
    53  
    54  // ClusterLoadAssignmentBuilder builds a ClusterLoadAssignment, aka EDS
    55  // response.
    56  type ClusterLoadAssignmentBuilder struct {
    57  	v *v2xdspb.ClusterLoadAssignment
    58  }
    59  
    60  // NewClusterLoadAssignmentBuilder creates a ClusterLoadAssignmentBuilder.
    61  func NewClusterLoadAssignmentBuilder(clusterName string, dropPercents map[string]uint32) *ClusterLoadAssignmentBuilder {
    62  	drops := make([]*v2xdspb.ClusterLoadAssignment_Policy_DropOverload, 0, len(dropPercents))
    63  	for n, d := range dropPercents {
    64  		drops = append(drops, &v2xdspb.ClusterLoadAssignment_Policy_DropOverload{
    65  			Category: n,
    66  			DropPercentage: &v2typepb.FractionalPercent{
    67  				Numerator:   d,
    68  				Denominator: v2typepb.FractionalPercent_HUNDRED,
    69  			},
    70  		})
    71  	}
    72  
    73  	return &ClusterLoadAssignmentBuilder{
    74  		v: &v2xdspb.ClusterLoadAssignment{
    75  			ClusterName: clusterName,
    76  			Policy: &v2xdspb.ClusterLoadAssignment_Policy{
    77  				DropOverloads: drops,
    78  			},
    79  		},
    80  	}
    81  }
    82  
    83  // AddLocalityOptions contains options when adding locality to the builder.
    84  type AddLocalityOptions struct {
    85  	Health []v2corepb.HealthStatus
    86  	Weight []uint32
    87  }
    88  
    89  // AddLocality adds a locality to the builder.
    90  func (clab *ClusterLoadAssignmentBuilder) AddLocality(subzone string, weight uint32, priority uint32, addrsWithPort []string, opts *AddLocalityOptions) {
    91  	lbEndPoints := make([]*v2endpointpb.LbEndpoint, 0, len(addrsWithPort))
    92  	for i, a := range addrsWithPort {
    93  		host, portStr, err := net.SplitHostPort(a)
    94  		if err != nil {
    95  			panic("failed to split " + a)
    96  		}
    97  		port, err := strconv.Atoi(portStr)
    98  		if err != nil {
    99  			panic("failed to atoi " + portStr)
   100  		}
   101  
   102  		lbe := &v2endpointpb.LbEndpoint{
   103  			HostIdentifier: &v2endpointpb.LbEndpoint_Endpoint{
   104  				Endpoint: &v2endpointpb.Endpoint{
   105  					Address: &v2corepb.Address{
   106  						Address: &v2corepb.Address_SocketAddress{
   107  							SocketAddress: &v2corepb.SocketAddress{
   108  								Protocol: v2corepb.SocketAddress_TCP,
   109  								Address:  host,
   110  								PortSpecifier: &v2corepb.SocketAddress_PortValue{
   111  									PortValue: uint32(port)}}}}}},
   112  		}
   113  		if opts != nil {
   114  			if i < len(opts.Health) {
   115  				lbe.HealthStatus = opts.Health[i]
   116  			}
   117  			if i < len(opts.Weight) {
   118  				lbe.LoadBalancingWeight = &wrapperspb.UInt32Value{Value: opts.Weight[i]}
   119  			}
   120  		}
   121  		lbEndPoints = append(lbEndPoints, lbe)
   122  	}
   123  
   124  	var localityID *v2corepb.Locality
   125  	if subzone != "" {
   126  		localityID = &v2corepb.Locality{
   127  			Region:  "",
   128  			Zone:    "",
   129  			SubZone: subzone,
   130  		}
   131  	}
   132  
   133  	clab.v.Endpoints = append(clab.v.Endpoints, &v2endpointpb.LocalityLbEndpoints{
   134  		Locality:            localityID,
   135  		LbEndpoints:         lbEndPoints,
   136  		LoadBalancingWeight: &wrapperspb.UInt32Value{Value: weight},
   137  		Priority:            priority,
   138  	})
   139  }
   140  
   141  // Build builds ClusterLoadAssignment.
   142  func (clab *ClusterLoadAssignmentBuilder) Build() *v2xdspb.ClusterLoadAssignment {
   143  	return clab.v
   144  }