Skip to content
This repository was archived by the owner on Aug 1, 2023. It is now read-only.

Commit 8252352

Browse files
author
Jamie Hannaford
committed
Add datastore functionality
1 parent 23867bb commit 8252352

File tree

6 files changed

+345
-0
lines changed

6 files changed

+345
-0
lines changed

rackspace/db/v1/datastores/doc.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package datastores
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package datastores
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/rackspace/gophercloud"
7+
)
8+
9+
const version1JSON = `
10+
{
11+
"id": "b00000b0-00b0-0b00-00b0-000b000000bb",
12+
"links": [
13+
{
14+
"href": "https://api.staging.ord1.clouddb.rackspace.net/v1.0/1234/datastores/versions/b00000b0-00b0-0b00-00b0-000b000000bb",
15+
"rel": "self"
16+
},
17+
{
18+
"href": "https://api.staging.ord1.clouddb.rackspace.net/datastores/versions/b00000b0-00b0-0b00-00b0-000b000000bb",
19+
"rel": "bookmark"
20+
}
21+
],
22+
"name": "5.1"
23+
}
24+
`
25+
26+
const version2JSON = `
27+
{
28+
"id": "c00000b0-00c0-0c00-00c0-000b000000cc",
29+
"links": [
30+
{
31+
"href": "https://api.staging.ord1.clouddb.rackspace.net/v1.0/1234/datastores/versions/c00000b0-00c0-0c00-00c0-000b000000cc",
32+
"rel": "self"
33+
},
34+
{
35+
"href": "https://api.staging.ord1.clouddb.rackspace.net/datastores/versions/c00000b0-00c0-0c00-00c0-000b000000cc",
36+
"rel": "bookmark"
37+
}
38+
],
39+
"name": "5.2"
40+
}
41+
`
42+
43+
var versionsJSON = fmt.Sprintf(`"versions": [%s, %s]`, version1JSON, version2JSON)
44+
45+
var singleDSJSON = fmt.Sprintf(`
46+
{
47+
"default_version": "c00000b0-00c0-0c00-00c0-000b000000cc",
48+
"id": "10000000-0000-0000-0000-000000000001",
49+
"links": [
50+
{
51+
"href": "https://api.staging.ord1.clouddb.rackspace.net/v1.0/1234/datastores/10000000-0000-0000-0000-000000000001",
52+
"rel": "self"
53+
},
54+
{
55+
"href": "https://api.staging.ord1.clouddb.rackspace.net/datastores/10000000-0000-0000-0000-000000000001",
56+
"rel": "bookmark"
57+
}
58+
],
59+
"name": "mysql",
60+
%s
61+
}
62+
`, versionsJSON)
63+
64+
var (
65+
listDSResp = fmt.Sprintf(`{"datastores":[%s]}`, singleDSJSON)
66+
getDSResp = fmt.Sprintf(`{"datastore":%s}`, singleDSJSON)
67+
listVersionsResp = fmt.Sprintf(`{%s}`, versionsJSON)
68+
getVersionResp = fmt.Sprintf(`{"version":%s}`, version1JSON)
69+
)
70+
71+
var exampleVersion1 = Version{
72+
ID: "b00000b0-00b0-0b00-00b0-000b000000bb",
73+
Links: []gophercloud.Link{
74+
gophercloud.Link{Rel: "self", Href: "https://api.staging.ord1.clouddb.rackspace.net/v1.0/1234/datastores/versions/b00000b0-00b0-0b00-00b0-000b000000bb"},
75+
gophercloud.Link{Rel: "bookmark", Href: "https://api.staging.ord1.clouddb.rackspace.net/datastores/versions/b00000b0-00b0-0b00-00b0-000b000000bb"},
76+
},
77+
Name: "5.1",
78+
}
79+
80+
var exampleVersion2 = Version{
81+
ID: "c00000b0-00c0-0c00-00c0-000b000000cc",
82+
Links: []gophercloud.Link{
83+
gophercloud.Link{Rel: "self", Href: "https://api.staging.ord1.clouddb.rackspace.net/v1.0/1234/datastores/versions/c00000b0-00c0-0c00-00c0-000b000000cc"},
84+
gophercloud.Link{Rel: "bookmark", Href: "https://api.staging.ord1.clouddb.rackspace.net/datastores/versions/c00000b0-00c0-0c00-00c0-000b000000cc"},
85+
},
86+
Name: "5.2",
87+
}
88+
89+
var exampleVersions = []Version{exampleVersion1, exampleVersion2}
90+
91+
var exampleDatastore = Datastore{
92+
DefaultVersion: "c00000b0-00c0-0c00-00c0-000b000000cc",
93+
ID: "10000000-0000-0000-0000-000000000001",
94+
Links: []gophercloud.Link{
95+
gophercloud.Link{Rel: "self", Href: "https://api.staging.ord1.clouddb.rackspace.net/v1.0/1234/datastores/10000000-0000-0000-0000-000000000001"},
96+
gophercloud.Link{Rel: "bookmark", Href: "https://api.staging.ord1.clouddb.rackspace.net/datastores/10000000-0000-0000-0000-000000000001"},
97+
},
98+
Name: "mysql",
99+
Versions: exampleVersions,
100+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package datastores
2+
3+
import (
4+
"github.com/rackspace/gophercloud"
5+
"github.com/rackspace/gophercloud/pagination"
6+
)
7+
8+
func List(client *gophercloud.ServiceClient) pagination.Pager {
9+
pageFn := func(r pagination.PageResult) pagination.Page {
10+
return DatastorePage{pagination.SinglePageBase(r)}
11+
}
12+
return pagination.NewPager(client, baseURL(client), pageFn)
13+
}
14+
15+
func Get(client *gophercloud.ServiceClient, datastoreID string) GetResult {
16+
var res GetResult
17+
18+
_, res.Err = client.Request("GET", resourceURL(client, datastoreID), gophercloud.RequestOpts{
19+
OkCodes: []int{200},
20+
JSONResponse: &res.Body,
21+
})
22+
23+
return res
24+
}
25+
26+
func ListVersions(client *gophercloud.ServiceClient, datastoreID string) pagination.Pager {
27+
pageFn := func(r pagination.PageResult) pagination.Page {
28+
return VersionPage{pagination.SinglePageBase(r)}
29+
}
30+
return pagination.NewPager(client, versionsURL(client, datastoreID), pageFn)
31+
}
32+
33+
func GetVersion(client *gophercloud.ServiceClient, datastoreID, versionID string) GetVersionResult {
34+
var res GetVersionResult
35+
36+
_, res.Err = client.Request("GET", versionURL(client, datastoreID, versionID), gophercloud.RequestOpts{
37+
OkCodes: []int{200},
38+
JSONResponse: &res.Body,
39+
})
40+
41+
return res
42+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package datastores
2+
3+
import (
4+
"testing"
5+
6+
"github.com/rackspace/gophercloud/pagination"
7+
th "github.com/rackspace/gophercloud/testhelper"
8+
fake "github.com/rackspace/gophercloud/testhelper/client"
9+
"github.com/rackspace/gophercloud/testhelper/fixture"
10+
)
11+
12+
func TestList(t *testing.T) {
13+
th.SetupHTTP()
14+
defer th.TeardownHTTP()
15+
16+
fixture.SetupHandler(t, "/datastores", "GET", "", listDSResp, 200)
17+
18+
pages := 0
19+
20+
err := List(fake.ServiceClient()).EachPage(func(page pagination.Page) (bool, error) {
21+
pages++
22+
23+
actual, err := ExtractDatastores(page)
24+
if err != nil {
25+
return false, err
26+
}
27+
28+
th.CheckDeepEquals(t, []Datastore{exampleDatastore}, actual)
29+
30+
return true, nil
31+
})
32+
33+
th.AssertNoErr(t, err)
34+
th.AssertEquals(t, 1, pages)
35+
}
36+
37+
func TestGet(t *testing.T) {
38+
th.SetupHTTP()
39+
defer th.TeardownHTTP()
40+
41+
fixture.SetupHandler(t, "/datastores/{dsID}", "GET", "", getDSResp, 200)
42+
43+
ds, err := Get(fake.ServiceClient(), "{dsID}").Extract()
44+
th.AssertNoErr(t, err)
45+
th.AssertDeepEquals(t, &exampleDatastore, ds)
46+
}
47+
48+
func TestListVersions(t *testing.T) {
49+
th.SetupHTTP()
50+
defer th.TeardownHTTP()
51+
52+
fixture.SetupHandler(t, "/datastores/{dsID}/versions", "GET", "", listVersionsResp, 200)
53+
54+
pages := 0
55+
56+
err := ListVersions(fake.ServiceClient(), "{dsID}").EachPage(func(page pagination.Page) (bool, error) {
57+
pages++
58+
59+
actual, err := ExtractVersions(page)
60+
if err != nil {
61+
return false, err
62+
}
63+
64+
th.CheckDeepEquals(t, exampleVersions, actual)
65+
66+
return true, nil
67+
})
68+
69+
th.AssertNoErr(t, err)
70+
th.AssertEquals(t, 1, pages)
71+
}
72+
73+
func TestGetVersion(t *testing.T) {
74+
th.SetupHTTP()
75+
defer th.TeardownHTTP()
76+
77+
fixture.SetupHandler(t, "/datastores/{dsID}/versions/{versionID}", "GET", "", getVersionResp, 200)
78+
79+
ds, err := GetVersion(fake.ServiceClient(), "{dsID}", "{versionID}").Extract()
80+
th.AssertNoErr(t, err)
81+
th.AssertDeepEquals(t, &exampleVersion1, ds)
82+
}

rackspace/db/v1/datastores/results.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package datastores
2+
3+
import (
4+
"github.com/mitchellh/mapstructure"
5+
"github.com/rackspace/gophercloud"
6+
"github.com/rackspace/gophercloud/pagination"
7+
)
8+
9+
type Version struct {
10+
ID string
11+
Links []gophercloud.Link
12+
Name string
13+
}
14+
15+
type Datastore struct {
16+
DefaultVersion string `json:"default_version" mapstructure:"default_version"`
17+
ID string
18+
Links []gophercloud.Link
19+
Name string
20+
Versions []Version
21+
}
22+
23+
type GetResult struct {
24+
gophercloud.Result
25+
}
26+
27+
type GetVersionResult struct {
28+
gophercloud.Result
29+
}
30+
31+
type DatastorePage struct {
32+
pagination.SinglePageBase
33+
}
34+
35+
func (r DatastorePage) IsEmpty() (bool, error) {
36+
is, err := ExtractDatastores(r)
37+
if err != nil {
38+
return true, err
39+
}
40+
return len(is) == 0, nil
41+
}
42+
43+
func ExtractDatastores(page pagination.Page) ([]Datastore, error) {
44+
casted := page.(DatastorePage).Body
45+
46+
var resp struct {
47+
Datastores []Datastore `mapstructure:"datastores" json:"datastores"`
48+
}
49+
50+
err := mapstructure.Decode(casted, &resp)
51+
return resp.Datastores, err
52+
}
53+
54+
func (r GetResult) Extract() (*Datastore, error) {
55+
if r.Err != nil {
56+
return nil, r.Err
57+
}
58+
59+
var response struct {
60+
Datastore Datastore `mapstructure:"datastore"`
61+
}
62+
63+
err := mapstructure.Decode(r.Body, &response)
64+
return &response.Datastore, err
65+
}
66+
67+
type VersionPage struct {
68+
pagination.SinglePageBase
69+
}
70+
71+
func (r VersionPage) IsEmpty() (bool, error) {
72+
is, err := ExtractVersions(r)
73+
if err != nil {
74+
return true, err
75+
}
76+
return len(is) == 0, nil
77+
}
78+
79+
func ExtractVersions(page pagination.Page) ([]Version, error) {
80+
casted := page.(VersionPage).Body
81+
82+
var resp struct {
83+
Versions []Version `mapstructure:"versions" json:"versions"`
84+
}
85+
86+
err := mapstructure.Decode(casted, &resp)
87+
return resp.Versions, err
88+
}
89+
90+
func (r GetVersionResult) Extract() (*Version, error) {
91+
if r.Err != nil {
92+
return nil, r.Err
93+
}
94+
95+
var response struct {
96+
Version Version `mapstructure:"version"`
97+
}
98+
99+
err := mapstructure.Decode(r.Body, &response)
100+
return &response.Version, err
101+
}

rackspace/db/v1/datastores/urls.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package datastores
2+
3+
import "github.com/rackspace/gophercloud"
4+
5+
func baseURL(c *gophercloud.ServiceClient) string {
6+
return c.ServiceURL("datastores")
7+
}
8+
9+
func resourceURL(c *gophercloud.ServiceClient, dsID string) string {
10+
return c.ServiceURL("datastores", dsID)
11+
}
12+
13+
func versionsURL(c *gophercloud.ServiceClient, dsID string) string {
14+
return c.ServiceURL("datastores", dsID, "versions")
15+
}
16+
17+
func versionURL(c *gophercloud.ServiceClient, dsID, versionID string) string {
18+
return c.ServiceURL("datastores", dsID, "versions", versionID)
19+
}

0 commit comments

Comments
 (0)