lib: Patch out the mess when using our magic option
This commit is contained in:
144
lib/main.go
144
lib/main.go
@@ -50,7 +50,9 @@ import (
|
|||||||
_ "github.com/purpleidea/mgmt/engine/resources" // let register's run
|
_ "github.com/purpleidea/mgmt/engine/resources" // let register's run
|
||||||
"github.com/purpleidea/mgmt/etcd"
|
"github.com/purpleidea/mgmt/etcd"
|
||||||
"github.com/purpleidea/mgmt/etcd/chooser"
|
"github.com/purpleidea/mgmt/etcd/chooser"
|
||||||
|
etcdClient "github.com/purpleidea/mgmt/etcd/client"
|
||||||
"github.com/purpleidea/mgmt/etcd/deployer"
|
"github.com/purpleidea/mgmt/etcd/deployer"
|
||||||
|
etcdInterfaces "github.com/purpleidea/mgmt/etcd/interfaces"
|
||||||
"github.com/purpleidea/mgmt/gapi"
|
"github.com/purpleidea/mgmt/gapi"
|
||||||
"github.com/purpleidea/mgmt/gapi/empty"
|
"github.com/purpleidea/mgmt/gapi/empty"
|
||||||
"github.com/purpleidea/mgmt/pgp"
|
"github.com/purpleidea/mgmt/pgp"
|
||||||
@@ -504,77 +506,97 @@ func (obj *Main) Run() error {
|
|||||||
} else {
|
} else {
|
||||||
Logf("seeds(%d): %+v", len(obj.seeds), obj.seeds)
|
Logf("seeds(%d): %+v", len(obj.seeds), obj.seeds)
|
||||||
}
|
}
|
||||||
obj.embdEtcd = &etcd.EmbdEtcd{
|
var client etcdInterfaces.Client
|
||||||
Hostname: hostname,
|
if !obj.NoMagic {
|
||||||
Seeds: obj.seeds,
|
obj.embdEtcd = &etcd.EmbdEtcd{
|
||||||
|
Hostname: hostname,
|
||||||
|
Seeds: obj.seeds,
|
||||||
|
|
||||||
ClientURLs: obj.clientURLs,
|
ClientURLs: obj.clientURLs,
|
||||||
ServerURLs: obj.serverURLs,
|
ServerURLs: obj.serverURLs,
|
||||||
AClientURLs: obj.advertiseClientURLs,
|
AClientURLs: obj.advertiseClientURLs,
|
||||||
AServerURLs: obj.advertiseServerURLs,
|
AServerURLs: obj.advertiseServerURLs,
|
||||||
|
|
||||||
NoServer: obj.NoServer,
|
NoServer: obj.NoServer,
|
||||||
NoNetwork: obj.NoNetwork,
|
NoNetwork: obj.NoNetwork,
|
||||||
NoMagic: obj.NoMagic,
|
NoMagic: obj.NoMagic,
|
||||||
|
|
||||||
Chooser: &chooser.DynamicSize{
|
Chooser: &chooser.DynamicSize{
|
||||||
IdealClusterSize: obj.idealClusterSize,
|
IdealClusterSize: obj.idealClusterSize,
|
||||||
},
|
},
|
||||||
|
|
||||||
Converger: converger,
|
Converger: converger,
|
||||||
|
|
||||||
NS: NS, // namespace
|
NS: NS, // namespace
|
||||||
Prefix: fmt.Sprintf("%s/", path.Join(prefix, "etcd")),
|
Prefix: fmt.Sprintf("%s/", path.Join(prefix, "etcd")),
|
||||||
|
|
||||||
Debug: obj.Debug,
|
Debug: obj.Debug,
|
||||||
Logf: func(format string, v ...interface{}) {
|
Logf: func(format string, v ...interface{}) {
|
||||||
obj.Logf("etcd: "+format, v...)
|
obj.Logf("etcd: "+format, v...)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
if err := obj.embdEtcd.Init(); err != nil {
|
if err := obj.embdEtcd.Init(); err != nil {
|
||||||
return errwrap.Wrapf(err, "etcd init failed")
|
return errwrap.Wrapf(err, "etcd init failed")
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
// cleanup etcd main loop last so it can process everything first
|
// cleanup etcd main loop last so it can process everything first
|
||||||
err := errwrap.Wrapf(obj.embdEtcd.Close(), "etcd close failed")
|
err := errwrap.Wrapf(obj.embdEtcd.Close(), "etcd close failed")
|
||||||
|
if err != nil {
|
||||||
|
// TODO: cause the final exit code to be non-zero
|
||||||
|
Logf("cleanup error: %+v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
var etcdErr error
|
||||||
|
// don't add a wait group here, this is done in embdEtcd.Destroy()
|
||||||
|
go func() {
|
||||||
|
etcdErr = obj.embdEtcd.Run() // returns when it shuts down...
|
||||||
|
obj.exit.Done(errwrap.Wrapf(etcdErr, "etcd run failed")) // trigger exit
|
||||||
|
}()
|
||||||
|
// tell etcd to shutdown, blocks until done!
|
||||||
|
// TODO: handle/report error?
|
||||||
|
defer obj.embdEtcd.Destroy()
|
||||||
|
|
||||||
|
// wait for etcd to be ready before continuing...
|
||||||
|
// TODO: do we need to add a timeout here?
|
||||||
|
select {
|
||||||
|
case <-obj.embdEtcd.Ready():
|
||||||
|
Logf("etcd is ready!")
|
||||||
|
// pass
|
||||||
|
|
||||||
|
case <-obj.embdEtcd.Exited():
|
||||||
|
Logf("etcd was destroyed!")
|
||||||
|
err := fmt.Errorf("etcd was destroyed on startup")
|
||||||
|
if etcdErr != nil {
|
||||||
|
err = etcdErr
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// TODO: should getting a client from EmbdEtcd already come with the NS?
|
||||||
|
client, err = obj.embdEtcd.MakeClientFromNamespace(NS)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// TODO: cause the final exit code to be non-zero
|
return errwrap.Wrapf(err, "make Client failed")
|
||||||
Logf("cleanup error: %+v", err)
|
|
||||||
}
|
}
|
||||||
}()
|
} else {
|
||||||
|
c := etcdClient.NewClientFromSeedsNamespace(
|
||||||
var etcdErr error
|
obj.Seeds, // endpoints
|
||||||
// don't add a wait group here, this is done in embdEtcd.Destroy()
|
NS,
|
||||||
go func() {
|
)
|
||||||
etcdErr = obj.embdEtcd.Run() // returns when it shuts down...
|
if err := c.Init(); err != nil {
|
||||||
obj.exit.Done(errwrap.Wrapf(etcdErr, "etcd run failed")) // trigger exit
|
return errwrap.Wrapf(err, "client Init failed")
|
||||||
}()
|
|
||||||
// tell etcd to shutdown, blocks until done!
|
|
||||||
// TODO: handle/report error?
|
|
||||||
defer obj.embdEtcd.Destroy()
|
|
||||||
|
|
||||||
// wait for etcd to be ready before continuing...
|
|
||||||
// TODO: do we need to add a timeout here?
|
|
||||||
select {
|
|
||||||
case <-obj.embdEtcd.Ready():
|
|
||||||
Logf("etcd is ready!")
|
|
||||||
// pass
|
|
||||||
|
|
||||||
case <-obj.embdEtcd.Exited():
|
|
||||||
Logf("etcd was destroyed!")
|
|
||||||
err := fmt.Errorf("etcd was destroyed on startup")
|
|
||||||
if etcdErr != nil {
|
|
||||||
err = etcdErr
|
|
||||||
}
|
}
|
||||||
return err
|
defer func() {
|
||||||
}
|
err := errwrap.Wrapf(c.Close(), "client Close failed")
|
||||||
// TODO: should getting a client from EmbdEtcd already come with the NS?
|
if err != nil {
|
||||||
etcdClient, err := obj.embdEtcd.MakeClientFromNamespace(NS)
|
// TODO: cause the final exit code to be non-zero
|
||||||
if err != nil {
|
Logf("client cleanup error: %+v", err)
|
||||||
return errwrap.Wrapf(err, "make Client failed")
|
}
|
||||||
|
}()
|
||||||
|
client = c
|
||||||
}
|
}
|
||||||
|
|
||||||
simpleDeploy := &deployer.SimpleDeploy{
|
simpleDeploy := &deployer.SimpleDeploy{
|
||||||
Client: etcdClient,
|
Client: client,
|
||||||
Debug: obj.Debug,
|
Debug: obj.Debug,
|
||||||
Logf: func(format string, v ...interface{}) {
|
Logf: func(format string, v ...interface{}) {
|
||||||
obj.Logf("deploy: "+format, v...)
|
obj.Logf("deploy: "+format, v...)
|
||||||
@@ -608,7 +630,7 @@ func (obj *Main) Run() error {
|
|||||||
// an etcd component from the etcd package added in.
|
// an etcd component from the etcd package added in.
|
||||||
world := &etcd.World{
|
world := &etcd.World{
|
||||||
Hostname: hostname,
|
Hostname: hostname,
|
||||||
Client: etcdClient,
|
Client: client,
|
||||||
MetadataPrefix: MetadataPrefix,
|
MetadataPrefix: MetadataPrefix,
|
||||||
StoragePrefix: StoragePrefix,
|
StoragePrefix: StoragePrefix,
|
||||||
StandaloneFs: obj.DeployFs, // used for static deploys
|
StandaloneFs: obj.DeployFs, // used for static deploys
|
||||||
|
|||||||
Reference in New Issue
Block a user