API Gateway to Ingress Gateway Snapshot Translation and Routes to Virtual Routers and Splitters (#16127)
* Stub proxycfg handler for API gateway * Add Service Kind constants/handling for API Gateway * Begin stubbing for SDS * Add new Secret type to xDS order of operations * Continue stubbing of SDS * Iterate on proxycfg handler for API gateway * Handle BoundAPIGateway config entry subscription in proxycfg-glue * Add API gateway to config snapshot validation * Add API gateway to config snapshot clone, leaf, etc. * Subscribe to bound route + cert config entries on bound-api-gateway * Track routes + certs on API gateway config snapshot * Generate DeepCopy() for types used in watch.Map * Watch all active references on api-gateway, unwatch inactive * Track loading of initial bound-api-gateway config entry * Use proper proto package for SDS mapping * Use ResourceReference instead of ServiceName, collect resources * Fix typo, add + remove TODOs * Watch discovery chains for TCPRoute * Add TODO for updating gateway services for api-gateway * make proto * Regenerate deep-copy for proxycfg * Set datacenter on upstream ID from query source * Watch discovery chains for http-route service backends * Add ServiceName getter to HTTP+TCP Service structs * Clean up unwatched discovery chains on API Gateway * Implement watch for ingress leaf certificate * Collect upstreams on http-route + tcp-route updates * Remove unused GatewayServices update handler * Remove unnecessary gateway services logic for API Gateway * Remove outdate TODO * Use .ToIngress where appropriate, including TODO for cleaning up * Cancel before returning error * Remove GatewayServices subscription * Add godoc for handlerAPIGateway functions * Update terminology from Connect => Consul Service Mesh Consistent with terminology changes in https://github.com/hashicorp/consul/pull/12690 * Add missing TODO * Remove duplicate switch case * Rerun deep-copy generator * Use correct property on config snapshot * Remove unnecessary leaf cert watch * Clean up based on code review feedback * Note handler properties that are initialized but set elsewhere * Add TODO for moving helper func into structs pkg * Update generated DeepCopy code * gofmt * Begin stubbing for SDS * Start adding tests * Remove second BoundAPIGateway case in glue * TO BE PICKED: fix formatting of str * WIP * Fix merge conflict * Implement HTTP Route to Discovery Chain config entries * Stub out function to create discovery chain * Add discovery chain merging code (#16131) * Test adding TCP and HTTP routes * Add some tests for the synthesizer * Run go mod tidy * Pairing with N8 * Run deep copy * Clean up GatewayChainSynthesizer * Fix missing assignment of BoundAPIGateway topic * Separate out synthesizeChains and toIngressTLS * Fix build errors * Ensure synthesizer skips non-matching routes by protocol * Rebase on N8s work * Generate DeepCopy() for API gateway listener types * Improve variable name * Regenerate DeepCopy() code * Fix linting issue * fix protobuf import * Fix more merge conflict errors * Fix synthesize test * Run deep copy * Add URLRewrite to proto * Update agent/consul/discoverychain/gateway_tcproute.go Co-authored-by: Nathan Coleman <nathan.coleman@hashicorp.com> * Remove APIGatewayConfigEntry that was extra * Error out if route kind is unknown * Fix formatting errors in proto --------- Co-authored-by: Nathan Coleman <nathan.coleman@hashicorp.com> Co-authored-by: Andrew Stucki <andrew.stucki@hashicorp.com>
This commit is contained in:
parent
3f276a470d
commit
d9c97a9ef7
|
@ -0,0 +1,190 @@
|
|||
package discoverychain
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"hash/crc32"
|
||||
"sort"
|
||||
"strconv"
|
||||
|
||||
"github.com/hashicorp/consul/agent/configentry"
|
||||
"github.com/hashicorp/consul/agent/structs"
|
||||
)
|
||||
|
||||
// GatewayChainSynthesizer is used to synthesize a discovery chain for a
|
||||
// gateway from its configuration and multiple other discovery chains.
|
||||
type GatewayChainSynthesizer struct {
|
||||
datacenter string
|
||||
gateway *structs.APIGatewayConfigEntry
|
||||
matchesByHostname map[string][]hostnameMatch
|
||||
tcpRoutes []structs.TCPRouteConfigEntry
|
||||
}
|
||||
|
||||
type hostnameMatch struct {
|
||||
match structs.HTTPMatch
|
||||
filters structs.HTTPFilters
|
||||
services []structs.HTTPService
|
||||
}
|
||||
|
||||
// NewGatewayChainSynthesizer creates a new GatewayChainSynthesizer for the
|
||||
// given gateway and datacenter.
|
||||
func NewGatewayChainSynthesizer(datacenter string, gateway *structs.APIGatewayConfigEntry) *GatewayChainSynthesizer {
|
||||
return &GatewayChainSynthesizer{
|
||||
datacenter: datacenter,
|
||||
gateway: gateway,
|
||||
matchesByHostname: map[string][]hostnameMatch{},
|
||||
}
|
||||
}
|
||||
|
||||
// AddTCPRoute adds a TCPRoute to use in synthesizing a discovery chain
|
||||
func (l *GatewayChainSynthesizer) AddTCPRoute(route structs.TCPRouteConfigEntry) {
|
||||
l.tcpRoutes = append(l.tcpRoutes, route)
|
||||
}
|
||||
|
||||
// AddHTTPRoute takes a new route and flattens its rule matches out per hostname.
|
||||
// This is required since a single route can specify multiple hostnames, and a
|
||||
// single hostname can be specified in multiple routes. Routing for a given
|
||||
// hostname must behave based on the aggregate of all rules that apply to it.
|
||||
func (l *GatewayChainSynthesizer) AddHTTPRoute(route structs.HTTPRouteConfigEntry) {
|
||||
for _, host := range route.Hostnames {
|
||||
matches, ok := l.matchesByHostname[host]
|
||||
if !ok {
|
||||
matches = []hostnameMatch{}
|
||||
}
|
||||
|
||||
for _, rule := range route.Rules {
|
||||
// If a rule has no matches defined, add default match
|
||||
if rule.Matches == nil {
|
||||
rule.Matches = []structs.HTTPMatch{}
|
||||
}
|
||||
if len(rule.Matches) == 0 {
|
||||
rule.Matches = []structs.HTTPMatch{{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: structs.HTTPPathMatchPrefix,
|
||||
Value: "/",
|
||||
},
|
||||
}}
|
||||
}
|
||||
|
||||
// Add all matches for this rule to the list for this hostname
|
||||
for _, match := range rule.Matches {
|
||||
matches = append(matches, hostnameMatch{
|
||||
match: match,
|
||||
filters: rule.Filters,
|
||||
services: rule.Services,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
l.matchesByHostname[host] = matches
|
||||
}
|
||||
}
|
||||
|
||||
// Synthesize assembles a synthetic discovery chain from multiple other discovery chains
|
||||
// that have StartNodes that are referenced by routers or splitters in the entries for the
|
||||
// given CompileRequest.
|
||||
//
|
||||
// This is currently used to help API gateways masquarade as ingress gateways
|
||||
// by providing a set of virtual config entries that change the routing behavior
|
||||
// to upstreams referenced in the given HTTPRoutes or TCPRoutes.
|
||||
func (l *GatewayChainSynthesizer) Synthesize(chains ...*structs.CompiledDiscoveryChain) ([]structs.IngressService, *structs.CompiledDiscoveryChain, error) {
|
||||
if len(chains) == 0 {
|
||||
return nil, nil, fmt.Errorf("must provide at least one compiled discovery chain")
|
||||
}
|
||||
|
||||
services, entries := l.synthesizeEntries()
|
||||
|
||||
if entries.IsEmpty() {
|
||||
// we can't actually compile a discovery chain, i.e. we're using a TCPRoute-based listener, instead, just return the ingresses
|
||||
// and the first pre-compiled discovery chain
|
||||
return services, chains[0], nil
|
||||
}
|
||||
|
||||
compiled, err := Compile(CompileRequest{
|
||||
ServiceName: l.gateway.Name,
|
||||
EvaluateInNamespace: l.gateway.NamespaceOrDefault(),
|
||||
EvaluateInPartition: l.gateway.PartitionOrDefault(),
|
||||
EvaluateInDatacenter: l.datacenter,
|
||||
Entries: entries,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
for _, c := range chains {
|
||||
for id, target := range c.Targets {
|
||||
compiled.Targets[id] = target
|
||||
}
|
||||
for id, node := range c.Nodes {
|
||||
compiled.Nodes[id] = node
|
||||
}
|
||||
compiled.EnvoyExtensions = append(compiled.EnvoyExtensions, c.EnvoyExtensions...)
|
||||
}
|
||||
|
||||
return services, compiled, nil
|
||||
}
|
||||
|
||||
// consolidateHTTPRoutes combines all rules into the shortest possible list of routes
|
||||
// with one route per hostname containing all rules for that hostname.
|
||||
func (l *GatewayChainSynthesizer) consolidateHTTPRoutes() []structs.HTTPRouteConfigEntry {
|
||||
var routes []structs.HTTPRouteConfigEntry
|
||||
|
||||
for hostname, rules := range l.matchesByHostname {
|
||||
// Create route for this hostname
|
||||
route := structs.HTTPRouteConfigEntry{
|
||||
Kind: structs.HTTPRoute,
|
||||
Name: fmt.Sprintf("%s-%s", l.gateway.Name, hostsKey(hostname)),
|
||||
Hostnames: []string{hostname},
|
||||
Rules: make([]structs.HTTPRouteRule, 0, len(rules)),
|
||||
Meta: l.gateway.Meta,
|
||||
EnterpriseMeta: l.gateway.EnterpriseMeta,
|
||||
}
|
||||
|
||||
// Sort rules for this hostname in order of precedence
|
||||
sort.SliceStable(rules, func(i, j int) bool {
|
||||
return compareHTTPRules(rules[i].match, rules[j].match)
|
||||
})
|
||||
|
||||
// Add all rules for this hostname
|
||||
for _, rule := range rules {
|
||||
route.Rules = append(route.Rules, structs.HTTPRouteRule{
|
||||
Matches: []structs.HTTPMatch{rule.match},
|
||||
Filters: rule.filters,
|
||||
Services: rule.services,
|
||||
})
|
||||
}
|
||||
|
||||
routes = append(routes, route)
|
||||
}
|
||||
|
||||
return routes
|
||||
}
|
||||
|
||||
func hostsKey(hosts ...string) string {
|
||||
sort.Strings(hosts)
|
||||
hostsHash := crc32.NewIEEE()
|
||||
for _, h := range hosts {
|
||||
if _, err := hostsHash.Write([]byte(h)); err != nil {
|
||||
continue
|
||||
}
|
||||
}
|
||||
return strconv.FormatUint(uint64(hostsHash.Sum32()), 16)
|
||||
}
|
||||
|
||||
func (l *GatewayChainSynthesizer) synthesizeEntries() ([]structs.IngressService, *configentry.DiscoveryChainSet) {
|
||||
services := []structs.IngressService{}
|
||||
entries := configentry.NewDiscoveryChainSet()
|
||||
|
||||
for _, route := range l.consolidateHTTPRoutes() {
|
||||
ingress, router, splitters, defaults := synthesizeHTTPRouteDiscoveryChain(route)
|
||||
entries.AddRouters(router)
|
||||
entries.AddSplitters(splitters...)
|
||||
entries.AddServices(defaults...)
|
||||
services = append(services, ingress)
|
||||
}
|
||||
|
||||
for _, route := range l.tcpRoutes {
|
||||
services = append(services, synthesizeTCPRouteDiscoveryChain(route)...)
|
||||
}
|
||||
|
||||
return services, entries
|
||||
}
|
|
@ -0,0 +1,276 @@
|
|||
package discoverychain
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/consul/agent/structs"
|
||||
)
|
||||
|
||||
// compareHTTPRules implements the non-hostname order of precedence for routes specified by the K8s Gateway API spec.
|
||||
// https://gateway-api.sigs.k8s.io/v1alpha2/references/spec/#gateway.networking.k8s.io/v1alpha2.HTTPRouteRule
|
||||
//
|
||||
// Ordering prefers matches based on the largest number of:
|
||||
//
|
||||
// 1. characters in a matching non-wildcard hostname
|
||||
// 2. characters in a matching hostname
|
||||
// 3. characters in a matching path
|
||||
// 4. header matches
|
||||
// 5. query param matches
|
||||
//
|
||||
// The hostname-specific comparison (1+2) occur in Envoy outside of our control:
|
||||
// https://github.com/envoyproxy/envoy/blob/5c4d4bd957f9402eca80bef82e7cc3ae714e04b4/source/common/router/config_impl.cc#L1645-L1682
|
||||
func compareHTTPRules(ruleA, ruleB structs.HTTPMatch) bool {
|
||||
if len(ruleA.Path.Value) != len(ruleB.Path.Value) {
|
||||
return len(ruleA.Path.Value) > len(ruleB.Path.Value)
|
||||
}
|
||||
if len(ruleA.Headers) != len(ruleB.Headers) {
|
||||
return len(ruleA.Headers) > len(ruleB.Headers)
|
||||
}
|
||||
return len(ruleA.Query) > len(ruleB.Query)
|
||||
}
|
||||
|
||||
func httpServiceDefault(entry structs.ConfigEntry, meta map[string]string) *structs.ServiceConfigEntry {
|
||||
return &structs.ServiceConfigEntry{
|
||||
Kind: structs.ServiceDefaults,
|
||||
Name: entry.GetName(),
|
||||
Protocol: "http",
|
||||
Meta: meta,
|
||||
EnterpriseMeta: *entry.GetEnterpriseMeta(),
|
||||
}
|
||||
}
|
||||
|
||||
func synthesizeHTTPRouteDiscoveryChain(route structs.HTTPRouteConfigEntry) (structs.IngressService, *structs.ServiceRouterConfigEntry, []*structs.ServiceSplitterConfigEntry, []*structs.ServiceConfigEntry) {
|
||||
meta := route.GetMeta()
|
||||
splitters := []*structs.ServiceSplitterConfigEntry{}
|
||||
defaults := []*structs.ServiceConfigEntry{}
|
||||
|
||||
router, splits := httpRouteToDiscoveryChain(route)
|
||||
serviceDefault := httpServiceDefault(router, meta)
|
||||
defaults = append(defaults, serviceDefault)
|
||||
for _, split := range splits {
|
||||
splitters = append(splitters, split)
|
||||
if split.Name != serviceDefault.Name {
|
||||
defaults = append(defaults, httpServiceDefault(split, meta))
|
||||
}
|
||||
}
|
||||
|
||||
ingress := structs.IngressService{
|
||||
Name: router.Name,
|
||||
Hosts: route.Hostnames,
|
||||
Meta: route.Meta,
|
||||
EnterpriseMeta: route.EnterpriseMeta,
|
||||
}
|
||||
|
||||
return ingress, router, splitters, defaults
|
||||
}
|
||||
|
||||
func httpRouteToDiscoveryChain(route structs.HTTPRouteConfigEntry) (*structs.ServiceRouterConfigEntry, []*structs.ServiceSplitterConfigEntry) {
|
||||
router := &structs.ServiceRouterConfigEntry{
|
||||
Kind: structs.ServiceRouter,
|
||||
Name: route.GetName(),
|
||||
Meta: route.GetMeta(),
|
||||
EnterpriseMeta: route.EnterpriseMeta,
|
||||
}
|
||||
var splitters []*structs.ServiceSplitterConfigEntry
|
||||
|
||||
for idx, rule := range route.Rules {
|
||||
modifier := httpRouteFiltersToServiceRouteHeaderModifier(rule.Filters.Headers)
|
||||
prefixRewrite := httpRouteFiltersToDestinationPrefixRewrite(rule.Filters.URLRewrites)
|
||||
|
||||
var destination structs.ServiceRouteDestination
|
||||
if len(rule.Services) == 1 {
|
||||
// TODO open question: is there a use case where someone might want to set the rewrite to ""?
|
||||
service := rule.Services[0]
|
||||
|
||||
servicePrefixRewrite := httpRouteFiltersToDestinationPrefixRewrite(service.Filters.URLRewrites)
|
||||
if servicePrefixRewrite == "" {
|
||||
servicePrefixRewrite = prefixRewrite
|
||||
}
|
||||
serviceModifier := httpRouteFiltersToServiceRouteHeaderModifier(service.Filters.Headers)
|
||||
modifier.Add = mergeMaps(modifier.Add, serviceModifier.Add)
|
||||
modifier.Set = mergeMaps(modifier.Set, serviceModifier.Set)
|
||||
modifier.Remove = append(modifier.Remove, serviceModifier.Remove...)
|
||||
|
||||
destination.Service = service.Name
|
||||
destination.Namespace = service.NamespaceOrDefault()
|
||||
destination.Partition = service.PartitionOrDefault()
|
||||
destination.PrefixRewrite = servicePrefixRewrite
|
||||
destination.RequestHeaders = modifier
|
||||
} else {
|
||||
// create a virtual service to split
|
||||
destination.Service = fmt.Sprintf("%s-%d", route.GetName(), idx)
|
||||
destination.Namespace = route.NamespaceOrDefault()
|
||||
destination.Partition = route.PartitionOrDefault()
|
||||
destination.PrefixRewrite = prefixRewrite
|
||||
destination.RequestHeaders = modifier
|
||||
|
||||
splitter := &structs.ServiceSplitterConfigEntry{
|
||||
Kind: structs.ServiceSplitter,
|
||||
Name: destination.Service,
|
||||
Splits: []structs.ServiceSplit{},
|
||||
Meta: route.GetMeta(),
|
||||
EnterpriseMeta: route.EnterpriseMeta,
|
||||
}
|
||||
|
||||
totalWeight := 0
|
||||
for _, service := range rule.Services {
|
||||
totalWeight += service.Weight
|
||||
}
|
||||
|
||||
for _, service := range rule.Services {
|
||||
if service.Weight == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
modifier := httpRouteFiltersToServiceRouteHeaderModifier(service.Filters.Headers)
|
||||
|
||||
weightPercentage := float32(service.Weight) / float32(totalWeight)
|
||||
split := structs.ServiceSplit{
|
||||
RequestHeaders: modifier,
|
||||
Weight: weightPercentage * 100,
|
||||
}
|
||||
split.Service = service.Name
|
||||
split.Namespace = service.NamespaceOrDefault()
|
||||
split.Partition = service.PartitionOrDefault()
|
||||
splitter.Splits = append(splitter.Splits, split)
|
||||
}
|
||||
if len(splitter.Splits) > 0 {
|
||||
splitters = append(splitters, splitter)
|
||||
}
|
||||
}
|
||||
|
||||
// for each match rule a ServiceRoute is created for the service-router
|
||||
// if there are no rules a single route with the destination is set
|
||||
if len(rule.Matches) == 0 {
|
||||
router.Routes = append(router.Routes, structs.ServiceRoute{Destination: &destination})
|
||||
}
|
||||
|
||||
for _, match := range rule.Matches {
|
||||
router.Routes = append(router.Routes, structs.ServiceRoute{
|
||||
Match: &structs.ServiceRouteMatch{HTTP: httpRouteMatchToServiceRouteHTTPMatch(match)},
|
||||
Destination: &destination,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return router, splitters
|
||||
}
|
||||
|
||||
func httpRouteFiltersToDestinationPrefixRewrite(rewrites []structs.URLRewrite) string {
|
||||
for _, rewrite := range rewrites {
|
||||
if rewrite.Path != "" {
|
||||
return rewrite.Path
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// httpRouteFiltersToServiceRouteHeaderModifier will consolidate a list of HTTP filters
|
||||
// into a single set of header modifications for Consul to make as a request passes through.
|
||||
func httpRouteFiltersToServiceRouteHeaderModifier(filters []structs.HTTPHeaderFilter) *structs.HTTPHeaderModifiers {
|
||||
modifier := &structs.HTTPHeaderModifiers{
|
||||
Add: make(map[string]string),
|
||||
Set: make(map[string]string),
|
||||
}
|
||||
for _, filter := range filters {
|
||||
// If we have multiple filters specified, then we can potentially clobber
|
||||
// "Add" and "Set" here -- as far as K8S gateway spec is concerned, this
|
||||
// is all implementation-specific behavior and undefined by the spec.
|
||||
modifier.Add = mergeMaps(modifier.Add, filter.Add)
|
||||
modifier.Set = mergeMaps(modifier.Set, filter.Set)
|
||||
modifier.Remove = append(modifier.Remove, filter.Remove...)
|
||||
}
|
||||
return modifier
|
||||
}
|
||||
|
||||
func mergeMaps(a, b map[string]string) map[string]string {
|
||||
for k, v := range b {
|
||||
a[k] = v
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
func httpRouteMatchToServiceRouteHTTPMatch(match structs.HTTPMatch) *structs.ServiceRouteHTTPMatch {
|
||||
var consulMatch structs.ServiceRouteHTTPMatch
|
||||
switch match.Path.Match {
|
||||
case structs.HTTPPathMatchExact:
|
||||
consulMatch.PathExact = match.Path.Value
|
||||
case structs.HTTPPathMatchPrefix:
|
||||
consulMatch.PathPrefix = match.Path.Value
|
||||
case structs.HTTPPathMatchRegularExpression:
|
||||
consulMatch.PathRegex = match.Path.Value
|
||||
}
|
||||
|
||||
for _, header := range match.Headers {
|
||||
switch header.Match {
|
||||
case structs.HTTPHeaderMatchExact:
|
||||
consulMatch.Header = append(consulMatch.Header, structs.ServiceRouteHTTPMatchHeader{
|
||||
Name: header.Name,
|
||||
Exact: header.Value,
|
||||
})
|
||||
case structs.HTTPHeaderMatchPrefix:
|
||||
consulMatch.Header = append(consulMatch.Header, structs.ServiceRouteHTTPMatchHeader{
|
||||
Name: header.Name,
|
||||
Prefix: header.Value,
|
||||
})
|
||||
case structs.HTTPHeaderMatchSuffix:
|
||||
consulMatch.Header = append(consulMatch.Header, structs.ServiceRouteHTTPMatchHeader{
|
||||
Name: header.Name,
|
||||
Suffix: header.Value,
|
||||
})
|
||||
case structs.HTTPHeaderMatchPresent:
|
||||
consulMatch.Header = append(consulMatch.Header, structs.ServiceRouteHTTPMatchHeader{
|
||||
Name: header.Name,
|
||||
Present: true,
|
||||
})
|
||||
case structs.HTTPHeaderMatchRegularExpression:
|
||||
consulMatch.Header = append(consulMatch.Header, structs.ServiceRouteHTTPMatchHeader{
|
||||
Name: header.Name,
|
||||
Regex: header.Value,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
for _, query := range match.Query {
|
||||
switch query.Match {
|
||||
case structs.HTTPQueryMatchExact:
|
||||
consulMatch.QueryParam = append(consulMatch.QueryParam, structs.ServiceRouteHTTPMatchQueryParam{
|
||||
Name: query.Name,
|
||||
Exact: query.Value,
|
||||
})
|
||||
case structs.HTTPQueryMatchPresent:
|
||||
consulMatch.QueryParam = append(consulMatch.QueryParam, structs.ServiceRouteHTTPMatchQueryParam{
|
||||
Name: query.Name,
|
||||
Present: true,
|
||||
})
|
||||
case structs.HTTPQueryMatchRegularExpression:
|
||||
consulMatch.QueryParam = append(consulMatch.QueryParam, structs.ServiceRouteHTTPMatchQueryParam{
|
||||
Name: query.Name,
|
||||
Regex: query.Value,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
switch match.Method {
|
||||
case structs.HTTPMatchMethodConnect:
|
||||
consulMatch.Methods = append(consulMatch.Methods, "CONNECT")
|
||||
case structs.HTTPMatchMethodDelete:
|
||||
consulMatch.Methods = append(consulMatch.Methods, "DELETE")
|
||||
case structs.HTTPMatchMethodGet:
|
||||
consulMatch.Methods = append(consulMatch.Methods, "GET")
|
||||
case structs.HTTPMatchMethodHead:
|
||||
consulMatch.Methods = append(consulMatch.Methods, "HEAD")
|
||||
case structs.HTTPMatchMethodOptions:
|
||||
consulMatch.Methods = append(consulMatch.Methods, "OPTIONS")
|
||||
case structs.HTTPMatchMethodPatch:
|
||||
consulMatch.Methods = append(consulMatch.Methods, "PATCH")
|
||||
case structs.HTTPMatchMethodPost:
|
||||
consulMatch.Methods = append(consulMatch.Methods, "POST")
|
||||
case structs.HTTPMatchMethodPut:
|
||||
consulMatch.Methods = append(consulMatch.Methods, "PUT")
|
||||
case structs.HTTPMatchMethodTrace:
|
||||
consulMatch.Methods = append(consulMatch.Methods, "TRACE")
|
||||
}
|
||||
|
||||
return &consulMatch
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package discoverychain
|
||||
|
||||
import "github.com/hashicorp/consul/agent/structs"
|
||||
|
||||
func synthesizeTCPRouteDiscoveryChain(route structs.TCPRouteConfigEntry) []structs.IngressService {
|
||||
services := make([]structs.IngressService, 0, len(route.Services))
|
||||
for _, service := range route.Services {
|
||||
ingress := structs.IngressService{
|
||||
Name: service.Name,
|
||||
EnterpriseMeta: service.EnterpriseMeta,
|
||||
}
|
||||
|
||||
services = append(services, ingress)
|
||||
}
|
||||
|
||||
return services
|
||||
}
|
|
@ -0,0 +1,545 @@
|
|||
package discoverychain
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/consul/agent/structs"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestGatewayChainSynthesizer_AddTCPRoute(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
datacenter := "dc1"
|
||||
gateway := &structs.APIGatewayConfigEntry{
|
||||
Kind: structs.APIGateway,
|
||||
Name: "gateway",
|
||||
}
|
||||
route := structs.TCPRouteConfigEntry{
|
||||
Kind: structs.TCPRoute,
|
||||
Name: "route",
|
||||
}
|
||||
|
||||
expected := GatewayChainSynthesizer{
|
||||
datacenter: datacenter,
|
||||
gateway: gateway,
|
||||
matchesByHostname: map[string][]hostnameMatch{},
|
||||
tcpRoutes: []structs.TCPRouteConfigEntry{
|
||||
route,
|
||||
},
|
||||
}
|
||||
|
||||
gatewayChainSynthesizer := NewGatewayChainSynthesizer(datacenter, gateway)
|
||||
|
||||
// Add a TCP route
|
||||
gatewayChainSynthesizer.AddTCPRoute(route)
|
||||
|
||||
require.Equal(t, expected, *gatewayChainSynthesizer)
|
||||
}
|
||||
|
||||
func TestGatewayChainSynthesizer_AddHTTPRoute(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cases := map[string]struct {
|
||||
route structs.HTTPRouteConfigEntry
|
||||
expectedMatchesByHostname map[string][]hostnameMatch
|
||||
}{
|
||||
"no hostanames": {
|
||||
route: structs.HTTPRouteConfigEntry{
|
||||
Kind: structs.HTTPRoute,
|
||||
Name: "route",
|
||||
},
|
||||
expectedMatchesByHostname: map[string][]hostnameMatch{},
|
||||
},
|
||||
"single hostname with no rules": {
|
||||
route: structs.HTTPRouteConfigEntry{
|
||||
Kind: structs.HTTPRoute,
|
||||
Name: "route",
|
||||
Hostnames: []string{
|
||||
"example.com",
|
||||
},
|
||||
},
|
||||
expectedMatchesByHostname: map[string][]hostnameMatch{
|
||||
"example.com": {},
|
||||
},
|
||||
},
|
||||
"single hostname with a single rule and no matches": {
|
||||
route: structs.HTTPRouteConfigEntry{
|
||||
Kind: structs.HTTPRoute,
|
||||
Name: "route",
|
||||
Hostnames: []string{
|
||||
"example.com",
|
||||
},
|
||||
Rules: []structs.HTTPRouteRule{
|
||||
{
|
||||
Filters: structs.HTTPFilters{},
|
||||
Matches: []structs.HTTPMatch{},
|
||||
Services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedMatchesByHostname: map[string][]hostnameMatch{
|
||||
"example.com": {
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "/",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"single hostname with a single rule and a single match": {
|
||||
route: structs.HTTPRouteConfigEntry{
|
||||
Kind: structs.HTTPRoute,
|
||||
Name: "route",
|
||||
Hostnames: []string{
|
||||
"example.com",
|
||||
},
|
||||
Rules: []structs.HTTPRouteRule{
|
||||
{
|
||||
Filters: structs.HTTPFilters{},
|
||||
Matches: []structs.HTTPMatch{
|
||||
{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
},
|
||||
Services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedMatchesByHostname: map[string][]hostnameMatch{
|
||||
"example.com": {
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"single hostname with a single rule and multiple matches": {
|
||||
route: structs.HTTPRouteConfigEntry{
|
||||
Kind: structs.HTTPRoute,
|
||||
Name: "route",
|
||||
Hostnames: []string{
|
||||
"example.com",
|
||||
},
|
||||
Rules: []structs.HTTPRouteRule{
|
||||
{
|
||||
Filters: structs.HTTPFilters{},
|
||||
Matches: []structs.HTTPMatch{
|
||||
{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "bar-",
|
||||
},
|
||||
},
|
||||
},
|
||||
Services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedMatchesByHostname: map[string][]hostnameMatch{
|
||||
"example.com": {
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "bar-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"multiple hostnames with a single rule and a single match": {
|
||||
route: structs.HTTPRouteConfigEntry{
|
||||
Kind: structs.HTTPRoute,
|
||||
Name: "route",
|
||||
Hostnames: []string{
|
||||
"example.com",
|
||||
"example.net",
|
||||
},
|
||||
Rules: []structs.HTTPRouteRule{
|
||||
{
|
||||
Filters: structs.HTTPFilters{},
|
||||
Matches: []structs.HTTPMatch{
|
||||
{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
},
|
||||
Services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedMatchesByHostname: map[string][]hostnameMatch{
|
||||
"example.com": {
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
"example.net": {
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"multiple hostnames with a single rule and multiple matches": {
|
||||
route: structs.HTTPRouteConfigEntry{
|
||||
Kind: structs.HTTPRoute,
|
||||
Name: "route",
|
||||
Hostnames: []string{
|
||||
"example.com",
|
||||
"example.net",
|
||||
},
|
||||
Rules: []structs.HTTPRouteRule{
|
||||
{
|
||||
Filters: structs.HTTPFilters{},
|
||||
Matches: []structs.HTTPMatch{
|
||||
{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "bar-",
|
||||
},
|
||||
},
|
||||
},
|
||||
Services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedMatchesByHostname: map[string][]hostnameMatch{
|
||||
"example.com": {
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "bar-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
"example.net": {
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "bar-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"multiple hostnames with multiple rules and multiple matches": {
|
||||
route: structs.HTTPRouteConfigEntry{
|
||||
Kind: structs.HTTPRoute,
|
||||
Name: "route",
|
||||
Hostnames: []string{
|
||||
"example.com",
|
||||
"example.net",
|
||||
},
|
||||
Rules: []structs.HTTPRouteRule{
|
||||
{
|
||||
Filters: structs.HTTPFilters{},
|
||||
Matches: []structs.HTTPMatch{
|
||||
{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "bar-",
|
||||
},
|
||||
},
|
||||
},
|
||||
Services: []structs.HTTPService{},
|
||||
},
|
||||
{
|
||||
Filters: structs.HTTPFilters{},
|
||||
Matches: []structs.HTTPMatch{
|
||||
{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "baz-",
|
||||
},
|
||||
},
|
||||
{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "qux-",
|
||||
},
|
||||
},
|
||||
},
|
||||
Services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectedMatchesByHostname: map[string][]hostnameMatch{
|
||||
"example.com": {
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "bar-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "baz-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "qux-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
"example.net": {
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "foo-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "bar-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "baz-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
{
|
||||
match: structs.HTTPMatch{
|
||||
Path: structs.HTTPPathMatch{
|
||||
Match: "prefix",
|
||||
Value: "qux-",
|
||||
},
|
||||
},
|
||||
filters: structs.HTTPFilters{},
|
||||
services: []structs.HTTPService{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
datacenter := "dc1"
|
||||
gateway := &structs.APIGatewayConfigEntry{
|
||||
Kind: structs.APIGateway,
|
||||
Name: "gateway",
|
||||
}
|
||||
|
||||
gatewayChainSynthesizer := NewGatewayChainSynthesizer(datacenter, gateway)
|
||||
|
||||
gatewayChainSynthesizer.AddHTTPRoute(tc.route)
|
||||
|
||||
require.Equal(t, tc.expectedMatchesByHostname, gatewayChainSynthesizer.matchesByHostname)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGatewayChainSynthesizer_Synthesize(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cases := map[string]struct {
|
||||
synthesizer *GatewayChainSynthesizer
|
||||
tcpRoutes []*structs.TCPRouteConfigEntry
|
||||
httpRoutes []*structs.HTTPRouteConfigEntry
|
||||
chain *structs.CompiledDiscoveryChain
|
||||
extra []*structs.CompiledDiscoveryChain
|
||||
expectedIngressServices []structs.IngressService
|
||||
expectedDiscoveryChain *structs.CompiledDiscoveryChain
|
||||
}{
|
||||
// TODO Add tests for other synthesizer types.
|
||||
"TCPRoute-based listener": {
|
||||
synthesizer: NewGatewayChainSynthesizer("dc1", &structs.APIGatewayConfigEntry{
|
||||
Kind: structs.APIGateway,
|
||||
Name: "gateway",
|
||||
}),
|
||||
tcpRoutes: []*structs.TCPRouteConfigEntry{
|
||||
{
|
||||
Kind: structs.TCPRoute,
|
||||
Name: "tcp-route",
|
||||
},
|
||||
},
|
||||
chain: &structs.CompiledDiscoveryChain{
|
||||
ServiceName: "foo",
|
||||
Namespace: "default",
|
||||
Datacenter: "dc1",
|
||||
},
|
||||
extra: []*structs.CompiledDiscoveryChain{},
|
||||
expectedIngressServices: []structs.IngressService{},
|
||||
expectedDiscoveryChain: &structs.CompiledDiscoveryChain{
|
||||
ServiceName: "foo",
|
||||
Namespace: "default",
|
||||
Datacenter: "dc1",
|
||||
},
|
||||
},
|
||||
"HTTPRoute-based listener": {
|
||||
synthesizer: NewGatewayChainSynthesizer("dc1", &structs.APIGatewayConfigEntry{
|
||||
Kind: structs.APIGateway,
|
||||
Name: "gateway",
|
||||
}),
|
||||
httpRoutes: []*structs.HTTPRouteConfigEntry{
|
||||
{
|
||||
Kind: structs.HTTPRoute,
|
||||
Name: "http-route",
|
||||
},
|
||||
},
|
||||
chain: &structs.CompiledDiscoveryChain{
|
||||
ServiceName: "foo",
|
||||
Namespace: "default",
|
||||
Datacenter: "dc1",
|
||||
},
|
||||
extra: []*structs.CompiledDiscoveryChain{},
|
||||
expectedIngressServices: []structs.IngressService{},
|
||||
expectedDiscoveryChain: &structs.CompiledDiscoveryChain{
|
||||
ServiceName: "foo",
|
||||
Namespace: "default",
|
||||
Datacenter: "dc1",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
for _, tcpRoute := range tc.tcpRoutes {
|
||||
tc.synthesizer.AddTCPRoute(*tcpRoute)
|
||||
}
|
||||
for _, httpRoute := range tc.httpRoutes {
|
||||
tc.synthesizer.AddHTTPRoute(*httpRoute)
|
||||
}
|
||||
|
||||
chains := append([]*structs.CompiledDiscoveryChain{tc.chain}, tc.extra...)
|
||||
ingressServices, discoveryChain, err := tc.synthesizer.Synthesize(chains...)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, tc.expectedIngressServices, ingressServices)
|
||||
require.Equal(t, tc.expectedDiscoveryChain, discoveryChain)
|
||||
})
|
||||
}
|
||||
}
|
|
@ -2,11 +2,13 @@ package proxycfg
|
|||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/hashicorp/consul/acl"
|
||||
"github.com/hashicorp/consul/agent/consul/discoverychain"
|
||||
"github.com/hashicorp/consul/agent/proxycfg/internal/watch"
|
||||
"github.com/hashicorp/consul/agent/structs"
|
||||
"github.com/hashicorp/consul/lib"
|
||||
|
@ -688,14 +690,99 @@ type configSnapshotAPIGateway struct {
|
|||
// Consul API Gateway into Consul core.
|
||||
//
|
||||
// FUTURE: Remove when API gateways have custom snapshot generation
|
||||
func (c *configSnapshotAPIGateway) ToIngress() configSnapshotIngressGateway {
|
||||
func (c *configSnapshotAPIGateway) ToIngress(datacenter string) (configSnapshotIngressGateway, error) {
|
||||
// Convert API Gateway Listeners to Ingress Listeners.
|
||||
ingressListeners := make(map[IngressListenerKey]structs.IngressListener, len(c.Listeners))
|
||||
synthesizedChains := map[UpstreamID]*structs.CompiledDiscoveryChain{}
|
||||
for name, listener := range c.Listeners {
|
||||
boundListener, ok := c.BoundListeners[name]
|
||||
if !ok {
|
||||
// Skip any listeners that don't have a bound listener. Once the bound listener is created, this will be run again.
|
||||
continue
|
||||
}
|
||||
|
||||
ingressListener := structs.IngressListener{
|
||||
Port: listener.Port,
|
||||
Protocol: string(listener.Protocol),
|
||||
}
|
||||
|
||||
// Create a synthesized discovery chain for each service.
|
||||
services, compiled, err := c.synthesizeChains(datacenter, listener.Protocol, boundListener)
|
||||
if err != nil {
|
||||
return configSnapshotIngressGateway{}, err
|
||||
}
|
||||
ingressListener.Services = services
|
||||
for _, service := range services {
|
||||
id := NewUpstreamIDFromServiceName(structs.NewServiceName(service.Name, &service.EnterpriseMeta))
|
||||
synthesizedChains[id] = compiled
|
||||
}
|
||||
|
||||
// Configure TLS for the ingress listener
|
||||
tls, err := c.toIngressTLS()
|
||||
if err != nil {
|
||||
return configSnapshotIngressGateway{}, err
|
||||
}
|
||||
ingressListener.TLS = tls
|
||||
|
||||
ingressListeners[IngressListenerKey{
|
||||
Port: listener.Port,
|
||||
Protocol: string(listener.Protocol),
|
||||
}] = ingressListener
|
||||
}
|
||||
upstreams := c.DeepCopy().ConfigSnapshotUpstreams
|
||||
upstreams.DiscoveryChain = synthesizedChains
|
||||
|
||||
return configSnapshotIngressGateway{
|
||||
ConfigSnapshotUpstreams: c.ConfigSnapshotUpstreams,
|
||||
// TODO Build from c.Listeners
|
||||
// Listeners:
|
||||
Defaults: structs.IngressServiceConfig{},
|
||||
ConfigSnapshotUpstreams: upstreams,
|
||||
GatewayConfigLoaded: true,
|
||||
Listeners: ingressListeners,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (c *configSnapshotAPIGateway) synthesizeChains(datacenter string, protocol structs.APIGatewayListenerProtocol, boundListener structs.BoundAPIGatewayListener) ([]structs.IngressService, *structs.CompiledDiscoveryChain, error) {
|
||||
chains := []*structs.CompiledDiscoveryChain{}
|
||||
synthesizer := discoverychain.NewGatewayChainSynthesizer(datacenter, c.GatewayConfig)
|
||||
for _, routeRef := range boundListener.Routes {
|
||||
switch routeRef.Kind {
|
||||
case structs.HTTPRoute:
|
||||
route, ok := c.HTTPRoutes.Get(routeRef)
|
||||
if !ok || protocol != structs.ListenerProtocolHTTP {
|
||||
continue
|
||||
}
|
||||
synthesizer.AddHTTPRoute(*route)
|
||||
for _, service := range route.GetServices() {
|
||||
id := NewUpstreamIDFromServiceName(structs.NewServiceName(service.Name, &service.EnterpriseMeta))
|
||||
if chain := c.DiscoveryChain[id]; chain != nil {
|
||||
chains = append(chains, chain)
|
||||
}
|
||||
}
|
||||
case structs.TCPRoute:
|
||||
route, ok := c.TCPRoutes.Get(routeRef)
|
||||
if !ok || protocol != structs.ListenerProtocolTCP {
|
||||
continue
|
||||
}
|
||||
synthesizer.AddTCPRoute(*route)
|
||||
for _, service := range route.GetServices() {
|
||||
id := NewUpstreamIDFromServiceName(structs.NewServiceName(service.Name, &service.EnterpriseMeta))
|
||||
if chain := c.DiscoveryChain[id]; chain != nil {
|
||||
chains = append(chains, chain)
|
||||
}
|
||||
}
|
||||
default:
|
||||
return nil, nil, fmt.Errorf("unknown route kind %q", routeRef.Kind)
|
||||
}
|
||||
}
|
||||
|
||||
if len(chains) == 0 {
|
||||
return nil, nil, errors.New("could not synthesize discovery chain")
|
||||
}
|
||||
|
||||
return synthesizer.Synthesize(chains...)
|
||||
}
|
||||
|
||||
func (c *configSnapshotAPIGateway) toIngressTLS() (*structs.GatewayTLSConfig, error) {
|
||||
// TODO (t-eckert) this is dependent on future SDS work.
|
||||
return &structs.GatewayTLSConfig{}, nil
|
||||
}
|
||||
|
||||
type configSnapshotIngressGateway struct {
|
||||
|
|
|
@ -8,7 +8,10 @@ import (
|
|||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/google/go-cmp/cmp/cmpopts"
|
||||
fuzz "github.com/google/gofuzz"
|
||||
"github.com/hashicorp/consul/agent/proxycfg/internal/watch"
|
||||
"github.com/hashicorp/consul/agent/structs"
|
||||
"github.com/hashicorp/consul/proto/pbpeering"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestConfigSnapshot_Clone(t *testing.T) {
|
||||
|
@ -50,3 +53,36 @@ func TestConfigSnapshot_Clone(t *testing.T) {
|
|||
t.FailNow()
|
||||
}
|
||||
}
|
||||
|
||||
func TestAPIGatewaySnapshotToIngressGatewaySnapshot(t *testing.T) {
|
||||
cases := map[string]struct {
|
||||
apiGatewaySnapshot *configSnapshotAPIGateway
|
||||
expected configSnapshotIngressGateway
|
||||
}{
|
||||
"default": {
|
||||
apiGatewaySnapshot: &configSnapshotAPIGateway{
|
||||
Listeners: map[string]structs.APIGatewayListener{},
|
||||
},
|
||||
expected: configSnapshotIngressGateway{
|
||||
GatewayConfigLoaded: true,
|
||||
ConfigSnapshotUpstreams: ConfigSnapshotUpstreams{
|
||||
PeerUpstreamEndpoints: watch.NewMap[UpstreamID, structs.CheckServiceNodes](),
|
||||
WatchedLocalGWEndpoints: watch.NewMap[string, structs.CheckServiceNodes](),
|
||||
UpstreamPeerTrustBundles: watch.NewMap[string, *pbpeering.PeeringTrustBundle](),
|
||||
DiscoveryChain: map[UpstreamID]*structs.CompiledDiscoveryChain{},
|
||||
},
|
||||
Listeners: map[IngressListenerKey]structs.IngressListener{},
|
||||
Defaults: structs.IngressServiceConfig{},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
actual, err := tc.apiGatewaySnapshot.ToIngress("dc1")
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, tc.expected, actual)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -206,7 +206,8 @@ type HTTPQueryMatch struct {
|
|||
// HTTPFilters specifies a list of filters used to modify a request
|
||||
// before it is routed to an upstream.
|
||||
type HTTPFilters struct {
|
||||
Headers []HTTPHeaderFilter
|
||||
Headers []HTTPHeaderFilter
|
||||
URLRewrites []URLRewrite
|
||||
}
|
||||
|
||||
// HTTPHeaderFilter specifies how HTTP headers should be modified.
|
||||
|
@ -216,6 +217,10 @@ type HTTPHeaderFilter struct {
|
|||
Set map[string]string
|
||||
}
|
||||
|
||||
type URLRewrite struct {
|
||||
Path string
|
||||
}
|
||||
|
||||
// HTTPRouteRule specifies the routing rules used to determine what upstream
|
||||
// service an HTTP request is routed to.
|
||||
type HTTPRouteRule struct {
|
||||
|
|
|
@ -329,6 +329,10 @@ func (o *HTTPRouteConfigEntry) DeepCopy() *HTTPRouteConfigEntry {
|
|||
}
|
||||
}
|
||||
}
|
||||
if o.Rules[i2].Filters.URLRewrites != nil {
|
||||
cp.Rules[i2].Filters.URLRewrites = make([]URLRewrite, len(o.Rules[i2].Filters.URLRewrites))
|
||||
copy(cp.Rules[i2].Filters.URLRewrites, o.Rules[i2].Filters.URLRewrites)
|
||||
}
|
||||
if o.Rules[i2].Matches != nil {
|
||||
cp.Rules[i2].Matches = make([]HTTPMatch, len(o.Rules[i2].Matches))
|
||||
copy(cp.Rules[i2].Matches, o.Rules[i2].Matches)
|
||||
|
@ -369,6 +373,10 @@ func (o *HTTPRouteConfigEntry) DeepCopy() *HTTPRouteConfigEntry {
|
|||
}
|
||||
}
|
||||
}
|
||||
if o.Rules[i2].Services[i4].Filters.URLRewrites != nil {
|
||||
cp.Rules[i2].Services[i4].Filters.URLRewrites = make([]URLRewrite, len(o.Rules[i2].Services[i4].Filters.URLRewrites))
|
||||
copy(cp.Rules[i2].Services[i4].Filters.URLRewrites, o.Rules[i2].Services[i4].Filters.URLRewrites)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -63,7 +63,11 @@ func (s *ResourceGenerator) clustersFromSnapshot(cfgSnap *proxycfg.ConfigSnapsho
|
|||
return res, nil
|
||||
case structs.ServiceKindAPIGateway:
|
||||
// TODO Find a cleaner solution, can't currently pass unexported property types
|
||||
cfgSnap.IngressGateway = cfgSnap.APIGateway.ToIngress()
|
||||
var err error
|
||||
cfgSnap.IngressGateway, err = cfgSnap.APIGateway.ToIngress(cfgSnap.Datacenter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
res, err := s.clustersFromSnapshotIngressGateway(cfgSnap)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -39,7 +39,11 @@ func (s *ResourceGenerator) endpointsFromSnapshot(cfgSnap *proxycfg.ConfigSnapsh
|
|||
return s.endpointsFromSnapshotIngressGateway(cfgSnap)
|
||||
case structs.ServiceKindAPIGateway:
|
||||
// TODO Find a cleaner solution, can't currently pass unexported property types
|
||||
cfgSnap.IngressGateway = cfgSnap.APIGateway.ToIngress()
|
||||
var err error
|
||||
cfgSnap.IngressGateway, err = cfgSnap.APIGateway.ToIngress(cfgSnap.Datacenter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return s.endpointsFromSnapshotIngressGateway(cfgSnap)
|
||||
default:
|
||||
return nil, fmt.Errorf("Invalid service kind: %v", cfgSnap.Kind)
|
||||
|
|
|
@ -850,7 +850,11 @@ func (s *ResourceGenerator) listenersFromSnapshotGateway(cfgSnap *proxycfg.Confi
|
|||
}
|
||||
case structs.ServiceKindAPIGateway:
|
||||
// TODO Find a cleaner solution, can't currently pass unexported property types
|
||||
cfgSnap.IngressGateway = cfgSnap.APIGateway.ToIngress()
|
||||
var err error
|
||||
cfgSnap.IngressGateway, err = cfgSnap.APIGateway.ToIngress(cfgSnap.Datacenter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
listeners, err := s.makeIngressGatewayListeners(a.Address, cfgSnap)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -34,7 +34,11 @@ func (s *ResourceGenerator) routesFromSnapshot(cfgSnap *proxycfg.ConfigSnapshot)
|
|||
return s.routesForIngressGateway(cfgSnap)
|
||||
case structs.ServiceKindAPIGateway:
|
||||
// TODO Find a cleaner solution, can't currently pass unexported property types
|
||||
cfgSnap.IngressGateway = cfgSnap.APIGateway.ToIngress()
|
||||
var err error
|
||||
cfgSnap.IngressGateway, err = cfgSnap.APIGateway.ToIngress(cfgSnap.Datacenter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return s.routesForIngressGateway(cfgSnap)
|
||||
case structs.ServiceKindTerminatingGateway:
|
||||
return s.routesForTerminatingGateway(cfgSnap)
|
||||
|
|
|
@ -364,6 +364,14 @@ func HTTPFiltersToStructs(s *HTTPFilters, t *structs.HTTPFilters) {
|
|||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
t.URLRewrites = make([]structs.URLRewrite, len(s.URLRewrites))
|
||||
for i := range s.URLRewrites {
|
||||
if s.URLRewrites[i] != nil {
|
||||
URLRewriteToStructs(s.URLRewrites[i], &t.URLRewrites[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
func HTTPFiltersFromStructs(t *structs.HTTPFilters, s *HTTPFilters) {
|
||||
if s == nil {
|
||||
|
@ -379,6 +387,16 @@ func HTTPFiltersFromStructs(t *structs.HTTPFilters, s *HTTPFilters) {
|
|||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
s.URLRewrites = make([]*URLRewrite, len(t.URLRewrites))
|
||||
for i := range t.URLRewrites {
|
||||
{
|
||||
var x URLRewrite
|
||||
URLRewriteFromStructs(&t.URLRewrites[i], &x)
|
||||
s.URLRewrites[i] = &x
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
func HTTPHeaderFilterToStructs(s *HTTPHeaderFilter, t *structs.HTTPHeaderFilter) {
|
||||
if s == nil {
|
||||
|
@ -1654,6 +1672,18 @@ func TransparentProxyMeshConfigFromStructs(t *structs.TransparentProxyMeshConfig
|
|||
}
|
||||
s.MeshDestinationsOnly = t.MeshDestinationsOnly
|
||||
}
|
||||
func URLRewriteToStructs(s *URLRewrite, t *structs.URLRewrite) {
|
||||
if s == nil {
|
||||
return
|
||||
}
|
||||
t.Path = s.Path
|
||||
}
|
||||
func URLRewriteFromStructs(t *structs.URLRewrite, s *URLRewrite) {
|
||||
if s == nil {
|
||||
return
|
||||
}
|
||||
s.Path = t.Path
|
||||
}
|
||||
func UpstreamConfigToStructs(s *UpstreamConfig, t *structs.UpstreamConfig) {
|
||||
if s == nil {
|
||||
return
|
||||
|
|
|
@ -567,6 +567,16 @@ func (msg *HTTPFilters) UnmarshalBinary(b []byte) error {
|
|||
return proto.Unmarshal(b, msg)
|
||||
}
|
||||
|
||||
// MarshalBinary implements encoding.BinaryMarshaler
|
||||
func (msg *URLRewrite) MarshalBinary() ([]byte, error) {
|
||||
return proto.Marshal(msg)
|
||||
}
|
||||
|
||||
// UnmarshalBinary implements encoding.BinaryUnmarshaler
|
||||
func (msg *URLRewrite) UnmarshalBinary(b []byte) error {
|
||||
return proto.Unmarshal(b, msg)
|
||||
}
|
||||
|
||||
// MarshalBinary implements encoding.BinaryMarshaler
|
||||
func (msg *HTTPHeaderFilter) MarshalBinary() ([]byte, error) {
|
||||
return proto.Marshal(msg)
|
||||
|
|
|
@ -4902,7 +4902,8 @@ type HTTPFilters struct {
|
|||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Headers []*HTTPHeaderFilter `protobuf:"bytes,1,rep,name=Headers,proto3" json:"Headers,omitempty"`
|
||||
Headers []*HTTPHeaderFilter `protobuf:"bytes,1,rep,name=Headers,proto3" json:"Headers,omitempty"`
|
||||
URLRewrites []*URLRewrite `protobuf:"bytes,2,rep,name=URLRewrites,proto3" json:"URLRewrites,omitempty"`
|
||||
}
|
||||
|
||||
func (x *HTTPFilters) Reset() {
|
||||
|
@ -4944,6 +4945,65 @@ func (x *HTTPFilters) GetHeaders() []*HTTPHeaderFilter {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (x *HTTPFilters) GetURLRewrites() []*URLRewrite {
|
||||
if x != nil {
|
||||
return x.URLRewrites
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// mog annotation:
|
||||
//
|
||||
// target=github.com/hashicorp/consul/agent/structs.URLRewrite
|
||||
// output=config_entry.gen.go
|
||||
// name=Structs
|
||||
type URLRewrite struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Path string `protobuf:"bytes,1,opt,name=Path,proto3" json:"Path,omitempty"`
|
||||
}
|
||||
|
||||
func (x *URLRewrite) Reset() {
|
||||
*x = URLRewrite{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[56]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *URLRewrite) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*URLRewrite) ProtoMessage() {}
|
||||
|
||||
func (x *URLRewrite) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[56]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use URLRewrite.ProtoReflect.Descriptor instead.
|
||||
func (*URLRewrite) Descriptor() ([]byte, []int) {
|
||||
return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{56}
|
||||
}
|
||||
|
||||
func (x *URLRewrite) GetPath() string {
|
||||
if x != nil {
|
||||
return x.Path
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// mog annotation:
|
||||
//
|
||||
// target=github.com/hashicorp/consul/agent/structs.HTTPHeaderFilter
|
||||
|
@ -4962,7 +5022,7 @@ type HTTPHeaderFilter struct {
|
|||
func (x *HTTPHeaderFilter) Reset() {
|
||||
*x = HTTPHeaderFilter{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[56]
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[57]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -4975,7 +5035,7 @@ func (x *HTTPHeaderFilter) String() string {
|
|||
func (*HTTPHeaderFilter) ProtoMessage() {}
|
||||
|
||||
func (x *HTTPHeaderFilter) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[56]
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[57]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -4988,7 +5048,7 @@ func (x *HTTPHeaderFilter) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use HTTPHeaderFilter.ProtoReflect.Descriptor instead.
|
||||
func (*HTTPHeaderFilter) Descriptor() ([]byte, []int) {
|
||||
return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{56}
|
||||
return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{57}
|
||||
}
|
||||
|
||||
func (x *HTTPHeaderFilter) GetAdd() map[string]string {
|
||||
|
@ -5033,7 +5093,7 @@ type HTTPService struct {
|
|||
func (x *HTTPService) Reset() {
|
||||
*x = HTTPService{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[57]
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[58]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -5046,7 +5106,7 @@ func (x *HTTPService) String() string {
|
|||
func (*HTTPService) ProtoMessage() {}
|
||||
|
||||
func (x *HTTPService) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[57]
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[58]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -5059,7 +5119,7 @@ func (x *HTTPService) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use HTTPService.ProtoReflect.Descriptor instead.
|
||||
func (*HTTPService) Descriptor() ([]byte, []int) {
|
||||
return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{57}
|
||||
return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{58}
|
||||
}
|
||||
|
||||
func (x *HTTPService) GetName() string {
|
||||
|
@ -5110,7 +5170,7 @@ type TCPRoute struct {
|
|||
func (x *TCPRoute) Reset() {
|
||||
*x = TCPRoute{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[58]
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[59]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -5123,7 +5183,7 @@ func (x *TCPRoute) String() string {
|
|||
func (*TCPRoute) ProtoMessage() {}
|
||||
|
||||
func (x *TCPRoute) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[58]
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[59]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -5136,7 +5196,7 @@ func (x *TCPRoute) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use TCPRoute.ProtoReflect.Descriptor instead.
|
||||
func (*TCPRoute) Descriptor() ([]byte, []int) {
|
||||
return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{58}
|
||||
return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{59}
|
||||
}
|
||||
|
||||
func (x *TCPRoute) GetMeta() map[string]string {
|
||||
|
@ -5187,7 +5247,7 @@ type TCPService struct {
|
|||
func (x *TCPService) Reset() {
|
||||
*x = TCPService{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[59]
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[60]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -5200,7 +5260,7 @@ func (x *TCPService) String() string {
|
|||
func (*TCPService) ProtoMessage() {}
|
||||
|
||||
func (x *TCPService) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[59]
|
||||
mi := &file_proto_pbconfigentry_config_entry_proto_msgTypes[60]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -5213,7 +5273,7 @@ func (x *TCPService) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use TCPService.ProtoReflect.Descriptor instead.
|
||||
func (*TCPService) Descriptor() ([]byte, []int) {
|
||||
return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{59}
|
||||
return file_proto_pbconfigentry_config_entry_proto_rawDescGZIP(), []int{60}
|
||||
}
|
||||
|
||||
func (x *TCPService) GetName() string {
|
||||
|
@ -6196,180 +6256,188 @@ var file_proto_pbconfigentry_config_entry_proto_rawDesc = []byte{
|
|||
0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x4d, 0x61, 0x74,
|
||||
0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18,
|
||||
0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x60, 0x0a, 0x0b,
|
||||
0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x07, 0x48,
|
||||
0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x68,
|
||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
||||
0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65,
|
||||
0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46,
|
||||
0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, 0xc2,
|
||||
0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c,
|
||||
0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x03, 0x41, 0x64, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
|
||||
0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e,
|
||||
0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e,
|
||||
0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61,
|
||||
0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74,
|
||||
0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76,
|
||||
0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12,
|
||||
0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68,
|
||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
||||
0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65,
|
||||
0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46,
|
||||
0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03,
|
||||
0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
|
||||
0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
|
||||
0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x36, 0x0a, 0x08, 0x53,
|
||||
0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
|
||||
0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb5, 0x01, 0x0a,
|
||||
0x0b, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x07,
|
||||
0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e,
|
||||
0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c,
|
||||
0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
|
||||
0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72,
|
||||
0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12,
|
||||
0x53, 0x0a, 0x0b, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02,
|
||||
0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70,
|
||||
0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
|
||||
0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x55, 0x52, 0x4c,
|
||||
0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x0b, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72,
|
||||
0x69, 0x74, 0x65, 0x73, 0x22, 0x20, 0x0a, 0x0a, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x77, 0x72, 0x69,
|
||||
0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x22, 0xc2, 0x02, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x48,
|
||||
0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x03, 0x41,
|
||||
0x64, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69,
|
||||
0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65,
|
||||
0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79,
|
||||
0x2e, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65,
|
||||
0x72, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x41, 0x64, 0x64, 0x12,
|
||||
0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52,
|
||||
0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x52, 0x0a, 0x03, 0x53, 0x65, 0x74, 0x18, 0x03,
|
||||
0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70,
|
||||
0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
|
||||
0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54,
|
||||
0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x65,
|
||||
0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x53, 0x65, 0x74, 0x1a, 0x36, 0x0a, 0x08, 0x41,
|
||||
0x64, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c,
|
||||
0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,
|
||||
0x02, 0x38, 0x01, 0x22, 0xe1, 0x01, 0x0a, 0x0b, 0x48, 0x54, 0x54, 0x50, 0x53, 0x65, 0x72, 0x76,
|
||||
0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68,
|
||||
0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12,
|
||||
0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
|
||||
0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e,
|
||||
0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e,
|
||||
0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c,
|
||||
0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a,
|
||||
0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18,
|
||||
0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72,
|
||||
0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
|
||||
0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72,
|
||||
0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72,
|
||||
0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xfc, 0x02, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x52,
|
||||
0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03,
|
||||
0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63,
|
||||
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63,
|
||||
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x52, 0x6f,
|
||||
0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d,
|
||||
0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02,
|
||||
0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70,
|
||||
0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
|
||||
0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73,
|
||||
0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07,
|
||||
0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69,
|
||||
0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68,
|
||||
0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74,
|
||||
0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72,
|
||||
0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65,
|
||||
0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
|
||||
0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f,
|
||||
0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
|
||||
0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53,
|
||||
0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a,
|
||||
0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
|
||||
0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,
|
||||
0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,
|
||||
0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x92, 0x01, 0x0a, 0x0a, 0x54, 0x43, 0x50, 0x53, 0x65,
|
||||
0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x57, 0x65, 0x69,
|
||||
0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68,
|
||||
0x74, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d,
|
||||
0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68,
|
||||
0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74,
|
||||
0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74,
|
||||
0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74,
|
||||
0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x2a, 0xfd, 0x01, 0x0a, 0x04,
|
||||
0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x4b, 0x69, 0x6e, 0x64, 0x55, 0x6e, 0x6b, 0x6e,
|
||||
0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73,
|
||||
0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e,
|
||||
0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72,
|
||||
0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73,
|
||||
0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69,
|
||||
0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69,
|
||||
0x6f, 0x6e, 0x73, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72,
|
||||
0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x10, 0x05, 0x12, 0x19,
|
||||
0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74,
|
||||
0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e,
|
||||
0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x07, 0x12, 0x17, 0x0a,
|
||||
0x13, 0x4b, 0x69, 0x6e, 0x64, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74,
|
||||
0x65, 0x77, 0x61, 0x79, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x54,
|
||||
0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x4b, 0x69, 0x6e,
|
||||
0x64, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10, 0x0a, 0x2a, 0x26, 0x0a, 0x0f, 0x49,
|
||||
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08,
|
||||
0x0a, 0x04, 0x44, 0x65, 0x6e, 0x79, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x6c, 0x6c, 0x6f,
|
||||
0x77, 0x10, 0x01, 0x2a, 0x21, 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e,
|
||||
0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x6f,
|
||||
0x6e, 0x73, 0x75, 0x6c, 0x10, 0x00, 0x2a, 0x50, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d,
|
||||
0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65,
|
||||
0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x72, 0x6f,
|
||||
0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e,
|
||||
0x74, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65,
|
||||
0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, 0x2a, 0x7b, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x68,
|
||||
0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d,
|
||||
0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65,
|
||||
0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x68, 0x47,
|
||||
0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x01,
|
||||
0x12, 0x18, 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d,
|
||||
0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x65,
|
||||
0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x6d,
|
||||
0x6f, 0x74, 0x65, 0x10, 0x03, 0x2a, 0x4f, 0x0a, 0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65,
|
||||
0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f,
|
||||
0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50,
|
||||
0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x17, 0x0a,
|
||||
0x13, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
|
||||
0x6c, 0x54, 0x43, 0x50, 0x10, 0x01, 0x2a, 0x92, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4d,
|
||||
0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54,
|
||||
0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x41, 0x6c, 0x6c,
|
||||
0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d,
|
||||
0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x10, 0x01, 0x12, 0x19,
|
||||
0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f,
|
||||
0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54,
|
||||
0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x47, 0x65, 0x74, 0x10,
|
||||
0x03, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65,
|
||||
0x74, 0x68, 0x6f, 0x64, 0x48, 0x65, 0x61, 0x64, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54,
|
||||
0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x73, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61,
|
||||
0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x10, 0x06,
|
||||
0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74,
|
||||
0x68, 0x6f, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54,
|
||||
0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x75, 0x74, 0x10,
|
||||
0x08, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65,
|
||||
0x74, 0x68, 0x6f, 0x64, 0x54, 0x72, 0x61, 0x63, 0x65, 0x10, 0x09, 0x2a, 0xa7, 0x01, 0x0a, 0x13,
|
||||
0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54,
|
||||
0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65,
|
||||
0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a,
|
||||
0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68,
|
||||
0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50,
|
||||
0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65,
|
||||
0x6e, 0x74, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64,
|
||||
0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78,
|
||||
0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54,
|
||||
0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x75, 0x66,
|
||||
0x66, 0x69, 0x78, 0x10, 0x04, 0x2a, 0x68, 0x0a, 0x11, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74,
|
||||
0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54,
|
||||
0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74,
|
||||
0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61,
|
||||
0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x48,
|
||||
0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75,
|
||||
0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a,
|
||||
0x6d, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63,
|
||||
0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65,
|
||||
0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19,
|
||||
0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68,
|
||||
0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x48, 0x54, 0x54,
|
||||
0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c,
|
||||
0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x42, 0xa6,
|
||||
0x02, 0x0a, 0x29, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70,
|
||||
0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
|
||||
0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x10, 0x43, 0x6f,
|
||||
0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
|
||||
0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73,
|
||||
0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72,
|
||||
0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72,
|
||||
0x79, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43, 0xaa, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69,
|
||||
0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65,
|
||||
0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79,
|
||||
0xca, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e,
|
||||
0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e,
|
||||
0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xe2, 0x02, 0x31, 0x48, 0x61, 0x73, 0x68, 0x69,
|
||||
0x02, 0x38, 0x01, 0x1a, 0x36, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
|
||||
0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
|
||||
0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe1, 0x01, 0x0a, 0x0b,
|
||||
0x48, 0x54, 0x54, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e,
|
||||
0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12,
|
||||
0x16, 0x0a, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
|
||||
0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x46, 0x69, 0x6c, 0x74, 0x65,
|
||||
0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69,
|
||||
0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65,
|
||||
0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79,
|
||||
0x2e, 0x48, 0x54, 0x54, 0x50, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x46, 0x69,
|
||||
0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72,
|
||||
0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e,
|
||||
0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c,
|
||||
0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
|
||||
0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52,
|
||||
0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x22,
|
||||
0xfc, 0x02, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04,
|
||||
0x4d, 0x65, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x68, 0x61, 0x73,
|
||||
0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e,
|
||||
0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74,
|
||||
0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61,
|
||||
0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x52, 0x0a, 0x07, 0x50,
|
||||
0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x68,
|
||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
||||
0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65,
|
||||
0x6e, 0x74, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66,
|
||||
0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12,
|
||||
0x4d, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
|
||||
0x0b, 0x32, 0x31, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f,
|
||||
0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f,
|
||||
0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72,
|
||||
0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x45,
|
||||
0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d,
|
||||
0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75,
|
||||
0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
|
||||
0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53,
|
||||
0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74,
|
||||
0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x92,
|
||||
0x01, 0x0a, 0x0a, 0x54, 0x43, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a,
|
||||
0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d,
|
||||
0x65, 0x12, 0x16, 0x0a, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
|
||||
0x05, 0x52, 0x06, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x58, 0x0a, 0x0e, 0x45, 0x6e, 0x74,
|
||||
0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28,
|
||||
0x0b, 0x32, 0x30, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f,
|
||||
0x6e, 0x73, 0x75, 0x6c, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f,
|
||||
0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d,
|
||||
0x65, 0x74, 0x61, 0x52, 0x0e, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x4d,
|
||||
0x65, 0x74, 0x61, 0x2a, 0xfd, 0x01, 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0f, 0x0a, 0x0b,
|
||||
0x4b, 0x69, 0x6e, 0x64, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a,
|
||||
0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x10,
|
||||
0x01, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
|
||||
0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x4b, 0x69,
|
||||
0x6e, 0x64, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79,
|
||||
0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
|
||||
0x65, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x04, 0x12, 0x17, 0x0a,
|
||||
0x13, 0x4b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61,
|
||||
0x75, 0x6c, 0x74, 0x73, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x4b, 0x69, 0x6e, 0x64, 0x49, 0x6e,
|
||||
0x6c, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x10,
|
||||
0x06, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65,
|
||||
0x77, 0x61, 0x79, 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x4b, 0x69, 0x6e, 0x64, 0x42, 0x6f, 0x75,
|
||||
0x6e, 0x64, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x10, 0x08, 0x12, 0x11,
|
||||
0x0a, 0x0d, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x54, 0x54, 0x50, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x10,
|
||||
0x09, 0x12, 0x10, 0x0a, 0x0c, 0x4b, 0x69, 0x6e, 0x64, 0x54, 0x43, 0x50, 0x52, 0x6f, 0x75, 0x74,
|
||||
0x65, 0x10, 0x0a, 0x2a, 0x26, 0x0a, 0x0f, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e,
|
||||
0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x65, 0x6e, 0x79, 0x10, 0x00,
|
||||
0x12, 0x09, 0x0a, 0x05, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x10, 0x01, 0x2a, 0x21, 0x0a, 0x13, 0x49,
|
||||
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79,
|
||||
0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x10, 0x00, 0x2a, 0x50,
|
||||
0x0a, 0x09, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x50,
|
||||
0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10,
|
||||
0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x54, 0x72,
|
||||
0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50,
|
||||
0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x10, 0x02,
|
||||
0x2a, 0x7b, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d,
|
||||
0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77,
|
||||
0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x10, 0x00, 0x12,
|
||||
0x17, 0x0a, 0x13, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f,
|
||||
0x64, 0x65, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x65, 0x73, 0x68,
|
||||
0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c,
|
||||
0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x4d, 0x65, 0x73, 0x68, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61,
|
||||
0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x10, 0x03, 0x2a, 0x4f, 0x0a,
|
||||
0x1a, 0x41, 0x50, 0x49, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x65,
|
||||
0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x4c,
|
||||
0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48,
|
||||
0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65,
|
||||
0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x54, 0x43, 0x50, 0x10, 0x01, 0x2a, 0x92,
|
||||
0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68,
|
||||
0x6f, 0x64, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d,
|
||||
0x65, 0x74, 0x68, 0x6f, 0x64, 0x41, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54,
|
||||
0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x6f, 0x6e,
|
||||
0x6e, 0x65, 0x63, 0x74, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61,
|
||||
0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10,
|
||||
0x02, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65,
|
||||
0x74, 0x68, 0x6f, 0x64, 0x47, 0x65, 0x74, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54,
|
||||
0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x48, 0x65, 0x61, 0x64,
|
||||
0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d,
|
||||
0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x05, 0x12, 0x18,
|
||||
0x0a, 0x14, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f,
|
||||
0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50,
|
||||
0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x10,
|
||||
0x07, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65,
|
||||
0x74, 0x68, 0x6f, 0x64, 0x50, 0x75, 0x74, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x54, 0x54,
|
||||
0x50, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x54, 0x72, 0x61, 0x63,
|
||||
0x65, 0x10, 0x09, 0x2a, 0xa7, 0x01, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64,
|
||||
0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x48,
|
||||
0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78,
|
||||
0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61,
|
||||
0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x10, 0x01,
|
||||
0x12, 0x1a, 0x0a, 0x16, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61,
|
||||
0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20,
|
||||
0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52,
|
||||
0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
|
||||
0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72,
|
||||
0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x10, 0x04, 0x2a, 0x68, 0x0a,
|
||||
0x11, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79,
|
||||
0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61,
|
||||
0x74, 0x63, 0x68, 0x45, 0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x54,
|
||||
0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69,
|
||||
0x78, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x54, 0x54, 0x50, 0x50, 0x61, 0x74, 0x68, 0x4d,
|
||||
0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65,
|
||||
0x73, 0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x2a, 0x6d, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x51,
|
||||
0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a,
|
||||
0x13, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45,
|
||||
0x78, 0x61, 0x63, 0x74, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75,
|
||||
0x65, 0x72, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x10,
|
||||
0x01, 0x12, 0x23, 0x0a, 0x1f, 0x48, 0x54, 0x54, 0x50, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x61,
|
||||
0x74, 0x63, 0x68, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73,
|
||||
0x73, 0x69, 0x6f, 0x6e, 0x10, 0x03, 0x42, 0xa6, 0x02, 0x0a, 0x29, 0x63, 0x6f, 0x6d, 0x2e, 0x68,
|
||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2e,
|
||||
0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65,
|
||||
0x6e, 0x74, 0x72, 0x79, 0x42, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72,
|
||||
0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
|
||||
0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x63,
|
||||
0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x62, 0x63, 0x6f,
|
||||
0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xa2, 0x02, 0x04, 0x48, 0x43, 0x49, 0x43,
|
||||
0xaa, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2e, 0x43, 0x6f, 0x6e,
|
||||
0x73, 0x75, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x43, 0x6f, 0x6e,
|
||||
0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0xca, 0x02, 0x25, 0x48, 0x61, 0x73, 0x68, 0x69,
|
||||
0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65,
|
||||
0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79,
|
||||
0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x28, 0x48,
|
||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c,
|
||||
0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x66,
|
||||
0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
0xe2, 0x02, 0x31, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x5c, 0x43, 0x6f, 0x6e,
|
||||
0x73, 0x75, 0x6c, 0x5c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5c, 0x43, 0x6f, 0x6e,
|
||||
0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61,
|
||||
0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x28, 0x48, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70,
|
||||
0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e,
|
||||
0x61, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x62,
|
||||
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
@ -6385,7 +6453,7 @@ func file_proto_pbconfigentry_config_entry_proto_rawDescGZIP() []byte {
|
|||
}
|
||||
|
||||
var file_proto_pbconfigentry_config_entry_proto_enumTypes = make([]protoimpl.EnumInfo, 10)
|
||||
var file_proto_pbconfigentry_config_entry_proto_msgTypes = make([]protoimpl.MessageInfo, 78)
|
||||
var file_proto_pbconfigentry_config_entry_proto_msgTypes = make([]protoimpl.MessageInfo, 79)
|
||||
var file_proto_pbconfigentry_config_entry_proto_goTypes = []interface{}{
|
||||
(Kind)(0), // 0: hashicorp.consul.internal.configentry.Kind
|
||||
(IntentionAction)(0), // 1: hashicorp.consul.internal.configentry.IntentionAction
|
||||
|
@ -6453,38 +6521,39 @@ var file_proto_pbconfigentry_config_entry_proto_goTypes = []interface{}{
|
|||
(*HTTPPathMatch)(nil), // 63: hashicorp.consul.internal.configentry.HTTPPathMatch
|
||||
(*HTTPQueryMatch)(nil), // 64: hashicorp.consul.internal.configentry.HTTPQueryMatch
|
||||
(*HTTPFilters)(nil), // 65: hashicorp.consul.internal.configentry.HTTPFilters
|
||||
(*HTTPHeaderFilter)(nil), // 66: hashicorp.consul.internal.configentry.HTTPHeaderFilter
|
||||
(*HTTPService)(nil), // 67: hashicorp.consul.internal.configentry.HTTPService
|
||||
(*TCPRoute)(nil), // 68: hashicorp.consul.internal.configentry.TCPRoute
|
||||
(*TCPService)(nil), // 69: hashicorp.consul.internal.configentry.TCPService
|
||||
nil, // 70: hashicorp.consul.internal.configentry.MeshConfig.MetaEntry
|
||||
nil, // 71: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry
|
||||
nil, // 72: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry
|
||||
nil, // 73: hashicorp.consul.internal.configentry.ServiceResolver.MetaEntry
|
||||
nil, // 74: hashicorp.consul.internal.configentry.IngressGateway.MetaEntry
|
||||
nil, // 75: hashicorp.consul.internal.configentry.IngressService.MetaEntry
|
||||
nil, // 76: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry
|
||||
nil, // 77: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry
|
||||
nil, // 78: hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry
|
||||
nil, // 79: hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry
|
||||
nil, // 80: hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry
|
||||
nil, // 81: hashicorp.consul.internal.configentry.APIGateway.MetaEntry
|
||||
nil, // 82: hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry
|
||||
nil, // 83: hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry
|
||||
nil, // 84: hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry
|
||||
nil, // 85: hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry
|
||||
nil, // 86: hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry
|
||||
nil, // 87: hashicorp.consul.internal.configentry.TCPRoute.MetaEntry
|
||||
(*pbcommon.EnterpriseMeta)(nil), // 88: hashicorp.consul.internal.common.EnterpriseMeta
|
||||
(*pbcommon.RaftIndex)(nil), // 89: hashicorp.consul.internal.common.RaftIndex
|
||||
(*durationpb.Duration)(nil), // 90: google.protobuf.Duration
|
||||
(*timestamppb.Timestamp)(nil), // 91: google.protobuf.Timestamp
|
||||
(*pbcommon.EnvoyExtension)(nil), // 92: hashicorp.consul.internal.common.EnvoyExtension
|
||||
(*URLRewrite)(nil), // 66: hashicorp.consul.internal.configentry.URLRewrite
|
||||
(*HTTPHeaderFilter)(nil), // 67: hashicorp.consul.internal.configentry.HTTPHeaderFilter
|
||||
(*HTTPService)(nil), // 68: hashicorp.consul.internal.configentry.HTTPService
|
||||
(*TCPRoute)(nil), // 69: hashicorp.consul.internal.configentry.TCPRoute
|
||||
(*TCPService)(nil), // 70: hashicorp.consul.internal.configentry.TCPService
|
||||
nil, // 71: hashicorp.consul.internal.configentry.MeshConfig.MetaEntry
|
||||
nil, // 72: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry
|
||||
nil, // 73: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry
|
||||
nil, // 74: hashicorp.consul.internal.configentry.ServiceResolver.MetaEntry
|
||||
nil, // 75: hashicorp.consul.internal.configentry.IngressGateway.MetaEntry
|
||||
nil, // 76: hashicorp.consul.internal.configentry.IngressService.MetaEntry
|
||||
nil, // 77: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry
|
||||
nil, // 78: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry
|
||||
nil, // 79: hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry
|
||||
nil, // 80: hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry
|
||||
nil, // 81: hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry
|
||||
nil, // 82: hashicorp.consul.internal.configentry.APIGateway.MetaEntry
|
||||
nil, // 83: hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry
|
||||
nil, // 84: hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry
|
||||
nil, // 85: hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry
|
||||
nil, // 86: hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry
|
||||
nil, // 87: hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry
|
||||
nil, // 88: hashicorp.consul.internal.configentry.TCPRoute.MetaEntry
|
||||
(*pbcommon.EnterpriseMeta)(nil), // 89: hashicorp.consul.internal.common.EnterpriseMeta
|
||||
(*pbcommon.RaftIndex)(nil), // 90: hashicorp.consul.internal.common.RaftIndex
|
||||
(*durationpb.Duration)(nil), // 91: google.protobuf.Duration
|
||||
(*timestamppb.Timestamp)(nil), // 92: google.protobuf.Timestamp
|
||||
(*pbcommon.EnvoyExtension)(nil), // 93: hashicorp.consul.internal.common.EnvoyExtension
|
||||
}
|
||||
var file_proto_pbconfigentry_config_entry_proto_depIdxs = []int32{
|
||||
0, // 0: hashicorp.consul.internal.configentry.ConfigEntry.Kind:type_name -> hashicorp.consul.internal.configentry.Kind
|
||||
88, // 1: hashicorp.consul.internal.configentry.ConfigEntry.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
89, // 2: hashicorp.consul.internal.configentry.ConfigEntry.RaftIndex:type_name -> hashicorp.consul.internal.common.RaftIndex
|
||||
89, // 1: hashicorp.consul.internal.configentry.ConfigEntry.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
90, // 2: hashicorp.consul.internal.configentry.ConfigEntry.RaftIndex:type_name -> hashicorp.consul.internal.common.RaftIndex
|
||||
11, // 3: hashicorp.consul.internal.configentry.ConfigEntry.MeshConfig:type_name -> hashicorp.consul.internal.configentry.MeshConfig
|
||||
17, // 4: hashicorp.consul.internal.configentry.ConfigEntry.ServiceResolver:type_name -> hashicorp.consul.internal.configentry.ServiceResolver
|
||||
27, // 5: hashicorp.consul.internal.configentry.ConfigEntry.IngressGateway:type_name -> hashicorp.consul.internal.configentry.IngressGateway
|
||||
|
@ -6492,30 +6561,30 @@ var file_proto_pbconfigentry_config_entry_proto_depIdxs = []int32{
|
|||
40, // 7: hashicorp.consul.internal.configentry.ConfigEntry.ServiceDefaults:type_name -> hashicorp.consul.internal.configentry.ServiceDefaults
|
||||
50, // 8: hashicorp.consul.internal.configentry.ConfigEntry.APIGateway:type_name -> hashicorp.consul.internal.configentry.APIGateway
|
||||
56, // 9: hashicorp.consul.internal.configentry.ConfigEntry.BoundAPIGateway:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway
|
||||
68, // 10: hashicorp.consul.internal.configentry.ConfigEntry.TCPRoute:type_name -> hashicorp.consul.internal.configentry.TCPRoute
|
||||
69, // 10: hashicorp.consul.internal.configentry.ConfigEntry.TCPRoute:type_name -> hashicorp.consul.internal.configentry.TCPRoute
|
||||
59, // 11: hashicorp.consul.internal.configentry.ConfigEntry.HTTPRoute:type_name -> hashicorp.consul.internal.configentry.HTTPRoute
|
||||
12, // 12: hashicorp.consul.internal.configentry.MeshConfig.TransparentProxy:type_name -> hashicorp.consul.internal.configentry.TransparentProxyMeshConfig
|
||||
13, // 13: hashicorp.consul.internal.configentry.MeshConfig.TLS:type_name -> hashicorp.consul.internal.configentry.MeshTLSConfig
|
||||
15, // 14: hashicorp.consul.internal.configentry.MeshConfig.HTTP:type_name -> hashicorp.consul.internal.configentry.MeshHTTPConfig
|
||||
70, // 15: hashicorp.consul.internal.configentry.MeshConfig.Meta:type_name -> hashicorp.consul.internal.configentry.MeshConfig.MetaEntry
|
||||
71, // 15: hashicorp.consul.internal.configentry.MeshConfig.Meta:type_name -> hashicorp.consul.internal.configentry.MeshConfig.MetaEntry
|
||||
16, // 16: hashicorp.consul.internal.configentry.MeshConfig.Peering:type_name -> hashicorp.consul.internal.configentry.PeeringMeshConfig
|
||||
14, // 17: hashicorp.consul.internal.configentry.MeshTLSConfig.Incoming:type_name -> hashicorp.consul.internal.configentry.MeshDirectionalTLSConfig
|
||||
14, // 18: hashicorp.consul.internal.configentry.MeshTLSConfig.Outgoing:type_name -> hashicorp.consul.internal.configentry.MeshDirectionalTLSConfig
|
||||
71, // 19: hashicorp.consul.internal.configentry.ServiceResolver.Subsets:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry
|
||||
72, // 19: hashicorp.consul.internal.configentry.ServiceResolver.Subsets:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry
|
||||
19, // 20: hashicorp.consul.internal.configentry.ServiceResolver.Redirect:type_name -> hashicorp.consul.internal.configentry.ServiceResolverRedirect
|
||||
72, // 21: hashicorp.consul.internal.configentry.ServiceResolver.Failover:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry
|
||||
90, // 22: hashicorp.consul.internal.configentry.ServiceResolver.ConnectTimeout:type_name -> google.protobuf.Duration
|
||||
73, // 21: hashicorp.consul.internal.configentry.ServiceResolver.Failover:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry
|
||||
91, // 22: hashicorp.consul.internal.configentry.ServiceResolver.ConnectTimeout:type_name -> google.protobuf.Duration
|
||||
22, // 23: hashicorp.consul.internal.configentry.ServiceResolver.LoadBalancer:type_name -> hashicorp.consul.internal.configentry.LoadBalancer
|
||||
73, // 24: hashicorp.consul.internal.configentry.ServiceResolver.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.MetaEntry
|
||||
74, // 24: hashicorp.consul.internal.configentry.ServiceResolver.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceResolver.MetaEntry
|
||||
21, // 25: hashicorp.consul.internal.configentry.ServiceResolverFailover.Targets:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailoverTarget
|
||||
23, // 26: hashicorp.consul.internal.configentry.LoadBalancer.RingHashConfig:type_name -> hashicorp.consul.internal.configentry.RingHashConfig
|
||||
24, // 27: hashicorp.consul.internal.configentry.LoadBalancer.LeastRequestConfig:type_name -> hashicorp.consul.internal.configentry.LeastRequestConfig
|
||||
25, // 28: hashicorp.consul.internal.configentry.LoadBalancer.HashPolicies:type_name -> hashicorp.consul.internal.configentry.HashPolicy
|
||||
26, // 29: hashicorp.consul.internal.configentry.HashPolicy.CookieConfig:type_name -> hashicorp.consul.internal.configentry.CookieConfig
|
||||
90, // 30: hashicorp.consul.internal.configentry.CookieConfig.TTL:type_name -> google.protobuf.Duration
|
||||
91, // 30: hashicorp.consul.internal.configentry.CookieConfig.TTL:type_name -> google.protobuf.Duration
|
||||
29, // 31: hashicorp.consul.internal.configentry.IngressGateway.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSConfig
|
||||
31, // 32: hashicorp.consul.internal.configentry.IngressGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.IngressListener
|
||||
74, // 33: hashicorp.consul.internal.configentry.IngressGateway.Meta:type_name -> hashicorp.consul.internal.configentry.IngressGateway.MetaEntry
|
||||
75, // 33: hashicorp.consul.internal.configentry.IngressGateway.Meta:type_name -> hashicorp.consul.internal.configentry.IngressGateway.MetaEntry
|
||||
28, // 34: hashicorp.consul.internal.configentry.IngressGateway.Defaults:type_name -> hashicorp.consul.internal.configentry.IngressServiceConfig
|
||||
48, // 35: hashicorp.consul.internal.configentry.IngressServiceConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck
|
||||
30, // 36: hashicorp.consul.internal.configentry.GatewayTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig
|
||||
|
@ -6524,21 +6593,21 @@ var file_proto_pbconfigentry_config_entry_proto_depIdxs = []int32{
|
|||
33, // 39: hashicorp.consul.internal.configentry.IngressService.TLS:type_name -> hashicorp.consul.internal.configentry.GatewayServiceTLSConfig
|
||||
34, // 40: hashicorp.consul.internal.configentry.IngressService.RequestHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers
|
||||
34, // 41: hashicorp.consul.internal.configentry.IngressService.ResponseHeaders:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers
|
||||
75, // 42: hashicorp.consul.internal.configentry.IngressService.Meta:type_name -> hashicorp.consul.internal.configentry.IngressService.MetaEntry
|
||||
88, // 43: hashicorp.consul.internal.configentry.IngressService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
76, // 42: hashicorp.consul.internal.configentry.IngressService.Meta:type_name -> hashicorp.consul.internal.configentry.IngressService.MetaEntry
|
||||
89, // 43: hashicorp.consul.internal.configentry.IngressService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
48, // 44: hashicorp.consul.internal.configentry.IngressService.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck
|
||||
30, // 45: hashicorp.consul.internal.configentry.GatewayServiceTLSConfig.SDS:type_name -> hashicorp.consul.internal.configentry.GatewayTLSSDSConfig
|
||||
76, // 46: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry
|
||||
77, // 47: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry
|
||||
77, // 46: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.AddEntry
|
||||
78, // 47: hashicorp.consul.internal.configentry.HTTPHeaderModifiers.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderModifiers.SetEntry
|
||||
36, // 48: hashicorp.consul.internal.configentry.ServiceIntentions.Sources:type_name -> hashicorp.consul.internal.configentry.SourceIntention
|
||||
78, // 49: hashicorp.consul.internal.configentry.ServiceIntentions.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry
|
||||
79, // 49: hashicorp.consul.internal.configentry.ServiceIntentions.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceIntentions.MetaEntry
|
||||
1, // 50: hashicorp.consul.internal.configentry.SourceIntention.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction
|
||||
37, // 51: hashicorp.consul.internal.configentry.SourceIntention.Permissions:type_name -> hashicorp.consul.internal.configentry.IntentionPermission
|
||||
2, // 52: hashicorp.consul.internal.configentry.SourceIntention.Type:type_name -> hashicorp.consul.internal.configentry.IntentionSourceType
|
||||
79, // 53: hashicorp.consul.internal.configentry.SourceIntention.LegacyMeta:type_name -> hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry
|
||||
91, // 54: hashicorp.consul.internal.configentry.SourceIntention.LegacyCreateTime:type_name -> google.protobuf.Timestamp
|
||||
91, // 55: hashicorp.consul.internal.configentry.SourceIntention.LegacyUpdateTime:type_name -> google.protobuf.Timestamp
|
||||
88, // 56: hashicorp.consul.internal.configentry.SourceIntention.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
80, // 53: hashicorp.consul.internal.configentry.SourceIntention.LegacyMeta:type_name -> hashicorp.consul.internal.configentry.SourceIntention.LegacyMetaEntry
|
||||
92, // 54: hashicorp.consul.internal.configentry.SourceIntention.LegacyCreateTime:type_name -> google.protobuf.Timestamp
|
||||
92, // 55: hashicorp.consul.internal.configentry.SourceIntention.LegacyUpdateTime:type_name -> google.protobuf.Timestamp
|
||||
89, // 56: hashicorp.consul.internal.configentry.SourceIntention.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
1, // 57: hashicorp.consul.internal.configentry.IntentionPermission.Action:type_name -> hashicorp.consul.internal.configentry.IntentionAction
|
||||
38, // 58: hashicorp.consul.internal.configentry.IntentionPermission.HTTP:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPPermission
|
||||
39, // 59: hashicorp.consul.internal.configentry.IntentionHTTPPermission.Header:type_name -> hashicorp.consul.internal.configentry.IntentionHTTPHeaderPermission
|
||||
|
@ -6548,39 +6617,39 @@ var file_proto_pbconfigentry_config_entry_proto_depIdxs = []int32{
|
|||
43, // 63: hashicorp.consul.internal.configentry.ServiceDefaults.Expose:type_name -> hashicorp.consul.internal.configentry.ExposeConfig
|
||||
45, // 64: hashicorp.consul.internal.configentry.ServiceDefaults.UpstreamConfig:type_name -> hashicorp.consul.internal.configentry.UpstreamConfiguration
|
||||
49, // 65: hashicorp.consul.internal.configentry.ServiceDefaults.Destination:type_name -> hashicorp.consul.internal.configentry.DestinationConfig
|
||||
80, // 66: hashicorp.consul.internal.configentry.ServiceDefaults.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry
|
||||
92, // 67: hashicorp.consul.internal.configentry.ServiceDefaults.EnvoyExtensions:type_name -> hashicorp.consul.internal.common.EnvoyExtension
|
||||
81, // 66: hashicorp.consul.internal.configentry.ServiceDefaults.Meta:type_name -> hashicorp.consul.internal.configentry.ServiceDefaults.MetaEntry
|
||||
93, // 67: hashicorp.consul.internal.configentry.ServiceDefaults.EnvoyExtensions:type_name -> hashicorp.consul.internal.common.EnvoyExtension
|
||||
4, // 68: hashicorp.consul.internal.configentry.MeshGatewayConfig.Mode:type_name -> hashicorp.consul.internal.configentry.MeshGatewayMode
|
||||
44, // 69: hashicorp.consul.internal.configentry.ExposeConfig.Paths:type_name -> hashicorp.consul.internal.configentry.ExposePath
|
||||
46, // 70: hashicorp.consul.internal.configentry.UpstreamConfiguration.Overrides:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig
|
||||
46, // 71: hashicorp.consul.internal.configentry.UpstreamConfiguration.Defaults:type_name -> hashicorp.consul.internal.configentry.UpstreamConfig
|
||||
88, // 72: hashicorp.consul.internal.configentry.UpstreamConfig.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
89, // 72: hashicorp.consul.internal.configentry.UpstreamConfig.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
47, // 73: hashicorp.consul.internal.configentry.UpstreamConfig.Limits:type_name -> hashicorp.consul.internal.configentry.UpstreamLimits
|
||||
48, // 74: hashicorp.consul.internal.configentry.UpstreamConfig.PassiveHealthCheck:type_name -> hashicorp.consul.internal.configentry.PassiveHealthCheck
|
||||
42, // 75: hashicorp.consul.internal.configentry.UpstreamConfig.MeshGateway:type_name -> hashicorp.consul.internal.configentry.MeshGatewayConfig
|
||||
90, // 76: hashicorp.consul.internal.configentry.PassiveHealthCheck.Interval:type_name -> google.protobuf.Duration
|
||||
81, // 77: hashicorp.consul.internal.configentry.APIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.APIGateway.MetaEntry
|
||||
91, // 76: hashicorp.consul.internal.configentry.PassiveHealthCheck.Interval:type_name -> google.protobuf.Duration
|
||||
82, // 77: hashicorp.consul.internal.configentry.APIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.APIGateway.MetaEntry
|
||||
53, // 78: hashicorp.consul.internal.configentry.APIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.APIGatewayListener
|
||||
51, // 79: hashicorp.consul.internal.configentry.APIGateway.Status:type_name -> hashicorp.consul.internal.configentry.Status
|
||||
52, // 80: hashicorp.consul.internal.configentry.Status.Conditions:type_name -> hashicorp.consul.internal.configentry.Condition
|
||||
55, // 81: hashicorp.consul.internal.configentry.Condition.Resource:type_name -> hashicorp.consul.internal.configentry.ResourceReference
|
||||
91, // 82: hashicorp.consul.internal.configentry.Condition.LastTransitionTime:type_name -> google.protobuf.Timestamp
|
||||
92, // 82: hashicorp.consul.internal.configentry.Condition.LastTransitionTime:type_name -> google.protobuf.Timestamp
|
||||
5, // 83: hashicorp.consul.internal.configentry.APIGatewayListener.Protocol:type_name -> hashicorp.consul.internal.configentry.APIGatewayListenerProtocol
|
||||
54, // 84: hashicorp.consul.internal.configentry.APIGatewayListener.TLS:type_name -> hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration
|
||||
55, // 85: hashicorp.consul.internal.configentry.APIGatewayTLSConfiguration.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference
|
||||
88, // 86: hashicorp.consul.internal.configentry.ResourceReference.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
82, // 87: hashicorp.consul.internal.configentry.BoundAPIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry
|
||||
89, // 86: hashicorp.consul.internal.configentry.ResourceReference.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
83, // 87: hashicorp.consul.internal.configentry.BoundAPIGateway.Meta:type_name -> hashicorp.consul.internal.configentry.BoundAPIGateway.MetaEntry
|
||||
57, // 88: hashicorp.consul.internal.configentry.BoundAPIGateway.Listeners:type_name -> hashicorp.consul.internal.configentry.BoundAPIGatewayListener
|
||||
55, // 89: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Certificates:type_name -> hashicorp.consul.internal.configentry.ResourceReference
|
||||
55, // 90: hashicorp.consul.internal.configentry.BoundAPIGatewayListener.Routes:type_name -> hashicorp.consul.internal.configentry.ResourceReference
|
||||
83, // 91: hashicorp.consul.internal.configentry.InlineCertificate.Meta:type_name -> hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry
|
||||
84, // 92: hashicorp.consul.internal.configentry.HTTPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry
|
||||
84, // 91: hashicorp.consul.internal.configentry.InlineCertificate.Meta:type_name -> hashicorp.consul.internal.configentry.InlineCertificate.MetaEntry
|
||||
85, // 92: hashicorp.consul.internal.configentry.HTTPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.HTTPRoute.MetaEntry
|
||||
55, // 93: hashicorp.consul.internal.configentry.HTTPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference
|
||||
60, // 94: hashicorp.consul.internal.configentry.HTTPRoute.Rules:type_name -> hashicorp.consul.internal.configentry.HTTPRouteRule
|
||||
51, // 95: hashicorp.consul.internal.configentry.HTTPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status
|
||||
65, // 96: hashicorp.consul.internal.configentry.HTTPRouteRule.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters
|
||||
61, // 97: hashicorp.consul.internal.configentry.HTTPRouteRule.Matches:type_name -> hashicorp.consul.internal.configentry.HTTPMatch
|
||||
67, // 98: hashicorp.consul.internal.configentry.HTTPRouteRule.Services:type_name -> hashicorp.consul.internal.configentry.HTTPService
|
||||
68, // 98: hashicorp.consul.internal.configentry.HTTPRouteRule.Services:type_name -> hashicorp.consul.internal.configentry.HTTPService
|
||||
62, // 99: hashicorp.consul.internal.configentry.HTTPMatch.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatch
|
||||
6, // 100: hashicorp.consul.internal.configentry.HTTPMatch.Method:type_name -> hashicorp.consul.internal.configentry.HTTPMatchMethod
|
||||
63, // 101: hashicorp.consul.internal.configentry.HTTPMatch.Path:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatch
|
||||
|
@ -6588,23 +6657,24 @@ var file_proto_pbconfigentry_config_entry_proto_depIdxs = []int32{
|
|||
7, // 103: hashicorp.consul.internal.configentry.HTTPHeaderMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderMatchType
|
||||
8, // 104: hashicorp.consul.internal.configentry.HTTPPathMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPPathMatchType
|
||||
9, // 105: hashicorp.consul.internal.configentry.HTTPQueryMatch.Match:type_name -> hashicorp.consul.internal.configentry.HTTPQueryMatchType
|
||||
66, // 106: hashicorp.consul.internal.configentry.HTTPFilters.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter
|
||||
85, // 107: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry
|
||||
86, // 108: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry
|
||||
65, // 109: hashicorp.consul.internal.configentry.HTTPService.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters
|
||||
88, // 110: hashicorp.consul.internal.configentry.HTTPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
87, // 111: hashicorp.consul.internal.configentry.TCPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.TCPRoute.MetaEntry
|
||||
55, // 112: hashicorp.consul.internal.configentry.TCPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference
|
||||
69, // 113: hashicorp.consul.internal.configentry.TCPRoute.Services:type_name -> hashicorp.consul.internal.configentry.TCPService
|
||||
51, // 114: hashicorp.consul.internal.configentry.TCPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status
|
||||
88, // 115: hashicorp.consul.internal.configentry.TCPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
18, // 116: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverSubset
|
||||
20, // 117: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailover
|
||||
118, // [118:118] is the sub-list for method output_type
|
||||
118, // [118:118] is the sub-list for method input_type
|
||||
118, // [118:118] is the sub-list for extension type_name
|
||||
118, // [118:118] is the sub-list for extension extendee
|
||||
0, // [0:118] is the sub-list for field type_name
|
||||
67, // 106: hashicorp.consul.internal.configentry.HTTPFilters.Headers:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter
|
||||
66, // 107: hashicorp.consul.internal.configentry.HTTPFilters.URLRewrites:type_name -> hashicorp.consul.internal.configentry.URLRewrite
|
||||
86, // 108: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Add:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.AddEntry
|
||||
87, // 109: hashicorp.consul.internal.configentry.HTTPHeaderFilter.Set:type_name -> hashicorp.consul.internal.configentry.HTTPHeaderFilter.SetEntry
|
||||
65, // 110: hashicorp.consul.internal.configentry.HTTPService.Filters:type_name -> hashicorp.consul.internal.configentry.HTTPFilters
|
||||
89, // 111: hashicorp.consul.internal.configentry.HTTPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
88, // 112: hashicorp.consul.internal.configentry.TCPRoute.Meta:type_name -> hashicorp.consul.internal.configentry.TCPRoute.MetaEntry
|
||||
55, // 113: hashicorp.consul.internal.configentry.TCPRoute.Parents:type_name -> hashicorp.consul.internal.configentry.ResourceReference
|
||||
70, // 114: hashicorp.consul.internal.configentry.TCPRoute.Services:type_name -> hashicorp.consul.internal.configentry.TCPService
|
||||
51, // 115: hashicorp.consul.internal.configentry.TCPRoute.Status:type_name -> hashicorp.consul.internal.configentry.Status
|
||||
89, // 116: hashicorp.consul.internal.configentry.TCPService.EnterpriseMeta:type_name -> hashicorp.consul.internal.common.EnterpriseMeta
|
||||
18, // 117: hashicorp.consul.internal.configentry.ServiceResolver.SubsetsEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverSubset
|
||||
20, // 118: hashicorp.consul.internal.configentry.ServiceResolver.FailoverEntry.value:type_name -> hashicorp.consul.internal.configentry.ServiceResolverFailover
|
||||
119, // [119:119] is the sub-list for method output_type
|
||||
119, // [119:119] is the sub-list for method input_type
|
||||
119, // [119:119] is the sub-list for extension type_name
|
||||
119, // [119:119] is the sub-list for extension extendee
|
||||
0, // [0:119] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_proto_pbconfigentry_config_entry_proto_init() }
|
||||
|
@ -7286,7 +7356,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() {
|
|||
}
|
||||
}
|
||||
file_proto_pbconfigentry_config_entry_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*HTTPHeaderFilter); i {
|
||||
switch v := v.(*URLRewrite); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -7298,7 +7368,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() {
|
|||
}
|
||||
}
|
||||
file_proto_pbconfigentry_config_entry_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*HTTPService); i {
|
||||
switch v := v.(*HTTPHeaderFilter); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -7310,7 +7380,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() {
|
|||
}
|
||||
}
|
||||
file_proto_pbconfigentry_config_entry_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*TCPRoute); i {
|
||||
switch v := v.(*HTTPService); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -7322,6 +7392,18 @@ func file_proto_pbconfigentry_config_entry_proto_init() {
|
|||
}
|
||||
}
|
||||
file_proto_pbconfigentry_config_entry_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*TCPRoute); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_proto_pbconfigentry_config_entry_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*TCPService); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
|
@ -7351,7 +7433,7 @@ func file_proto_pbconfigentry_config_entry_proto_init() {
|
|||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_proto_pbconfigentry_config_entry_proto_rawDesc,
|
||||
NumEnums: 10,
|
||||
NumMessages: 78,
|
||||
NumMessages: 79,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
|
|
|
@ -805,6 +805,16 @@ message HTTPQueryMatch {
|
|||
// name=Structs
|
||||
message HTTPFilters {
|
||||
repeated HTTPHeaderFilter Headers = 1;
|
||||
repeated URLRewrite URLRewrites = 2;
|
||||
}
|
||||
|
||||
// mog annotation:
|
||||
//
|
||||
// target=github.com/hashicorp/consul/agent/structs.URLRewrite
|
||||
// output=config_entry.gen.go
|
||||
// name=Structs
|
||||
message URLRewrite {
|
||||
string Path = 1;
|
||||
}
|
||||
|
||||
// mog annotation:
|
||||
|
|
Loading…
Reference in New Issue