Skip to content

Commit

Permalink
Merge pull request #7 from ethpandaops/feat/config-err-msgs
Browse files Browse the repository at this point in the history
refactor: Improve error messages for config loading
  • Loading branch information
mattevans authored Jan 10, 2025
2 parents 61859c1 + ea54f43 commit 77fdc1f
Show file tree
Hide file tree
Showing 11 changed files with 35 additions and 14 deletions.
2 changes: 1 addition & 1 deletion cmd/cli/commands/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func RegisterCommands(app *cli.App, opts *options.CommandOpts) {

sidecarCfg, err := sidecar.NewConfigService(log, c.GlobalString("config-path"))
if err != nil {
return fmt.Errorf("%serror loading config: %v%s", tui.TerminalColorRed, err, tui.TerminalColorReset)
return fmt.Errorf("%s%v%s", tui.TerminalColorRed, err, tui.TerminalColorReset)
}

return configureContributoor(c, log, sidecarCfg)
Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/commands/install/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func RegisterCommands(app *cli.App, opts *options.CommandOpts) {

sidecarCfg, err := sidecar.NewConfigService(log, c.GlobalString("config-path"))
if err != nil {
return fmt.Errorf("error loading config: %w", err)
return fmt.Errorf("%s%v%s", tui.TerminalColorRed, err, tui.TerminalColorReset)
}

return installContributoor(c, log, sidecarCfg)
Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/commands/restart/restart.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func RegisterCommands(app *cli.App, opts *options.CommandOpts) {

sidecarCfg, err := sidecar.NewConfigService(log, c.GlobalString("config-path"))
if err != nil {
return fmt.Errorf("error loading config: %w", err)
return fmt.Errorf("%s%v%s", tui.TerminalColorRed, err, tui.TerminalColorReset)
}

dockerSidecar, err := sidecar.NewDockerSidecar(log, sidecarCfg, installerCfg)
Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/commands/start/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func RegisterCommands(app *cli.App, opts *options.CommandOpts) {

sidecarCfg, err := sidecar.NewConfigService(log, c.GlobalString("config-path"))
if err != nil {
return fmt.Errorf("error loading config: %w", err)
return fmt.Errorf("%s%v%s", tui.TerminalColorRed, err, tui.TerminalColorReset)
}

dockerSidecar, err := sidecar.NewDockerSidecar(log, sidecarCfg, installerCfg)
Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/commands/start/start_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ func TestRegisterCommands(t *testing.T) {
{
name: "fails when config service fails",
configPath: "/invalid/path/that/doesnt/exist",
expectedError: "error loading config",
expectedError: "directory [/invalid/path/that/doesnt/exist] does not exist",
},
}

Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/commands/status/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func RegisterCommands(app *cli.App, opts *options.CommandOpts) {

sidecarCfg, err := sidecar.NewConfigService(log, c.GlobalString("config-path"))
if err != nil {
return fmt.Errorf("error loading config: %w", err)
return fmt.Errorf("%s%v%s", tui.TerminalColorRed, err, tui.TerminalColorReset)
}

dockerSidecar, err := sidecar.NewDockerSidecar(log, sidecarCfg, installerCfg)
Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/commands/stop/stop.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func RegisterCommands(app *cli.App, opts *options.CommandOpts) {

sidecarCfg, err := sidecar.NewConfigService(log, c.GlobalString("config-path"))
if err != nil {
return fmt.Errorf("error loading config: %w", err)
return fmt.Errorf("%s%v%s", tui.TerminalColorRed, err, tui.TerminalColorReset)
}

dockerSidecar, err := sidecar.NewDockerSidecar(log, sidecarCfg, installerCfg)
Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/commands/stop/stop_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ func TestRegisterCommands(t *testing.T) {
{
name: "fails when config service fails",
configPath: "/invalid/path/that/doesnt/exist",
expectedError: "error loading config",
expectedError: "directory [/invalid/path/that/doesnt/exist] does not exist",
},
}

Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/commands/update/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func RegisterCommands(app *cli.App, opts *options.CommandOpts) {

sidecarCfg, err := sidecar.NewConfigService(log, c.GlobalString("config-path"))
if err != nil {
return fmt.Errorf("error loading config: %w", err)
return fmt.Errorf("%s%v%s", tui.TerminalColorRed, err, tui.TerminalColorReset)
}

dockerSidecar, err := sidecar.NewDockerSidecar(log, sidecarCfg, installerCfg)
Expand Down
2 changes: 1 addition & 1 deletion cmd/cli/commands/update/update_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ func TestRegisterCommands(t *testing.T) {
{
name: "fails when config service fails",
configPath: "/invalid/path/that/doesnt/exist",
expectedError: "error loading config",
expectedError: "directory [/invalid/path/that/doesnt/exist] does not exist",
},
}

Expand Down
29 changes: 25 additions & 4 deletions internal/sidecar/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ func NewConfigService(logger *logrus.Logger, configPath string) (ConfigManager,

// Check if config exists
if _, serr := os.Stat(fullConfigPath); os.IsNotExist(serr) {
return nil, fmt.Errorf("config file not found at [%s]. Please run 'install.sh' first", fullConfigPath)
return nil, wrapMissingConfigError(fmt.Errorf("config file not found at [%s]", fullConfigPath))
}

// Load existing config
Expand All @@ -80,18 +80,18 @@ func NewConfigService(logger *logrus.Logger, configPath string) (ConfigManager,
// First unmarshal YAML into a map
var yamlMap map[string]interface{}
if yerr := yaml.Unmarshal(data, &yamlMap); yerr != nil {
return nil, yerr
return nil, wrapInvalidConfigError(yerr)
}

// Convert to JSON
jsonBytes, err := json.Marshal(yamlMap)
if err != nil {
return nil, err
return nil, wrapInvalidConfigError(err)
}

oldConfig := &config.Config{}
if err := protojson.Unmarshal(jsonBytes, oldConfig); err != nil {
return nil, err
return nil, wrapInvalidConfigError(err)
}

// Get default config with latest schema
Expand Down Expand Up @@ -262,3 +262,24 @@ func migrateConfig(target, source *config.Config) error {
*/
return nil
}

// wrapInvalidConfigError wraps an error with a user-friendly message.
func wrapInvalidConfigError(err error) error {
return fmt.Errorf("configuration error:\n\n"+
"Your config.yaml file appears to be invalid. Please check:\n"+
"1. All fields are correctly spelled\n"+
"2. No unknown fields are present\n"+
"3. All required fields are set\n\n"+
"If the problem persists, try removing your config.yaml and re-running install.sh\n\n"+
"For detailed configuration help, visit: https://github.com/ethpandaops/contributoor#configuration\n\n"+
"Debug details: %w",
err)
}

// wrapMissingConfigError wraps an error with a user-friendly message.
func wrapMissingConfigError(err error) error {
return fmt.Errorf("configuration error:\n\n"+
"Your config.yaml file does not exist. Please run 'contributoor install' first.\n\n"+
"Debug details: %w",
err)
}

0 comments on commit 77fdc1f

Please sign in to comment.