etcd: Rewrite embed etcd implementation

This is a giant cleanup of the etcd code. The earlier version was
written when I was less experienced with golang.

This is still not perfect, and does contain some races, but at least
it's a decent base to start from. The automatic elastic clustering
should be considered an experimental feature. If you need a more
battle-tested cluster, then you should manage etcd manually and point
mgmt at your existing cluster.
This commit is contained in:
James Shubin
2018-05-05 17:35:08 -04:00
parent fb275d9537
commit a5842a41b2
56 changed files with 5459 additions and 2654 deletions

View File

@@ -26,7 +26,7 @@ import (
"syscall"
"testing"
"github.com/purpleidea/mgmt/etcd"
"github.com/purpleidea/mgmt/etcd/client"
etcdfs "github.com/purpleidea/mgmt/etcd/fs"
"github.com/purpleidea/mgmt/integration"
"github.com/purpleidea/mgmt/util"
@@ -41,6 +41,7 @@ import (
const (
umask = 0666
superblock = "/some/superblock" // TODO: generate randomly per test?
ns = "/_mgmt/test" // must not end with a slash!
)
// Ensure that etcdfs.Fs implements afero.Fs.
@@ -79,20 +80,26 @@ func TestFs1(t *testing.T) {
}
defer stopEtcd() // ignore the error
etcdClient := &etcd.ClientEtcd{
Seeds: []string{"localhost:2379"}, // endpoints
logf := func(format string, v ...interface{}) {
t.Logf("test: etcd: fs: "+format, v...)
}
etcdClient := client.NewClientFromSeedsNamespace(
[]string{"localhost:2379"}, // endpoints
ns,
)
if err := etcdClient.Connect(); err != nil {
if err := etcdClient.Init(); err != nil {
t.Errorf("client connection error: %+v", err)
return
}
defer etcdClient.Destroy()
defer etcdClient.Close()
etcdFs := &etcdfs.Fs{
Client: etcdClient.GetClient(),
Client: etcdClient,
Metadata: superblock,
DataPrefix: etcdfs.DefaultDataPrefix,
Logf: logf,
}
//var etcdFs afero.Fs = NewEtcdFs()
@@ -193,20 +200,26 @@ func TestFs2(t *testing.T) {
}
defer stopEtcd() // ignore the error
etcdClient := &etcd.ClientEtcd{
Seeds: []string{"localhost:2379"}, // endpoints
logf := func(format string, v ...interface{}) {
t.Logf("test: etcd: fs: "+format, v...)
}
etcdClient := client.NewClientFromSeedsNamespace(
[]string{"localhost:2379"}, // endpoints
ns,
)
if err := etcdClient.Connect(); err != nil {
if err := etcdClient.Init(); err != nil {
t.Errorf("client connection error: %+v", err)
return
}
defer etcdClient.Destroy()
defer etcdClient.Close()
etcdFs := &etcdfs.Fs{
Client: etcdClient.GetClient(),
Client: etcdClient,
Metadata: superblock,
DataPrefix: etcdfs.DefaultDataPrefix,
Logf: logf,
}
tree, err := util.FsTree(etcdFs, "/")
@@ -246,20 +259,26 @@ func TestFs3(t *testing.T) {
}
defer stopEtcd() // ignore the error
etcdClient := &etcd.ClientEtcd{
Seeds: []string{"localhost:2379"}, // endpoints
logf := func(format string, v ...interface{}) {
t.Logf("test: etcd: fs: "+format, v...)
}
etcdClient := client.NewClientFromSeedsNamespace(
[]string{"localhost:2379"}, // endpoints
ns,
)
if err := etcdClient.Connect(); err != nil {
if err := etcdClient.Init(); err != nil {
t.Errorf("client connection error: %+v", err)
return
}
defer etcdClient.Destroy()
defer etcdClient.Close()
etcdFs := &etcdfs.Fs{
Client: etcdClient.GetClient(),
Client: etcdClient,
Metadata: superblock,
DataPrefix: etcdfs.DefaultDataPrefix,
Logf: logf,
}
if err := etcdFs.Mkdir("/tmp", umask); err != nil {
@@ -371,18 +390,19 @@ func TestEtcdCopyFs0(t *testing.T) {
}
defer stopEtcd() // ignore the error
etcdClient := &etcd.ClientEtcd{
Seeds: []string{"localhost:2379"}, // endpoints
}
etcdClient := client.NewClientFromSeedsNamespace(
[]string{"localhost:2379"}, // endpoints
ns,
)
if err := etcdClient.Connect(); err != nil {
if err := etcdClient.Init(); err != nil {
t.Errorf("client connection error: %+v", err)
return
}
defer etcdClient.Destroy()
defer etcdClient.Close()
etcdFs := &etcdfs.Fs{
Client: etcdClient.GetClient(),
Client: etcdClient,
Metadata: superblock,
DataPrefix: etcdfs.DefaultDataPrefix,
}