2023-03-28 18:39:22 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
2023-08-11 13:12:13 +00:00
|
|
|
// SPDX-License-Identifier: BUSL-1.1
|
2023-03-28 18:39:22 +00:00
|
|
|
|
2023-08-15 18:57:07 +00:00
|
|
|
package config
|
2019-04-29 16:27:57 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
2023-12-11 15:25:11 +00:00
|
|
|
"time"
|
2021-02-22 21:00:15 +00:00
|
|
|
|
2021-03-11 04:04:13 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
2023-12-11 15:25:11 +00:00
|
|
|
"google.golang.org/protobuf/proto"
|
|
|
|
"google.golang.org/protobuf/types/known/durationpb"
|
2021-04-29 18:54:05 +00:00
|
|
|
|
|
|
|
"github.com/hashicorp/consul/agent/structs"
|
2019-04-29 16:27:57 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestParseProxyConfig(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
input map[string]interface{}
|
|
|
|
want ProxyConfig
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "defaults - nil",
|
|
|
|
input: nil,
|
|
|
|
want: ProxyConfig{
|
|
|
|
Protocol: "tcp",
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "defaults - empty",
|
|
|
|
input: map[string]interface{}{},
|
|
|
|
want: ProxyConfig{
|
|
|
|
Protocol: "tcp",
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "defaults - other stuff",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"foo": "bar",
|
|
|
|
"envoy_foo": "envoy_bar",
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
Protocol: "tcp",
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "protocol override",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"protocol": "http",
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
Protocol: "http",
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "protocol uppercase override",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"protocol": "HTTP",
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
Protocol: "http",
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
},
|
|
|
|
},
|
2019-07-05 15:06:47 +00:00
|
|
|
{
|
|
|
|
name: "bind address override, string",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"bind_address": "127.0.0.2",
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
Protocol: "tcp",
|
|
|
|
BindAddress: "127.0.0.2",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "bind port override, string",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"bind_port": "8888",
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
Protocol: "tcp",
|
|
|
|
BindPort: 8888,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "bind port override, int",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"bind_port": 8889,
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
Protocol: "tcp",
|
|
|
|
BindPort: 8889,
|
|
|
|
},
|
|
|
|
},
|
2019-04-29 16:27:57 +00:00
|
|
|
{
|
|
|
|
name: "local connect timeout override, string",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"local_connect_timeout_ms": "1000",
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 1000,
|
|
|
|
Protocol: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "local connect timeout override, float ",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"local_connect_timeout_ms": float64(1000.0),
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 1000,
|
|
|
|
Protocol: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "local connect timeout override, int ",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"local_connect_timeout_ms": 1000,
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 1000,
|
|
|
|
Protocol: "tcp",
|
2021-01-25 19:50:00 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "local request timeout override, string",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"local_request_timeout_ms": "1000",
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
LocalRequestTimeoutMs: intPointer(1000),
|
|
|
|
Protocol: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "local request timeout override, float ",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"local_request_timeout_ms": float64(1000.0),
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
LocalRequestTimeoutMs: intPointer(1000),
|
|
|
|
Protocol: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "local request timeout override, int ",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"local_request_timeout_ms": 1000,
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
LocalRequestTimeoutMs: intPointer(1000),
|
|
|
|
Protocol: "tcp",
|
2019-04-29 16:27:57 +00:00
|
|
|
},
|
|
|
|
},
|
2022-11-29 22:43:15 +00:00
|
|
|
{
|
|
|
|
name: "local idle timeout override, float ",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"local_idle_timeout_ms": float64(1000.0),
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
LocalIdleTimeoutMs: intPointer(1000),
|
|
|
|
Protocol: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "local idle timeout override, int ",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"local_idle_timeout_ms": 1000,
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
LocalIdleTimeoutMs: intPointer(1000),
|
|
|
|
Protocol: "tcp",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "local idle timeout override, string",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"local_idle_timeout_ms": "1000",
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
LocalIdleTimeoutMs: intPointer(1000),
|
|
|
|
Protocol: "tcp",
|
|
|
|
},
|
|
|
|
},
|
2022-09-26 16:29:06 +00:00
|
|
|
{
|
|
|
|
name: "balance inbound connections override, string",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"balance_inbound_connections": "exact_balance",
|
|
|
|
},
|
|
|
|
want: ProxyConfig{
|
|
|
|
LocalConnectTimeoutMs: 5000,
|
|
|
|
Protocol: "tcp",
|
|
|
|
BalanceInboundConnections: "exact_balance",
|
|
|
|
},
|
|
|
|
},
|
2019-04-29 16:27:57 +00:00
|
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
got, err := ParseProxyConfig(tt.input)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, tt.want, got)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-26 16:20:56 +00:00
|
|
|
func TestParseGatewayConfig(t *testing.T) {
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
input map[string]interface{}
|
|
|
|
want GatewayConfig
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "defaults - nil",
|
|
|
|
input: nil,
|
|
|
|
want: GatewayConfig{
|
|
|
|
ConnectTimeoutMs: 5000,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "defaults - empty",
|
|
|
|
input: map[string]interface{}{},
|
|
|
|
want: GatewayConfig{
|
|
|
|
ConnectTimeoutMs: 5000,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "defaults - other stuff",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"foo": "bar",
|
|
|
|
"envoy_foo": "envoy_bar",
|
|
|
|
},
|
|
|
|
want: GatewayConfig{
|
|
|
|
ConnectTimeoutMs: 5000,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "kitchen sink",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"envoy_gateway_bind_tagged_addresses": true,
|
|
|
|
"envoy_gateway_bind_addresses": map[string]structs.ServiceAddress{"foo": {Address: "127.0.0.1", Port: 80}},
|
|
|
|
"envoy_gateway_no_default_bind": true,
|
2020-06-03 21:28:45 +00:00
|
|
|
"envoy_dns_discovery_type": "StRiCt_DnS",
|
2020-03-26 16:20:56 +00:00
|
|
|
"connect_timeout_ms": 10,
|
|
|
|
},
|
|
|
|
want: GatewayConfig{
|
|
|
|
ConnectTimeoutMs: 10,
|
|
|
|
BindTaggedAddresses: true,
|
|
|
|
NoDefaultBind: true,
|
|
|
|
BindAddresses: map[string]structs.ServiceAddress{"foo": {Address: "127.0.0.1", Port: 80}},
|
2020-06-03 21:28:45 +00:00
|
|
|
DNSDiscoveryType: "strict_dns",
|
2020-03-26 16:20:56 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "deprecated kitchen sink",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
"envoy_mesh_gateway_bind_tagged_addresses": true,
|
|
|
|
"envoy_mesh_gateway_bind_addresses": map[string]structs.ServiceAddress{"foo": {Address: "127.0.0.1", Port: 80}},
|
|
|
|
"envoy_mesh_gateway_no_default_bind": true,
|
|
|
|
"connect_timeout_ms": 10,
|
|
|
|
},
|
|
|
|
want: GatewayConfig{
|
|
|
|
ConnectTimeoutMs: 10,
|
|
|
|
BindTaggedAddresses: true,
|
|
|
|
NoDefaultBind: true,
|
|
|
|
BindAddresses: map[string]structs.ServiceAddress{"foo": {Address: "127.0.0.1", Port: 80}},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "new fields override deprecated ones",
|
|
|
|
input: map[string]interface{}{
|
|
|
|
// Deprecated
|
|
|
|
"envoy_mesh_gateway_bind_tagged_addresses": true,
|
|
|
|
"envoy_mesh_gateway_bind_addresses": map[string]structs.ServiceAddress{"foo": {Address: "127.0.0.1", Port: 80}},
|
|
|
|
"envoy_mesh_gateway_no_default_bind": true,
|
|
|
|
|
|
|
|
// New
|
|
|
|
"envoy_gateway_bind_tagged_addresses": false,
|
|
|
|
"envoy_gateway_bind_addresses": map[string]structs.ServiceAddress{"bar": {Address: "127.0.0.1", Port: 8080}},
|
|
|
|
"envoy_gateway_no_default_bind": false,
|
|
|
|
},
|
|
|
|
want: GatewayConfig{
|
|
|
|
ConnectTimeoutMs: 5000,
|
|
|
|
BindTaggedAddresses: false,
|
|
|
|
NoDefaultBind: false,
|
|
|
|
BindAddresses: map[string]structs.ServiceAddress{"bar": {Address: "127.0.0.1", Port: 8080}},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
got, err := ParseGatewayConfig(tt.input)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, tt.want, got)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-03 20:13:33 +00:00
|
|
|
func intPointer(i int) *int {
|
|
|
|
return &i
|
|
|
|
}
|
2023-12-11 15:25:11 +00:00
|
|
|
|
|
|
|
func Test_ProxyConfig_GetXDSFetchTimeout(t *testing.T) {
|
|
|
|
tests := map[string]struct {
|
|
|
|
conf map[string]interface{}
|
|
|
|
expect *durationpb.Duration
|
|
|
|
expectErr bool
|
|
|
|
}{
|
|
|
|
"nil_conf": {
|
|
|
|
expect: nil,
|
|
|
|
conf: nil,
|
|
|
|
},
|
|
|
|
"key_not_found": {
|
|
|
|
expect: nil,
|
|
|
|
conf: map[string]interface{}{},
|
|
|
|
},
|
|
|
|
"invalid_key": {
|
|
|
|
expect: nil,
|
|
|
|
conf: map[string]interface{}{
|
|
|
|
"i_do_not_exist": "as_an_expected_field",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"nil_value_for_key": {
|
|
|
|
expect: nil,
|
|
|
|
conf: map[string]interface{}{
|
|
|
|
"xds_fetch_timeout_ms": nil,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"bad_value_for_key": {
|
|
|
|
expectErr: true,
|
|
|
|
conf: map[string]interface{}{
|
|
|
|
"xds_fetch_timeout_ms": "bad",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"negative_value_for_key": {
|
|
|
|
expect: nil,
|
|
|
|
conf: map[string]interface{}{
|
|
|
|
"xds_fetch_timeout_ms": -1,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"valid_value_for_key": {
|
|
|
|
expect: durationpb.New(99 * time.Millisecond),
|
|
|
|
conf: map[string]interface{}{
|
|
|
|
"xds_fetch_timeout_ms": 99,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for n, tc := range tests {
|
|
|
|
t.Run(n, func(t *testing.T) {
|
|
|
|
conf, err := ParseXDSCommonConfig(tc.conf)
|
|
|
|
if tc.expectErr {
|
|
|
|
require.Error(t, err)
|
|
|
|
} else {
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
require.True(t, proto.Equal(tc.expect, conf.GetXDSFetchTimeout()))
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|