Add context

This commit adds and passes context around to (almost) every function.
This allows cancelling (almost) every function call globally.
This commit is contained in:
Tom Wiesing 2022-11-28 13:30:08 +01:00
parent 996ecb9f80
commit 3455f491ca
No known key found for this signature in database
104 changed files with 836 additions and 511 deletions

View file

@ -41,12 +41,12 @@ func (bk backup) Run(context wisski_distillery.Context) error {
// prune old backups
if !bk.NoPrune {
defer logging.LogOperation(func() error {
return dis.Exporter().PruneExports(context.IOStream)
return dis.Exporter().PruneExports(context.Context, context.IOStream)
}, context.IOStream, "Pruning old backups")
}
// do the handling
err := dis.Exporter().MakeExport(context.IOStream, exporter.ExportTask{
err := dis.Exporter().MakeExport(context.Context, context.IOStream, exporter.ExportTask{
Dest: bk.Positionals.Dest,
StagingOnly: bk.StagingOnly,

View file

@ -40,7 +40,7 @@ var errBlindUpdateFailed = exit.Error{
func (bu blindUpdate) Run(context wisski_distillery.Context) error {
// find all the instances!
wissKIs, err := context.Environment.Instances().Load(bu.Positionals.Slug...)
wissKIs, err := context.Environment.Instances().Load(context.Context, bu.Positionals.Slug...)
if err != nil {
return err
}
@ -52,7 +52,7 @@ func (bu blindUpdate) Run(context wisski_distillery.Context) error {
// and do the actual blind_update!
return status.StreamGroup(context.IOStream, bu.Parallel, func(instance *wisski.WissKI, str stream.IOStream) error {
return instance.Drush().Update(str)
return instance.Drush().Update(context.Context, str)
}, wissKIs, status.SmartMessage(func(item *wisski.WissKI) string {
return fmt.Sprintf("blind_update %q", item.Slug)
}))

View file

@ -115,7 +115,7 @@ func (bs cBootstrap) Run(context wisski_distillery.Context) error {
return errBoostrapFailedToCopyExe.WithMessageF(err)
}
err = fsx.CopyFile(env, wdcliPath, exe)
err = fsx.CopyFile(context.Context, env, wdcliPath, exe)
if err != nil && err != fsx.ErrCopySameFile {
return errBoostrapFailedToCopyExe.WithMessageF(err)
}

View file

@ -33,14 +33,14 @@ func (cron) Description() wisski_distillery.Description {
func (cr cron) Run(context wisski_distillery.Context) error {
// find all the instances!
wissKIs, err := context.Environment.Instances().Load(cr.Positionals.Slug...)
wissKIs, err := context.Environment.Instances().Load(context.Context, cr.Positionals.Slug...)
if err != nil {
return err
}
// and do the actual blind_update!
return status.StreamGroup(context.IOStream, cr.Parallel, func(instance *wisski.WissKI, io stream.IOStream) error {
return instance.Drush().Cron(io)
return instance.Drush().Cron(context.Context, io)
}, wissKIs, status.SmartMessage(func(item *wisski.WissKI) string {
return fmt.Sprintf("cron %q", item.Slug)
}))

View file

@ -40,14 +40,14 @@ var errSettingSet = exit.Error{
}
func (ds setting) Run(context wisski_distillery.Context) error {
instance, err := context.Environment.Instances().WissKI(ds.Positionals.Slug)
instance, err := context.Environment.Instances().WissKI(context.Context, ds.Positionals.Slug)
if err != nil {
return err
}
if ds.Positionals.Value == "" {
// get the setting
value, err := instance.Settings().Get(nil, ds.Positionals.Setting)
value, err := instance.Settings().Get(context.Context, nil, ds.Positionals.Setting)
if err != nil {
return errSettingGet.Wrap(err)
}
@ -69,7 +69,7 @@ func (ds setting) Run(context wisski_distillery.Context) error {
}
// set the serialized value!
if err := instance.Settings().Set(nil, ds.Positionals.Setting, data); err != nil {
if err := instance.Settings().Set(context.Context, nil, ds.Positionals.Setting, data); err != nil {
return errSettingSet.Wrap(err)
}

View file

@ -75,7 +75,7 @@ var errPasswordsNotIdentical = exit.Error{
}
func (du duser) Run(context wisski_distillery.Context) error {
instance, err := context.Environment.Instances().WissKI(du.Positionals.Slug)
instance, err := context.Environment.Instances().WissKI(context.Context, du.Positionals.Slug)
if err != nil {
return err
}
@ -94,7 +94,7 @@ func (du duser) Run(context wisski_distillery.Context) error {
}
func (du duser) login(context wisski_distillery.Context, instance *wisski.WissKI) error {
link, err := instance.Users().Login(nil, du.Positionals.User)
link, err := instance.Users().Login(context.Context, nil, du.Positionals.User)
if err != nil {
return err
}
@ -110,7 +110,7 @@ var errPasswordFound = exit.Error{
func (du duser) checkCommonPassword(context wisski_distillery.Context, instance *wisski.WissKI) error {
users := instance.Users()
entities, err := users.All(nil)
entities, err := users.All(context.Context, nil)
if err != nil {
return err
}
@ -121,19 +121,19 @@ func (du duser) checkCommonPassword(context wisski_distillery.Context, instance
},
PrefixAlign: true,
Handler: func(user wstatus.User, index int, writer io.Writer) error {
pv, err := users.GetPasswordValidator(string(user.Name))
pv, err := users.GetPasswordValidator(context.Context, string(user.Name))
if err != nil {
return err
}
defer pv.Close()
return pv.CheckDictionary(context.Environment.Context(), writer)
return pv.CheckDictionary(context.Context, writer)
},
}, entities)
}
func (du duser) checkPasswordInteractive(context wisski_distillery.Context, instance *wisski.WissKI) error {
validator, err := instance.Users().GetPasswordValidator(du.Positionals.User)
validator, err := instance.Users().GetPasswordValidator(context.Context, du.Positionals.User)
if err != nil {
return err
}
@ -151,7 +151,7 @@ func (du duser) checkPasswordInteractive(context wisski_distillery.Context, inst
break
}
if validator.Check(candidate) {
if validator.Check(context.Context, candidate) {
context.Println("check passed")
} else {
context.Println("check did not pass")
@ -180,5 +180,5 @@ func (du duser) resetPassword(context wisski_distillery.Context, instance *wissk
return errPasswordsNotIdentical
}
return instance.Users().SetPassword(nil, du.Positionals.User, passwd1)
return instance.Users().SetPassword(context.Context, nil, du.Positionals.User, passwd1)
}

View file

@ -29,12 +29,12 @@ func (info) Description() wisski_distillery.Description {
}
func (i info) Run(context wisski_distillery.Context) error {
instance, err := context.Environment.Instances().WissKI(i.Positionals.Slug)
instance, err := context.Environment.Instances().WissKI(context.Context, i.Positionals.Slug)
if err != nil {
return err
}
info, err := instance.Info().Information(false)
info, err := instance.Info().Information(context.Context, false)
if err != nil {
return err
}

View file

@ -46,20 +46,20 @@ var errNotUnlock = exit.Error{
}
func (l instanceLock) Run(context wisski_distillery.Context) error {
instance, err := context.Environment.Instances().WissKI(l.Positionals.Slug)
instance, err := context.Environment.Instances().WissKI(context.Context, l.Positionals.Slug)
if err != nil {
return err
}
if l.Unlock {
if !instance.Locker().TryUnlock() {
if !instance.Locker().TryUnlock(context.Context) {
return errNotUnlock
}
context.Println("unlocked")
return nil
}
if !instance.Locker().TryLock() {
if !instance.Locker().TryLock(context.Context) {
return locker.Locked
}

View file

@ -25,7 +25,7 @@ func (ls) Description() wisski_distillery.Description {
}
func (l ls) Run(context wisski_distillery.Context) error {
instances, err := context.Environment.Instances().Load(l.Positionals.Slug...)
instances, err := context.Environment.Instances().Load(context.Context, l.Positionals.Slug...)
if err != nil {
return err
}

View file

@ -50,7 +50,7 @@ func (mma makeMysqlAccount) Run(context wisski_distillery.Context) error {
return errUnableToReadPassword.WithMessageF(err)
}
if err := dis.SQL().CreateSuperuser(username, password, false); err != nil {
if err := dis.SQL().CreateSuperuser(context.Context, username, password, false); err != nil {
return err
}

View file

@ -32,7 +32,7 @@ func (mysql) Description() wisski_distillery.Description {
}
func (ms mysql) Run(context wisski_distillery.Context) error {
code, err := context.Environment.SQL().Shell(context.IOStream, ms.Positionals.Args...)
code, err := context.Environment.SQL().Shell(context.Context, context.IOStream, ms.Positionals.Args...)
if err != nil {
return err
}

View file

@ -39,14 +39,14 @@ var errNoPathbuilder = exit.Error{
func (pb pathbuilders) Run(context wisski_distillery.Context) error {
// get the wisski
instance, err := context.Environment.Instances().WissKI(pb.Positionals.Slug)
instance, err := context.Environment.Instances().WissKI(context.Context, pb.Positionals.Slug)
if err != nil {
return err
}
// get all of the pathbuilders
if pb.Positionals.Name == "" {
names, err := instance.Pathbuilder().All(nil)
names, err := instance.Pathbuilder().All(context.Context, nil)
if err != nil {
return errPathbuilders.WithMessageF(err)
}
@ -57,7 +57,7 @@ func (pb pathbuilders) Run(context wisski_distillery.Context) error {
}
// get all the pathbuilders
xml, err := instance.Pathbuilder().Get(nil, pb.Positionals.Name)
xml, err := instance.Pathbuilder().Get(context.Context, nil, pb.Positionals.Name)
if xml == "" {
return errNoPathbuilder.WithMessageF(pb.Positionals.Name)
}

View file

@ -31,12 +31,12 @@ var errPrefixesGeneric = exit.Error{
}
func (p prefixes) Run(context wisski_distillery.Context) error {
instance, err := context.Environment.Instances().WissKI(p.Positionals.Slug)
instance, err := context.Environment.Instances().WissKI(context.Context, p.Positionals.Slug)
if err != nil {
return err
}
prefixes, err := instance.Prefixes().All(nil)
prefixes, err := instance.Prefixes().All(context.Context, nil)
if err != nil {
return errPrefixesGeneric.Wrap(err)
}

View file

@ -45,7 +45,7 @@ func (p provision) Run(context wisski_distillery.Context) error {
// check that it doesn't already exist
logging.LogMessage(context.IOStream, "Provisioning new WissKI instance %s", slug)
if exists, err := dis.Instances().Has(slug); err != nil || exists {
if exists, err := dis.Instances().Has(context.Context, slug); err != nil || exists {
return errProvisionAlreadyExists.WithMessageF(slug)
}
@ -63,7 +63,7 @@ func (p provision) Run(context wisski_distillery.Context) error {
// Store in the instances table!
if err := logging.LogOperation(func() error {
if err := instance.Bookkeeping().Save(); err != nil {
if err := instance.Bookkeeping().Save(context.Context); err != nil {
return errProvisionGeneric.WithMessageF(slug, err)
}
@ -77,7 +77,7 @@ func (p provision) Run(context wisski_distillery.Context) error {
domain := instance.Domain()
for _, pc := range dis.Provisionable() {
logging.LogMessage(context.IOStream, "Provisioning %s resources", pc.Name())
err := pc.Provision(instance.Instance, domain)
err := pc.Provision(context.Context, instance.Instance, domain)
if err != nil {
return err
}
@ -90,7 +90,7 @@ func (p provision) Run(context wisski_distillery.Context) error {
// run the provision script
if err := logging.LogOperation(func() error {
if err := instance.Provisioner().Provision(context.IOStream); err != nil {
if err := instance.Provisioner().Provision(context.Context, context.IOStream); err != nil {
return errProvisionGeneric.WithMessageF(slug, err)
}
@ -101,7 +101,7 @@ func (p provision) Run(context wisski_distillery.Context) error {
// start the container!
logging.LogMessage(context.IOStream, "Starting Container")
if err := instance.Barrel().Stack().Up(context.IOStream); err != nil {
if err := instance.Barrel().Stack().Up(context.Context, context.IOStream); err != nil {
return err
}

View file

@ -59,7 +59,7 @@ func (p purge) Run(context wisski_distillery.Context) error {
// load the instance (first via bookkeeping, then via defaults)
logging.LogMessage(context.IOStream, "Checking bookkeeping table")
instance, err := dis.Instances().WissKI(slug)
instance, err := dis.Instances().WissKI(context.Context, slug)
if err == instances.ErrWissKINotFound {
context.Println("Not found in bookkeeping table, assuming defaults")
instance, err = dis.Instances().Create(slug)
@ -70,7 +70,7 @@ func (p purge) Run(context wisski_distillery.Context) error {
// remove docker stack
logging.LogMessage(context.IOStream, "Stopping and removing docker container")
if err := instance.Barrel().Stack().Down(context.IOStream); err != nil {
if err := instance.Barrel().Stack().Down(context.Context, context.IOStream); err != nil {
context.EPrintln(err)
}
@ -85,7 +85,7 @@ func (p purge) Run(context wisski_distillery.Context) error {
domain := instance.Domain()
for _, pc := range dis.Provisionable() {
logging.LogMessage(context.IOStream, "Purging %s resources", pc.Name())
err := pc.Purge(instance.Instance, domain)
err := pc.Purge(context.Context, instance.Instance, domain)
if err != nil {
return err
}
@ -98,13 +98,13 @@ func (p purge) Run(context wisski_distillery.Context) error {
// remove from bookkeeping
logging.LogMessage(context.IOStream, "Removing instance from bookkeeping")
if err := instance.Bookkeeping().Delete(); err != nil {
if err := instance.Bookkeeping().Delete(context.Context); err != nil {
context.EPrintln(err)
}
// remove the filesystem
logging.LogMessage(context.IOStream, "Remove lock data")
if instance.Locker().TryUnlock() {
if instance.Locker().TryUnlock(context.Context) {
context.EPrintln("instance was not locked")
}

View file

@ -40,14 +40,14 @@ func (rb rebuild) Run(context wisski_distillery.Context) error {
dis := context.Environment
// find the instances
wissKIs, err := dis.Instances().Load(rb.Positionals.Slug...)
wissKIs, err := dis.Instances().Load(context.Context, rb.Positionals.Slug...)
if err != nil {
return err
}
// and do the actual rebuild
return status.StreamGroup(context.IOStream, rb.Parallel, func(instance *wisski.WissKI, io stream.IOStream) error {
return instance.Barrel().Build(io, true)
return instance.Barrel().Build(context.Context, io, true)
}, wissKIs, status.SmartMessage(func(item *wisski.WissKI) string {
return fmt.Sprintf("rebuild %q", item.Slug)
}))

View file

@ -46,7 +46,7 @@ func (r reserve) Run(context wisski_distillery.Context) error {
// check that it doesn't already exist
logging.LogMessage(context.IOStream, "Reserving new WissKI instance %s", slug)
if exists, err := dis.Instances().Has(slug); err != nil || exists {
if exists, err := dis.Instances().Has(context.Context, slug); err != nil || exists {
return errProvisionAlreadyExists.WithMessageF(slug)
}
@ -66,13 +66,13 @@ func (r reserve) Run(context wisski_distillery.Context) error {
s := instance.Reserve().Stack()
{
if err := logging.LogOperation(func() error {
return s.Install(context.IOStream, component.InstallationContext{})
return s.Install(context.Context, context.IOStream, component.InstallationContext{})
}, context.IOStream, "Installing docker stack"); err != nil {
return err
}
if err := logging.LogOperation(func() error {
return s.Update(context.IOStream, true)
return s.Update(context.Context, context.IOStream, true)
}, context.IOStream, "Updating docker stack"); err != nil {
return err
}

View file

@ -5,6 +5,7 @@ import (
wisski_distillery "github.com/FAU-CDI/wisski-distillery"
"github.com/FAU-CDI/wisski-distillery/internal/cli"
"github.com/FAU-CDI/wisski-distillery/pkg/cancel"
"github.com/tkw1536/goprogram/exit"
)
@ -33,7 +34,7 @@ var errServerListen = exit.Error{
func (s server) Run(context wisski_distillery.Context) error {
dis := context.Environment
handler, err := dis.Control().Server(dis.Context(), context.IOStream)
handler, err := dis.Control().Server(context.Context, context.IOStream)
if err != nil {
return err
}
@ -47,14 +48,21 @@ func (s server) Run(context wisski_distillery.Context) error {
}
go func() {
<-dis.Context().Done()
<-context.Context.Done()
listener.Close()
}()
// and serve that listener
err = http.Serve(listener, http.StripPrefix(s.Prefix, handler))
if err == nil {
return nil
server := http.Server{
Handler: http.StripPrefix(s.Prefix, handler),
}
err, _ = cancel.WithContext(context.Context, func(start func()) error {
start()
return server.Serve(listener)
}, func() {
// gracefully shutdown server
context.Printf("shutting down server")
server.Shutdown(context.Context)
})
return errServerListen.Wrap(err)
}

View file

@ -38,12 +38,12 @@ var errShell = exit.Error{
}
func (sh shell) Run(context wisski_distillery.Context) error {
instance, err := context.Environment.Instances().WissKI(sh.Positionals.Slug)
instance, err := context.Environment.Instances().WissKI(context.Context, sh.Positionals.Slug)
if err != nil {
return err
}
code, err := instance.Barrel().Shell(context.IOStream, sh.Positionals.Args...)
code, err := instance.Barrel().Shell(context.Context, context.IOStream, sh.Positionals.Args...)
if err != nil {
return errShell.WithMessageF(err)
}

View file

@ -39,13 +39,13 @@ func (sn snapshot) Run(context wisski_distillery.Context) error {
dis := context.Environment
// find the instance!
instance, err := dis.Instances().WissKI(sn.Positionals.Slug)
instance, err := dis.Instances().WissKI(context.Context, sn.Positionals.Slug)
if err != nil {
return err
}
// do a snapshot of it!
err = dis.Exporter().MakeExport(context.IOStream, exporter.ExportTask{
err = dis.Exporter().MakeExport(context.Context, context.IOStream, exporter.ExportTask{
Dest: sn.Positionals.Dest,
StagingOnly: sn.StagingOnly,

View file

@ -31,7 +31,7 @@ var errSSHListen = exit.Error{
func (s ssh) Run(context wisski_distillery.Context) error {
dis := context.Environment
server, err := dis.SSH().Server(dis.Context(), s.PrivateKeyPath, context.IOStream)
server, err := dis.SSH().Server(context.Context, s.PrivateKeyPath, context.IOStream)
if err != nil {
return err
}
@ -45,7 +45,7 @@ func (s ssh) Run(context wisski_distillery.Context) error {
}
go func() {
<-dis.Context().Done()
<-context.Context.Done()
listener.Close()
}()

View file

@ -25,7 +25,7 @@ func (cStatus) Description() wisski_distillery.Description {
}
func (s cStatus) Run(context wisski_distillery.Context) error {
status, _, err := context.Environment.Info().Status(true)
status, _, err := context.Environment.Info().Status(context.Context, true)
if err != nil {
return err
}

View file

@ -65,7 +65,7 @@ func (sp systempause) start(context wisski_distillery.Context, dis *dis.Distille
Handler: func(item component.Installable, index int, writer io.Writer) error {
io := stream.NewIOStream(writer, writer, stream.Null, 0)
return item.Stack(context.Environment.Environment).Up(io)
return item.Stack(context.Environment.Environment).Up(context.Context, io)
},
}, dis.Installable()); err != nil {
return err
@ -74,7 +74,7 @@ func (sp systempause) start(context wisski_distillery.Context, dis *dis.Distille
logging.LogMessage(context.IOStream, "Starting Up WissKIs")
// find the instances
wissKIs, err := dis.Instances().All()
wissKIs, err := dis.Instances().All(context.Context)
if err != nil {
return err
}
@ -88,7 +88,7 @@ func (sp systempause) start(context wisski_distillery.Context, dis *dis.Distille
Handler: func(item *wisski.WissKI, index int, writer io.Writer) error {
io := stream.NewIOStream(writer, writer, stream.Null, 0)
return item.Barrel().Stack().Up(io)
return item.Barrel().Stack().Up(context.Context, io)
},
}, wissKIs); err != nil {
return err
@ -101,7 +101,7 @@ func (sp systempause) stop(context wisski_distillery.Context, dis *dis.Distiller
logging.LogMessage(context.IOStream, "Shutting Down WissKIs")
// find the instances
wissKIs, err := dis.Instances().All()
wissKIs, err := dis.Instances().All(context.Context)
if err != nil {
return err
}
@ -115,7 +115,7 @@ func (sp systempause) stop(context wisski_distillery.Context, dis *dis.Distiller
Handler: func(item *wisski.WissKI, index int, writer io.Writer) error {
io := stream.NewIOStream(writer, writer, stream.Null, 0)
return item.Barrel().Stack().Down(io)
return item.Barrel().Stack().Down(context.Context, io)
},
}, wissKIs); err != nil {
return err
@ -132,7 +132,7 @@ func (sp systempause) stop(context wisski_distillery.Context, dis *dis.Distiller
Handler: func(item component.Installable, index int, writer io.Writer) error {
io := stream.NewIOStream(writer, writer, stream.Null, 0)
return item.Stack(context.Environment.Environment).Down(io)
return item.Stack(context.Environment.Environment).Down(context.Context, io)
},
}, dis.Installable()); err != nil {
return err

View file

@ -135,11 +135,11 @@ func (si systemupdate) Run(context wisski_distillery.Context) error {
io := stream.NewIOStream(writer, writer, stream.Null, 0)
stack := item.Stack(context.Environment.Environment)
if err := stack.Install(io, item.Context(ctx)); err != nil {
if err := stack.Install(context.Context, io, item.Context(ctx)); err != nil {
return err
}
if err := stack.Update(io, true); err != nil {
if err := stack.Update(context.Context, io, true); err != nil {
return err
}
@ -154,7 +154,7 @@ func (si systemupdate) Run(context wisski_distillery.Context) error {
updated[item.ID()] = struct{}{}
}()
return ud.Update(io)
return ud.Update(context.Context, io)
},
}, dis.Installable())
}, context.IOStream, "Performing Stack Updates"); err != nil {
@ -170,7 +170,7 @@ func (si systemupdate) Run(context wisski_distillery.Context) error {
context.Println("Already updated")
return nil
}
return item.Update(context.IOStream)
return item.Update(context.Context, context.IOStream)
}, context.IOStream, "Updating Component: %s", name); err != nil {
return errBootstrapComponent.WithMessageF(name, err)
}
@ -194,9 +194,9 @@ var errMustExecFailed = exit.Error{
func (si systemupdate) mustExec(context wisski_distillery.Context, workdir string, exe string, argv ...string) error {
dis := context.Environment
if workdir == "" {
workdir = context.Environment.Config.DeployRoot
workdir = dis.Config.DeployRoot
}
code := dis.Still.Environment.Exec(context.IOStream, workdir, exe, argv...)
code := dis.Still.Environment.Exec(context.Context, context.IOStream, workdir, exe, argv...)
if code != 0 {
err := errMustExecFailed.WithMessageF(code)
err.ExitCode = exit.ExitCode(code)

View file

@ -37,14 +37,14 @@ var errPrefixUpdateFailed = exit.Error{
func (upc updateprefixconfig) Run(context wisski_distillery.Context) error {
dis := context.Environment
wissKIs, err := dis.Instances().All()
wissKIs, err := dis.Instances().All(context.Context)
if err != nil {
return errPrefixUpdateFailed.Wrap(err)
}
return status.StreamGroup(context.IOStream, upc.Parallel, func(instance *wisski.WissKI, io stream.IOStream) error {
io.Println("reading prefixes")
err := instance.Prefixes().Update()
err := instance.Prefixes().Update(context.Context)
if err != nil {
return errPrefixUpdateFailed.Wrap(err)
}