blob: 18f8a4150f34e7d162ec4eaa11bba3177ae2c22d [file] [log] [blame]
Jon Perrittee6074f2014-04-30 18:42:32 -05001package volumes
2
3import (
4 "github.com/racker/perigee"
Jon Perrittd1d6a742014-09-17 01:10:59 -05005 "github.com/rackspace/gophercloud"
6 "github.com/rackspace/gophercloud/pagination"
7 "github.com/rackspace/gophercloud/utils"
Jon Perrittee6074f2014-04-30 18:42:32 -05008)
9
Jon Perrittd1d6a742014-09-17 01:10:59 -050010type VolumeOpts struct {
11 Availability string
12 Description string
13 ImageID string
14 Metadata map[string]string
15 Name string
16 Size int
17 SnapshotID string
18 Type string
Jon Perrittee6074f2014-04-30 18:42:32 -050019}
Jon Perritte77b9b22014-05-01 13:11:12 -050020
Jon Perrittd1d6a742014-09-17 01:10:59 -050021func Create(client *gophercloud.ServiceClient, opts VolumeOpts) (Volume, error) {
22
23 type volume struct {
24 Availability *string `json:"availability_zone,omitempty"`
25 Description *string `json:"display_description,omitempty"`
26 ImageID *string `json:"imageRef,omitempty"`
27 Metadata map[string]string `json:"metadata,omitempty"`
28 Name *string `json:"display_name,omitempty"`
29 Size *int `json:"size,omitempty"`
30 SnapshotID *string `json:"snapshot_id,omitempty"`
31 SourceVolID *string `json:"source_volid,omitempty"`
32 VolumeType *string `json:"volume_type,omitempty"`
Jon Perritt94963ad2014-05-05 12:14:39 -050033 }
Jon Perrittd1d6a742014-09-17 01:10:59 -050034
35 type request struct {
36 Volume volume `json:"volume"`
Jon Perritt94963ad2014-05-05 12:14:39 -050037 }
Jon Perrittd1d6a742014-09-17 01:10:59 -050038
39 reqBody := request{
40 Volume: volume{},
41 }
42
43 reqBody.Volume.Availability = utils.MaybeString(opts.Availability)
44 reqBody.Volume.Description = utils.MaybeString(opts.Description)
45 reqBody.Volume.ImageID = utils.MaybeString(opts.ImageID)
46 reqBody.Volume.Name = utils.MaybeString(opts.Name)
47 reqBody.Volume.Size = utils.MaybeInt(opts.Size)
48 reqBody.Volume.SnapshotID = utils.MaybeString(opts.SnapshotID)
49 reqBody.Volume.SourceVolID = utils.MaybeString(opts.SourceVolID)
50 reqBody.Volume.VolumeType = utils.MaybeString(opts.VolumeType)
51
52 type response struct {
53 Volume Volume `json:"volume"`
54 }
55
56 var respBody response
57
58 _, err = perigee.Request("POST", volumesURL(client), perigee.Options{
59 MoreHeaders: c.Provider.AuthenticatedHeaders(),
60 OkCodes: []int{201},
61 ReqBody: &reqBody,
62 Results: &respBody,
Jon Perritt94963ad2014-05-05 12:14:39 -050063 })
Jon Perrittd1d6a742014-09-17 01:10:59 -050064 if err != nil {
65 return nil, err
66 }
67
68 return &respBody.Volume, nil
69}
70
71func List(client *gophercloud.ServiceClient, opts ListOpts) pagination.Pager {
72 var url string
73
74 query := utils.BuildQuery(opts.Params)
75
76 if !opts.Full {
77 url = c.volumesURL()
78 } else {
79 url = c.volumeURL("detail")
80 }
81
82 createPage := func(r pagination.LastHTTPResponse) pagination.Page {
83 p := ListResult{
84 pagination.MarkerPageBase{
85 LastHTTPResponse: r,
86 },
87 }
88 p.MarkerPageBase.Owner = p
89 return p
90 }
91
92 pager := pagination.NewPager(client, url, createPage)
93 return pager
Jon Perritt94963ad2014-05-05 12:14:39 -050094}
95
Jon Perritt70dd47d2014-05-01 13:51:53 -050096func Get(c *blockstorage.Client, opts GetOpts) (Volume, error) {
97 var v Volume
98 h, err := c.GetHeaders()
99 if err != nil {
100 return v, err
101 }
102 url := c.GetVolumeURL(opts["id"])
103 _, err = perigee.Request("GET", url, perigee.Options{
104 Results: &struct {
105 Volume *Volume `json:"volume"`
106 }{&v},
107 MoreHeaders: h,
108 })
109 return v, err
110}
111
Jon Perritte77b9b22014-05-01 13:11:12 -0500112func Delete(c *blockstorage.Client, opts DeleteOpts) error {
113 h, err := c.GetHeaders()
114 if err != nil {
115 return err
116 }
117 url := c.GetVolumeURL(opts["id"])
118 _, err = perigee.Request("DELETE", url, perigee.Options{
119 MoreHeaders: h,
120 })
121 return err
122}