|
|
@ -14,6 +14,7 @@ import (
|
|
|
|
httpd "github.com/rqlite/rqlite/http"
|
|
|
|
httpd "github.com/rqlite/rqlite/http"
|
|
|
|
"github.com/rqlite/rqlite/store"
|
|
|
|
"github.com/rqlite/rqlite/store"
|
|
|
|
"github.com/rqlite/rqlite/tcp"
|
|
|
|
"github.com/rqlite/rqlite/tcp"
|
|
|
|
|
|
|
|
"github.com/rqlite/rqlite/testdata/x509"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// Node represents a node under test.
|
|
|
|
// Node represents a node under test.
|
|
|
@ -22,6 +23,10 @@ type Node struct {
|
|
|
|
RaftAddr string
|
|
|
|
RaftAddr string
|
|
|
|
ID string
|
|
|
|
ID string
|
|
|
|
Dir string
|
|
|
|
Dir string
|
|
|
|
|
|
|
|
NodeCertPath string
|
|
|
|
|
|
|
|
NodeKeyPath string
|
|
|
|
|
|
|
|
HTTPCertPath string
|
|
|
|
|
|
|
|
HTTPKeyPath string
|
|
|
|
Store *store.Store
|
|
|
|
Store *store.Store
|
|
|
|
Service *httpd.Service
|
|
|
|
Service *httpd.Service
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -311,8 +316,13 @@ func DoJoinRequest(nodeAddr, raftID, raftAddr string, voter bool) (*http.Respons
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func mustNewNode(enableSingle bool) *Node {
|
|
|
|
func mustNewNode(enableSingle bool) *Node {
|
|
|
|
|
|
|
|
dir := mustTempDir()
|
|
|
|
node := &Node{
|
|
|
|
node := &Node{
|
|
|
|
Dir: mustTempDir(),
|
|
|
|
Dir: dir,
|
|
|
|
|
|
|
|
NodeCertPath: x509.CertFile(dir),
|
|
|
|
|
|
|
|
NodeKeyPath: x509.KeyFile(dir),
|
|
|
|
|
|
|
|
HTTPCertPath: x509.CertFile(dir),
|
|
|
|
|
|
|
|
HTTPKeyPath: x509.KeyFile(dir),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
dbConf := store.NewDBConfig("", false)
|
|
|
|
dbConf := store.NewDBConfig("", false)
|
|
|
@ -346,6 +356,50 @@ func mustNewNode(enableSingle bool) *Node {
|
|
|
|
return node
|
|
|
|
return node
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func mustNewNodeEncrypted(enableSingle, httpEncrypt, nodeEncrypt bool) *Node {
|
|
|
|
|
|
|
|
node := &Node{
|
|
|
|
|
|
|
|
Dir: mustTempDir(),
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dbConf := store.NewDBConfig("", false)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var tn *tcp.Transport
|
|
|
|
|
|
|
|
if nodeEncrypt {
|
|
|
|
|
|
|
|
tn = tcp.NewTLSTransport(node.NodeCertPath, node.NodeCertPath, true)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
tn = tcp.NewTransport()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if err := tn.Open("localhost:0"); err != nil {
|
|
|
|
|
|
|
|
panic(err.Error())
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
node.Store = store.New(tn, &store.StoreConfig{
|
|
|
|
|
|
|
|
DBConf: dbConf,
|
|
|
|
|
|
|
|
Dir: node.Dir,
|
|
|
|
|
|
|
|
ID: tn.Addr().String(),
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
node.Store.SnapshotThreshold = 100
|
|
|
|
|
|
|
|
node.Store.SnapshotInterval = mustParseDuration("1s")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if err := node.Store.Open(enableSingle); err != nil {
|
|
|
|
|
|
|
|
node.Deprovision()
|
|
|
|
|
|
|
|
panic(fmt.Sprintf("failed to open store: %s", err.Error()))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
node.RaftAddr = node.Store.Addr()
|
|
|
|
|
|
|
|
node.ID = node.Store.ID()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
node.Service = httpd.New("localhost:0", node.Store, nil)
|
|
|
|
|
|
|
|
node.Service.Expvar = true
|
|
|
|
|
|
|
|
if err := node.Service.Start(); err != nil {
|
|
|
|
|
|
|
|
node.Deprovision()
|
|
|
|
|
|
|
|
panic(fmt.Sprintf("failed to start HTTP server: %s", err.Error()))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
node.APIAddr = node.Service.Addr().String()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return node
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func mustNewLeaderNode() *Node {
|
|
|
|
func mustNewLeaderNode() *Node {
|
|
|
|
node := mustNewNode(true)
|
|
|
|
node := mustNewNode(true)
|
|
|
|
if _, err := node.WaitForLeader(); err != nil {
|
|
|
|
if _, err := node.WaitForLeader(); err != nil {
|
|
|
|