in pkg/config/validation/validation.go [1725:1834]
func ValidateMeshConfigProxyConfig(config *meshconfig.ProxyConfig) (errs error) {
if config.ConfigPath == "" {
errs = multierror.Append(errs, errors.New("config path must be set"))
}
if config.BinaryPath == "" {
errs = multierror.Append(errs, errors.New("binary path must be set"))
}
clusterName := config.GetClusterName()
switch naming := clusterName.(type) {
case *meshconfig.ProxyConfig_ServiceCluster:
if naming.ServiceCluster == "" {
errs = multierror.Append(errs, errors.New("service cluster must be specified"))
}
case *meshconfig.ProxyConfig_TracingServiceName_: // intentionally left empty for now
default:
errs = multierror.Append(errs, errors.New("oneof service cluster or tracing service name must be specified"))
}
if err := ValidateParentAndDrain(config.DrainDuration, config.ParentShutdownDuration); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, "invalid parent and drain time combination"))
}
// discovery address is mandatory since mutual TLS relies on CDS.
// strictly speaking, proxies can operate without RDS/CDS and with hot restarts
// but that requires additional test validation
if config.DiscoveryAddress == "" {
errs = multierror.Append(errs, errors.New("discovery address must be set to the proxy discovery service"))
} else if err := ValidateProxyAddress(config.DiscoveryAddress); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, "invalid discovery address:"))
}
if tracer := config.GetTracing().GetLightstep(); tracer != nil {
if err := ValidateLightstepCollector(tracer); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, "invalid lightstep config:"))
}
}
if tracer := config.GetTracing().GetZipkin(); tracer != nil {
if err := ValidateZipkinCollector(tracer); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, "invalid zipkin config:"))
}
}
if tracer := config.GetTracing().GetDatadog(); tracer != nil {
if err := ValidateDatadogCollector(tracer); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, "invalid datadog config:"))
}
}
if tracer := config.GetTracing().GetTlsSettings(); tracer != nil {
if err := validateTLS(tracer); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, "invalid tracing TLS config:"))
}
}
if tracerCustomTags := config.GetTracing().GetCustomTags(); tracerCustomTags != nil {
if err := validateCustomTags(tracerCustomTags); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, "invalid tracing custom tags:"))
}
}
if config.StatsdUdpAddress != "" {
if err := ValidateProxyAddress(config.StatsdUdpAddress); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, fmt.Sprintf("invalid statsd udp address %q:", config.StatsdUdpAddress)))
}
}
// nolint: staticcheck
if config.EnvoyMetricsServiceAddress != "" {
if err := ValidateProxyAddress(config.EnvoyMetricsServiceAddress); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, fmt.Sprintf("invalid envoy metrics service address %q:", config.EnvoyMetricsServiceAddress)))
} else {
scope.Warnf("EnvoyMetricsServiceAddress is deprecated, use EnvoyMetricsService instead.") // nolint: stylecheck
}
}
if config.EnvoyMetricsService != nil && config.EnvoyMetricsService.Address != "" {
if err := ValidateProxyAddress(config.EnvoyMetricsService.Address); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, fmt.Sprintf("invalid envoy metrics service address %q:", config.EnvoyMetricsService.Address)))
}
}
if config.EnvoyAccessLogService != nil && config.EnvoyAccessLogService.Address != "" {
if err := ValidateProxyAddress(config.EnvoyAccessLogService.Address); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, fmt.Sprintf("invalid envoy access log service address %q:", config.EnvoyAccessLogService.Address)))
}
}
if err := ValidatePort(int(config.ProxyAdminPort)); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, "invalid proxy admin port:"))
}
if err := ValidateControlPlaneAuthPolicy(config.ControlPlaneAuthPolicy); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, "invalid authentication policy:"))
}
if err := ValidatePort(int(config.StatusPort)); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, "invalid status port:"))
}
if pkpConf := config.GetPrivateKeyProvider(); pkpConf != nil {
if err := validatePrivateKeyProvider(pkpConf); err != nil {
errs = multierror.Append(errs, multierror.Prefix(err, "invalid private key provider confguration:"))
}
}
return
}