...

Source file src/github.com/datawire/ambassador/v2/pkg/ambex/endpoint.go

Documentation: github.com/datawire/ambassador/v2/pkg/ambex

     1  package ambex
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  	"strings"
     7  
     8  	v2 "github.com/datawire/ambassador/v2/pkg/api/envoy/api/v2"
     9  	v2core "github.com/datawire/ambassador/v2/pkg/api/envoy/api/v2/core"
    10  	v2endpoint "github.com/datawire/ambassador/v2/pkg/api/envoy/api/v2/endpoint"
    11  	v3core "github.com/datawire/ambassador/v2/pkg/api/envoy/config/core/v3"
    12  	v3endpoint "github.com/datawire/ambassador/v2/pkg/api/envoy/config/endpoint/v3"
    13  	v3endpointconfig "github.com/datawire/ambassador/v2/pkg/api/envoy/config/endpoint/v3"
    14  )
    15  
    16  // The Endpoints struct is how Endpoint data gets communicated to ambex. This is a bit simpler than
    17  // the envoy endpoint data structures, and also provides us a layer of indirection to buffer us from
    18  // changes in envoy configuration, e.g. we can switch from v2 to v3 endpoint data, or add v3
    19  // endpoint data fairly easily with this layer of indirection.
    20  type Endpoints struct {
    21  	Entries map[string][]*Endpoint
    22  }
    23  
    24  func (e *Endpoints) RoutesString() string {
    25  	var routes []string
    26  	for k, eps := range e.Entries {
    27  		var addrs []string
    28  		for _, ep := range eps {
    29  			addr := fmt.Sprintf("%s:%s:%d", ep.Protocol, ep.Ip, ep.Port)
    30  			addrs = append(addrs, addr)
    31  		}
    32  		routes = append(routes, fmt.Sprintf("%s=[%s]", k, strings.Join(addrs, ", ")))
    33  	}
    34  	sort.Strings(routes)
    35  	return strings.Join(routes, "\n")
    36  }
    37  
    38  // ToMap_v2 produces a map with the envoy v2 friendly forms of all the endpoint data.
    39  func (e *Endpoints) ToMap_v2() map[string]*v2.ClusterLoadAssignment {
    40  	result := map[string]*v2.ClusterLoadAssignment{}
    41  	for name, eps := range e.Entries {
    42  		var endpoints []*v2endpoint.LbEndpoint
    43  		for _, ep := range eps {
    44  			endpoints = append(endpoints, ep.ToLbEndpoint_v2())
    45  		}
    46  		loadAssignment := &v2.ClusterLoadAssignment{
    47  			ClusterName: name,
    48  			Endpoints:   []*v2endpoint.LocalityLbEndpoints{{LbEndpoints: endpoints}},
    49  		}
    50  		result[name] = loadAssignment
    51  	}
    52  	return result
    53  }
    54  
    55  // ToMap_v3 produces a map with the envoy v3 friendly forms of all the endpoint data.
    56  func (e *Endpoints) ToMap_v3() map[string]*v3endpointconfig.ClusterLoadAssignment {
    57  	result := map[string]*v3endpointconfig.ClusterLoadAssignment{}
    58  	for name, eps := range e.Entries {
    59  		var endpoints []*v3endpoint.LbEndpoint
    60  		for _, ep := range eps {
    61  			endpoints = append(endpoints, ep.ToLbEndpoint_v3())
    62  		}
    63  		loadAssignment := &v3endpointconfig.ClusterLoadAssignment{
    64  			ClusterName: name,
    65  			Endpoints:   []*v3endpointconfig.LocalityLbEndpoints{{LbEndpoints: endpoints}},
    66  		}
    67  		result[name] = loadAssignment
    68  	}
    69  	return result
    70  }
    71  
    72  // Endpoint contains the subset of fields we bother to expose.
    73  type Endpoint struct {
    74  	ClusterName string
    75  	Ip          string
    76  	Port        uint32
    77  	Protocol    string
    78  }
    79  
    80  // ToLBEndpoint_v2 translates to envoy v2 frinedly form of the Endpoint data.
    81  func (e *Endpoint) ToLbEndpoint_v2() *v2endpoint.LbEndpoint {
    82  	return &v2endpoint.LbEndpoint{
    83  		HostIdentifier: &v2endpoint.LbEndpoint_Endpoint{
    84  			Endpoint: &v2endpoint.Endpoint{
    85  				Address: &v2core.Address{
    86  					Address: &v2core.Address_SocketAddress{
    87  						SocketAddress: &v2core.SocketAddress{
    88  							Protocol: v2core.SocketAddress_Protocol(v2core.SocketAddress_Protocol_value[e.Protocol]),
    89  							Address:  e.Ip,
    90  							PortSpecifier: &v2core.SocketAddress_PortValue{
    91  								PortValue: e.Port,
    92  							},
    93  							Ipv4Compat: true,
    94  						},
    95  					},
    96  				},
    97  			},
    98  		},
    99  	}
   100  }
   101  
   102  // ToLBEndpoint_v3 translates to envoy v3 frinedly form of the Endpoint data.
   103  func (e *Endpoint) ToLbEndpoint_v3() *v3endpoint.LbEndpoint {
   104  	return &v3endpoint.LbEndpoint{
   105  		HostIdentifier: &v3endpoint.LbEndpoint_Endpoint{
   106  			Endpoint: &v3endpoint.Endpoint{
   107  				Address: &v3core.Address{
   108  					Address: &v3core.Address_SocketAddress{
   109  						SocketAddress: &v3core.SocketAddress{
   110  							Protocol: v3core.SocketAddress_Protocol(v3core.SocketAddress_Protocol_value[e.Protocol]),
   111  							Address:  e.Ip,
   112  							PortSpecifier: &v3core.SocketAddress_PortValue{
   113  								PortValue: e.Port,
   114  							},
   115  							Ipv4Compat: true,
   116  						},
   117  					},
   118  				},
   119  			},
   120  		},
   121  	}
   122  }
   123  

View as plain text