blob: e15c8cf91cd574ca07b08695e400bfa0a01c30ad [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 validation
import (
"testing"
)
import (
meshconfig "istio.io/api/mesh/v1alpha1"
)
func TestValidateExtensionProviderService(t *testing.T) {
tests := []struct {
service string
valid bool
name string
}{
{
service: "127.0.0.1",
valid: true,
name: "pure ip4 address",
},
{
service: "2001:1::1",
valid: true,
name: "pure ip6 address",
},
{
service: "istio-pilot.dubbo-system.svc.cluster.local",
valid: true,
name: "standard kubernetes FQDN",
},
{
service: "istio-pilot.dubbo-system.svc.cluster.local:3000",
valid: false,
name: "standard kubernetes FQDN with port",
},
{
service: "bar/istio.io",
valid: true,
name: "extension provider service with namespace",
},
{
service: "bar/istio.io:3000",
valid: false,
name: "extension provider service with namespace and port",
},
{
service: "bar/foo/istio.io",
valid: false,
name: "extension provider service with namespace",
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
err := validateExtensionProviderService(tt.service)
valid := err == nil
if valid != tt.valid {
t.Errorf("Expected valid=%v, got valid=%v for %v", tt.valid, valid, tt.service)
}
})
}
}
func TestValidateExtensionProviderTracingZipkin(t *testing.T) {
cases := []struct {
name string
config *meshconfig.MeshConfig_ExtensionProvider_ZipkinTracingProvider
valid bool
}{
{
name: "zipkin normal",
config: &meshconfig.MeshConfig_ExtensionProvider_ZipkinTracingProvider{
Service: "zipkin.dubbo-system",
Port: 9411,
},
valid: true,
},
{
name: "zipkin service with namespace",
config: &meshconfig.MeshConfig_ExtensionProvider_ZipkinTracingProvider{
Service: "namespace/zipkin.dubbo-system",
Port: 9411,
},
valid: true,
},
{
name: "zipkin service with invalid namespace",
config: &meshconfig.MeshConfig_ExtensionProvider_ZipkinTracingProvider{
Service: "name/space/zipkin.dubbo-system",
Port: 9411,
},
valid: false,
},
{
name: "zipkin service with port",
config: &meshconfig.MeshConfig_ExtensionProvider_ZipkinTracingProvider{
Service: "zipkin.dubbo-system:9411",
Port: 9411,
},
valid: false,
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
err := validateExtensionProviderTracingZipkin(c.config)
valid := err == nil
if valid != c.valid {
t.Errorf("Expected valid=%v, got valid=%v for %v", c.valid, valid, c.config)
}
})
}
}
func TestValidateExtensionProviderTracingLightstep(t *testing.T) {
cases := []struct {
name string
config *meshconfig.MeshConfig_ExtensionProvider_LightstepTracingProvider
valid bool
}{
{
name: "lightstep normal",
config: &meshconfig.MeshConfig_ExtensionProvider_LightstepTracingProvider{
Service: "collector.lightstep",
Port: 8080,
AccessToken: "abcdefg1234567",
},
valid: true,
},
{
name: "lightstep service with namespace",
config: &meshconfig.MeshConfig_ExtensionProvider_LightstepTracingProvider{
Service: "namespace/collector.lightstep",
Port: 8080,
AccessToken: "abcdefg1234567",
},
valid: true,
},
{
name: "lightstep service with missing port",
config: &meshconfig.MeshConfig_ExtensionProvider_LightstepTracingProvider{
Service: "10.0.0.100",
AccessToken: "abcdefg1234567",
},
valid: false,
},
{
name: "lightstep service with missing accesstoken",
config: &meshconfig.MeshConfig_ExtensionProvider_LightstepTracingProvider{
Service: "namespace/collector.lightstep",
Port: 8080,
},
valid: false,
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
err := validateExtensionProviderTracingLightStep(c.config)
valid := err == nil
if valid != c.valid {
t.Errorf("Expected valid=%v, got valid=%v for %v", c.valid, valid, c.config)
}
})
}
}
func TestValidateExtensionProviderTracingDatadog(t *testing.T) {
cases := []struct {
name string
config *meshconfig.MeshConfig_ExtensionProvider_DatadogTracingProvider
valid bool
}{
{
name: "datadog normal",
config: &meshconfig.MeshConfig_ExtensionProvider_DatadogTracingProvider{
Service: "datadog-agent.com",
Port: 8126,
},
valid: true,
},
{
name: "datadog service with namespace",
config: &meshconfig.MeshConfig_ExtensionProvider_DatadogTracingProvider{
Service: "namespace/datadog-agent.com",
Port: 8126,
},
valid: true,
},
{
name: "datadog service with invalid namespace",
config: &meshconfig.MeshConfig_ExtensionProvider_DatadogTracingProvider{
Service: "name/space/datadog-agent.com",
Port: 8126,
},
valid: false,
},
{
name: "datadog service with port",
config: &meshconfig.MeshConfig_ExtensionProvider_DatadogTracingProvider{
Service: "datadog-agent.com:8126",
Port: 8126,
},
valid: false,
},
{
name: "datadog missing port",
config: &meshconfig.MeshConfig_ExtensionProvider_DatadogTracingProvider{
Service: "datadog-agent.com",
},
valid: false,
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
err := validateExtensionProviderTracingDatadog(c.config)
valid := err == nil
if valid != c.valid {
t.Errorf("Expected valid=%v, got valid=%v for %v", c.valid, valid, c.config)
}
})
}
}
func TestValidateExtensionProviderTracingOpenCensusAgent(t *testing.T) {
cases := []struct {
name string
config *meshconfig.MeshConfig_ExtensionProvider_OpenCensusAgentTracingProvider
valid bool
}{
{
name: "opencensus normal",
config: &meshconfig.MeshConfig_ExtensionProvider_OpenCensusAgentTracingProvider{
Service: "opencensus-agent.com",
Port: 4000,
},
valid: true,
},
{
name: "opencensus service with namespace",
config: &meshconfig.MeshConfig_ExtensionProvider_OpenCensusAgentTracingProvider{
Service: "namespace/opencensus-agent.com",
Port: 4000,
},
valid: true,
},
{
name: "opencensus service with invalid namespace",
config: &meshconfig.MeshConfig_ExtensionProvider_OpenCensusAgentTracingProvider{
Service: "name/space/opencensus-agent.com",
Port: 4000,
},
valid: false,
},
{
name: "opencensus service with port",
config: &meshconfig.MeshConfig_ExtensionProvider_OpenCensusAgentTracingProvider{
Service: "opencensus-agent.com:4000",
Port: 4000,
},
valid: false,
},
{
name: "opencensus missing port",
config: &meshconfig.MeshConfig_ExtensionProvider_OpenCensusAgentTracingProvider{
Service: "opencensus-agent.com",
},
valid: false,
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
err := validateExtensionProviderTracingOpenCensusAgent(c.config)
valid := err == nil
if valid != c.valid {
t.Errorf("Expected valid=%v, got valid=%v for %v", c.valid, valid, c.config)
}
})
}
}
func TestValidateExtensionProviderEnvoyOtelAls(t *testing.T) {
cases := []struct {
name string
provider *meshconfig.MeshConfig_ExtensionProvider_EnvoyOpenTelemetryLogProvider
valid bool
}{
{
name: "otel normal",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyOpenTelemetryLogProvider{
Service: "otel.istio-syste.svc",
Port: 4000,
},
valid: true,
},
{
name: "otel service with namespace",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyOpenTelemetryLogProvider{
Service: "namespace/otel.istio-syste.svc",
Port: 4000,
},
valid: true,
},
{
name: "otel service with invalid namespace",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyOpenTelemetryLogProvider{
Service: "name/space/otel.istio-syste.svc",
Port: 4000,
},
valid: false,
},
{
name: "otel service with port",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyOpenTelemetryLogProvider{
Service: "otel.istio-syste.svc:4000",
Port: 4000,
},
valid: false,
},
{
name: "otel missing port",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyOpenTelemetryLogProvider{
Service: "otel.istio-syste.svc",
},
valid: false,
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
err := ValidateExtensionProviderEnvoyOtelAls(c.provider)
valid := err == nil
if valid != c.valid {
t.Errorf("Expected valid=%v, got valid=%v for %v", c.valid, valid, c.provider)
}
})
}
}
func TestValidateExtensionProviderEnvoyHTTPAls(t *testing.T) {
cases := []struct {
name string
provider *meshconfig.MeshConfig_ExtensionProvider_EnvoyHttpGrpcV3LogProvider
valid bool
}{
{
name: "normal",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyHttpGrpcV3LogProvider{
Service: "grpc-als.istio-syste.svc",
Port: 4000,
},
valid: true,
},
{
name: "service with namespace",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyHttpGrpcV3LogProvider{
Service: "namespace/grpc-als.istio-syste.svc",
Port: 4000,
},
valid: true,
},
{
name: "service with invalid namespace",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyHttpGrpcV3LogProvider{
Service: "name/space/grpc-als.istio-syste.svc",
Port: 4000,
},
valid: false,
},
{
name: "service with port",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyHttpGrpcV3LogProvider{
Service: "grpc-als.istio-syste.svc:4000",
Port: 4000,
},
valid: false,
},
{
name: "missing port",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyHttpGrpcV3LogProvider{
Service: "grpc-als.istio-syste.svc",
},
valid: false,
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
err := ValidateExtensionProviderEnvoyHTTPAls(c.provider)
valid := err == nil
if valid != c.valid {
t.Errorf("Expected valid=%v, got valid=%v for %v", c.valid, valid, c.provider)
}
})
}
}
func TestValidateExtensionProviderEnvoyTCPAls(t *testing.T) {
cases := []struct {
name string
provider *meshconfig.MeshConfig_ExtensionProvider_EnvoyTcpGrpcV3LogProvider
valid bool
}{
{
name: "normal",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyTcpGrpcV3LogProvider{
Service: "grpc-als.istio-syste.svc",
Port: 4000,
},
valid: true,
},
{
name: "service with namespace",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyTcpGrpcV3LogProvider{
Service: "namespace/grpc-als.istio-syste.svc",
Port: 4000,
},
valid: true,
},
{
name: "service with invalid namespace",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyTcpGrpcV3LogProvider{
Service: "name/space/grpc-als.istio-syste.svc",
Port: 4000,
},
valid: false,
},
{
name: "service with port",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyTcpGrpcV3LogProvider{
Service: "grpc-als.istio-syste.svc:4000",
Port: 4000,
},
valid: false,
},
{
name: "missing port",
provider: &meshconfig.MeshConfig_ExtensionProvider_EnvoyTcpGrpcV3LogProvider{
Service: "grpc-als.istio-syste.svc",
},
valid: false,
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
err := ValidateExtensionProviderEnvoyTCPAls(c.provider)
valid := err == nil
if valid != c.valid {
t.Errorf("Expected valid=%v, got valid=%v for %v", c.valid, valid, c.provider)
}
})
}
}