diff --git a/etcdmain/config.go b/etcdmain/config.go index 93d4dbc1d..7f87064e7 100644 --- a/etcdmain/config.go +++ b/etcdmain/config.go @@ -231,11 +231,10 @@ func (cfg *config) Parse(arguments []string) error { return ErrConflictBootstrapFlags } - peerBindAddrFlag := "peer-bind-addr" - if !flags.IsSet(cfg.FlagSet, peerBindAddrFlag) { - peerBindAddrFlag = "peer-addr" - } - cfg.lpurls, err = flags.URLsFromFlags(cfg.FlagSet, "listen-peer-urls", peerBindAddrFlag, cfg.peerTLSInfo) + flags.SetBindAddrFromAddr(cfg.FlagSet, "peer-bind-addr", "peer-addr") + flags.SetBindAddrFromAddr(cfg.FlagSet, "bind-addr", "addr") + + cfg.lpurls, err = flags.URLsFromFlags(cfg.FlagSet, "listen-peer-urls", "peer-bind-addr", cfg.peerTLSInfo) if err != nil { return err } @@ -243,11 +242,7 @@ func (cfg *config) Parse(arguments []string) error { if err != nil { return err } - bindAddrFlag := "bind-addr" - if !flags.IsSet(cfg.FlagSet, bindAddrFlag) { - bindAddrFlag = "addr" - } - cfg.lcurls, err = flags.URLsFromFlags(cfg.FlagSet, "listen-client-urls", bindAddrFlag, cfg.clientTLSInfo) + cfg.lcurls, err = flags.URLsFromFlags(cfg.FlagSet, "listen-client-urls", "bind-addr", cfg.clientTLSInfo) if err != nil { return err } diff --git a/etcdmain/config_test.go b/etcdmain/config_test.go index 881b7a315..fbda2d369 100644 --- a/etcdmain/config_test.go +++ b/etcdmain/config_test.go @@ -151,6 +151,35 @@ func TestConfigParsingOtherFlags(t *testing.T) { } } +func TestConfigParsingV1Flags(t *testing.T) { + args := []string{ + "-peer-addr=127.0.0.1:7001", + "-addr=127.0.0.1:4001", + } + wcfg := NewConfig() + wcfg.lpurls = []url.URL{{Scheme: "http", Host: "0.0.0.0:7001"}} + wcfg.apurls = []url.URL{{Scheme: "http", Host: "127.0.0.1:7001"}} + wcfg.lcurls = []url.URL{{Scheme: "http", Host: "0.0.0.0:4001"}} + wcfg.acurls = []url.URL{{Scheme: "http", Host: "127.0.0.1:4001"}} + + cfg := NewConfig() + if err := cfg.Parse(args); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(cfg.lpurls, wcfg.lpurls) { + t.Errorf("listen peer urls = %+v, want %+v", cfg.lpurls, wcfg.lpurls) + } + if !reflect.DeepEqual(cfg.apurls, wcfg.apurls) { + t.Errorf("advertise peer urls = %+v, want %+v", cfg.apurls, wcfg.apurls) + } + if !reflect.DeepEqual(cfg.lcurls, wcfg.lcurls) { + t.Errorf("listen client urls = %+v, want %+v", cfg.lcurls, wcfg.lcurls) + } + if !reflect.DeepEqual(cfg.acurls, wcfg.acurls) { + t.Errorf("advertise client urls = %+v, want %+v", cfg.acurls, wcfg.acurls) + } +} + func TestConfigParsingConflictClusteringFlags(t *testing.T) { conflictArgs := [][]string{ []string{ diff --git a/pkg/flags/flag.go b/pkg/flags/flag.go index 51e880bcc..bc0d7799d 100644 --- a/pkg/flags/flag.go +++ b/pkg/flags/flag.go @@ -85,6 +85,21 @@ func SetFlagsFromEnv(fs *flag.FlagSet) error { return err } +// SetBindAddrFromAddr sets the value of bindAddr flag from the value +// of addr flag. Both flags' Value must be of type IPAddressPort. If the +// bindAddr flag is set and the addr flag is unset, it will set bindAddr to +// 0.0.0.0:port of addr. Otherwise, it keeps the original values. +func SetBindAddrFromAddr(fs *flag.FlagSet, bindAddrFlagName, addrFlagName string) { + if IsSet(fs, bindAddrFlagName) || !IsSet(fs, addrFlagName) { + return + } + addr := *fs.Lookup(addrFlagName).Value.(*IPAddressPort) + addr.IP = "0.0.0.0" + if err := fs.Set(bindAddrFlagName, addr.String()); err != nil { + log.Panicf("etcdmain: unexpected flags set error: %v", err) + } +} + // URLsFromFlags decides what URLs should be using two different flags // as datasources. The first flag's Value must be of type URLs, while // the second must be of type IPAddressPort. If both of these flags diff --git a/pkg/flags/flag_test.go b/pkg/flags/flag_test.go index decac4c64..678c59e0f 100644 --- a/pkg/flags/flag_test.go +++ b/pkg/flags/flag_test.go @@ -81,6 +81,49 @@ func TestSetFlagsFromEnvBad(t *testing.T) { } } +func TestSetBindAddrFromAddr(t *testing.T) { + tests := []struct { + args []string + waddr *IPAddressPort + }{ + // no flags set + { + args: []string{}, + waddr: &IPAddressPort{}, + }, + // addr flag set + { + args: []string{"-addr=192.0.3.17:4001"}, + waddr: &IPAddressPort{IP: "0.0.0.0", Port: 4001}, + }, + // bindAddr flag set + { + args: []string{"-bind-addr=127.0.0.1:4001"}, + waddr: &IPAddressPort{IP: "127.0.0.1", Port: 4001}, + }, + // both addr flags set + { + args: []string{"-bind-addr=127.0.0.1:4001", "-addr=192.0.3.17:4001"}, + waddr: &IPAddressPort{IP: "127.0.0.1", Port: 4001}, + }, + } + for i, tt := range tests { + fs := flag.NewFlagSet("test", flag.PanicOnError) + fs.Var(&IPAddressPort{}, "addr", "") + bindAddr := &IPAddressPort{} + fs.Var(bindAddr, "bind-addr", "") + if err := fs.Parse(tt.args); err != nil { + t.Errorf("#%d: failed to parse flags: %v", i, err) + continue + } + SetBindAddrFromAddr(fs, "bind-addr", "addr") + + if !reflect.DeepEqual(bindAddr, tt.waddr) { + t.Errorf("#%d: bindAddr = %+v, want %+v", i, bindAddr, tt.waddr) + } + } +} + func TestURLsFromFlags(t *testing.T) { tests := []struct { args []string