...
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
17
18
19
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
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
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
73 type Endpoint struct {
74 ClusterName string
75 Ip string
76 Port uint32
77 Protocol string
78 }
79
80
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
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