main.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package main
  2. import (
  3. "log"
  4. "github.com/porter-dev/porter/api/server/shared/config/envloader"
  5. "github.com/porter-dev/porter/cmd/migrate/keyrotate"
  6. adapter "github.com/porter-dev/porter/internal/adapter"
  7. "github.com/porter-dev/porter/internal/repository/gorm"
  8. lr "github.com/porter-dev/porter/pkg/logger"
  9. "github.com/joeshaw/envdecode"
  10. )
  11. func main() {
  12. logger := lr.NewConsole(true)
  13. logger.Info().Msg("running migrations")
  14. envConf, err := envloader.FromEnv()
  15. if err != nil {
  16. logger.Fatal().Err(err).Msg("could not load env conf")
  17. return
  18. }
  19. db, err := adapter.New(envConf.DBConf)
  20. if err != nil {
  21. logger.Fatal().Err(err).Msg("could not connect to the database")
  22. return
  23. }
  24. err = gorm.AutoMigrate(db, envConf.ServerConf.Debug)
  25. if err != nil {
  26. logger.Fatal().Err(err).Msg("gorm auto-migration failed")
  27. return
  28. }
  29. if err := db.Raw("ALTER TABLE clusters DROP CONSTRAINT IF EXISTS fk_cluster_token_caches").Error; err != nil {
  30. logger.Fatal().Err(err).Msg("failed to drop cluster token cache constraint")
  31. return
  32. }
  33. if err := db.Raw("ALTER TABLE cluster_token_caches DROP CONSTRAINT IF EXISTS fk_clusters_token_cache").Error; err != nil {
  34. logger.Fatal().Err(err).Msg("failed to drop clusters token cache constraint")
  35. return
  36. }
  37. if shouldRotate, oldKeyStr, newKeyStr := shouldKeyRotate(); shouldRotate {
  38. oldKey := [32]byte{}
  39. newKey := [32]byte{}
  40. copy(oldKey[:], []byte(oldKeyStr))
  41. copy(newKey[:], []byte(newKeyStr))
  42. err := keyrotate.Rotate(db, &oldKey, &newKey)
  43. if err != nil {
  44. logger.Fatal().Err(err).Msg("key rotation failed")
  45. }
  46. }
  47. if err := InstanceMigrate(db, envConf.DBConf); err != nil {
  48. logger.Fatal().Err(err).Msg("vault migration failed")
  49. }
  50. }
  51. type RotateConf struct {
  52. // we add a dummy field to avoid empty struct issue with envdecode
  53. DummyField string `env:"ASDF,default=asdf"`
  54. OldEncryptionKey string `env:"OLD_ENCRYPTION_KEY"`
  55. NewEncryptionKey string `env:"NEW_ENCRYPTION_KEY"`
  56. }
  57. func shouldKeyRotate() (bool, string, string) {
  58. var c RotateConf
  59. if err := envdecode.StrictDecode(&c); err != nil {
  60. log.Fatalf("Failed to decode migration conf: %s", err)
  61. return false, "", ""
  62. }
  63. return c.OldEncryptionKey != "" && c.NewEncryptionKey != "", c.OldEncryptionKey, c.NewEncryptionKey
  64. }