func snapshotRestoreCommandFunc(cmd *cobra.Command, args []string) { if len(args) != 1 { err := fmt.Errorf("snapshot restore requires exactly one argument") ExitWithError(ExitBadArgs, err) } urlmap, uerr := types.NewURLsMap(restoreCluster) if uerr != nil { ExitWithError(ExitBadArgs, uerr) } cfg := etcdserver.ServerConfig{ InitialClusterToken: restoreClusterToken, InitialPeerURLsMap: urlmap, PeerURLs: types.MustNewURLs(strings.Split(restorePeerURLs, ",")), Name: restoreName, } if err := cfg.VerifyBootstrap(); err != nil { ExitWithError(ExitBadArgs, err) } cl, cerr := membership.NewClusterFromURLsMap(restoreClusterToken, urlmap) if cerr != nil { ExitWithError(ExitBadArgs, cerr) } basedir := restoreDataDir if basedir == "" { basedir = restoreName + ".etcd" } waldir := path.Join(basedir, "member", "wal") snapdir := path.Join(basedir, "member", "snap") if _, err := os.Stat(basedir); err == nil { ExitWithError(ExitInvalidInput, fmt.Errorf("data-dir %q exists", basedir)) } makeDB(snapdir, args[0]) makeWAL(waldir, cl) }
func TestGetOtherPeerURLs(t *testing.T) { tests := []struct { membs []*membership.Member wurls []string }{ { []*membership.Member{ membership.NewMember("1", types.MustNewURLs([]string{"http://10.0.0.1:1"}), "a", nil), }, []string{}, }, { []*membership.Member{ membership.NewMember("1", types.MustNewURLs([]string{"http://10.0.0.1:1"}), "a", nil), membership.NewMember("2", types.MustNewURLs([]string{"http://10.0.0.2:2"}), "a", nil), membership.NewMember("3", types.MustNewURLs([]string{"http://10.0.0.3:3"}), "a", nil), }, []string{"http://10.0.0.2:2", "http://10.0.0.3:3"}, }, { []*membership.Member{ membership.NewMember("1", types.MustNewURLs([]string{"http://10.0.0.1:1"}), "a", nil), membership.NewMember("3", types.MustNewURLs([]string{"http://10.0.0.3:3"}), "a", nil), membership.NewMember("2", types.MustNewURLs([]string{"http://10.0.0.2:2"}), "a", nil), }, []string{"http://10.0.0.2:2", "http://10.0.0.3:3"}, }, } for i, tt := range tests { cl := membership.NewClusterFromMembers("", types.ID(0), tt.membs) self := "1" urls := getRemotePeerURLs(cl, self) if !reflect.DeepEqual(urls, tt.wurls) { t.Errorf("#%d: urls = %+v, want %+v", i, urls, tt.wurls) } } }