mirror of
https://github.com/1Panel-dev/KubePi.git
synced 2025-09-26 19:31:15 +08:00
feat(migrate): 数据库迁移实现
This commit is contained in:
@@ -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
65
migrate/migrate.go
Normal 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", ¤tDbVersion); 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()
|
||||
}
|
||||
}
|
12
migrate/migrations/types.go
Normal file
12
migrate/migrations/types.go
Normal 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
46
migrate/v1/migrations.go
Normal 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)
|
||||
},
|
||||
}
|
Reference in New Issue
Block a user