dbaas: Support restoring from a backup. (#442)

This commit is contained in:
Andrew Starr-Bochicchio 2021-04-09 11:51:45 -04:00 committed by GitHub
parent 7305c698ab
commit dd4bfeaea9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 175 additions and 71 deletions

View File

@ -193,16 +193,23 @@ type DatabaseBackup struct {
SizeGigabytes float64 `json:"size_gigabytes,omitempty"`
}
// DatabaseBackupRestore contains information needed to restore a backup.
type DatabaseBackupRestore struct {
DatabaseName string `json:"database_name,omitempty"`
BackupCreatedAt string `json:"backup_created_at,omitempty"`
}
// DatabaseCreateRequest represents a request to create a database cluster
type DatabaseCreateRequest struct {
Name string `json:"name,omitempty"`
EngineSlug string `json:"engine,omitempty"`
Version string `json:"version,omitempty"`
SizeSlug string `json:"size,omitempty"`
Region string `json:"region,omitempty"`
NumNodes int `json:"num_nodes,omitempty"`
PrivateNetworkUUID string `json:"private_network_uuid"`
Tags []string `json:"tags,omitempty"`
Name string `json:"name,omitempty"`
EngineSlug string `json:"engine,omitempty"`
Version string `json:"version,omitempty"`
SizeSlug string `json:"size,omitempty"`
Region string `json:"region,omitempty"`
NumNodes int `json:"num_nodes,omitempty"`
PrivateNetworkUUID string `json:"private_network_uuid"`
Tags []string `json:"tags,omitempty"`
BackupRestore *DatabaseBackupRestore `json:"backup_restore,omitempty"`
}
// DatabaseResizeRequest can be used to initiate a database resize operation.

View File

@ -161,54 +161,57 @@ func TestDatabases_Get(t *testing.T) {
}
func TestDatabases_Create(t *testing.T) {
setup()
defer teardown()
want := &Database{
ID: "8d91899c-0739-4a1a-acc5-deadbeefbb8f",
Name: "backend-test",
EngineSlug: "pg",
VersionSlug: "10",
Connection: &DatabaseConnection{
URI: "postgres://doadmin:zt91mum075ofzyww@dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
Database: "defaultdb",
Host: "dbtest-do-user-3342561-0.db.ondigitalocean.com",
Port: 25060,
User: "doadmin",
Password: "zt91mum075ofzyww",
SSL: true,
},
PrivateConnection: &DatabaseConnection{
URI: "postgres://doadmin:zt91mum075ofzyww@private-dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
Database: "defaultdb",
Host: "dbtest-do-user-3342561-0.db.ondigitalocean.com",
Port: 25060,
User: "doadmin",
Password: "zt91mum075ofzyww",
SSL: true,
},
Users: nil,
DBNames: nil,
NumNodes: 2,
RegionSlug: "nyc3",
Status: "creating",
CreatedAt: time.Date(2019, 2, 26, 6, 12, 39, 0, time.UTC),
MaintenanceWindow: nil,
SizeSlug: "db-s-2vcpu-4gb",
Tags: []string{"production", "staging"},
}
createRequest := &DatabaseCreateRequest{
Name: "backend-test",
EngineSlug: "pg",
Version: "10",
Region: "nyc3",
SizeSlug: "db-s-2vcpu-4gb",
NumNodes: 2,
Tags: []string{"production", "staging"},
}
body := `
tests := []struct {
title string
createRequest *DatabaseCreateRequest
want *Database
body string
}{
{
title: "create",
createRequest: &DatabaseCreateRequest{
Name: "backend-test",
EngineSlug: "pg",
Version: "10",
Region: "nyc3",
SizeSlug: "db-s-2vcpu-4gb",
NumNodes: 2,
Tags: []string{"production", "staging"},
},
want: &Database{
ID: "8d91899c-0739-4a1a-acc5-deadbeefbb8f",
Name: "backend-test",
EngineSlug: "pg",
VersionSlug: "10",
Connection: &DatabaseConnection{
URI: "postgres://doadmin:zt91mum075ofzyww@dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
Database: "defaultdb",
Host: "dbtest-do-user-3342561-0.db.ondigitalocean.com",
Port: 25060,
User: "doadmin",
Password: "zt91mum075ofzyww",
SSL: true,
},
PrivateConnection: &DatabaseConnection{
URI: "postgres://doadmin:zt91mum075ofzyww@private-dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
Database: "defaultdb",
Host: "dbtest-do-user-3342561-0.db.ondigitalocean.com",
Port: 25060,
User: "doadmin",
Password: "zt91mum075ofzyww",
SSL: true,
},
Users: nil,
DBNames: nil,
NumNodes: 2,
RegionSlug: "nyc3",
Status: "creating",
CreatedAt: time.Date(2019, 2, 26, 6, 12, 39, 0, time.UTC),
MaintenanceWindow: nil,
SizeSlug: "db-s-2vcpu-4gb",
Tags: []string{"production", "staging"},
},
body: `
{
"database": {
"id": "8d91899c-0739-4a1a-acc5-deadbeefbb8f",
@ -243,23 +246,117 @@ func TestDatabases_Create(t *testing.T) {
"size": "db-s-2vcpu-4gb",
"tags": ["production", "staging"]
}
}`
}`,
},
{
title: "create from backup",
createRequest: &DatabaseCreateRequest{
Name: "backend-restored",
EngineSlug: "pg",
Version: "10",
Region: "nyc3",
SizeSlug: "db-s-2vcpu-4gb",
NumNodes: 2,
Tags: []string{"production", "staging"},
BackupRestore: &DatabaseBackupRestore{
DatabaseName: "backend-orig",
BackupCreatedAt: "2019-01-31T19:25:22Z",
},
},
want: &Database{
ID: "8d91899c-0739-4a1a-acc5-deadbeefbb8f",
Name: "backend-test",
EngineSlug: "pg",
VersionSlug: "10",
Connection: &DatabaseConnection{
URI: "postgres://doadmin:zt91mum075ofzyww@dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
Database: "defaultdb",
Host: "dbtest-do-user-3342561-0.db.ondigitalocean.com",
Port: 25060,
User: "doadmin",
Password: "zt91mum075ofzyww",
SSL: true,
},
PrivateConnection: &DatabaseConnection{
URI: "postgres://doadmin:zt91mum075ofzyww@private-dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
Database: "defaultdb",
Host: "dbtest-do-user-3342561-0.db.ondigitalocean.com",
Port: 25060,
User: "doadmin",
Password: "zt91mum075ofzyww",
SSL: true,
},
Users: nil,
DBNames: nil,
NumNodes: 2,
RegionSlug: "nyc3",
Status: "creating",
CreatedAt: time.Date(2019, 2, 26, 6, 12, 39, 0, time.UTC),
MaintenanceWindow: nil,
SizeSlug: "db-s-2vcpu-4gb",
Tags: []string{"production", "staging"},
},
body: `
{
"database": {
"id": "8d91899c-0739-4a1a-acc5-deadbeefbb8f",
"name": "backend-test",
"engine": "pg",
"version": "10",
"connection": {
"uri": "postgres://doadmin:zt91mum075ofzyww@dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
"database": "defaultdb",
"host": "dbtest-do-user-3342561-0.db.ondigitalocean.com",
"port": 25060,
"user": "doadmin",
"password": "zt91mum075ofzyww",
"ssl": true
},
"private_connection": {
"uri": "postgres://doadmin:zt91mum075ofzyww@private-dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
"database": "defaultdb",
"host": "dbtest-do-user-3342561-0.db.ondigitalocean.com",
"port": 25060,
"user": "doadmin",
"password": "zt91mum075ofzyww",
"ssl": true
},
"users": null,
"db_names": null,
"num_nodes": 2,
"region": "nyc3",
"status": "creating",
"created_at": "2019-02-26T06:12:39Z",
"maintenance_window": null,
"size": "db-s-2vcpu-4gb",
"tags": ["production", "staging"]
}
}`,
},
}
mux.HandleFunc("/v2/databases", func(w http.ResponseWriter, r *http.Request) {
v := new(DatabaseCreateRequest)
err := json.NewDecoder(r.Body).Decode(v)
if err != nil {
t.Fatal(err)
}
for _, tt := range tests {
t.Run(tt.title, func(t *testing.T) {
setup()
defer teardown()
testMethod(t, r, http.MethodPost)
require.Equal(t, v, createRequest)
fmt.Fprint(w, body)
})
mux.HandleFunc("/v2/databases", func(w http.ResponseWriter, r *http.Request) {
v := new(DatabaseCreateRequest)
err := json.NewDecoder(r.Body).Decode(v)
if err != nil {
t.Fatal(err)
}
got, _, err := client.Databases.Create(ctx, createRequest)
require.NoError(t, err)
require.Equal(t, want, got)
testMethod(t, r, http.MethodPost)
require.Equal(t, v, tt.createRequest)
fmt.Fprint(w, tt.body)
})
got, _, err := client.Databases.Create(ctx, tt.createRequest)
require.NoError(t, err)
require.Equal(t, tt.want, got)
})
}
}
func TestDatabases_Delete(t *testing.T) {
@ -1350,7 +1447,7 @@ func TestDatabases_CreateDatabaseUserWithMySQLSettings(t *testing.T) {
"name": "foo",
"mysql_settings": {
"auth_plugin": "%s"
}
}
}
}`, SQLAuthPluginNative))
expectedUser := &DatabaseUser{