Merge pull request #16707 from serathius/dynamic-flags

Dynamically generate flags passed to etcd binary
This commit is contained in:
Marek Siarkowicz 2023-10-12 18:23:23 +02:00 committed by GitHub
commit 6d68ab092d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 65 additions and 72 deletions

View File

@ -70,8 +70,10 @@ func TestConnectionMultiplexing(t *testing.T) {
} { } {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
ctx := context.Background() ctx := context.Background()
cfg := e2e.EtcdProcessClusterConfig{ClusterSize: 1, Client: e2e.ClientConfig{ConnectionType: tc.serverTLS}, ClientHttpSeparate: tc.separateHttpPort} cfg := e2e.NewConfig(e2e.WithClusterSize(1))
clus, err := e2e.NewEtcdProcessCluster(ctx, t, e2e.WithConfig(&cfg)) cfg.Client.ConnectionType = tc.serverTLS
cfg.ClientHttpSeparate = tc.separateHttpPort
clus, err := e2e.NewEtcdProcessCluster(ctx, t, e2e.WithConfig(cfg))
require.NoError(t, err) require.NoError(t, err)
defer clus.Close() defer clus.Close()

View File

@ -39,10 +39,11 @@ const (
) )
type testCase struct { type testCase struct {
name string name string
config e2e.EtcdProcessClusterConfig client e2e.ClientConfig
maxWatchDelay time.Duration clientHttpSerparate bool
dbSizeBytes int maxWatchDelay time.Duration
dbSizeBytes int
} }
const ( const (
@ -56,27 +57,27 @@ const (
var tcs = []testCase{ var tcs = []testCase{
{ {
name: "NoTLS", name: "NoTLS",
config: e2e.EtcdProcessClusterConfig{ClusterSize: 1},
maxWatchDelay: 150 * time.Millisecond, maxWatchDelay: 150 * time.Millisecond,
dbSizeBytes: 5 * Mega, dbSizeBytes: 5 * Mega,
}, },
{ {
name: "TLS", name: "TLS",
config: e2e.EtcdProcessClusterConfig{ClusterSize: 1, Client: e2e.ClientConfig{ConnectionType: e2e.ClientTLS}}, client: e2e.ClientConfig{ConnectionType: e2e.ClientTLS},
maxWatchDelay: 150 * time.Millisecond, maxWatchDelay: 150 * time.Millisecond,
dbSizeBytes: 5 * Mega, dbSizeBytes: 5 * Mega,
}, },
{ {
name: "SeparateHttpNoTLS", name: "SeparateHttpNoTLS",
config: e2e.EtcdProcessClusterConfig{ClusterSize: 1, ClientHttpSeparate: true}, clientHttpSerparate: true,
maxWatchDelay: 150 * time.Millisecond, maxWatchDelay: 150 * time.Millisecond,
dbSizeBytes: 5 * Mega, dbSizeBytes: 5 * Mega,
}, },
{ {
name: "SeparateHttpTLS", name: "SeparateHttpTLS",
config: e2e.EtcdProcessClusterConfig{ClusterSize: 1, Client: e2e.ClientConfig{ConnectionType: e2e.ClientTLS}, ClientHttpSeparate: true}, client: e2e.ClientConfig{ConnectionType: e2e.ClientTLS},
maxWatchDelay: 150 * time.Millisecond, clientHttpSerparate: true,
dbSizeBytes: 5 * Mega, maxWatchDelay: 150 * time.Millisecond,
dbSizeBytes: 5 * Mega,
}, },
} }
@ -84,12 +85,16 @@ func TestWatchDelayForPeriodicProgressNotification(t *testing.T) {
e2e.BeforeTest(t) e2e.BeforeTest(t)
for _, tc := range tcs { for _, tc := range tcs {
tc := tc tc := tc
tc.config.ServerConfig.ExperimentalWatchProgressNotifyInterval = watchResponsePeriod cfg := e2e.DefaultConfig()
cfg.ClusterSize = 1
cfg.ServerConfig.ExperimentalWatchProgressNotifyInterval = watchResponsePeriod
cfg.Client = tc.client
cfg.ClientHttpSeparate = tc.clientHttpSerparate
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
clus, err := e2e.NewEtcdProcessCluster(context.Background(), t, e2e.WithConfig(&tc.config)) clus, err := e2e.NewEtcdProcessCluster(context.Background(), t, e2e.WithConfig(cfg))
require.NoError(t, err) require.NoError(t, err)
defer clus.Close() defer clus.Close()
c := newClient(t, clus.EndpointsGRPC(), tc.config.Client) c := newClient(t, clus.EndpointsGRPC(), tc.client)
require.NoError(t, fillEtcdWithData(context.Background(), c, tc.dbSizeBytes)) require.NoError(t, fillEtcdWithData(context.Background(), c, tc.dbSizeBytes))
ctx, cancel := context.WithTimeout(context.Background(), watchTestDuration) ctx, cancel := context.WithTimeout(context.Background(), watchTestDuration)
@ -105,11 +110,16 @@ func TestWatchDelayForPeriodicProgressNotification(t *testing.T) {
func TestWatchDelayForManualProgressNotification(t *testing.T) { func TestWatchDelayForManualProgressNotification(t *testing.T) {
e2e.BeforeTest(t) e2e.BeforeTest(t)
for _, tc := range tcs { for _, tc := range tcs {
tc := tc
cfg := e2e.DefaultConfig()
cfg.ClusterSize = 1
cfg.Client = tc.client
cfg.ClientHttpSeparate = tc.clientHttpSerparate
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
clus, err := e2e.NewEtcdProcessCluster(context.Background(), t, e2e.WithConfig(&tc.config)) clus, err := e2e.NewEtcdProcessCluster(context.Background(), t, e2e.WithConfig(cfg))
require.NoError(t, err) require.NoError(t, err)
defer clus.Close() defer clus.Close()
c := newClient(t, clus.EndpointsGRPC(), tc.config.Client) c := newClient(t, clus.EndpointsGRPC(), tc.client)
require.NoError(t, fillEtcdWithData(context.Background(), c, tc.dbSizeBytes)) require.NoError(t, fillEtcdWithData(context.Background(), c, tc.dbSizeBytes))
ctx, cancel := context.WithTimeout(context.Background(), watchTestDuration) ctx, cancel := context.WithTimeout(context.Background(), watchTestDuration)
@ -137,11 +147,16 @@ func TestWatchDelayForManualProgressNotification(t *testing.T) {
func TestWatchDelayForEvent(t *testing.T) { func TestWatchDelayForEvent(t *testing.T) {
e2e.BeforeTest(t) e2e.BeforeTest(t)
for _, tc := range tcs { for _, tc := range tcs {
tc := tc
cfg := e2e.DefaultConfig()
cfg.ClusterSize = 1
cfg.Client = tc.client
cfg.ClientHttpSeparate = tc.clientHttpSerparate
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
clus, err := e2e.NewEtcdProcessCluster(context.Background(), t, e2e.WithConfig(&tc.config)) clus, err := e2e.NewEtcdProcessCluster(context.Background(), t, e2e.WithConfig(cfg))
require.NoError(t, err) require.NoError(t, err)
defer clus.Close() defer clus.Close()
c := newClient(t, clus.EndpointsGRPC(), tc.config.Client) c := newClient(t, clus.EndpointsGRPC(), tc.client)
require.NoError(t, fillEtcdWithData(context.Background(), c, tc.dbSizeBytes)) require.NoError(t, fillEtcdWithData(context.Background(), c, tc.dbSizeBytes))
ctx, cancel := context.WithTimeout(context.Background(), watchTestDuration) ctx, cancel := context.WithTimeout(context.Background(), watchTestDuration)

View File

@ -17,6 +17,7 @@ package e2e
import ( import (
"context" "context"
"errors" "errors"
"flag"
"fmt" "fmt"
"net/url" "net/url"
"path" "path"
@ -30,10 +31,8 @@ import (
"go.uber.org/zap/zaptest" "go.uber.org/zap/zaptest"
"go.etcd.io/etcd/api/v3/etcdserverpb" "go.etcd.io/etcd/api/v3/etcdserverpb"
"go.etcd.io/etcd/client/pkg/v3/logutil"
clientv3 "go.etcd.io/etcd/client/v3" clientv3 "go.etcd.io/etcd/client/v3"
"go.etcd.io/etcd/pkg/v3/proxy" "go.etcd.io/etcd/pkg/v3/proxy"
config2 "go.etcd.io/etcd/server/v3/config"
"go.etcd.io/etcd/server/v3/embed" "go.etcd.io/etcd/server/v3/embed"
"go.etcd.io/etcd/server/v3/etcdserver" "go.etcd.io/etcd/server/v3/etcdserver"
"go.etcd.io/etcd/tests/v3/framework/config" "go.etcd.io/etcd/tests/v3/framework/config"
@ -538,9 +537,6 @@ func (cfg *EtcdProcessClusterConfig) EtcdServerProcessConfig(tb testing.TB, i in
if cfg.EnableV2 { if cfg.EnableV2 {
args = append(args, "--enable-v2") args = append(args, "--enable-v2")
} }
if cfg.ServerConfig.ExperimentalInitialCorruptCheck {
args = append(args, "--experimental-initial-corrupt-check")
}
var murl string var murl string
if cfg.MetricsURLScheme != "" { if cfg.MetricsURLScheme != "" {
murl = (&url.URL{ murl = (&url.URL{
@ -552,54 +548,20 @@ func (cfg *EtcdProcessClusterConfig) EtcdServerProcessConfig(tb testing.TB, i in
args = append(args, cfg.TlsArgs()...) args = append(args, cfg.TlsArgs()...)
if cfg.ServerConfig.AuthToken != "" && cfg.ServerConfig.AuthToken != embed.DefaultAuthToken {
args = append(args, "--auth-token="+cfg.ServerConfig.AuthToken)
}
if cfg.ServerConfig.V2Deprecation != "" && cfg.ServerConfig.V2Deprecation != config2.V2_DEPR_DEFAULT {
args = append(args, "--v2-deprecation="+string(cfg.ServerConfig.V2Deprecation))
}
if cfg.Discovery != "" { if cfg.Discovery != "" {
args = append(args, "--discovery="+cfg.Discovery) args = append(args, "--discovery="+cfg.Discovery)
} }
if cfg.ServerConfig.LogLevel != "" && cfg.ServerConfig.LogLevel != logutil.DefaultLogLevel { defaultValues := values(*embed.NewConfig())
args = append(args, "--log-level="+cfg.ServerConfig.LogLevel) overrideValues := values(cfg.ServerConfig)
} for flag, value := range overrideValues {
if defaultValue := defaultValues[flag]; value == "" || value == defaultValue {
if cfg.ServerConfig.MaxConcurrentStreams != 0 && cfg.ServerConfig.MaxConcurrentStreams != embed.DefaultMaxConcurrentStreams { continue
args = append(args, "--max-concurrent-streams="+fmt.Sprintf("%d", cfg.ServerConfig.MaxConcurrentStreams))
}
if cfg.ServerConfig.ExperimentalCorruptCheckTime != 0 {
args = append(args, "--experimental-corrupt-check-time="+fmt.Sprintf("%s", cfg.ServerConfig.ExperimentalCorruptCheckTime))
}
if cfg.ServerConfig.ExperimentalCompactHashCheckEnabled {
args = append(args, "--experimental-compact-hash-check-enabled")
}
if cfg.ServerConfig.ExperimentalCompactHashCheckTime != 0 && cfg.ServerConfig.ExperimentalCompactHashCheckTime != embed.DefaultExperimentalCompactHashCheckTime {
args = append(args, "--experimental-compact-hash-check-time="+cfg.ServerConfig.ExperimentalCompactHashCheckTime.String())
}
if cfg.ServerConfig.ExperimentalCompactionBatchLimit != 0 {
args = append(args, "--experimental-compaction-batch-limit="+fmt.Sprintf("%d", cfg.ServerConfig.ExperimentalCompactionBatchLimit))
}
if cfg.ServerConfig.ExperimentalCompactionSleepInterval != 0 {
args = append(args, "--experimental-compaction-sleep-interval="+cfg.ServerConfig.ExperimentalCompactionSleepInterval.String())
}
if cfg.ServerConfig.WarningUnaryRequestDuration != 0 {
args = append(args, "--warning-unary-request-duration="+cfg.ServerConfig.WarningUnaryRequestDuration.String())
}
if cfg.ServerConfig.ExperimentalWarningUnaryRequestDuration != 0 {
args = append(args, "--experimental-warning-unary-request-duration="+cfg.ServerConfig.ExperimentalWarningUnaryRequestDuration.String())
}
if cfg.ServerConfig.ExperimentalWatchProgressNotifyInterval != 0 {
args = append(args, "--experimental-watch-progress-notify-interval="+cfg.ServerConfig.ExperimentalWatchProgressNotifyInterval.String())
}
if cfg.ServerConfig.SnapshotCatchUpEntries != 0 && cfg.ServerConfig.SnapshotCatchUpEntries != etcdserver.DefaultSnapshotCatchUpEntries {
if cfg.Version == CurrentVersion || (cfg.Version == MinorityLastVersion && i <= cfg.ClusterSize/2) || (cfg.Version == QuorumLastVersion && i > cfg.ClusterSize/2) {
args = append(args, "--experimental-snapshot-catchup-entries="+fmt.Sprintf("%d", cfg.ServerConfig.SnapshotCatchUpEntries))
} }
if flag == "experimental-snapshot-catchup-entries" && !(cfg.Version == CurrentVersion || (cfg.Version == MinorityLastVersion && i <= cfg.ClusterSize/2) || (cfg.Version == QuorumLastVersion && i > cfg.ClusterSize/2)) {
continue
}
args = append(args, fmt.Sprintf("--%s=%s", flag, value))
} }
envVars := map[string]string{} envVars := map[string]string{}
for key, value := range cfg.EnvVars { for key, value := range cfg.EnvVars {
@ -654,6 +616,20 @@ func (cfg *EtcdProcessClusterConfig) EtcdServerProcessConfig(tb testing.TB, i in
} }
} }
func values(cfg embed.Config) map[string]string {
fs := flag.NewFlagSet("etcd", flag.ContinueOnError)
cfg.AddFlags(fs)
values := map[string]string{}
fs.VisitAll(func(f *flag.Flag) {
value := f.Value.String()
if value == "false" || value == "0" {
value = ""
}
values[f.Name] = value
})
return values
}
func clientURL(scheme string, port int, connType ClientConnType) string { func clientURL(scheme string, port int, connType ClientConnType) string {
curlHost := fmt.Sprintf("localhost:%d", port) curlHost := fmt.Sprintf("localhost:%d", port)
switch connType { switch connType {

View File

@ -57,7 +57,7 @@ func TestEtcdServerProcessConfig(t *testing.T) {
name: "CorruptCheck", name: "CorruptCheck",
config: NewConfig(WithInitialCorruptCheck(true)), config: NewConfig(WithInitialCorruptCheck(true)),
expectArgsContain: []string{ expectArgsContain: []string{
"--experimental-initial-corrupt-check", "--experimental-initial-corrupt-check=true",
}, },
}, },
{ {