From 7dd8d61a8a9d99781abf968182d2336e9c181e50 Mon Sep 17 00:00:00 2001 From: bubblemelon <12985181+Bubblemelon@users.noreply.github.com> Date: Wed, 11 Jul 2018 21:10:02 -0700 Subject: [PATCH] some --- config/shared/errors/errors.go | 1 - internal/exec/engine.go | 18 ++++++++++----- internal/exec/stages/disks/disks.go | 21 ++++++++++++------ internal/exec/stages/files/files.go | 15 ++++++++----- internal/exec/stages/stages.go | 2 +- internal/main.go | 16 +++++--------- internal/oem/oem.go | 11 +++------- internal/providers/packet/packet.go | 34 ++++++++++++----------------- internal/providers/providers.go | 2 +- internal/resource/url.go | 1 + 10 files changed, 62 insertions(+), 59 deletions(-) diff --git a/config/shared/errors/errors.go b/config/shared/errors/errors.go index 087181a0f8..9700b05855 100644 --- a/config/shared/errors/errors.go +++ b/config/shared/errors/errors.go @@ -91,7 +91,6 @@ var ( ErrHashWrongSize = errors.New("incorrect size for hash sum") ErrHashUnrecognized = errors.New("unrecognized hash function") ErrEngineConfiguration = errors.New("engine incorrectly configured") - ErrValidFetchEmptyData = errors.New("fetch successful but fetched data empty") ) // NewNoInstallSectionError produces an error indicating the given unit, named diff --git a/internal/exec/engine.go b/internal/exec/engine.go index 1465a1f038..a650d5eca9 100644 --- a/internal/exec/engine.go +++ b/internal/exec/engine.go @@ -16,6 +16,7 @@ package exec import ( "encoding/json" + "fmt" "io/ioutil" "net/url" @@ -53,10 +54,10 @@ type Engine struct { // Run executes the stage of the given name. It returns true if the stage // successfully ran and false if there were any errors. -func (e Engine) Run(stageName string) (bool, error) { +func (e Engine) Run(stageName string) error { if e.Fetcher == nil || e.Logger == nil { fmt.Fprintf(os.Stderr, "engine incorrectly configured\n") - return false, errors.ErrEngineConfiguration + return errors.ErrEngineConfiguration } baseConfig := types.Config{ Ignition: types.Ignition{Version: types.MaxVersion.String()}, @@ -72,7 +73,7 @@ func (e Engine) Run(stageName string) (bool, error) { e.logReport(r) if err != nil && err != providers.ErrNoProvider { e.Logger.Crit("failed to acquire system base config: %v", err) - return false, err + return err } cfg, err := e.acquireConfig() @@ -84,17 +85,22 @@ func (e Engine) Run(stageName string) (bool, error) { e.logReport(r) if err != nil && err != providers.ErrNoProvider { e.Logger.Crit("failed to acquire default config: %v", err) - return false, err + return err } default: e.Logger.Crit("failed to acquire config: %v", err) - return false, err + return err } e.Logger.PushPrefix(stageName) defer e.Logger.PopPrefix() - return stages.Get(stageName).Create(e.Logger, e.Root, *e.Fetcher).Run(config.Append(baseConfig, config.Append(systemBaseConfig, cfg))), err + if err = stages.Get(stageName).Create(e.Logger, e.Root, *e.Fetcher).Run(config.Append(baseConfig, config.Append(systemBaseConfig, cfg))); err != nil { + e.Logger.Crit("%s did not pass", stageName) + return err + } + e.Logger.Info("%s passed", stageName) + return err } // acquireConfig returns the configuration, first checking a local cache diff --git a/internal/exec/stages/disks/disks.go b/internal/exec/stages/disks/disks.go index e30eb775c3..2e02bc2fe5 100644 --- a/internal/exec/stages/disks/disks.go +++ b/internal/exec/stages/disks/disks.go @@ -19,6 +19,7 @@ package disks import ( + "errors" "fmt" "os/exec" @@ -65,29 +66,30 @@ func (stage) Name() string { return name } -func (s stage) Run(config types.Config) bool { +func (s stage) Run(config types.Config) error { // Interacting with disks/partitions/raids/filesystems in general can cause // udev races. If we do not need to do anything, we also do not need to // do the udevadm settle and can just return here. if len(config.Storage.Disks) == 0 && len(config.Storage.Raid) == 0 && len(config.Storage.Filesystems) == 0 { - return true + return nil } if err := s.createPartitions(config); err != nil { s.Logger.Crit("create partitions failed: %v", err) - return false + return newDiskStageError("create partitions failed: ", err) } if err := s.createRaids(config); err != nil { s.Logger.Crit("failed to create raids: %v", err) - return false + return newDiskStageError("failed to create raids: ", err) } if err := s.createFilesystems(config); err != nil { s.Logger.Crit("failed to create filesystems: %v", err) - return false + return newDiskStageError("failed to create filesystems: ", err) + } // udevd registers an IN_CLOSE_WRITE inotify watch on block device @@ -119,10 +121,10 @@ func (s stage) Run(config types.Config) bool { "waiting for udev to settle", ); err != nil { s.Logger.Crit("udevadm settle failed: %v", err) - return false + return newDiskStageError("udevadm settle failed: ", err) } - return true + return nil } // waitOnDevices waits for the devices enumerated in devs as a logged operation @@ -163,3 +165,8 @@ func (s stage) waitOnDevicesAndCreateAliases(devs []string, ctxt string) error { return nil } + +func newDiskStageError(msg string, err error) error { + e := errors.New(msg + err.Error()) + return e +} diff --git a/internal/exec/stages/files/files.go b/internal/exec/stages/files/files.go index b546d80a8e..2d39a30655 100644 --- a/internal/exec/stages/files/files.go +++ b/internal/exec/stages/files/files.go @@ -60,21 +60,26 @@ func (stage) Name() string { return name } -func (s stage) Run(config types.Config) bool { +func (s stage) Run(config types.Config) error { if err := s.createPasswd(config); err != nil { s.Logger.Crit("failed to create users/groups: %v", err) - return false + return newFileStageError("failed to create users/groups: ", err) } if err := s.createFilesystemsEntries(config); err != nil { s.Logger.Crit("failed to create files: %v", err) - return false + return newFileStageError("failed to create files: ", err) } if err := s.createUnits(config); err != nil { s.Logger.Crit("failed to create units: %v", err) - return false + return newFileStageError("failed to create units: ", err) } - return true + return nil +} + +func newFileStageError(msg string, err error) error { + e := errors.New(msg + err.Error()) + return e } diff --git a/internal/exec/stages/stages.go b/internal/exec/stages/stages.go index d6b56fa27a..5f4e86957c 100644 --- a/internal/exec/stages/stages.go +++ b/internal/exec/stages/stages.go @@ -23,7 +23,7 @@ import ( // Stage is responsible for actually executing a stage of the configuration. type Stage interface { - Run(config types.Config) bool + Run(config types.Config) error Name() string } diff --git a/internal/main.go b/internal/main.go index b257aa33e6..f3b317e5d1 100644 --- a/internal/main.go +++ b/internal/main.go @@ -92,27 +92,23 @@ func main() { OEMConfig: oemConfig, Fetcher: &fetcher, } - ignSuccess, err := engine.Run(flags.stage.String()) - if !ignSuccess { - logger.Warning("Ignition failed") + if err = engine.Run(flags.stage.String()); err != nil { + logger.Crit("Ignition failed") if err != nil { logger.Err(err.Error()) - } else { - logger.Info("ERRORRRRR IS NIL") } - statusErr := engine.OEMConfig.Status(*engine.Fetcher, err) - if statusErr != nil { - logger.Err("Status error: ", statusErr.Error()) + if statusErr := engine.OEMConfig.Status(flags.stage.String(), *engine.Fetcher, err); statusErr != nil { + logger.Err("POST Status error: ", statusErr.Error()) } os.Exit(1) } else { logger.Info("Ignition finished successfully") // err should be nil - statusErr := engine.OEMConfig.Status(*engine.Fetcher, err) + statusErr := engine.OEMConfig.Status(flags.stage.String(), *engine.Fetcher, err) if statusErr != nil { - logger.Err("Status error: ", statusErr.Error()) + logger.Err("POST Status error: ", statusErr.Error()) } } } diff --git a/internal/oem/oem.go b/internal/oem/oem.go index 41b90bdb55..e7d422ddcb 100644 --- a/internal/oem/oem.go +++ b/internal/oem/oem.go @@ -62,15 +62,10 @@ func (c Config) NewFetcherFunc() providers.FuncNewFetcher { } } -// Status takes b as whether ignition passes (true) or fails -// msg is the error or success message -func (c Config) Status(f resource.Fetcher, statusErr error) error { +// Status takes a Fetcher and the error from Run (from engine) +func (c Config) Status(stageName string, f resource.Fetcher, statusErr error) error { if c.status != nil { - err := c.status(f, statusErr) - if err != nil { - f.Logger.Err("Error: ", err) - } - return err + return c.status(stageName, f, statusErr) } return nil } diff --git a/internal/providers/packet/packet.go b/internal/providers/packet/packet.go index 1f6a622faf..2120b13484 100644 --- a/internal/providers/packet/packet.go +++ b/internal/providers/packet/packet.go @@ -20,17 +20,21 @@ package packet import ( "bytes" "encoding/json" + "errors" "net/http" "net/url" "strings" - "github.com/coreos/ignition/config/shared/errors" "github.com/coreos/ignition/config/validate/report" "github.com/coreos/ignition/internal/config/types" "github.com/coreos/ignition/internal/providers/util" "github.com/coreos/ignition/internal/resource" ) +var ( + ErrValidFetchEmptyData = errors.New("fetch successful but fetched data empty") +) + var ( userdataUrl = url.URL{ Scheme: "https", @@ -63,7 +67,7 @@ func FetchConfig(f resource.Fetcher) (types.Config, report.Report, error) { } // PostStatus posts a message that will show on the Packet Instance Timeline -func PostStatus(f resource.Fetcher, errMsg error) error { +func PostStatus(stageName string, f resource.Fetcher, errMsg error) error { f.Logger.Info("POST message to Packet Timeline") // fetch JSON from https://metadata.packet.net/metadata data, err := f.FetchToBuffer(metadataUrl, resource.FetchOptions{ @@ -73,9 +77,8 @@ func PostStatus(f resource.Fetcher, errMsg error) error { return err } if data == nil { - return errors.ErrValidFetchEmptyData + return ErrValidFetchEmptyData } - metadata := struct { PhoneHomeURL string `json:"phone_home_url"` }{} @@ -89,26 +92,17 @@ func PostStatus(f resource.Fetcher, errMsg error) error { phonehomeURL = strings.TrimSuffix(phonehomeURL, "/phone-home") // POST Message to phonehome IP postMessageURL := phonehomeURL + "/events" - if errMsg != nil { - - err = postMessage(errMsg, f, "Ignition error: "+errMsg.Error(), postMessageURL) - if err != nil { - return err - } - } else { - - err = postMessage(errMsg, f, "Ignition: valid config", postMessageURL) - if err != nil { - return err - } + err = postMessage(stageName, errMsg, f, postMessageURL) - } return err } // postMessage makes a post request with the supplied message to the url -func postMessage(e error, f resource.Fetcher, message string, url string) error { +func postMessage(stageName string, e error, f resource.Fetcher, url string) error { + + stageName = "[" + stageName + "]" + type mStruct struct { State string `json:"state"` Message string `json:"message"` @@ -117,13 +111,13 @@ func postMessage(e error, f resource.Fetcher, message string, url string) error if e != nil { m = mStruct{ State: "failed", - Message: message, + Message: stageName + " Ignition error: " + e.Error(), } } else { m = mStruct{ State: "succeeded", - Message: message, + Message: stageName + " Ignition status: finished sucessfully", } } messageJSON, err := json.Marshal(m) diff --git a/internal/providers/providers.go b/internal/providers/providers.go index eeb87cde9c..99933ccd7e 100644 --- a/internal/providers/providers.go +++ b/internal/providers/providers.go @@ -29,4 +29,4 @@ var ( type FuncFetchConfig func(f resource.Fetcher) (types.Config, report.Report, error) type FuncNewFetcher func(logger *log.Logger) (resource.Fetcher, error) -type FuncPostStatus func(f resource.Fetcher, e error) error +type FuncPostStatus func(stageName string, f resource.Fetcher, e error) error diff --git a/internal/resource/url.go b/internal/resource/url.go index 7af49a02c5..79d64b9912 100644 --- a/internal/resource/url.go +++ b/internal/resource/url.go @@ -246,6 +246,7 @@ func (f *Fetcher) FetchFromHTTP(u url.URL, dest *os.File, opts FetchOptions) err default: return ErrFailed } + return f.decompressCopyHashAndVerify(dest, dataReader, opts) }