...
1 package entrypoint_test
2
3 import (
4 "testing"
5
6 bootstrap "github.com/emissary-ingress/emissary/v3/pkg/api/envoy/config/bootstrap/v3"
7 v3listener "github.com/emissary-ingress/emissary/v3/pkg/api/envoy/config/listener/v3"
8 route "github.com/emissary-ingress/emissary/v3/pkg/api/envoy/config/route/v3"
9 http "github.com/emissary-ingress/emissary/v3/pkg/api/envoy/extensions/filters/network/http_connection_manager/v3"
10 "github.com/emissary-ingress/emissary/v3/pkg/envoy-control-plane/resource/v3"
11 "github.com/emissary-ingress/emissary/v3/pkg/envoy-control-plane/wellknown"
12 "github.com/stretchr/testify/assert"
13 )
14
15
16
17
18
19
20 func findListener(envoyConfig *bootstrap.Bootstrap, predicate func(*v3listener.Listener) bool) *v3listener.Listener {
21 for _, listener := range envoyConfig.StaticResources.Listeners {
22 if predicate(listener) {
23 return listener
24 }
25 }
26 return nil
27 }
28
29
30 func findListenerByName(envoyConfig *bootstrap.Bootstrap, name string) *v3listener.Listener {
31 return findListener(envoyConfig, func(listener *v3listener.Listener) bool {
32 return listener.Name == name
33 })
34 }
35
36
37
38 func mustFindListenerByName(t *testing.T, envoyConfig *bootstrap.Bootstrap, name string) *v3listener.Listener {
39 listener := findListenerByName(envoyConfig, name)
40 assert.NotNil(t, listener)
41 return listener
42 }
43
44
45
46 func findRoutes(listener *v3listener.Listener, predicate func(*route.Route) bool) []*route.Route {
47 routes := make([]*route.Route, 0)
48
49
50
51 for _, chain := range listener.FilterChains {
52 for _, filter := range chain.Filters {
53 if filter.Name != wellknown.HTTPConnectionManager {
54 continue
55 }
56
57 hcm := resource.GetHTTPConnectionManager(filter)
58
59 if hcm != nil {
60 rs, ok := hcm.RouteSpecifier.(*http.HttpConnectionManager_RouteConfig)
61
62 if ok {
63 for _, vh := range rs.RouteConfig.VirtualHosts {
64 for _, vhr := range vh.Routes {
65
66
67
68
69 if predicate(vhr) {
70 routes = append(routes, vhr)
71 }
72 }
73 }
74 }
75 }
76 }
77 }
78
79 return routes
80 }
81
82
83 func findRoutesToCluster(l *v3listener.Listener, cluster_name string) []*route.Route {
84 return findRoutes(l, func(r *route.Route) bool {
85 routeAction, ok := r.Action.(*route.Route_Route)
86
87 if !ok {
88 return false
89 }
90
91 return routeAction.Route.GetCluster() == cluster_name
92 })
93 }
94
95
96
97 func mustFindRoutesToCluster(t *testing.T, listener *v3listener.Listener, cluster_name string) []*route.Route {
98 routes := findRoutesToCluster(listener, cluster_name)
99 assert.NotEmpty(t, routes)
100 return routes
101 }
102
103
104
105
106 func findRouteAction(listener *v3listener.Listener, predicate func(*route.RouteAction) bool) *route.RouteAction {
107 routes := findRoutes(listener, func(r *route.Route) bool {
108 routeAction, ok := r.Action.(*route.Route_Route)
109
110 if ok {
111 return predicate(routeAction.Route)
112 }
113
114 return false
115 })
116
117 if len(routes) == 0 {
118 return nil
119 }
120
121 return routes[0].Action.(*route.Route_Route).Route
122 }
123
124
125
126 func mustFindRouteAction(t *testing.T, listener *v3listener.Listener, predicate func(*route.RouteAction) bool) *route.RouteAction {
127 routeAction := findRouteAction(listener, predicate)
128 assert.NotNil(t, routeAction)
129 return routeAction
130 }
131
132
133
134 func mustFindRouteActionToCluster(t *testing.T, listener *v3listener.Listener, clusterName string) *route.RouteAction {
135 routeAction := mustFindRouteAction(t, listener, func(ra *route.RouteAction) bool {
136 return ra.GetCluster() == clusterName
137 })
138 return routeAction
139 }
140
View as plain text