Handle errors during the before install process a little better

This commit is contained in:
Dane Everitt 2020-08-23 14:07:03 -07:00
parent 1e39487240
commit ebc0e82772
No known key found for this signature in database
GPG Key ID: EEA66103B3D71F53

View File

@ -21,7 +21,6 @@ import (
"path" "path"
"path/filepath" "path/filepath"
"strconv" "strconv"
"sync"
"time" "time"
) )
@ -215,14 +214,14 @@ func (ip *InstallationProcess) Run() error {
installPath, err := ip.BeforeExecute() installPath, err := ip.BeforeExecute()
if err != nil { if err != nil {
return err return errors.WithStack(err)
} }
cid, err := ip.Execute(installPath) cid, err := ip.Execute(installPath)
if err != nil { if err != nil {
ip.RemoveContainer() ip.RemoveContainer()
return err return errors.WithStack(err)
} }
// If this step fails, log a warning but don't exit out of the process. This is completely // If this step fails, log a warning but don't exit out of the process. This is completely
@ -294,32 +293,14 @@ func (ip *InstallationProcess) pullInstallationImage() error {
// as well as writes the installation script to the disk. This process is executed in an async // as well as writes the installation script to the disk. This process is executed in an async
// manner, if either one fails the error is returned. // manner, if either one fails the error is returned.
func (ip *InstallationProcess) BeforeExecute() (string, error) { func (ip *InstallationProcess) BeforeExecute() (string, error) {
wg := sync.WaitGroup{} fileName, err := ip.writeScriptToDisk()
wg.Add(3)
var e []error
var fileName string
go func() {
defer wg.Done()
name, err := ip.writeScriptToDisk()
if err != nil { if err != nil {
e = append(e, err) return "", errors.WithMessage(err, "failed to write installation script to disk")
return
} }
fileName = name
}()
go func() {
defer wg.Done()
if err := ip.pullInstallationImage(); err != nil { if err := ip.pullInstallationImage(); err != nil {
e = append(e, err) return "", errors.WithMessage(err, "failed to pull updated installation container image for server")
} }
}()
go func() {
defer wg.Done()
opts := types.ContainerRemoveOptions{ opts := types.ContainerRemoveOptions{
RemoveVolumes: true, RemoveVolumes: true,
@ -328,18 +309,9 @@ func (ip *InstallationProcess) BeforeExecute() (string, error) {
if err := ip.client.ContainerRemove(ip.context, ip.Server.Id()+"_installer", opts); err != nil { if err := ip.client.ContainerRemove(ip.context, ip.Server.Id()+"_installer", opts); err != nil {
if !client.IsErrNotFound(err) { if !client.IsErrNotFound(err) {
e = append(e, err) return "", errors.WithMessage(err, "failed to remove existing install container for server")
} }
} }
}()
wg.Wait()
// Maybe a better way to handle this, but if there is at least one error
// just bail out of the process now.
if len(e) > 0 {
return "", errors.WithStack(e[0])
}
return fileName, nil return fileName, nil
} }