1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
|
package backups
import (
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/pagination"
)
// CreateOptsBuilder allows extensions to add additional parameters to the
// Create request.
type CreateOptsBuilder interface {
ToBackupCreateMap() (map[string]interface{}, error)
}
// CreateOpts contains options for creating a Backup. This object is passed to
// the backups.Create function. For more information about these parameters,
// see the Backup object.
type CreateOpts struct {
// VolumeID is the ID of the volume to create the backup from.
VolumeID string `json:"volume_id" required:"true"`
// Force will force the creation of a backup regardless of the
//volume's status.
Force bool `json:"force,omitempty"`
// Name is the name of the backup.
Name string `json:"name,omitempty"`
// Description is the description of the backup.
Description string `json:"description,omitempty"`
// Metadata is metadata for the backup.
// Requires microversion 3.43 or later.
Metadata map[string]string `json:"metadata,omitempty"`
// Container is a container to store the backup.
Container string `json:"container,omitempty"`
// Incremental is whether the backup should be incremental or not.
Incremental bool `json:"incremental,omitempty"`
// SnapshotID is the ID of a snapshot to backup.
SnapshotID string `json:"snapshot_id,omitempty"`
// AvailabilityZone is an availability zone to locate the volume or snapshot.
// Requires microversion 3.51 or later.
AvailabilityZone string `json:"availability_zone,omitempty"`
}
// ToBackupCreateMap assembles a request body based on the contents of a
// CreateOpts.
func (opts CreateOpts) ToBackupCreateMap() (map[string]interface{}, error) {
return gophercloud.BuildRequestBody(opts, "backup")
}
// Create will create a new Backup based on the values in CreateOpts. To
// extract the Backup object from the response, call the Extract method on the
// CreateResult.
func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) (r CreateResult) {
b, err := opts.ToBackupCreateMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Post(createURL(client), b, &r.Body, &gophercloud.RequestOpts{
OkCodes: []int{202},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// Delete will delete the existing Backup with the provided ID.
func Delete(client *gophercloud.ServiceClient, id string) (r DeleteResult) {
resp, err := client.Delete(deleteURL(client, id), nil)
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// Get retrieves the Backup with the provided ID. To extract the Backup
// object from the response, call the Extract method on the GetResult.
func Get(client *gophercloud.ServiceClient, id string) (r GetResult) {
resp, err := client.Get(getURL(client, id), &r.Body, nil)
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// ListOptsBuilder allows extensions to add additional parameters to the List
// request.
type ListOptsBuilder interface {
ToBackupListQuery() (string, error)
}
type ListOpts struct {
// AllTenants will retrieve backups of all tenants/projects.
AllTenants bool `q:"all_tenants"`
// Name will filter by the specified backup name.
// This does not work in later microversions.
Name string `q:"name"`
// Status will filter by the specified status.
// This does not work in later microversions.
Status string `q:"status"`
// TenantID will filter by a specific tenant/project ID.
// Setting AllTenants is required to use this.
TenantID string `q:"project_id"`
// VolumeID will filter by a specified volume ID.
// This does not work in later microversions.
VolumeID string `q:"volume_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"`
}
// ToBackupListQuery formats a ListOpts into a query string.
func (opts ListOpts) ToBackupListQuery() (string, error) {
q, err := gophercloud.BuildQueryString(opts)
return q.String(), err
}
// List returns Backups 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.ToBackupListQuery()
if err != nil {
return pagination.Pager{Err: err}
}
url += query
}
return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
return BackupPage{pagination.LinkedPageBase{PageResult: r}}
})
}
// ListDetailOptsBuilder allows extensions to add additional parameters to the ListDetail
// request.
type ListDetailOptsBuilder interface {
ToBackupListDetailQuery() (string, error)
}
type ListDetailOpts struct {
// AllTenants will retrieve backups of all tenants/projects.
AllTenants bool `q:"all_tenants"`
// 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"`
// True to include `count` in the API response, supported from version 3.45
WithCount bool `q:"with_count"`
}
// ToBackupListDetailQuery formats a ListDetailOpts into a query string.
func (opts ListDetailOpts) ToBackupListDetailQuery() (string, error) {
q, err := gophercloud.BuildQueryString(opts)
return q.String(), err
}
// ListDetail returns more detailed information about Backups optionally
// limited by the conditions provided in ListDetailOpts.
func ListDetail(client *gophercloud.ServiceClient, opts ListDetailOptsBuilder) pagination.Pager {
url := listDetailURL(client)
if opts != nil {
query, err := opts.ToBackupListDetailQuery()
if err != nil {
return pagination.Pager{Err: err}
}
url += query
}
return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page {
return BackupPage{pagination.LinkedPageBase{PageResult: r}}
})
}
// UpdateOptsBuilder allows extensions to add additional parameters to
// the Update request.
type UpdateOptsBuilder interface {
ToBackupUpdateMap() (map[string]interface{}, error)
}
// UpdateOpts contain options for updating an existing Backup.
type UpdateOpts struct {
// Name is the name of the backup.
Name *string `json:"name,omitempty"`
// Description is the description of the backup.
Description *string `json:"description,omitempty"`
// Metadata is metadata for the backup.
// Requires microversion 3.43 or later.
Metadata map[string]string `json:"metadata,omitempty"`
}
// ToBackupUpdateMap assembles a request body based on the contents of
// an UpdateOpts.
func (opts UpdateOpts) ToBackupUpdateMap() (map[string]interface{}, error) {
return gophercloud.BuildRequestBody(opts, "")
}
// Update will update the Backup with provided information. To extract
// the updated Backup from the response, call the Extract method on the
// UpdateResult.
// Requires microversion 3.9 or later.
func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) (r UpdateResult) {
b, err := opts.ToBackupUpdateMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Put(updateURL(client, id), b, &r.Body, &gophercloud.RequestOpts{
OkCodes: []int{200},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// RestoreOpts contains options for restoring a Backup. This object is passed to
// the backups.RestoreFromBackup function.
type RestoreOpts struct {
// VolumeID is the ID of the existing volume to restore the backup to.
VolumeID string `json:"volume_id,omitempty"`
// Name is the name of the new volume to restore the backup to.
Name string `json:"name,omitempty"`
}
// ToRestoreMap assembles a request body based on the contents of a
// RestoreOpts.
func (opts RestoreOpts) ToRestoreMap() (map[string]interface{}, error) {
return gophercloud.BuildRequestBody(opts, "restore")
}
// RestoreFromBackup will restore a Backup to a volume based on the values in
// RestoreOpts. To extract the Restore object from the response, call the
// Extract method on the RestoreResult.
func RestoreFromBackup(client *gophercloud.ServiceClient, id string, opts RestoreOpts) (r RestoreResult) {
b, err := opts.ToRestoreMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Post(restoreURL(client, id), b, &r.Body, &gophercloud.RequestOpts{
OkCodes: []int{202},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// Export will export a Backup information. To extract the Backup export record
// object from the response, call the Extract method on the ExportResult.
func Export(client *gophercloud.ServiceClient, id string) (r ExportResult) {
resp, err := client.Get(exportURL(client, id), &r.Body, nil)
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// ImportOpts contains options for importing a Backup. This object is passed to
// the backups.ImportBackup function.
type ImportOpts BackupRecord
// ToBackupImportMap assembles a request body based on the contents of a
// ImportOpts.
func (opts ImportOpts) ToBackupImportMap() (map[string]interface{}, error) {
return gophercloud.BuildRequestBody(opts, "backup-record")
}
// Import will import a Backup data to a backup based on the values in
// ImportOpts. To extract the Backup object from the response, call the
// Extract method on the ImportResult.
func Import(client *gophercloud.ServiceClient, opts ImportOpts) (r ImportResult) {
b, err := opts.ToBackupImportMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Post(importURL(client), b, &r.Body, &gophercloud.RequestOpts{
OkCodes: []int{201},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
|