100 lines
2.2 KiB
Go
100 lines
2.2 KiB
Go
package bolt
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"testing"
|
|
|
|
"github.com/boltdb/bolt"
|
|
portainer "github.com/portainer/portainer/api"
|
|
"github.com/portainer/portainer/api/filesystem"
|
|
)
|
|
|
|
// New Database should be EE and DBVersion
|
|
//
|
|
|
|
func TestMigrateData(t *testing.T) {
|
|
var store *Store
|
|
|
|
t.Run("MigrateData for New Store", func(t *testing.T) {
|
|
fileService, err := filesystem.NewService(dataStorePath, "")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
store, err := NewStore(dataStorePath, fileService)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
err = store.Open()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
err = store.Init()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
store.MigrateData(false)
|
|
|
|
testVersion(store, portainer.DBVersionEE, t)
|
|
testEdition(store, portainer.PortainerEE, t)
|
|
|
|
store.Close()
|
|
})
|
|
|
|
tests := []struct {
|
|
edition portainer.SoftwareEdition
|
|
version int
|
|
expectedVersion int
|
|
}{
|
|
{edition: portainer.PortainerCE, version: 5, expectedVersion: portainer.DBVersionEE},
|
|
{edition: portainer.PortainerCE, version: 21, expectedVersion: portainer.DBVersionEE},
|
|
}
|
|
|
|
for _, tc := range tests {
|
|
store = NewTestStore(tc.edition, tc.version, true)
|
|
t.Run(fmt.Sprintf("MigrateData for %s version %d", tc.edition.GetEditionLabel(), tc.version), func(t *testing.T) {
|
|
store.MigrateData(false)
|
|
testVersion(store, tc.expectedVersion, t)
|
|
testEdition(store, portainer.PortainerEE, t)
|
|
})
|
|
|
|
t.Run(fmt.Sprintf("Restoring DB after migrateData for %s version %d", tc.edition.GetEditionLabel(), tc.version), func(t *testing.T) {
|
|
store.RollbackToCE()
|
|
testVersion(store, tc.version, t)
|
|
testEdition(store, tc.edition, t)
|
|
})
|
|
|
|
store.Close()
|
|
}
|
|
|
|
t.Run("Error in MigrateData should restore backup before MigrateData", func(t *testing.T) {
|
|
version := 21
|
|
store = NewTestStore(portainer.PortainerCE, version, true)
|
|
|
|
deleteBucket(store.connection.DB, "settings")
|
|
store.MigrateData(false)
|
|
|
|
testVersion(store, version, t)
|
|
testEdition(store, portainer.PortainerCE, t)
|
|
|
|
store.Close()
|
|
})
|
|
|
|
teardown()
|
|
}
|
|
|
|
func deleteBucket(db *bolt.DB, bucketName string) {
|
|
db.Update(func(tx *bolt.Tx) error {
|
|
log.Printf("Delete bucket %s\n", bucketName)
|
|
err := tx.DeleteBucket([]byte(bucketName))
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
return err
|
|
})
|
|
}
|