dbaas: Support restoring from a backup. (#442)
This commit is contained in:
parent
7305c698ab
commit
dd4bfeaea9
23
databases.go
23
databases.go
|
@ -193,16 +193,23 @@ type DatabaseBackup struct {
|
||||||
SizeGigabytes float64 `json:"size_gigabytes,omitempty"`
|
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
|
// DatabaseCreateRequest represents a request to create a database cluster
|
||||||
type DatabaseCreateRequest struct {
|
type DatabaseCreateRequest struct {
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
EngineSlug string `json:"engine,omitempty"`
|
EngineSlug string `json:"engine,omitempty"`
|
||||||
Version string `json:"version,omitempty"`
|
Version string `json:"version,omitempty"`
|
||||||
SizeSlug string `json:"size,omitempty"`
|
SizeSlug string `json:"size,omitempty"`
|
||||||
Region string `json:"region,omitempty"`
|
Region string `json:"region,omitempty"`
|
||||||
NumNodes int `json:"num_nodes,omitempty"`
|
NumNodes int `json:"num_nodes,omitempty"`
|
||||||
PrivateNetworkUUID string `json:"private_network_uuid"`
|
PrivateNetworkUUID string `json:"private_network_uuid"`
|
||||||
Tags []string `json:"tags,omitempty"`
|
Tags []string `json:"tags,omitempty"`
|
||||||
|
BackupRestore *DatabaseBackupRestore `json:"backup_restore,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DatabaseResizeRequest can be used to initiate a database resize operation.
|
// DatabaseResizeRequest can be used to initiate a database resize operation.
|
||||||
|
|
|
@ -161,54 +161,57 @@ func TestDatabases_Get(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDatabases_Create(t *testing.T) {
|
func TestDatabases_Create(t *testing.T) {
|
||||||
setup()
|
tests := []struct {
|
||||||
defer teardown()
|
title string
|
||||||
|
createRequest *DatabaseCreateRequest
|
||||||
want := &Database{
|
want *Database
|
||||||
ID: "8d91899c-0739-4a1a-acc5-deadbeefbb8f",
|
body string
|
||||||
Name: "backend-test",
|
}{
|
||||||
EngineSlug: "pg",
|
{
|
||||||
VersionSlug: "10",
|
title: "create",
|
||||||
Connection: &DatabaseConnection{
|
createRequest: &DatabaseCreateRequest{
|
||||||
URI: "postgres://doadmin:zt91mum075ofzyww@dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
|
Name: "backend-test",
|
||||||
Database: "defaultdb",
|
EngineSlug: "pg",
|
||||||
Host: "dbtest-do-user-3342561-0.db.ondigitalocean.com",
|
Version: "10",
|
||||||
Port: 25060,
|
Region: "nyc3",
|
||||||
User: "doadmin",
|
SizeSlug: "db-s-2vcpu-4gb",
|
||||||
Password: "zt91mum075ofzyww",
|
NumNodes: 2,
|
||||||
SSL: true,
|
Tags: []string{"production", "staging"},
|
||||||
},
|
},
|
||||||
PrivateConnection: &DatabaseConnection{
|
want: &Database{
|
||||||
URI: "postgres://doadmin:zt91mum075ofzyww@private-dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
|
ID: "8d91899c-0739-4a1a-acc5-deadbeefbb8f",
|
||||||
Database: "defaultdb",
|
Name: "backend-test",
|
||||||
Host: "dbtest-do-user-3342561-0.db.ondigitalocean.com",
|
EngineSlug: "pg",
|
||||||
Port: 25060,
|
VersionSlug: "10",
|
||||||
User: "doadmin",
|
Connection: &DatabaseConnection{
|
||||||
Password: "zt91mum075ofzyww",
|
URI: "postgres://doadmin:zt91mum075ofzyww@dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
|
||||||
SSL: true,
|
Database: "defaultdb",
|
||||||
},
|
Host: "dbtest-do-user-3342561-0.db.ondigitalocean.com",
|
||||||
Users: nil,
|
Port: 25060,
|
||||||
DBNames: nil,
|
User: "doadmin",
|
||||||
NumNodes: 2,
|
Password: "zt91mum075ofzyww",
|
||||||
RegionSlug: "nyc3",
|
SSL: true,
|
||||||
Status: "creating",
|
},
|
||||||
CreatedAt: time.Date(2019, 2, 26, 6, 12, 39, 0, time.UTC),
|
PrivateConnection: &DatabaseConnection{
|
||||||
MaintenanceWindow: nil,
|
URI: "postgres://doadmin:zt91mum075ofzyww@private-dbtest-do-user-3342561-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require",
|
||||||
SizeSlug: "db-s-2vcpu-4gb",
|
Database: "defaultdb",
|
||||||
Tags: []string{"production", "staging"},
|
Host: "dbtest-do-user-3342561-0.db.ondigitalocean.com",
|
||||||
}
|
Port: 25060,
|
||||||
|
User: "doadmin",
|
||||||
createRequest := &DatabaseCreateRequest{
|
Password: "zt91mum075ofzyww",
|
||||||
Name: "backend-test",
|
SSL: true,
|
||||||
EngineSlug: "pg",
|
},
|
||||||
Version: "10",
|
Users: nil,
|
||||||
Region: "nyc3",
|
DBNames: nil,
|
||||||
SizeSlug: "db-s-2vcpu-4gb",
|
NumNodes: 2,
|
||||||
NumNodes: 2,
|
RegionSlug: "nyc3",
|
||||||
Tags: []string{"production", "staging"},
|
Status: "creating",
|
||||||
}
|
CreatedAt: time.Date(2019, 2, 26, 6, 12, 39, 0, time.UTC),
|
||||||
|
MaintenanceWindow: nil,
|
||||||
body := `
|
SizeSlug: "db-s-2vcpu-4gb",
|
||||||
|
Tags: []string{"production", "staging"},
|
||||||
|
},
|
||||||
|
body: `
|
||||||
{
|
{
|
||||||
"database": {
|
"database": {
|
||||||
"id": "8d91899c-0739-4a1a-acc5-deadbeefbb8f",
|
"id": "8d91899c-0739-4a1a-acc5-deadbeefbb8f",
|
||||||
|
@ -243,23 +246,117 @@ func TestDatabases_Create(t *testing.T) {
|
||||||
"size": "db-s-2vcpu-4gb",
|
"size": "db-s-2vcpu-4gb",
|
||||||
"tags": ["production", "staging"]
|
"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) {
|
for _, tt := range tests {
|
||||||
v := new(DatabaseCreateRequest)
|
t.Run(tt.title, func(t *testing.T) {
|
||||||
err := json.NewDecoder(r.Body).Decode(v)
|
setup()
|
||||||
if err != nil {
|
defer teardown()
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
testMethod(t, r, http.MethodPost)
|
mux.HandleFunc("/v2/databases", func(w http.ResponseWriter, r *http.Request) {
|
||||||
require.Equal(t, v, createRequest)
|
v := new(DatabaseCreateRequest)
|
||||||
fmt.Fprint(w, body)
|
err := json.NewDecoder(r.Body).Decode(v)
|
||||||
})
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
got, _, err := client.Databases.Create(ctx, createRequest)
|
testMethod(t, r, http.MethodPost)
|
||||||
require.NoError(t, err)
|
require.Equal(t, v, tt.createRequest)
|
||||||
require.Equal(t, want, got)
|
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) {
|
func TestDatabases_Delete(t *testing.T) {
|
||||||
|
@ -1350,7 +1447,7 @@ func TestDatabases_CreateDatabaseUserWithMySQLSettings(t *testing.T) {
|
||||||
"name": "foo",
|
"name": "foo",
|
||||||
"mysql_settings": {
|
"mysql_settings": {
|
||||||
"auth_plugin": "%s"
|
"auth_plugin": "%s"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}`, SQLAuthPluginNative))
|
}`, SQLAuthPluginNative))
|
||||||
expectedUser := &DatabaseUser{
|
expectedUser := &DatabaseUser{
|
||||||
|
|
Loading…
Reference in New Issue