diff --git a/config/config.go b/config/config.go index 4748b685..610c7014 100644 --- a/config/config.go +++ b/config/config.go @@ -1,6 +1,8 @@ package config import ( + "fmt" + "io" "os" "strings" @@ -25,7 +27,7 @@ func NewService(logger log.Logger) Service { func (s *Service) Load(config interface{}) error { if err := s.LoadFile(pkger.Include("/configs/config.default.yml"), config); err != nil { - return err + s.logger.LogErrorf("loading default config file using pkger: %w", err) } if err := LoadEnvironmentFile(s.logger, APP_CONFIG, config); err != nil { @@ -45,12 +47,29 @@ func (s *Service) LoadFile(file string, config interface{}) error { f, err := pkger.Open(file) if err != nil { - return logger.LogErrorf("pkger unable to load %s: %w", file, err).Err() + return fmt.Errorf("pkger unable to load %s: %w", file, err) } deflt := viper.New() deflt.SetConfigType("yaml") if err := deflt.ReadConfig(f); err != nil { + return fmt.Errorf("unable to load the defaults: %w", err) + } + + if err := deflt.Unmarshal(config); err != nil { + return fmt.Errorf("unable to unmarshal the defaults: %w", err) + } + + return nil +} + +func (s *Service) LoadFromReader(in io.Reader, config interface{}) error { + logger := s.logger + logger.Info().Logf("loading config file from reader") + + deflt := viper.New() + deflt.SetConfigType("yaml") + if err := deflt.ReadConfig(in); err != nil { return logger.LogErrorf("unable to load the defaults: %w", err).Err() } diff --git a/config/config_test.go b/config/config_test.go index b4eb506d..3105098c 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -1,6 +1,7 @@ package config_test import ( + "embed" "os" "testing" @@ -17,6 +18,7 @@ type ConfigModel struct { Default string App string Secret string + Custom string } func Test_Load(t *testing.T) { @@ -37,3 +39,20 @@ func Test_Load(t *testing.T) { require.Equal(t, "app", cfg.Config.App) require.Equal(t, "keep secret!", cfg.Config.Secret) } + +//go:embed testdata/*.yml +var configs embed.FS + +func Test_LoadFile(t *testing.T) { + cfg := &GlobalConfigModel{} + + service := config.NewService(log.NewDefaultLogger()) + + file, err := configs.Open("testdata/config.yml") + require.NoError(t, err) + + err = service.LoadFromReader(file, cfg) + require.NoError(t, err) + + require.Equal(t, "custom", cfg.Config.Custom) +} diff --git a/config/testdata/config.yml b/config/testdata/config.yml new file mode 100644 index 00000000..6c128f6f --- /dev/null +++ b/config/testdata/config.yml @@ -0,0 +1,2 @@ +Config: + Custom: "custom" diff --git a/database/database.go b/database/database.go index 9b46b5da..8a8d943f 100644 --- a/database/database.go +++ b/database/database.go @@ -35,7 +35,7 @@ func NewAndMigrate(ctx context.Context, logger log.Logger, config DatabaseConfig } // run migrations first - if err := RunMigrations(logger, config); err != nil { + if err := RunMigrations(logger, config, nil); err != nil { return nil, err } diff --git a/database/migrator.go b/database/migrator.go index eec69b77..e5ce1c74 100644 --- a/database/migrator.go +++ b/database/migrator.go @@ -17,7 +17,7 @@ import ( var migrationMutex sync.Mutex -func RunMigrations(logger log.Logger, config DatabaseConfig) error { +func RunMigrations(logger log.Logger, config DatabaseConfig, migrationsSource source.Driver) error { db, err := New(context.Background(), logger, config) if err != nil { return err @@ -31,9 +31,13 @@ func RunMigrations(logger log.Logger, config DatabaseConfig) error { return err } + if migrationsSource != nil { + source = migrationsSource + } + migrationMutex.Lock() m, err := migrate.NewWithInstance( - "filtering-pkger", + "migrations", source, config.DatabaseName, driver, @@ -42,7 +46,18 @@ func RunMigrations(logger log.Logger, config DatabaseConfig) error { return logger.Fatal().LogErrorf("Error running migration: %w", err).Err() } + ver, _, err := m.Version() + switch { + case err == migrate.ErrNilVersion: + logger.Info().Log("Clean DB, no migrations") + case err != nil: + return logger.Fatal().LogErrorf("Error getting current migration version: %w", err).Err() + default: + logger.Info().Logf("DB is at version: %d", ver) + } + err = m.Up() + migrationMutex.Unlock() switch err { @@ -53,6 +68,16 @@ func RunMigrations(logger log.Logger, config DatabaseConfig) error { return logger.Fatal().LogErrorf("Error running migrations: %w", err).Err() } + ver, _, err = m.Version() + switch { + case err == migrate.ErrNilVersion: + logger.Info().Log("Clean DB, no migrations") + case err != nil: + return logger.Fatal().LogErrorf("Error getting current migration version: %w", err).Err() + default: + logger.Info().Logf("DB migrated to version: %d", ver) + } + logger.Info().Log("Migrations complete") return nil diff --git a/go.mod b/go.mod index 2b955574..3819733c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/moov-io/base -go 1.13 +go 1.16 require ( github.com/go-kit/kit v0.10.0