Vendor: add Gophercloud BlockStorage V3 volumes
Add the latest blockstorage v3 volumes client library.
This commit is contained in:
parent
ac3554a37f
commit
d38bd6b5f8
5
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/doc.go
generated
vendored
Normal file
5
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
// Package volumes provides information and interaction with volumes in the
|
||||||
|
// OpenStack Block Storage service. A volume is a detachable block storage
|
||||||
|
// device, akin to a USB hard drive. It can only be attached to one instance at
|
||||||
|
// a time.
|
||||||
|
package volumes
|
202
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/requests.go
generated
vendored
Normal file
202
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/requests.go
generated
vendored
Normal file
|
@ -0,0 +1,202 @@
|
||||||
|
package volumes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gophercloud/gophercloud"
|
||||||
|
"github.com/gophercloud/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CreateOptsBuilder allows extensions to add additional parameters to the
|
||||||
|
// Create request.
|
||||||
|
type CreateOptsBuilder interface {
|
||||||
|
ToVolumeCreateMap() (map[string]interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateOpts contains options for creating a Volume. This object is passed to
|
||||||
|
// the volumes.Create function. For more information about these parameters,
|
||||||
|
// see the Volume object.
|
||||||
|
type CreateOpts struct {
|
||||||
|
// The size of the volume, in GB
|
||||||
|
Size int `json:"size" required:"true"`
|
||||||
|
// The availability zone
|
||||||
|
AvailabilityZone string `json:"availability_zone,omitempty"`
|
||||||
|
// ConsistencyGroupID is the ID of a consistency group
|
||||||
|
ConsistencyGroupID string `json:"consistencygroup_id,omitempty"`
|
||||||
|
// The volume description
|
||||||
|
Description string `json:"description,omitempty"`
|
||||||
|
// One or more metadata key and value pairs to associate with the volume
|
||||||
|
Metadata map[string]string `json:"metadata,omitempty"`
|
||||||
|
// The volume name
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
// the ID of the existing volume snapshot
|
||||||
|
SnapshotID string `json:"snapshot_id,omitempty"`
|
||||||
|
// SourceReplica is a UUID of an existing volume to replicate with
|
||||||
|
SourceReplica string `json:"source_replica,omitempty"`
|
||||||
|
// the ID of the existing volume
|
||||||
|
SourceVolID string `json:"source_volid,omitempty"`
|
||||||
|
// The ID of the image from which you want to create the volume.
|
||||||
|
// Required to create a bootable volume.
|
||||||
|
ImageID string `json:"imageRef,omitempty"`
|
||||||
|
// The associated volume type
|
||||||
|
VolumeType string `json:"volume_type,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToVolumeCreateMap assembles a request body based on the contents of a
|
||||||
|
// CreateOpts.
|
||||||
|
func (opts CreateOpts) ToVolumeCreateMap() (map[string]interface{}, error) {
|
||||||
|
return gophercloud.BuildRequestBody(opts, "volume")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create will create a new Volume based on the values in CreateOpts. To extract
|
||||||
|
// the Volume object from the response, call the Extract method on the
|
||||||
|
// CreateResult.
|
||||||
|
func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) (r CreateResult) {
|
||||||
|
b, err := opts.ToVolumeCreateMap()
|
||||||
|
if err != nil {
|
||||||
|
r.Err = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, r.Err = client.Post(createURL(client), b, &r.Body, &gophercloud.RequestOpts{
|
||||||
|
OkCodes: []int{202},
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete will delete the existing Volume with the provided ID.
|
||||||
|
func Delete(client *gophercloud.ServiceClient, id string) (r DeleteResult) {
|
||||||
|
_, r.Err = client.Delete(deleteURL(client, id), nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get retrieves the Volume with the provided ID. To extract the Volume object
|
||||||
|
// from the response, call the Extract method on the GetResult.
|
||||||
|
func Get(client *gophercloud.ServiceClient, id string) (r GetResult) {
|
||||||
|
_, r.Err = client.Get(getURL(client, id), &r.Body, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListOptsBuilder allows extensions to add additional parameters to the List
|
||||||
|
// request.
|
||||||
|
type ListOptsBuilder interface {
|
||||||
|
ToVolumeListQuery() (string, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListOpts holds options for listing Volumes. It is passed to the volumes.List
|
||||||
|
// function.
|
||||||
|
type ListOpts struct {
|
||||||
|
// AllTenants will retrieve volumes of all tenants/projects.
|
||||||
|
AllTenants bool `q:"all_tenants"`
|
||||||
|
|
||||||
|
// Metadata will filter results based on specified metadata.
|
||||||
|
Metadata map[string]string `q:"metadata"`
|
||||||
|
|
||||||
|
// Name will filter by the specified volume name.
|
||||||
|
Name string `q:"name"`
|
||||||
|
|
||||||
|
// Status will filter by the specified status.
|
||||||
|
Status string `q:"status"`
|
||||||
|
|
||||||
|
// TenantID will filter by a specific tenant/project ID.
|
||||||
|
// Setting AllTenants is required for this.
|
||||||
|
TenantID string `q:"project_id"`
|
||||||
|
|
||||||
|
// Comma-separated list of sort keys and optional sort directions in the
|
||||||
|
// form of <key>[:<direction>].
|
||||||
|
Sort string `q:"sort"`
|
||||||
|
|
||||||
|
// Requests a page size of items.
|
||||||
|
Limit int `q:"limit"`
|
||||||
|
|
||||||
|
// Used in conjunction with limit to return a slice of items.
|
||||||
|
Offset int `q:"offset"`
|
||||||
|
|
||||||
|
// The ID of the last-seen item.
|
||||||
|
Marker string `q:"marker"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToVolumeListQuery formats a ListOpts into a query string.
|
||||||
|
func (opts ListOpts) ToVolumeListQuery() (string, error) {
|
||||||
|
q, err := gophercloud.BuildQueryString(opts)
|
||||||
|
return q.String(), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// List returns Volumes optionally limited by the conditions provided in ListOpts.
|
||||||
|
func List(client *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager {
|
||||||
|
url := listURL(client)
|
||||||
|
if opts != nil {
|
||||||
|
query, err := opts.ToVolumeListQuery()
|
||||||
|
if err != nil {
|
||||||
|
return pagination.Pager{Err: err}
|
||||||
|
}
|
||||||
|
url += query
|
||||||
|
}
|
||||||
|
|
||||||
|
return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
|
||||||
|
return VolumePage{pagination.LinkedPageBase{PageResult: r}}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateOptsBuilder allows extensions to add additional parameters to the
|
||||||
|
// Update request.
|
||||||
|
type UpdateOptsBuilder interface {
|
||||||
|
ToVolumeUpdateMap() (map[string]interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateOpts contain options for updating an existing Volume. This object is passed
|
||||||
|
// to the volumes.Update function. For more information about the parameters, see
|
||||||
|
// the Volume object.
|
||||||
|
type UpdateOpts struct {
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Description string `json:"description,omitempty"`
|
||||||
|
Metadata map[string]string `json:"metadata,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToVolumeUpdateMap assembles a request body based on the contents of an
|
||||||
|
// UpdateOpts.
|
||||||
|
func (opts UpdateOpts) ToVolumeUpdateMap() (map[string]interface{}, error) {
|
||||||
|
return gophercloud.BuildRequestBody(opts, "volume")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update will update the Volume with provided information. To extract the updated
|
||||||
|
// Volume from the response, call the Extract method on the UpdateResult.
|
||||||
|
func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) (r UpdateResult) {
|
||||||
|
b, err := opts.ToVolumeUpdateMap()
|
||||||
|
if err != nil {
|
||||||
|
r.Err = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, r.Err = client.Put(updateURL(client, id), b, &r.Body, &gophercloud.RequestOpts{
|
||||||
|
OkCodes: []int{200},
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// IDFromName is a convienience function that returns a server's ID given its name.
|
||||||
|
func IDFromName(client *gophercloud.ServiceClient, name string) (string, error) {
|
||||||
|
count := 0
|
||||||
|
id := ""
|
||||||
|
pages, err := List(client, nil).AllPages()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
all, err := ExtractVolumes(pages)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range all {
|
||||||
|
if s.Name == name {
|
||||||
|
count++
|
||||||
|
id = s.ID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch count {
|
||||||
|
case 0:
|
||||||
|
return "", gophercloud.ErrResourceNotFound{Name: name, ResourceType: "volume"}
|
||||||
|
case 1:
|
||||||
|
return id, nil
|
||||||
|
default:
|
||||||
|
return "", gophercloud.ErrMultipleResourcesFound{Name: name, Count: count, ResourceType: "volume"}
|
||||||
|
}
|
||||||
|
}
|
170
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/results.go
generated
vendored
Normal file
170
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/results.go
generated
vendored
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
package volumes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/gophercloud/gophercloud"
|
||||||
|
"github.com/gophercloud/gophercloud/pagination"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Attachment represents a Volume Attachment record
|
||||||
|
type Attachment struct {
|
||||||
|
AttachedAt time.Time `json:"-"`
|
||||||
|
AttachmentID string `json:"attachment_id"`
|
||||||
|
Device string `json:"device"`
|
||||||
|
HostName string `json:"host_name"`
|
||||||
|
ID string `json:"id"`
|
||||||
|
ServerID string `json:"server_id"`
|
||||||
|
VolumeID string `json:"volume_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON is our unmarshalling helper
|
||||||
|
func (r *Attachment) UnmarshalJSON(b []byte) error {
|
||||||
|
type tmp Attachment
|
||||||
|
var s struct {
|
||||||
|
tmp
|
||||||
|
AttachedAt gophercloud.JSONRFC3339MilliNoZ `json:"attached_at"`
|
||||||
|
}
|
||||||
|
err := json.Unmarshal(b, &s)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*r = Attachment(s.tmp)
|
||||||
|
|
||||||
|
r.AttachedAt = time.Time(s.AttachedAt)
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Volume contains all the information associated with an OpenStack Volume.
|
||||||
|
type Volume struct {
|
||||||
|
// Unique identifier for the volume.
|
||||||
|
ID string `json:"id"`
|
||||||
|
// Current status of the volume.
|
||||||
|
Status string `json:"status"`
|
||||||
|
// Size of the volume in GB.
|
||||||
|
Size int `json:"size"`
|
||||||
|
// AvailabilityZone is which availability zone the volume is in.
|
||||||
|
AvailabilityZone string `json:"availability_zone"`
|
||||||
|
// The date when this volume was created.
|
||||||
|
CreatedAt time.Time `json:"-"`
|
||||||
|
// The date when this volume was last updated
|
||||||
|
UpdatedAt time.Time `json:"-"`
|
||||||
|
// Instances onto which the volume is attached.
|
||||||
|
Attachments []Attachment `json:"attachments"`
|
||||||
|
// Human-readable display name for the volume.
|
||||||
|
Name string `json:"name"`
|
||||||
|
// Human-readable description for the volume.
|
||||||
|
Description string `json:"description"`
|
||||||
|
// The type of volume to create, either SATA or SSD.
|
||||||
|
VolumeType string `json:"volume_type"`
|
||||||
|
// The ID of the snapshot from which the volume was created
|
||||||
|
SnapshotID string `json:"snapshot_id"`
|
||||||
|
// The ID of another block storage volume from which the current volume was created
|
||||||
|
SourceVolID string `json:"source_volid"`
|
||||||
|
// Arbitrary key-value pairs defined by the user.
|
||||||
|
Metadata map[string]string `json:"metadata"`
|
||||||
|
// UserID is the id of the user who created the volume.
|
||||||
|
UserID string `json:"user_id"`
|
||||||
|
// Indicates whether this is a bootable volume.
|
||||||
|
Bootable string `json:"bootable"`
|
||||||
|
// Encrypted denotes if the volume is encrypted.
|
||||||
|
Encrypted bool `json:"encrypted"`
|
||||||
|
// ReplicationStatus is the status of replication.
|
||||||
|
ReplicationStatus string `json:"replication_status"`
|
||||||
|
// ConsistencyGroupID is the consistency group ID.
|
||||||
|
ConsistencyGroupID string `json:"consistencygroup_id"`
|
||||||
|
// Multiattach denotes if the volume is multi-attach capable.
|
||||||
|
Multiattach bool `json:"multiattach"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON another unmarshalling function
|
||||||
|
func (r *Volume) UnmarshalJSON(b []byte) error {
|
||||||
|
type tmp Volume
|
||||||
|
var s struct {
|
||||||
|
tmp
|
||||||
|
CreatedAt gophercloud.JSONRFC3339MilliNoZ `json:"created_at"`
|
||||||
|
UpdatedAt gophercloud.JSONRFC3339MilliNoZ `json:"updated_at"`
|
||||||
|
}
|
||||||
|
err := json.Unmarshal(b, &s)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*r = Volume(s.tmp)
|
||||||
|
|
||||||
|
r.CreatedAt = time.Time(s.CreatedAt)
|
||||||
|
r.UpdatedAt = time.Time(s.UpdatedAt)
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// VolumePage is a pagination.pager that is returned from a call to the List function.
|
||||||
|
type VolumePage struct {
|
||||||
|
pagination.LinkedPageBase
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsEmpty returns true if a ListResult contains no Volumes.
|
||||||
|
func (r VolumePage) IsEmpty() (bool, error) {
|
||||||
|
volumes, err := ExtractVolumes(r)
|
||||||
|
return len(volumes) == 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (page VolumePage) NextPageURL() (string, error) {
|
||||||
|
var s struct {
|
||||||
|
Links []gophercloud.Link `json:"volumes_links"`
|
||||||
|
}
|
||||||
|
err := page.ExtractInto(&s)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return gophercloud.ExtractNextURL(s.Links)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtractVolumes extracts and returns Volumes. It is used while iterating over a volumes.List call.
|
||||||
|
func ExtractVolumes(r pagination.Page) ([]Volume, error) {
|
||||||
|
var s []Volume
|
||||||
|
err := ExtractVolumesInto(r, &s)
|
||||||
|
return s, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type commonResult struct {
|
||||||
|
gophercloud.Result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract will get the Volume object out of the commonResult object.
|
||||||
|
func (r commonResult) Extract() (*Volume, error) {
|
||||||
|
var s Volume
|
||||||
|
err := r.ExtractInto(&s)
|
||||||
|
return &s, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtractInto converts our response data into a volume struct
|
||||||
|
func (r commonResult) ExtractInto(v interface{}) error {
|
||||||
|
return r.Result.ExtractIntoStructPtr(v, "volume")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExtractVolumesInto similar to ExtractInto but operates on a `list` of volumes
|
||||||
|
func ExtractVolumesInto(r pagination.Page, v interface{}) error {
|
||||||
|
return r.(VolumePage).Result.ExtractIntoSlicePtr(v, "volumes")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateResult contains the response body and error from a Create request.
|
||||||
|
type CreateResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetResult contains the response body and error from a Get request.
|
||||||
|
type GetResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateResult contains the response body and error from an Update request.
|
||||||
|
type UpdateResult struct {
|
||||||
|
commonResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteResult contains the response body and error from a Delete request.
|
||||||
|
type DeleteResult struct {
|
||||||
|
gophercloud.ErrResult
|
||||||
|
}
|
23
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/urls.go
generated
vendored
Normal file
23
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/urls.go
generated
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
package volumes
|
||||||
|
|
||||||
|
import "github.com/gophercloud/gophercloud"
|
||||||
|
|
||||||
|
func createURL(c *gophercloud.ServiceClient) string {
|
||||||
|
return c.ServiceURL("volumes")
|
||||||
|
}
|
||||||
|
|
||||||
|
func listURL(c *gophercloud.ServiceClient) string {
|
||||||
|
return c.ServiceURL("volumes", "detail")
|
||||||
|
}
|
||||||
|
|
||||||
|
func deleteURL(c *gophercloud.ServiceClient, id string) string {
|
||||||
|
return c.ServiceURL("volumes", id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getURL(c *gophercloud.ServiceClient, id string) string {
|
||||||
|
return deleteURL(c, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateURL(c *gophercloud.ServiceClient, id string) string {
|
||||||
|
return deleteURL(c, id)
|
||||||
|
}
|
22
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/util.go
generated
vendored
Normal file
22
vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/util.go
generated
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
package volumes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gophercloud/gophercloud"
|
||||||
|
)
|
||||||
|
|
||||||
|
// WaitForStatus will continually poll the resource, checking for a particular
|
||||||
|
// status. It will do this for the amount of seconds defined.
|
||||||
|
func WaitForStatus(c *gophercloud.ServiceClient, id, status string, secs int) error {
|
||||||
|
return gophercloud.WaitFor(secs, func() (bool, error) {
|
||||||
|
current, err := Get(c, id).Extract()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if current.Status == status {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
}
|
|
@ -738,7 +738,25 @@
|
||||||
"revisionTime": "2018-05-31T02:06:30Z"
|
"revisionTime": "2018-05-31T02:06:30Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "vFS5BwnCdQIfKm1nNWrR+ijsAZA=",
|
"checksumSHA1": "vqXNCd2My0y/5tPC/Bs79uf6Q4E=",
|
||||||
|
"path": "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes",
|
||||||
|
"revision": "282f25e4025de0a42015d2e2b5faef1d920aad3c",
|
||||||
|
"revisionTime": "2018-05-15T01:47:05Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "Au6MAsI90lewLByg9n+Yjtdqdh8=",
|
||||||
|
"path": "github.com/gophercloud/gophercloud/openstack/common/extensions",
|
||||||
|
"revision": "95a28eb606def6aaaed082b6b82d3244b0552184",
|
||||||
|
"revisionTime": "2017-06-23T01:44:30Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "4XWDCGMYqipwJymi9xJo9UffD7g=",
|
||||||
|
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions",
|
||||||
|
"revision": "95a28eb606def6aaaed082b6b82d3244b0552184",
|
||||||
|
"revisionTime": "2017-06-23T01:44:30Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"checksumSHA1": "e7AW3YDVYJPKUjpqsB4AL9RRlTw=",
|
||||||
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips",
|
"path": "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips",
|
||||||
"revision": "7112fcd50da4ea27e8d4d499b30f04eea143bec2",
|
"revision": "7112fcd50da4ea27e8d4d499b30f04eea143bec2",
|
||||||
"revisionTime": "2018-05-31T02:06:30Z"
|
"revisionTime": "2018-05-31T02:06:30Z"
|
||||||
|
|
Loading…
Reference in New Issue