grafana/pkg/services/sqlstore/migrations/cloud_migrations.go

174 lines
7.7 KiB
Go
Raw Normal View History

package migrations
import (
. "github.com/grafana/grafana/pkg/services/sqlstore/migrator"
)
func addCloudMigrationsMigrations(mg *Migrator) {
// --- v1 - synchronous workflow
migrationTable := Table{
Name: "cloud_migration",
Columns: []*Column{
{Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true},
{Name: "auth_token", Type: DB_Text, Nullable: true}, // encrypted
{Name: "stack", Type: DB_Text},
{Name: "created", Type: DB_DateTime, Nullable: false},
{Name: "updated", Type: DB_DateTime, Nullable: false},
},
}
migrationRunTable := Table{
Name: "cloud_migration_run",
Columns: []*Column{
{Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true},
{Name: "cloud_migration_uid", Type: DB_NVarchar, Length: 40, Nullable: true}, // get from the cloud service
{Name: "result", Type: DB_Text, Nullable: false},
{Name: "created", Type: DB_DateTime, Nullable: false},
{Name: "updated", Type: DB_DateTime, Nullable: false},
{Name: "finished", Type: DB_DateTime, Nullable: true},
},
}
mg.AddMigration("create cloud_migration table v1", NewAddTableMigration(migrationTable))
mg.AddMigration("create cloud_migration_run table v1", NewAddTableMigration(migrationRunTable))
stackIDColumn := Column{Name: "stack_id", Type: DB_BigInt, Nullable: false}
regionSlugColumn := Column{Name: "region_slug", Type: DB_Text, Nullable: false}
clusterSlugColumn := Column{Name: "cluster_slug", Type: DB_Text, Nullable: false}
mg.AddMigration("add stack_id column", NewAddColumnMigration(migrationTable, &stackIDColumn))
mg.AddMigration("add region_slug column", NewAddColumnMigration(migrationTable, &regionSlugColumn))
mg.AddMigration("add cluster_slug column", NewAddColumnMigration(migrationTable, &clusterSlugColumn))
// --- adding uid to migration
migUidColumn := Column{Name: "uid", Type: DB_NVarchar, Length: 40, Nullable: true}
mg.AddMigration("add migration uid column", NewAddColumnMigration(migrationTable, &migUidColumn))
mg.AddMigration("Update uid column values for migration", NewRawSQLMigration("").
SQLite("UPDATE cloud_migration SET uid=printf('u%09d',id) WHERE uid IS NULL;").
Postgres("UPDATE `cloud_migration` SET uid='u' || lpad('' || id::text,9,'0') WHERE uid IS NULL;").
Mysql("UPDATE cloud_migration SET uid=concat('u',lpad(id,9,'0')) WHERE uid IS NULL;"))
mg.AddMigration("Add unique index migration_uid", NewAddIndexMigration(migrationTable, &Index{
Cols: []string{"uid"}, Type: UniqueIndex,
}))
// --- adding uid to migration run
runUidColumn := Column{Name: "uid", Type: DB_NVarchar, Length: 40, Nullable: true}
mg.AddMigration("add migration run uid column", NewAddColumnMigration(migrationRunTable, &runUidColumn))
mg.AddMigration("Update uid column values for migration run", NewRawSQLMigration("").
SQLite("UPDATE cloud_migration_run SET uid=printf('u%09d',id) WHERE uid IS NULL;").
Postgres("UPDATE `cloud_migration_run` SET uid='u' || lpad('' || id::text,9,'0') WHERE uid IS NULL;").
Mysql("UPDATE cloud_migration_run SET uid=concat('u',lpad(id,9,'0')) WHERE uid IS NULL;"))
mg.AddMigration("Add unique index migration_run_uid", NewAddIndexMigration(migrationRunTable, &Index{
Cols: []string{"uid"}, Type: UniqueIndex,
}))
// --- v2 - asynchronous workflow refactor
sessionTable := Table{
Name: "cloud_migration_session",
Columns: []*Column{
{Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true},
{Name: "uid", Type: DB_NVarchar, Length: 40, Nullable: true},
{Name: "auth_token", Type: DB_Text, Nullable: true}, // encrypted
{Name: "slug", Type: DB_Text},
{Name: "stack_id", Type: DB_BigInt, Nullable: false},
{Name: "region_slug", Type: DB_Text, Nullable: false},
{Name: "cluster_slug", Type: DB_Text, Nullable: false},
{Name: "created", Type: DB_DateTime, Nullable: false},
{Name: "updated", Type: DB_DateTime, Nullable: false},
},
Indices: []*Index{
{Cols: []string{"uid"}, Type: UniqueIndex},
},
}
migrationSnapshotTable := Table{
Name: "cloud_migration_snapshot",
Columns: []*Column{
{Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true},
{Name: "uid", Type: DB_NVarchar, Length: 40, Nullable: true},
{Name: "session_uid", Type: DB_NVarchar, Length: 40, Nullable: true}, // get from the cloud service
{Name: "result", Type: DB_Text, Nullable: false},
{Name: "created", Type: DB_DateTime, Nullable: false},
{Name: "updated", Type: DB_DateTime, Nullable: false},
{Name: "finished", Type: DB_DateTime, Nullable: true},
},
Indices: []*Index{
{Cols: []string{"uid"}, Type: UniqueIndex},
},
}
addTableReplaceMigrations(mg, migrationTable, sessionTable, 2, map[string]string{
"id": "id",
"uid": "uid",
"auth_token": "auth_token",
"slug": "stack",
"stack_id": "stack_id",
"region_slug": "region_slug",
"cluster_slug": "cluster_slug",
"created": "created",
"updated": "updated",
})
addTableReplaceMigrations(mg, migrationRunTable, migrationSnapshotTable, 2, map[string]string{
"id": "id",
"uid": "uid",
"session_uid": "cloud_migration_uid",
"result": "result",
"created": "created",
"updated": "updated",
"finished": "finished",
})
// --- add new columns to snapshots table
uploadUrlColumn := Column{Name: "upload_url", Type: DB_Text, Nullable: true}
mg.AddMigration("add snapshot upload_url column", NewAddColumnMigration(migrationSnapshotTable, &uploadUrlColumn))
statusColumn := Column{Name: "status", Type: DB_Text, Nullable: false}
mg.AddMigration("add snapshot status column", NewAddColumnMigration(migrationSnapshotTable, &statusColumn))
localDirColumn := Column{Name: "local_directory", Type: DB_Text, Nullable: true}
mg.AddMigration("add snapshot local_directory column", NewAddColumnMigration(migrationSnapshotTable, &localDirColumn))
gmsSnapshotUIDColumn := Column{Name: "gms_snapshot_uid", Type: DB_Text, Nullable: true}
mg.AddMigration("add snapshot gms_snapshot_uid column", NewAddColumnMigration(migrationSnapshotTable, &gmsSnapshotUIDColumn))
encryptionKeyColumn := Column{Name: "encryption_key", Type: DB_Text, Nullable: true}
mg.AddMigration("add snapshot encryption_key column", NewAddColumnMigration(migrationSnapshotTable, &encryptionKeyColumn))
errorStringColumn := Column{Name: "error_string", Type: DB_Text, Nullable: true}
mg.AddMigration("add snapshot error_string column", NewAddColumnMigration(migrationSnapshotTable, &errorStringColumn))
// --- create table for tracking resource migrations
migrationResourceTable := Table{
Name: "cloud_migration_resource",
Columns: []*Column{
{Name: "id", Type: DB_BigInt, IsPrimaryKey: true, IsAutoIncrement: true},
{Name: "uid", Type: DB_NVarchar, Length: 40, Nullable: false},
{Name: "resource_type", Type: DB_NVarchar, Length: 40, Nullable: false},
{Name: "resource_uid", Type: DB_NVarchar, Length: 40, Nullable: false},
{Name: "status", Type: DB_NVarchar, Length: 20, Nullable: false},
{Name: "error_string", Type: DB_Text, Nullable: true},
{Name: "snapshot_uid", Type: DB_NVarchar, Length: 40, Nullable: false},
},
}
mg.AddMigration("create cloud_migration_resource table v1", NewAddTableMigration(migrationResourceTable))
// -- delete the snapshot result column while still in the experimental phase
mg.AddMigration("delete cloud_migration_snapshot.result column", NewRawSQLMigration("ALTER TABLE cloud_migration_snapshot DROP COLUMN result"))
mg.AddMigration("add cloud_migration_resource.name column", NewAddColumnMigration(migrationResourceTable, &Column{
Name: "name",
Type: DB_Text,
Nullable: true,
}))
mg.AddMigration("add cloud_migration_resource.parent_name column", NewAddColumnMigration(migrationResourceTable, &Column{
Name: "parent_name",
Type: DB_Text,
Nullable: true,
}))
}