diff --git a/etcdmain/config.go b/etcdmain/config.go index 1723a4ffe3f..5c2d7f41eb6 100644 --- a/etcdmain/config.go +++ b/etcdmain/config.go @@ -260,7 +260,10 @@ func (cfg *config) Parse(arguments []string) error { } // when etcd runs in member mode user needs to set -advertise-client-urls if -listen-client-urls is set. - if cfg.proxy.String() != proxyFlagOn { + // TODO(yichengq): check this for joining through discovery service case + mayFallbackToProxy := flags.IsSet(cfg.FlagSet, "discovery") && cfg.fallback.String() == fallbackFlagProxy + mayBeProxy := cfg.proxy.String() != proxyFlagOff || mayFallbackToProxy + if !mayBeProxy { if flags.IsSet(cfg.FlagSet, "listen-client-urls") && !flags.IsSet(cfg.FlagSet, "advertise-client-urls") { return errUnsetAdvertiseClientURLsFlag } diff --git a/etcdmain/config_test.go b/etcdmain/config_test.go index 2a6331fdcbe..3cc581b89a0 100644 --- a/etcdmain/config_test.go +++ b/etcdmain/config_test.go @@ -212,6 +212,71 @@ func TestConfigParsingConflictClusteringFlags(t *testing.T) { } } +func TestConfigParsingMissedAdvertiseClientURLsFlag(t *testing.T) { + tests := []struct { + args []string + werr error + }{ + { + []string{ + "-initial-cluster=infra1=http://127.0.0.1:2380", + "-listen-client-urls=http://127.0.0.1:2379", + }, + errUnsetAdvertiseClientURLsFlag, + }, + { + []string{ + "-discovery-srv=example.com", + "-listen-client-urls=http://127.0.0.1:2379", + }, + errUnsetAdvertiseClientURLsFlag, + }, + { + []string{ + "-discovery=http://example.com/abc", + "-discovery-fallback=exit", + "-listen-client-urls=http://127.0.0.1:2379", + }, + errUnsetAdvertiseClientURLsFlag, + }, + { + []string{ + "-listen-client-urls=http://127.0.0.1:2379", + }, + errUnsetAdvertiseClientURLsFlag, + }, + { + []string{ + "-discovery=http://example.com/abc", + "-listen-client-urls=http://127.0.0.1:2379", + }, + nil, + }, + { + []string{ + "-proxy=on", + "-listen-client-urls=http://127.0.0.1:2379", + }, + nil, + }, + { + []string{ + "-proxy=readonly", + "-listen-client-urls=http://127.0.0.1:2379", + }, + nil, + }, + } + + for i, tt := range tests { + cfg := NewConfig() + err := cfg.Parse(tt.args) + if err != tt.werr { + t.Errorf("%d: err = %v, want %v", i, err, tt.werr) + } + } +} + func TestConfigIsNewCluster(t *testing.T) { tests := []struct { state string