9e7e753faf
while satellites have also run this logic, old satellites that no longer exist cannot and so the node cannot get the updated data. this locally migrates it so that the calculations for the undistributed amounts are correct. there's also some tab/space whitespace and gofmt fixes. Change-Id: I470879703314fe6541eaba5f21b47849781894f8
147 lines
3.0 KiB
Go
147 lines
3.0 KiB
Go
// Copyright (C) 2019 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package testdata
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"storj.io/storj/private/dbutil/dbschema"
|
|
"storj.io/storj/private/dbutil/sqliteutil"
|
|
)
|
|
|
|
// States is the global variable that stores all the states for testing.
|
|
var States = MultiDBStates{
|
|
List: []*MultiDBState{
|
|
&v0,
|
|
&v1,
|
|
&v2,
|
|
&v3,
|
|
&v4,
|
|
&v5,
|
|
&v6,
|
|
&v7,
|
|
&v8,
|
|
&v9,
|
|
&v10,
|
|
&v11,
|
|
&v12,
|
|
&v13,
|
|
&v14,
|
|
&v15,
|
|
&v16,
|
|
&v17,
|
|
&v18,
|
|
&v19,
|
|
&v20,
|
|
&v21,
|
|
&v22,
|
|
&v23,
|
|
&v24,
|
|
&v25,
|
|
&v26,
|
|
&v27,
|
|
&v28,
|
|
&v29,
|
|
&v30,
|
|
&v31,
|
|
&v32,
|
|
&v33,
|
|
&v34,
|
|
&v35,
|
|
&v36,
|
|
&v37,
|
|
&v38,
|
|
&v39,
|
|
&v40,
|
|
&v41,
|
|
&v42,
|
|
&v43,
|
|
&v44,
|
|
&v45,
|
|
&v46,
|
|
&v47,
|
|
&v48,
|
|
&v49,
|
|
&v50,
|
|
&v51,
|
|
},
|
|
}
|
|
|
|
// MultiDBStates provides a convenient list of MultiDBState.
|
|
type MultiDBStates struct {
|
|
List []*MultiDBState
|
|
}
|
|
|
|
// FindVersion finds a MultiDBState with the specified version.
|
|
func (mdbs *MultiDBStates) FindVersion(version int) (*MultiDBState, bool) {
|
|
for _, state := range mdbs.List {
|
|
if state.Version == version {
|
|
return state, true
|
|
}
|
|
}
|
|
return nil, false
|
|
}
|
|
|
|
// MultiDBState represents an expected state across multiple DBs, defined in SQL
|
|
// commands.
|
|
type MultiDBState struct {
|
|
Version int
|
|
DBStates DBStates
|
|
}
|
|
|
|
// DBStates is a convenience type.
|
|
type DBStates map[string]*DBState
|
|
|
|
// DBState allows you to define the desired state of the DB using SQl commands.
|
|
// Both the SQl and NewData fields contains SQL that will be executed to create
|
|
// the expected DB. The NewData SQL additionally will be executed on the testDB
|
|
// to ensure data is consistent. If OldData is not empty, it is executed on the
|
|
// testDB before the migration is run, and NewData is not run on the testDB. This
|
|
// is used to assert that a migration that modifies data runs as expected.
|
|
type DBState struct {
|
|
SQL string
|
|
OldData string
|
|
NewData string
|
|
}
|
|
|
|
// MultiDBSnapshot represents an expected state among multiple databases.
|
|
type MultiDBSnapshot struct {
|
|
Version int
|
|
DBSnapshots DBSnapshots
|
|
}
|
|
|
|
// NewMultiDBSnapshot returns a new MultiDBSnapshot.
|
|
func NewMultiDBSnapshot() *MultiDBSnapshot {
|
|
return &MultiDBSnapshot{
|
|
DBSnapshots: DBSnapshots{},
|
|
}
|
|
}
|
|
|
|
// DBSnapshots is a convenience type.
|
|
type DBSnapshots map[string]*DBSnapshot
|
|
|
|
// DBSnapshot is a snapshot of a single DB.
|
|
type DBSnapshot struct {
|
|
Schema *dbschema.Schema
|
|
Data *dbschema.Data
|
|
}
|
|
|
|
// LoadMultiDBSnapshot converts a MultiDBState into a MultiDBSnapshot. It
|
|
// executes the SQL and stores the schema and data.
|
|
func LoadMultiDBSnapshot(ctx context.Context, multiDBState *MultiDBState) (*MultiDBSnapshot, error) {
|
|
multiDBSnapshot := NewMultiDBSnapshot()
|
|
for dbName, dbState := range multiDBState.DBStates {
|
|
snapshot, err := sqliteutil.LoadSnapshotFromSQL(ctx, fmt.Sprintf("%s\n%s", dbState.SQL, dbState.NewData))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
multiDBSnapshot.DBSnapshots[dbName] = &DBSnapshot{
|
|
Schema: snapshot.Schema,
|
|
Data: snapshot.Data,
|
|
}
|
|
}
|
|
return multiDBSnapshot, nil
|
|
}
|