-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathresource.go
119 lines (108 loc) · 3.37 KB
/
resource.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Copyright 2020 Envoyproxy Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package example
import (
httproute "github.com/envoyproxy/go-control-plane/envoy/config/route/v3"
"github.com/envoyproxy/go-control-plane/pkg/cache/types"
"github.com/envoyproxy/go-control-plane/pkg/cache/v3"
"github.com/envoyproxy/go-control-plane/pkg/resource/v3"
metaroute "github.com/aeraki-mesh/meta-protocol-control-plane-api/aeraki/meta_protocol_proxy/config/route/v1alpha"
)
var metaRoute = metaroute.RouteConfiguration{
Name: "test",
Routes: []*metaroute.Route{
{
Name: "test",
Match: &metaroute.RouteMatch{
Metadata: []*httproute.HeaderMatcher{
{
Name: "interface",
HeaderMatchSpecifier: &httproute.HeaderMatcher_ExactMatch{
ExactMatch: "org.apache.dubbo.samples.basic.api.DemoService",
},
},
{
Name: "method",
HeaderMatchSpecifier: &httproute.HeaderMatcher_ExactMatch{
ExactMatch: "sayHello",
},
},
},
},
Route: &metaroute.RouteAction{
ClusterSpecifier: &metaroute.RouteAction_Cluster{
Cluster: "outbound|20880||org.apache.dubbo.samples.basic.api.demoservice",
},
},
},
},
}
func makeRoute() *httproute.RouteConfiguration {
return metaProtocolRoute2HttpRoute(metaRoute)
}
// We use Envoy RDS(HTTP RouteConfiguration) to transmit Meta Protocol Configuration from the RDS server to the Proxy
func metaProtocolRoute2HttpRoute(metaRoute metaroute.RouteConfiguration) *httproute.RouteConfiguration {
httpRoute := &httproute.RouteConfiguration{
Name: metaRoute.Name,
VirtualHosts: []*httproute.VirtualHost{
{
Name: "dummy",
Domains: []string{"*"},
},
},
}
for _, route := range metaRoute.Routes {
routeMatch := &httproute.RouteMatch{
PathSpecifier: &httproute.RouteMatch_Prefix{
Prefix: "/",
},
}
for _, metadata := range route.Match.Metadata {
routeMatch.Headers = append(routeMatch.Headers, &httproute.HeaderMatcher{
Name: metadata.Name,
HeaderMatchSpecifier: metadata.HeaderMatchSpecifier,
})
}
var routeAction *httproute.RouteAction
if route.Route.GetWeightedClusters() != nil {
routeAction = &httproute.RouteAction{
ClusterSpecifier: &httproute.RouteAction_WeightedClusters{
WeightedClusters: route.Route.GetWeightedClusters(),
},
}
} else {
routeAction = &httproute.RouteAction{
ClusterSpecifier: &httproute.RouteAction_Cluster{
Cluster: route.Route.GetCluster(),
},
}
}
httpRoute.VirtualHosts[0].Routes = append(httpRoute.VirtualHosts[0].Routes, &httproute.Route{
Name: route.Name,
Match: routeMatch,
Action: &httproute.Route_Route{
Route: routeAction,
},
})
}
return httpRoute
}
func GenerateSnapshot() *cache.Snapshot {
snap, _ := cache.NewSnapshot("1",
map[resource.Type][]types.Resource{
resource.RouteType: {makeRoute()},
},
)
return snap
}