blob: 818d6fdc9fe1a0b46cad0787b7980719332389cf [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package option_test
import (
"testing"
"time"
)
import (
. "github.com/onsi/gomega"
"google.golang.org/protobuf/types/known/durationpb"
meshAPI "istio.io/api/mesh/v1alpha1"
networkingAPI "istio.io/api/networking/v1alpha3"
)
import (
"github.com/apache/dubbo-go-pixiu/pilot/pkg/model"
"github.com/apache/dubbo-go-pixiu/pkg/bootstrap/option"
)
// nolint: lll
func TestOptions(t *testing.T) {
cases := []struct {
testName string
key string
option option.Instance
expectError bool
expected interface{}
}{
{
testName: "proxy config",
key: "config",
option: option.ProxyConfig(&model.NodeMetaProxyConfig{DiscoveryAddress: "fake"}),
expected: &model.NodeMetaProxyConfig{DiscoveryAddress: "fake"},
},
{
testName: "pilotSAN",
key: "pilot_SAN",
option: option.PilotSubjectAltName([]string{"fake"}),
expected: `[{"exact":"fake"}]`,
},
{
testName: "pilotSAN multi",
key: "pilot_SAN",
option: option.PilotSubjectAltName([]string{"fake", "other"}),
expected: `[{"exact":"fake"},{"exact":"other"}]`,
},
{
testName: "nil connect timeout",
key: "connect_timeout",
option: option.ConnectTimeout(nil),
expected: nil,
},
{
testName: "connect timeout",
key: "connect_timeout",
option: option.ConnectTimeout(durationpb.New(time.Second)),
expected: "1s",
},
{
testName: "cluster",
key: "cluster",
option: option.Cluster("fake"),
expected: "fake",
},
{
testName: "nodeID",
key: "nodeID",
option: option.NodeID("fake"),
expected: "fake",
},
{
testName: "region",
key: "region",
option: option.Region("fake"),
expected: "fake",
},
{
testName: "zone",
key: "zone",
option: option.Zone("fake"),
expected: "fake",
},
{
testName: "sub zone",
key: "sub_zone",
option: option.SubZone("fake"),
expected: "fake",
},
{
testName: "node metadata nil",
key: "meta_json_str",
option: option.NodeMetadata(nil, nil),
expected: nil,
},
{
testName: "node metadata",
key: "meta_json_str",
option: option.NodeMetadata(&model.BootstrapNodeMetadata{
NodeMetadata: model.NodeMetadata{
IstioVersion: "fake",
},
}, map[string]interface{}{
"key": "value",
}),
expected: "{\"ISTIO_VERSION\":\"fake\",\"key\":\"value\"}",
},
{
testName: "discovery address",
key: "discovery_address",
option: option.DiscoveryAddress("fake"),
expected: "fake",
},
{
testName: "localhost v4",
key: "localhost",
option: option.Localhost(option.LocalhostIPv4),
expected: option.LocalhostValue("127.0.0.1"),
},
{
testName: "localhost v6",
key: "localhost",
option: option.Localhost(option.LocalhostIPv6),
expected: option.LocalhostValue("::1"),
},
{
testName: "wildcard v4",
key: "wildcard",
option: option.Wildcard(option.WildcardIPv4),
expected: option.WildcardValue("0.0.0.0"),
},
{
testName: "wildcard v6",
key: "wildcard",
option: option.Wildcard(option.WildcardIPv6),
expected: option.WildcardValue("::"),
},
{
testName: "dns lookup family v4",
key: "dns_lookup_family",
option: option.DNSLookupFamily(option.DNSLookupFamilyIPv4),
expected: option.DNSLookupFamilyValue("V4_ONLY"),
},
{
testName: "dns lookup family v6",
key: "dns_lookup_family",
option: option.DNSLookupFamily(option.DNSLookupFamilyIPv6),
expected: option.DNSLookupFamilyValue("AUTO"),
},
{
testName: "lightstep address empty",
key: "lightstep",
option: option.LightstepAddress(""),
expected: nil,
},
{
testName: "lightstep address ipv4",
key: "lightstep",
option: option.LightstepAddress("127.0.0.1:80"),
expected: "{\"address\": \"127.0.0.1\", \"port_value\": 80}",
},
{
testName: "lightstep address ipv6",
key: "lightstep",
option: option.LightstepAddress("[2001:db8::100]:80"),
expected: "{\"address\": \"2001:db8::100\", \"port_value\": 80}",
},
{
testName: "lightstep address ipv6 missing brackets",
key: "lightstep",
option: option.LightstepAddress("2001:db8::100:80"),
expectError: true,
},
{
testName: "lightstep address host port",
key: "lightstep",
option: option.LightstepAddress("fake:80"),
expected: "{\"address\": \"fake\", \"port_value\": 80}",
},
{
testName: "lightstep address no port",
key: "lightstep",
option: option.LightstepAddress("fake:"),
expected: "{\"address\": \"fake\", \"port_value\": }",
},
{
testName: "lightstep address missing port",
key: "lightstep",
option: option.LightstepAddress("127.0.0.1"),
expectError: true,
},
{
testName: "lightstep token",
key: "lightstepToken",
option: option.LightstepToken("fake"),
expected: "fake",
},
{
testName: "openCensusAgent address",
key: "openCensusAgent",
option: option.OpenCensusAgentAddress("fake-ocagent"),
expected: "fake-ocagent",
},
{
testName: "openCensusAgent empty context",
key: "openCensusAgentContexts",
option: option.OpenCensusAgentContexts([]meshAPI.Tracing_OpenCensusAgent_TraceContext{}),
expected: `["TRACE_CONTEXT","GRPC_TRACE_BIN","CLOUD_TRACE_CONTEXT","B3"]`,
},
{
testName: "openCensusAgent order context",
key: "openCensusAgentContexts",
option: option.OpenCensusAgentContexts([]meshAPI.Tracing_OpenCensusAgent_TraceContext{
meshAPI.Tracing_OpenCensusAgent_CLOUD_TRACE_CONTEXT,
meshAPI.Tracing_OpenCensusAgent_B3,
meshAPI.Tracing_OpenCensusAgent_GRPC_BIN,
meshAPI.Tracing_OpenCensusAgent_W3C_TRACE_CONTEXT,
}),
expected: `["CLOUD_TRACE_CONTEXT","B3","GRPC_TRACE_BIN","TRACE_CONTEXT"]`,
},
{
testName: "openCensusAgent one context",
key: "openCensusAgentContexts",
option: option.OpenCensusAgentContexts([]meshAPI.Tracing_OpenCensusAgent_TraceContext{
meshAPI.Tracing_OpenCensusAgent_B3,
}),
expected: `["B3"]`,
},
{
testName: "stackdriver enabled",
key: "stackdriver",
option: option.StackDriverEnabled(true),
expected: true,
},
{
testName: "stackdriver project ID",
key: "stackdriverProjectID",
option: option.StackDriverProjectID("fake"),
expected: "fake",
},
{
testName: "stackdriver debug",
key: "stackdriverDebug",
option: option.StackDriverDebug(true),
expected: true,
},
{
testName: "stackdriver max annotations",
key: "stackdriverMaxAnnotations",
option: option.StackDriverMaxAnnotations(100),
expected: int64(100),
},
{
testName: "stackdriver max attributes",
key: "stackdriverMaxAttributes",
option: option.StackDriverMaxAttributes(100),
expected: int64(100),
},
{
testName: "stackdriver max events",
key: "stackdriverMaxEvents",
option: option.StackDriverMaxEvents(100),
expected: int64(100),
},
{
testName: "pilot grpc address empty",
key: "pilot_grpc_address",
option: option.PilotGRPCAddress(""),
expected: nil,
},
{
testName: "pilot grpc address ipv4",
key: "pilot_grpc_address",
option: option.PilotGRPCAddress("127.0.0.1:80"),
expected: "{\"address\": \"127.0.0.1\", \"port_value\": 80}",
},
{
testName: "pilot grpc address ipv6",
key: "pilot_grpc_address",
option: option.PilotGRPCAddress("[2001:db8::100]:80"),
expected: "{\"address\": \"2001:db8::100\", \"port_value\": 80}",
},
{
testName: "pilot grpc address ipv6 missing brackets",
key: "pilot_grpc_address",
option: option.PilotGRPCAddress("2001:db8::100:80"),
expectError: true,
},
{
testName: "pilot grpc address host port",
key: "pilot_grpc_address",
option: option.PilotGRPCAddress("fake:80"),
expected: "{\"address\": \"fake\", \"port_value\": 80}",
},
{
testName: "pilot grpc address no port",
key: "pilot_grpc_address",
option: option.PilotGRPCAddress("fake:"),
expected: "{\"address\": \"fake\", \"port_value\": }",
},
{
testName: "pilot grpc address missing port",
key: "pilot_grpc_address",
option: option.PilotGRPCAddress("127.0.0.1"),
expectError: true,
},
{
testName: "zipkin address empty",
key: "zipkin",
option: option.ZipkinAddress(""),
expected: nil,
},
{
testName: "zipkin address ipv4",
key: "zipkin",
option: option.ZipkinAddress("127.0.0.1:80"),
expected: "{\"address\": \"127.0.0.1\", \"port_value\": 80}",
},
{
testName: "zipkin address ipv6",
key: "zipkin",
option: option.ZipkinAddress("[2001:db8::100]:80"),
expected: "{\"address\": \"2001:db8::100\", \"port_value\": 80}",
},
{
testName: "zipkin address ipv6 missing brackets",
key: "zipkin",
option: option.ZipkinAddress("2001:db8::100:80"),
expectError: true,
},
{
testName: "zipkin address host port",
key: "zipkin",
option: option.ZipkinAddress("fake:80"),
expected: "{\"address\": \"fake\", \"port_value\": 80}",
},
{
testName: "zipkin address no port",
key: "zipkin",
option: option.ZipkinAddress("fake:"),
expected: "{\"address\": \"fake\", \"port_value\": }",
},
{
testName: "zipkin address missing port",
key: "zipkin",
option: option.ZipkinAddress("127.0.0.1"),
expectError: true,
},
{
testName: "datadog address empty",
key: "datadog",
option: option.DataDogAddress(""),
expected: nil,
},
{
testName: "datadog address ipv4",
key: "datadog",
option: option.DataDogAddress("127.0.0.1:80"),
expected: "{\"address\": \"127.0.0.1\", \"port_value\": 80}",
},
{
testName: "datadog address ipv6",
key: "datadog",
option: option.DataDogAddress("[2001:db8::100]:80"),
expected: "{\"address\": \"2001:db8::100\", \"port_value\": 80}",
},
{
testName: "datadog address ipv6 missing brackets",
key: "datadog",
option: option.DataDogAddress("2001:db8::100:80"),
expectError: true,
},
{
testName: "datadog address host port",
key: "datadog",
option: option.DataDogAddress("fake:80"),
expected: "{\"address\": \"fake\", \"port_value\": 80}",
},
{
testName: "datadog address no port",
key: "datadog",
option: option.DataDogAddress("fake:"),
expected: "{\"address\": \"fake\", \"port_value\": }",
},
{
testName: "datadog address missing port",
key: "datadog",
option: option.DataDogAddress("127.0.0.1"),
expectError: true,
},
{
testName: "statsd address empty",
key: "statsd",
option: option.StatsdAddress(""),
expected: nil,
},
{
testName: "statsd address ipv4",
key: "statsd",
option: option.StatsdAddress("127.0.0.1:80"),
expected: "{\"address\": \"127.0.0.1\", \"port_value\": 80}",
},
{
testName: "statsd address ipv6",
key: "statsd",
option: option.StatsdAddress("[2001:db8::100]:80"),
expected: "{\"address\": \"2001:db8::100\", \"port_value\": 80}",
},
{
testName: "statsd address ipv6 missing brackets",
key: "statsd",
option: option.StatsdAddress("2001:db8::100:80"),
expectError: true,
},
{
testName: "statsd address host port",
key: "statsd",
option: option.StatsdAddress("fake:80"),
expected: "{\"address\": \"fake\", \"port_value\": 80}",
},
{
testName: "statsd address no port",
key: "statsd",
option: option.StatsdAddress("fake:"),
expected: "{\"address\": \"fake\", \"port_value\": }",
},
{
testName: "statsd address missing port",
key: "statsd",
option: option.StatsdAddress("127.0.0.1"),
expectError: true,
},
{
testName: "envoy metrics address empty",
key: "envoy_metrics_service_address",
option: option.EnvoyMetricsServiceAddress(""),
expected: nil,
},
{
testName: "envoy metrics address ipv4",
key: "envoy_metrics_service_address",
option: option.EnvoyMetricsServiceAddress("127.0.0.1:80"),
expected: "{\"address\": \"127.0.0.1\", \"port_value\": 80}",
},
{
testName: "envoy metrics address ipv6",
key: "envoy_metrics_service_address",
option: option.EnvoyMetricsServiceAddress("[2001:db8::100]:80"),
expected: "{\"address\": \"2001:db8::100\", \"port_value\": 80}",
},
{
testName: "envoy metrics address ipv6 missing brackets",
key: "envoy_metrics_service_address",
option: option.EnvoyMetricsServiceAddress("2001:db8::100:80"),
expectError: true,
},
{
testName: "envoy metrics address host port",
key: "envoy_metrics_service_address",
option: option.EnvoyMetricsServiceAddress("fake:80"),
expected: "{\"address\": \"fake\", \"port_value\": 80}",
},
{
testName: "envoy metrics address no port",
key: "envoy_metrics_service_address",
option: option.EnvoyMetricsServiceAddress("fake:"),
expected: "{\"address\": \"fake\", \"port_value\": }",
},
{
testName: "envoy metrics address missing port",
key: "envoy_metrics_service_address",
option: option.EnvoyMetricsServiceAddress("127.0.0.1"),
expectError: true,
},
{
testName: "envoy metrics tls nil",
key: "envoy_metrics_service_tls",
option: option.EnvoyMetricsServiceTLS(nil, &model.BootstrapNodeMetadata{}),
expected: nil,
},
{
testName: "envoy metrics tls",
key: "envoy_metrics_service_tls",
option: option.EnvoyMetricsServiceTLS(&networkingAPI.ClientTLSSettings{
Mode: networkingAPI.ClientTLSSettings_ISTIO_MUTUAL,
}, &model.BootstrapNodeMetadata{}),
expected: `{"name":"envoy.transport_sockets.tls","typed_config":{"@type":"type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext","common_tls_context":{"alpn_protocols":["istio","h2"],"combined_validation_context":{"default_validation_context":{},"validation_context_sds_secret_config":{"name":"ROOTCA","sds_config":{"api_config_source":{"api_type":"GRPC","grpc_services":[{"envoy_grpc":{"cluster_name":"sds-grpc"}}],"set_node_on_first_message_only":true,"transport_api_version":"V3"},"initial_fetch_timeout":"0s","resource_api_version":"V3"}}},"tls_certificate_sds_secret_configs":[{"name":"default","sds_config":{"api_config_source":{"api_type":"GRPC","grpc_services":[{"envoy_grpc":{"cluster_name":"sds-grpc"}}],"set_node_on_first_message_only":true,"transport_api_version":"V3"},"initial_fetch_timeout":"0s","resource_api_version":"V3"}}]},"sni":"envoy_metrics_service"}}`,
},
{
testName: "envoy metrics keepalive nil",
key: "envoy_metrics_service_tcp_keepalive",
option: option.EnvoyMetricsServiceTCPKeepalive(nil),
expected: nil,
},
{
testName: "envoy metrics keepalive",
key: "envoy_metrics_service_tcp_keepalive",
option: option.EnvoyMetricsServiceTCPKeepalive(&networkingAPI.ConnectionPoolSettings_TCPSettings_TcpKeepalive{
Time: durationpb.New(time.Second),
}),
expected: "{\"tcp_keepalive\":{\"keepalive_time\":{\"value\":1}}}",
},
{
testName: "envoy accesslog address empty",
key: "envoy_accesslog_service_address",
option: option.EnvoyAccessLogServiceAddress(""),
expected: nil,
},
{
testName: "envoy accesslog address ipv4",
key: "envoy_accesslog_service_address",
option: option.EnvoyAccessLogServiceAddress("127.0.0.1:80"),
expected: "{\"address\": \"127.0.0.1\", \"port_value\": 80}",
},
{
testName: "envoy accesslog address ipv6",
key: "envoy_accesslog_service_address",
option: option.EnvoyAccessLogServiceAddress("[2001:db8::100]:80"),
expected: "{\"address\": \"2001:db8::100\", \"port_value\": 80}",
},
{
testName: "envoy accesslog address ipv6 missing brackets",
key: "envoy_accesslog_service_address",
option: option.EnvoyAccessLogServiceAddress("2001:db8::100:80"),
expectError: true,
},
{
testName: "envoy accesslog address host port",
key: "envoy_accesslog_service_address",
option: option.EnvoyAccessLogServiceAddress("fake:80"),
expected: "{\"address\": \"fake\", \"port_value\": 80}",
},
{
testName: "envoy accesslog address no port",
key: "envoy_accesslog_service_address",
option: option.EnvoyAccessLogServiceAddress("fake:"),
expected: "{\"address\": \"fake\", \"port_value\": }",
},
{
testName: "envoy accesslog address missing port",
key: "envoy_accesslog_service_address",
option: option.EnvoyAccessLogServiceAddress("127.0.0.1"),
expectError: true,
},
{
testName: "envoy accesslog tls nil",
key: "envoy_accesslog_service_tls",
option: option.EnvoyAccessLogServiceTLS(nil, &model.BootstrapNodeMetadata{}),
expected: nil,
},
{
testName: "envoy access log tls",
key: "envoy_accesslog_service_tls",
option: option.EnvoyAccessLogServiceTLS(&networkingAPI.ClientTLSSettings{
Mode: networkingAPI.ClientTLSSettings_ISTIO_MUTUAL,
}, &model.BootstrapNodeMetadata{}),
expected: `{"name":"envoy.transport_sockets.tls","typed_config":{"@type":"type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext","common_tls_context":{"alpn_protocols":["istio","h2"],"combined_validation_context":{"default_validation_context":{},"validation_context_sds_secret_config":{"name":"ROOTCA","sds_config":{"api_config_source":{"api_type":"GRPC","grpc_services":[{"envoy_grpc":{"cluster_name":"sds-grpc"}}],"set_node_on_first_message_only":true,"transport_api_version":"V3"},"initial_fetch_timeout":"0s","resource_api_version":"V3"}}},"tls_certificate_sds_secret_configs":[{"name":"default","sds_config":{"api_config_source":{"api_type":"GRPC","grpc_services":[{"envoy_grpc":{"cluster_name":"sds-grpc"}}],"set_node_on_first_message_only":true,"transport_api_version":"V3"},"initial_fetch_timeout":"0s","resource_api_version":"V3"}}]},"sni":"envoy_accesslog_service"}}`,
},
{
testName: "envoy access log keepalive nil",
key: "envoy_accesslog_service_tcp_keepalive",
option: option.EnvoyAccessLogServiceTCPKeepalive(nil),
expected: nil,
},
{
testName: "envoy access log keepalive",
key: "envoy_accesslog_service_tcp_keepalive",
option: option.EnvoyAccessLogServiceTCPKeepalive(&networkingAPI.ConnectionPoolSettings_TCPSettings_TcpKeepalive{
Time: durationpb.New(time.Second),
}),
expected: "{\"tcp_keepalive\":{\"keepalive_time\":{\"value\":1}}}",
},
{
testName: "envoy stats matcher inclusion prefix nil",
key: "inclusionPrefix",
option: option.EnvoyStatsMatcherInclusionPrefix(nil),
expected: nil,
},
{
testName: "envoy stats matcher inclusion prefix empty",
key: "inclusionPrefix",
option: option.EnvoyStatsMatcherInclusionPrefix(make([]string, 0)),
expected: nil,
},
{
testName: "envoy stats matcher inclusion prefix",
key: "inclusionPrefix",
option: option.EnvoyStatsMatcherInclusionPrefix([]string{"fake"}),
expected: []string{"fake"},
},
{
testName: "envoy stats matcher inclusion suffix nil",
key: "inclusionSuffix",
option: option.EnvoyStatsMatcherInclusionSuffix(nil),
expected: nil,
},
{
testName: "envoy stats matcher inclusion suffix empty",
key: "inclusionSuffix",
option: option.EnvoyStatsMatcherInclusionSuffix(make([]string, 0)),
expected: nil,
},
{
testName: "envoy stats matcher inclusion suffix",
key: "inclusionSuffix",
option: option.EnvoyStatsMatcherInclusionSuffix([]string{"fake"}),
expected: []string{"fake"},
},
{
testName: "envoy stats matcher inclusion regexp nil",
key: "inclusionRegexps",
option: option.EnvoyStatsMatcherInclusionRegexp(nil),
expected: nil,
},
{
testName: "envoy stats matcher inclusion regexp empty",
key: "inclusionRegexps",
option: option.EnvoyStatsMatcherInclusionRegexp(make([]string, 0)),
expected: nil,
},
{
testName: "envoy stats matcher inclusion regexp",
key: "inclusionRegexps",
option: option.EnvoyStatsMatcherInclusionRegexp([]string{"fake"}),
expected: []string{"fake"},
},
{
testName: "sts enabled",
key: "sts",
option: option.STSEnabled(true),
expected: true,
},
{
testName: "sts port",
key: "sts_port",
option: option.STSPort(5555),
expected: 5555,
},
{
testName: "project id",
key: "gcp_project_id",
option: option.GCPProjectID("project"),
expected: "project",
},
{
testName: "tracing tls nil",
key: "tracing_tls",
option: option.TracingTLS(nil, &model.BootstrapNodeMetadata{}, false),
expected: nil,
},
{
testName: "tracing tls",
key: "tracing_tls",
option: option.TracingTLS(&networkingAPI.ClientTLSSettings{
Mode: networkingAPI.ClientTLSSettings_SIMPLE,
CaCertificates: "/etc/tracing/ca.pem",
}, &model.BootstrapNodeMetadata{}, false),
expected: `{"name":"envoy.transport_sockets.tls","typed_config":{"@type":"type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext","common_tls_context":{"combined_validation_context":{"default_validation_context":{},"validation_context_sds_secret_config":{"name":"file-root:/etc/tracing/ca.pem","sds_config":{"api_config_source":{"api_type":"GRPC","grpc_services":[{"envoy_grpc":{"cluster_name":"sds-grpc"}}],"set_node_on_first_message_only":true,"transport_api_version":"V3"},"resource_api_version":"V3"}}}}}}`,
},
}
for _, c := range cases {
t.Run(c.testName, func(t *testing.T) {
g := NewWithT(t)
params, err := option.NewTemplateParams(c.option)
if c.expectError {
g.Expect(err).ToNot(BeNil())
} else {
g.Expect(err).To(BeNil())
actual, ok := params[c.key]
if c.expected == nil {
g.Expect(ok).To(BeFalse())
} else {
g.Expect(ok).To(BeTrue())
g.Expect(actual).To(Equal(c.expected))
}
}
})
}
}