lib: Patch out the mess when using our magic option

This commit is contained in:
James Shubin
2025-03-11 04:40:03 -04:00
parent dce83efa96
commit 87d8533bd0

View File

@@ -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