feat(migrate): 数据库迁移实现

This commit is contained in:
chenyang
2021-06-07 19:26:41 +08:00
parent 6275c9101f
commit 9a113ffb41
4 changed files with 129 additions and 3 deletions

View File

@@ -5,6 +5,7 @@ import (
"fmt"
"github.com/KubeOperator/ekko/internal/config"
v1Config "github.com/KubeOperator/ekko/internal/model/v1/config"
"github.com/KubeOperator/ekko/migrate"
"github.com/asdine/storm/v3"
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/context"
@@ -95,6 +96,10 @@ func (e *EkkoSerer) setUpErrHandler() {
})
}
func (e *EkkoSerer) runMigrations() {
migrate.RunMigrate(e.db, e.logger)
}
func (e *EkkoSerer) bootstrap() *EkkoSerer {
e.Application = iris.New()
e.setUpConfig()
@@ -103,9 +108,7 @@ func (e *EkkoSerer) bootstrap() *EkkoSerer {
e.setUpSession()
e.setResultHandler()
e.setUpErrHandler()
e.setDefaultUserGroups()
e.setDefaultRoles()
e.setSuperUser()
e.runMigrations()
return e
}

65
migrate/migrate.go Normal file
View File

@@ -0,0 +1,65 @@
package migrate
import (
"errors"
"github.com/KubeOperator/ekko/migrate/migrations"
v1 "github.com/KubeOperator/ekko/migrate/v1"
"github.com/asdine/storm/v3"
"github.com/sirupsen/logrus"
"os"
"sort"
)
var definedMigrations = append([]migrations.Migration{}, v1.Migrations...)
func RunMigrate(db *storm.DB, logger *logrus.Logger) {
var currentDbVersion int
if err := db.Get("db", "current_db_version", &currentDbVersion); err != nil {
if errors.Is(err, storm.ErrNotFound) {
currentDbVersion = 0
} else {
logger.Errorf("can not get current db version ,%s", err.Error())
os.Exit(1)
}
}
logger.Infof("current db version: %d",currentDbVersion)
var prepareExecuteMigrationVersions []int
for i := range definedMigrations {
if definedMigrations[i].Version > currentDbVersion {
prepareExecuteMigrationVersions = append(prepareExecuteMigrationVersions, definedMigrations[i].Version)
}
}
if len(prepareExecuteMigrationVersions) > 0 {
sort.Ints(prepareExecuteMigrationVersions)
lastVersion := prepareExecuteMigrationVersions[len(prepareExecuteMigrationVersions)-1]
tx, err := db.Begin(true)
if err != nil {
logger.Errorf("can not open transaction ,%s", err.Error())
os.Exit(1)
}
for i := range definedMigrations {
for j := range prepareExecuteMigrationVersions {
if definedMigrations[i].Version == prepareExecuteMigrationVersions[j] {
logger.Infof("executing db migration: [%d] %s", definedMigrations[i].Version, definedMigrations[i].Message)
if err := definedMigrations[i].Handler(tx); err != nil {
_ = tx.Rollback()
logger.Errorf("execute migration: [%d] %s failed,rollback it", definedMigrations[i].Version, err.Error())
os.Exit(1)
}
}
}
}
currentDbVersion = lastVersion
if err := tx.Set("db", "current_db_version", currentDbVersion); err != nil {
_ = tx.Rollback()
logger.Errorf("update db version failed %s ,rollback it", err.Error())
os.Exit(1)
}
logger.Infof("update db to version: %d", currentDbVersion)
_ = tx.Commit()
}
}

View File

@@ -0,0 +1,12 @@
package migrations
import "github.com/asdine/storm/v3"
type MigrationFUNC func(db storm.Node) error
type Migration struct {
Version int
Handler MigrationFUNC
Message string
}

46
migrate/v1/migrations.go Normal file
View File

@@ -0,0 +1,46 @@
package v1
import (
v1 "github.com/KubeOperator/ekko/internal/model/v1"
v1Role "github.com/KubeOperator/ekko/internal/model/v1/role"
"github.com/KubeOperator/ekko/migrate/migrations"
"github.com/asdine/storm/v3"
"github.com/google/uuid"
)
var Migrations = []migrations.Migration{
InitData,
CreateRole,
}
var InitData = migrations.Migration{
Version: 1,
Message: "init data",
Handler: func(db storm.Node) error {
role := v1Role.Role{
BaseModel: v1.BaseModel{},
Metadata: v1.Metadata{
Name: "test1",
UUID: uuid.New().String(),
},
Rules: nil,
}
return db.Save(&role)
},
}
var CreateRole = migrations.Migration{
Version: 2,
Message: "init data 123",
Handler: func(db storm.Node) error {
role := v1Role.Role{
BaseModel: v1.BaseModel{},
Metadata: v1.Metadata{
Name: "test2",
UUID: uuid.New().String(),
},
Rules: nil,
}
return db.Save(&role)
},
}