mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #5380 from gyuho/backup_e2e_test
e2e: v2 backup test
This commit is contained in:
commit
ecf192556e
@ -15,6 +15,8 @@
|
|||||||
package e2e
|
package e2e
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@ -227,6 +229,52 @@ func TestCtlV2RoleList(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCtlV2Backup(t *testing.T) { // For https://github.com/coreos/etcd/issues/5360
|
||||||
|
defer testutil.AfterTest(t)
|
||||||
|
|
||||||
|
var (
|
||||||
|
backupDirPrefix = "testbackup"
|
||||||
|
backupDir = fmt.Sprintf("%s0.etcd", backupDirPrefix)
|
||||||
|
)
|
||||||
|
epc1 := setupEtcdctlTest(t, &configNoTLS, false)
|
||||||
|
if err := etcdctlSet(epc1, "foo1", "bar"); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := etcdctlBackup(epc1, epc1.procs[0].cfg.dataDirPath, backupDir); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(backupDir)
|
||||||
|
|
||||||
|
if err := epc1.Close(); err != nil {
|
||||||
|
t.Fatalf("error closing etcd processes (%v)", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// restart from the backup directory
|
||||||
|
cfg2 := configNoTLS
|
||||||
|
cfg2.dataDirPathPrefix = backupDirPrefix
|
||||||
|
cfg2.keepDataDir = true
|
||||||
|
cfg2.forceNewCluster = true
|
||||||
|
epc2 := setupEtcdctlTest(t, &cfg2, false)
|
||||||
|
|
||||||
|
// check if backup went through correctly
|
||||||
|
if err := etcdctlGet(epc2, "foo1", "bar", false); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if it can serve client requests
|
||||||
|
if err := etcdctlSet(epc2, "foo2", "bar"); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := etcdctlGet(epc2, "foo2", "bar", false); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := epc2.Close(); err != nil {
|
||||||
|
t.Fatalf("error closing etcd processes (%v)", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func etcdctlPrefixArgs(clus *etcdProcessCluster) []string {
|
func etcdctlPrefixArgs(clus *etcdProcessCluster) []string {
|
||||||
endpoints := ""
|
endpoints := ""
|
||||||
if proxies := clus.proxies(); len(proxies) != 0 {
|
if proxies := clus.proxies(); len(proxies) != 0 {
|
||||||
@ -329,6 +377,11 @@ func etcdctlAuthEnable(clus *etcdProcessCluster) error {
|
|||||||
return spawnWithExpect(cmdArgs, "Authentication Enabled")
|
return spawnWithExpect(cmdArgs, "Authentication Enabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func etcdctlBackup(clus *etcdProcessCluster, dataDir, backupDir string) error {
|
||||||
|
cmdArgs := append(etcdctlPrefixArgs(clus), "backup", "--data-dir", dataDir, "--backup-dir", backupDir)
|
||||||
|
return spawnWithExpect(cmdArgs, "wal: ignored file")
|
||||||
|
}
|
||||||
|
|
||||||
func mustEtcdctl(t *testing.T) {
|
func mustEtcdctl(t *testing.T) {
|
||||||
if !fileutil.Exist("../bin/etcdctl") {
|
if !fileutil.Exist("../bin/etcdctl") {
|
||||||
t.Fatalf("could not find etcdctl binary")
|
t.Fatalf("could not find etcdctl binary")
|
||||||
|
@ -123,7 +123,10 @@ type etcdProcess struct {
|
|||||||
|
|
||||||
type etcdProcessConfig struct {
|
type etcdProcessConfig struct {
|
||||||
args []string
|
args []string
|
||||||
|
|
||||||
dataDirPath string
|
dataDirPath string
|
||||||
|
keepDataDir bool
|
||||||
|
|
||||||
acurl string
|
acurl string
|
||||||
// additional url for tls connection when the etcd process
|
// additional url for tls connection when the etcd process
|
||||||
// serves both http and https
|
// serves both http and https
|
||||||
@ -132,6 +135,9 @@ type etcdProcessConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type etcdProcessClusterConfig struct {
|
type etcdProcessClusterConfig struct {
|
||||||
|
dataDirPathPrefix string
|
||||||
|
keepDataDir bool
|
||||||
|
|
||||||
clusterSize int
|
clusterSize int
|
||||||
basePort int
|
basePort int
|
||||||
proxySize int
|
proxySize int
|
||||||
@ -191,9 +197,13 @@ func newEtcdProcess(cfg *etcdProcessConfig) (*etcdProcess, error) {
|
|||||||
if !fileutil.Exist("../bin/etcd") {
|
if !fileutil.Exist("../bin/etcd") {
|
||||||
return nil, fmt.Errorf("could not find etcd binary")
|
return nil, fmt.Errorf("could not find etcd binary")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !cfg.keepDataDir {
|
||||||
if err := os.RemoveAll(cfg.dataDirPath); err != nil {
|
if err := os.RemoveAll(cfg.dataDirPath); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
child, err := spawnCmd(append([]string{"../bin/etcd"}, cfg.args...))
|
child, err := spawnCmd(append([]string{"../bin/etcd"}, cfg.args...))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -234,10 +244,16 @@ func (cfg *etcdProcessClusterConfig) etcdProcessConfigs() []*etcdProcessConfig {
|
|||||||
|
|
||||||
purl := url.URL{Scheme: peerScheme, Host: fmt.Sprintf("localhost:%d", port+1)}
|
purl := url.URL{Scheme: peerScheme, Host: fmt.Sprintf("localhost:%d", port+1)}
|
||||||
name := fmt.Sprintf("testname%d", i)
|
name := fmt.Sprintf("testname%d", i)
|
||||||
dataDirPath, derr := ioutil.TempDir("", name+".etcd")
|
var dataDirPath string
|
||||||
|
if cfg.dataDirPathPrefix != "" {
|
||||||
|
dataDirPath = fmt.Sprintf("%s%d.etcd", cfg.dataDirPathPrefix, i)
|
||||||
|
} else {
|
||||||
|
var derr error
|
||||||
|
dataDirPath, derr = ioutil.TempDir("", name+".etcd")
|
||||||
if derr != nil {
|
if derr != nil {
|
||||||
panic("could not get tempdir for datadir")
|
panic("could not get tempdir for datadir")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
initialCluster[i] = fmt.Sprintf("%s=%s", name, purl.String())
|
initialCluster[i] = fmt.Sprintf("%s=%s", name, purl.String())
|
||||||
|
|
||||||
args := []string{
|
args := []string{
|
||||||
@ -259,10 +275,10 @@ func (cfg *etcdProcessClusterConfig) etcdProcessConfigs() []*etcdProcessConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
args = append(args, cfg.tlsArgs()...)
|
args = append(args, cfg.tlsArgs()...)
|
||||||
|
|
||||||
etcdCfgs[i] = &etcdProcessConfig{
|
etcdCfgs[i] = &etcdProcessConfig{
|
||||||
args: args,
|
args: args,
|
||||||
dataDirPath: dataDirPath,
|
dataDirPath: dataDirPath,
|
||||||
|
keepDataDir: cfg.keepDataDir,
|
||||||
acurl: curl,
|
acurl: curl,
|
||||||
acurltls: curltls,
|
acurltls: curltls,
|
||||||
}
|
}
|
||||||
@ -285,6 +301,7 @@ func (cfg *etcdProcessClusterConfig) etcdProcessConfigs() []*etcdProcessConfig {
|
|||||||
etcdCfgs[cfg.clusterSize+i] = &etcdProcessConfig{
|
etcdCfgs[cfg.clusterSize+i] = &etcdProcessConfig{
|
||||||
args: args,
|
args: args,
|
||||||
dataDirPath: dataDirPath,
|
dataDirPath: dataDirPath,
|
||||||
|
keepDataDir: cfg.keepDataDir,
|
||||||
acurl: curl.String(),
|
acurl: curl.String(),
|
||||||
isProxy: true,
|
isProxy: true,
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user