1
0
mirror of https://github.com/openshift/installer.git synced 2026-02-05 06:46:36 +01:00

deps: Bump gophercloud to v1.6.0

This commit is contained in:
Pierre Prinetti
2023-09-12 10:38:02 +02:00
parent 3152ba0ec8
commit f2e94913a0
24 changed files with 1182 additions and 56 deletions

5
go.mod
View File

@@ -41,8 +41,8 @@ require (
github.com/golang/protobuf v1.5.3
github.com/google/go-cmp v0.5.9
github.com/google/uuid v1.3.1
github.com/gophercloud/gophercloud v1.3.0
github.com/gophercloud/utils v0.0.0-20230330070308-5bd5e1d608f8
github.com/gophercloud/gophercloud v1.6.0
github.com/gophercloud/utils v0.0.0-20230523080330-de873b9cf00d
github.com/h2non/filetype v1.0.12
github.com/hashicorp/go-multierror v1.1.1
github.com/hashicorp/go-version v1.6.0
@@ -159,6 +159,7 @@ require (
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-hclog v1.2.0 // indirect
github.com/hashicorp/go-retryablehttp v0.7.2 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect
github.com/hashicorp/terraform-json v0.14.0 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/imdario/mergo v0.3.13 // indirect

8
go.sum
View File

@@ -690,10 +690,11 @@ github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTV
github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
github.com/gophercloud/gophercloud v1.3.0 h1:RUKyCMiZoQR3VlVR5E3K7PK1AC3/qppsWYo6dtBiqs8=
github.com/gophercloud/gophercloud v1.3.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM=
github.com/gophercloud/utils v0.0.0-20230330070308-5bd5e1d608f8 h1:K9r5WEeAiaEgFZsuOP0OYjE4TtyFcCLG1nI08t9AP6A=
github.com/gophercloud/utils v0.0.0-20230330070308-5bd5e1d608f8/go.mod h1:VSalo4adEk+3sNkmVJLnhHoOyOYYS8sTWLG4mv5BKto=
github.com/gophercloud/gophercloud v1.6.0 h1:JwJN1bauRnWPba5ueWs9IluONHteXPWjjK+MvfM4krY=
github.com/gophercloud/gophercloud v1.6.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM=
github.com/gophercloud/utils v0.0.0-20230523080330-de873b9cf00d h1:6Gvua77nKyAiZQpu0N3AsamGu1L6Mlnhp3tAtDcqwvc=
github.com/gophercloud/utils v0.0.0-20230523080330-de873b9cf00d/go.mod h1:VSalo4adEk+3sNkmVJLnhHoOyOYYS8sTWLG4mv5BKto=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/mux v0.0.0-20191024121256-f395758b854c/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
@@ -726,6 +727,7 @@ github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9
github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
github.com/hashicorp/go-retryablehttp v0.7.2 h1:AcYqCvkpalPnPF2pn0KamgwamS42TqUDDYFRKq/RAd0=
github.com/hashicorp/go-retryablehttp v0.7.2/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8=
github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.5.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=

View File

@@ -1,3 +1,60 @@
## v1.6.0 (2023-08-30)
New features and improvements:
* [GH-2712](https://github.com/gophercloud/gophercloud/pull/2712) [v1] README: minor change to test backport workflow
* [GH-2713](https://github.com/gophercloud/gophercloud/pull/2713) [v1] tests: run MultiAttach with a capable Cinder Type
* [GH-2714](https://github.com/gophercloud/gophercloud/pull/2714) [v1] Add CRUD support for encryption in volume v3 types
* [GH-2715](https://github.com/gophercloud/gophercloud/pull/2715) [v1] Add projectID to fwaas_v2 policy CreateOpts and ListOpts
* [GH-2716](https://github.com/gophercloud/gophercloud/pull/2716) [v1] Add projectID to fwaas_v2 CreateOpts
* [GH-2717](https://github.com/gophercloud/gophercloud/pull/2717) [v1] [manila]: add reset and force delete actions to a snapshot
* [GH-2718](https://github.com/gophercloud/gophercloud/pull/2718) [v1] [cinder]: add reset and force delete actions to volumes and snapshots
* [GH-2721](https://github.com/gophercloud/gophercloud/pull/2721) [v1] orchestration: Explicit error in optionsmap creation
* [GH-2723](https://github.com/gophercloud/gophercloud/pull/2723) [v1] Add conductor API to Baremetal V1
* [GH-2729](https://github.com/gophercloud/gophercloud/pull/2729) [v1] networking/v2/ports: allow list filter by security group
CI changes:
* [GH-2675](https://github.com/gophercloud/gophercloud/pull/2675) [v1][CI] Drop periodic jobs from stable branch
* [GH-2683](https://github.com/gophercloud/gophercloud/pull/2683) [v1] CI tweaks
## v1.5.0 (2023-06-21)
New features and improvements:
* [GH-2634](https://github.com/gophercloud/gophercloud/pull/2634) baremetal: update inspection inventory with recent additions
* [GH-2635](https://github.com/gophercloud/gophercloud/pull/2635) [manila]: Add Share Replicas support
* [GH-2637](https://github.com/gophercloud/gophercloud/pull/2637) [FWaaS_v2]: Add FWaaS_V2 workflow and enable tests
* [GH-2639](https://github.com/gophercloud/gophercloud/pull/2639) Implement errors.Unwrap() on unexpected status code errors
* [GH-2648](https://github.com/gophercloud/gophercloud/pull/2648) [manila]: implement share transfer API
## v1.4.0 (2023-05-25)
New features and improvements:
* [GH-2465](https://github.com/gophercloud/gophercloud/pull/2465) keystone: add v3 limits update operation
* [GH-2596](https://github.com/gophercloud/gophercloud/pull/2596) keystone: add v3 limits get operation
* [GH-2618](https://github.com/gophercloud/gophercloud/pull/2618) keystone: add v3 limits delete operation
* [GH-2616](https://github.com/gophercloud/gophercloud/pull/2616) Add CRUD support for register limit APIs
* [GH-2610](https://github.com/gophercloud/gophercloud/pull/2610) Add PUT/HEAD/DELETE for identity/v3/OS-INHERIT
* [GH-2597](https://github.com/gophercloud/gophercloud/pull/2597) Add validation and optimise objects.BulkDelete
* [GH-2602](https://github.com/gophercloud/gophercloud/pull/2602) [swift v1]: introduce a TempURLKey argument for objects.CreateTempURLOpts struct
* [GH-2623](https://github.com/gophercloud/gophercloud/pull/2623) Add the ability to remove ingress/egress policies from fwaas_v2 groups
* [GH-2625](https://github.com/gophercloud/gophercloud/pull/2625) neutron: Support trunk_details extension
CI changes:
* [GH-2608](https://github.com/gophercloud/gophercloud/pull/2608) Drop train and ussuri jobs
* [GH-2589](https://github.com/gophercloud/gophercloud/pull/2589) Bump EmilienM/devstack-action from 0.10 to 0.11
* [GH-2604](https://github.com/gophercloud/gophercloud/pull/2604) Bump mheap/github-action-required-labels from 3 to 4
* [GH-2620](https://github.com/gophercloud/gophercloud/pull/2620) Pin goimport dep to a version that works with go 1.14
* [GH-2619](https://github.com/gophercloud/gophercloud/pull/2619) Fix version comparison for acceptance tests
* [GH-2627](https://github.com/gophercloud/gophercloud/pull/2627) Limits: Fix ToDo to create registered limit and use it
* [GH-2629](https://github.com/gophercloud/gophercloud/pull/2629) [manila]: Add share from snapshot restore functional test
## v1.3.0 (2023-03-28)
* [GH-2464](https://github.com/gophercloud/gophercloud/pull/2464) keystone: add v3 limits create operation

View File

@@ -1,6 +1,5 @@
# Gophercloud: an OpenStack SDK for Go
[![Build Status](https://travis-ci.org/gophercloud/gophercloud.svg?branch=master)](https://travis-ci.org/gophercloud/gophercloud)
[![Coverage Status](https://coveralls.io/repos/github/gophercloud/gophercloud/badge.svg?branch=master)](https://coveralls.io/github/gophercloud/gophercloud?branch=master)
[![Coverage Status](https://coveralls.io/repos/github/gophercloud/gophercloud/badge.svg?branch=v1)](https://coveralls.io/github/gophercloud/gophercloud?branch=v1)
Gophercloud is an OpenStack Go SDK.
@@ -40,7 +39,7 @@ You will need to retrieve the following:
Credentials, a pre-generated token, or any other supported authentication
mechanism.
For users that have the OpenStack dashboard installed, there's a shortcut. If
For users who have the OpenStack dashboard installed, there's a shortcut. If
you visit the `project/api_access` path in Horizon and click on the
"Download OpenStack RC File" button at the top right hand corner, you can
download either a `clouds.yaml` file or an `openrc` bash file that exports all

View File

@@ -116,61 +116,109 @@ type ErrDefault400 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault400) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
// ErrDefault401 is the default error type returned on a 401 HTTP response code.
type ErrDefault401 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault401) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
// ErrDefault403 is the default error type returned on a 403 HTTP response code.
type ErrDefault403 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault403) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
// ErrDefault404 is the default error type returned on a 404 HTTP response code.
type ErrDefault404 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault404) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
// ErrDefault405 is the default error type returned on a 405 HTTP response code.
type ErrDefault405 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault405) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
// ErrDefault408 is the default error type returned on a 408 HTTP response code.
type ErrDefault408 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault408) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
// ErrDefault409 is the default error type returned on a 409 HTTP response code.
type ErrDefault409 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault409) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
// ErrDefault429 is the default error type returned on a 429 HTTP response code.
type ErrDefault429 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault429) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
// ErrDefault500 is the default error type returned on a 500 HTTP response code.
type ErrDefault500 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault500) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
// ErrDefault502 is the default error type returned on a 502 HTTP response code.
type ErrDefault502 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault502) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
// ErrDefault503 is the default error type returned on a 503 HTTP response code.
type ErrDefault503 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault503) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
// ErrDefault504 is the default error type returned on a 504 HTTP response code.
type ErrDefault504 struct {
ErrUnexpectedResponseCode
}
func (e ErrDefault504) Unwrap() error {
return e.ErrUnexpectedResponseCode
}
func (e ErrDefault400) Error() string {
e.DefaultErrString = fmt.Sprintf(
"Bad request with: [%s %s], error message: %s",

View File

@@ -189,3 +189,90 @@ func UpdateMetadata(client *gophercloud.ServiceClient, id string, opts UpdateMet
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// ResetStatusOptsBuilder allows extensions to add additional parameters to the
// ResetStatus request.
type ResetStatusOptsBuilder interface {
ToSnapshotResetStatusMap() (map[string]interface{}, error)
}
// ResetStatusOpts contains options for resetting a Snapshot status.
// For more information about these parameters, please, refer to the Block Storage API V3,
// Snapshot Actions, ResetStatus snapshot documentation.
type ResetStatusOpts struct {
// Status is a snapshot status to reset to.
Status string `json:"status"`
}
// ToSnapshotResetStatusMap assembles a request body based on the contents of a
// ResetStatusOpts.
func (opts ResetStatusOpts) ToSnapshotResetStatusMap() (map[string]interface{}, error) {
return gophercloud.BuildRequestBody(opts, "os-reset_status")
}
// ResetStatus will reset the existing snapshot status. ResetStatusResult contains only the error.
// To extract it, call the ExtractErr method on the ResetStatusResult.
func ResetStatus(client *gophercloud.ServiceClient, id string, opts ResetStatusOptsBuilder) (r ResetStatusResult) {
b, err := opts.ToSnapshotResetStatusMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Post(resetStatusURL(client, id), b, nil, &gophercloud.RequestOpts{
OkCodes: []int{202},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// UpdateStatusOptsBuilder allows extensions to add additional parameters to the
// UpdateStatus request.
type UpdateStatusOptsBuilder interface {
ToSnapshotUpdateStatusMap() (map[string]interface{}, error)
}
// UpdateStatusOpts contains options for resetting a Snapshot status.
// For more information about these parameters, please, refer to the Block Storage API V3,
// Snapshot Actions, UpdateStatus snapshot documentation.
type UpdateStatusOpts struct {
// Status is a snapshot status to update to.
Status string `json:"status"`
// A progress percentage value for snapshot build progress.
Progress string `json:"progress,omitempty"`
}
// ToSnapshotUpdateStatusMap assembles a request body based on the contents of a
// UpdateStatusOpts.
func (opts UpdateStatusOpts) ToSnapshotUpdateStatusMap() (map[string]interface{}, error) {
return gophercloud.BuildRequestBody(opts, "os-update_snapshot_status")
}
// UpdateStatus will reset the existing snapshot status. UpdateStatusResult contains only the error.
// To extract it, call the ExtractErr method on the UpdateStatusResult.
func UpdateStatus(client *gophercloud.ServiceClient, id string, opts UpdateStatusOptsBuilder) (r UpdateStatusResult) {
b, err := opts.ToSnapshotUpdateStatusMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Post(resetStatusURL(client, id), b, nil, &gophercloud.RequestOpts{
OkCodes: []int{202},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// ForceDelete will delete the existing snapshot in any state. ForceDeleteResult contains only the error.
// To extract it, call the ExtractErr method on the ForceDeleteResult.
func ForceDelete(client *gophercloud.ServiceClient, id string) (r ForceDeleteResult) {
b := map[string]interface{}{
"os-force_delete": struct{}{},
}
resp, err := client.Post(forceDeleteURL(client, id), b, nil, &gophercloud.RequestOpts{
OkCodes: []int{202},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}

View File

@@ -141,3 +141,18 @@ func (r commonResult) Extract() (*Snapshot, error) {
err := r.ExtractInto(&s)
return s.Snapshot, err
}
// ResetStatusResult contains the response error from a ResetStatus request.
type ResetStatusResult struct {
gophercloud.ErrResult
}
// UpdateStatusResult contains the response error from an UpdateStatus request.
type UpdateStatusResult struct {
gophercloud.ErrResult
}
// ForceDeleteResult contains the response error from a ForceDelete request.
type ForceDeleteResult struct {
gophercloud.ErrResult
}

View File

@@ -29,3 +29,15 @@ func metadataURL(c *gophercloud.ServiceClient, id string) string {
func updateMetadataURL(c *gophercloud.ServiceClient, id string) string {
return metadataURL(c, id)
}
func resetStatusURL(c *gophercloud.ServiceClient, id string) string {
return c.ServiceURL("snapshots", id, "action")
}
func updateStatusURL(c *gophercloud.ServiceClient, id string) string {
return c.ServiceURL("snapshots", id, "action")
}
func forceDeleteURL(c *gophercloud.ServiceClient, id string) string {
return c.ServiceURL("snapshots", id, "action")
}

View File

@@ -160,5 +160,61 @@ Example to Remove/Revoke Access to a Volume Type
if err != nil {
panic(err)
}
Example to Create the Encryption of a Volume Type
typeID := "7ffaca22-f646-41d4-b79d-d7e4452ef8cc"
volumeType, err := volumetypes.CreateEncryption(client, typeID, .CreateEncryptionOpts{
KeySize: 256,
Provider: "luks",
ControlLocation: "front-end",
Cipher: "aes-xts-plain64",
}).Extract()
if err != nil{
panic(err)
}
fmt.Println(volumeType)
Example to Delete the Encryption of a Volume Type
typeID := "7ffaca22-f646-41d4-b79d-d7e4452ef8cc"
encryptionID := ""81e069c6-7394-4856-8df7-3b237ca61f74
err := volumetypes.DeleteEncryption(client, typeID, encryptionID).ExtractErr()
if err != nil{
panic(err)
}
Example to Update the Encryption of a Volume Type
typeID := "7ffaca22-f646-41d4-b79d-d7e4452ef8cc"
volumetype, err = volumetypes.UpdateEncryption(client, typeID, volumetypes.UpdateEncryptionOpts{
KeySize: 256,
Provider: "luks",
ControlLocation: "front-end",
Cipher: "aes-xts-plain64",
}).Extract()
if err != nil{
panic(err)
}
fmt.Println(volumetype)
Example to Show an Encryption of a Volume Type
typeID := "7ffaca22-f646-41d4-b79d-d7e4452ef8cc"
volumeType, err := volumetypes.GetEncrytpion(client, typeID).Extract()
if err != nil{
panic(err)
}
fmt.Println(volumeType)
Example to Show an Encryption Spec of a Volume Type
typeID := "7ffaca22-f646-41d4-b79d-d7e4452ef8cc"
key := "cipher"
volumeType, err := volumetypes.GetEncrytpionSpec(client, typeID).Extract()
if err != nil{
panic(err)
}
fmt.Println(volumeType)
*/
package volumetypes

View File

@@ -304,3 +304,108 @@ func RemoveAccess(client *gophercloud.ServiceClient, id string, opts RemoveAcces
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// CreateEncryptionOptsBuilder allows extensions to add additional parameters to the
// Create Encryption request.
type CreateEncryptionOptsBuilder interface {
ToEncryptionCreateMap() (map[string]interface{}, error)
}
// CreateEncryptionOpts contains options for creating an Encryption Type object.
// This object is passed to the volumetypes.CreateEncryption function.
// For more information about these parameters,see the Encryption Type object.
type CreateEncryptionOpts struct {
// The size of the encryption key.
KeySize int `json:"key_size"`
// The class of that provides the encryption support.
Provider string `json:"provider" required:"true"`
// Notional service where encryption is performed.
ControlLocation string `json:"control_location"`
// The encryption algorithm or mode.
Cipher string `json:"cipher"`
}
// ToEncryptionCreateMap assembles a request body based on the contents of a
// CreateEncryptionOpts.
func (opts CreateEncryptionOpts) ToEncryptionCreateMap() (map[string]interface{}, error) {
return gophercloud.BuildRequestBody(opts, "encryption")
}
// CreateEncryption will creates an Encryption Type object based on the CreateEncryptionOpts.
// To extract the Encryption Type object from the response, call the Extract method on the
// EncryptionCreateResult.
func CreateEncryption(client *gophercloud.ServiceClient, id string, opts CreateEncryptionOptsBuilder) (r CreateEncryptionResult) {
b, err := opts.ToEncryptionCreateMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Post(createEncryptionURL(client, id), b, &r.Body, &gophercloud.RequestOpts{
OkCodes: []int{200},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// Delete will delete an encryption type for an existing Volume Type with the provided ID.
func DeleteEncryption(client *gophercloud.ServiceClient, id, encryptionID string) (r DeleteEncryptionResult) {
resp, err := client.Delete(deleteEncryptionURL(client, id, encryptionID), nil)
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// GetEncryption retrieves the encryption type for an existing VolumeType with the provided ID.
func GetEncryption(client *gophercloud.ServiceClient, id string) (r GetEncryptionResult) {
resp, err := client.Get(getEncryptionURL(client, id), &r.Body, nil)
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// GetEncryptionSpecs retrieves the encryption type specs for an existing VolumeType with the provided ID.
func GetEncryptionSpec(client *gophercloud.ServiceClient, id, key string) (r GetEncryptionSpecResult) {
resp, err := client.Get(getEncryptionSpecURL(client, id, key), &r.Body, nil)
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// UpdateEncryptionOptsBuilder allows extensions to add additional parameters to the
// Update encryption request.
type UpdateEncryptionOptsBuilder interface {
ToUpdateEncryptionMap() (map[string]interface{}, error)
}
// Update Encryption Opts contains options for creating an Update Encryption Type. This object is passed to
// the volumetypes.UpdateEncryption function. For more information about these parameters,
// see the Update Encryption Type object.
type UpdateEncryptionOpts struct {
// The size of the encryption key.
KeySize int `json:"key_size"`
// The class of that provides the encryption support.
Provider string `json:"provider"`
// Notional service where encryption is performed.
ControlLocation string `json:"control_location"`
// The encryption algorithm or mode.
Cipher string `json:"cipher"`
}
// ToEncryptionCreateMap assembles a request body based on the contents of a
// UpdateEncryptionOpts.
func (opts UpdateEncryptionOpts) ToUpdateEncryptionMap() (map[string]interface{}, error) {
return gophercloud.BuildRequestBody(opts, "encryption")
}
// Update will update an existing encryption for a Volume Type based on the values in UpdateEncryptionOpts.
// To extract the UpdateEncryption Type object from the response, call the Extract method on the
// UpdateEncryptionResult.
func UpdateEncryption(client *gophercloud.ServiceClient, id, encryptionID string, opts UpdateEncryptionOptsBuilder) (r UpdateEncryptionResult) {
b, err := opts.ToUpdateEncryptionMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Put(updateEncryptionURL(client, id, encryptionID), b, &r.Body, &gophercloud.RequestOpts{
OkCodes: []int{200},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}

View File

@@ -200,3 +200,100 @@ type AddAccessResult struct {
type RemoveAccessResult struct {
gophercloud.ErrResult
}
type EncryptionType struct {
// Unique identifier for the volume type.
VolumeTypeID string `json:"volume_type_id"`
// Notional service where encryption is performed.
ControlLocation string `json:"control_location"`
// Unique identifier for encryption type.
EncryptionID string `json:"encryption_id"`
// Size of encryption key.
KeySize int `json:"key_size"`
// Class that provides encryption support.
Provider string `json:"provider"`
// The encryption algorithm or mode.
Cipher string `json:"cipher"`
}
type encryptionResult struct {
gophercloud.Result
}
func (r encryptionResult) Extract() (*EncryptionType, error) {
var s EncryptionType
err := r.ExtractInto(&s)
return &s, err
}
// ExtractInto converts our response data into a volume type struct
func (r encryptionResult) ExtractInto(v interface{}) error {
return r.Result.ExtractIntoStructPtr(v, "encryption")
}
type CreateEncryptionResult struct {
encryptionResult
}
// UpdateResult contains the response body and error from an UpdateEncryption request.
type UpdateEncryptionResult struct {
encryptionResult
}
// DeleteEncryptionResult contains the response body and error from a DeleteEncryprion request.
type DeleteEncryptionResult struct {
gophercloud.ErrResult
}
type GetEncryptionType struct {
// Unique identifier for the volume type.
VolumeTypeID string `json:"volume_type_id"`
// Notional service where encryption is performed.
ControlLocation string `json:"control_location"`
// Shows if the resource is deleted or Notional
Deleted bool `json:"deleted"`
// Shows the date and time the resource was created.
CreatedAt string `json:"created_at"`
// Shows the date and time when resource was updated.
UpdatedAt string `json:"updated_at"`
// Unique identifier for encryption type.
EncryptionID string `json:"encryption_id"`
// Size of encryption key.
KeySize int `json:"key_size"`
// Class that provides encryption support.
Provider string `json:"provider"`
// Shows the date and time the reousrce was deleted.
DeletedAt string `json:"deleted_at"`
// The encryption algorithm or mode.
Cipher string `json:"cipher"`
}
type encryptionShowResult struct {
gophercloud.Result
}
// Extract interprets any extraSpecResult as an ExtraSpec, if possible.
func (r encryptionShowResult) Extract() (*GetEncryptionType, error) {
var s GetEncryptionType
err := r.ExtractInto(&s)
return &s, err
}
type GetEncryptionResult struct {
encryptionShowResult
}
type encryptionShowSpecResult struct {
gophercloud.Result
}
// Extract interprets any empty interface Result as an empty interface.
func (r encryptionShowSpecResult) Extract() (map[string]interface{}, error) {
var s map[string]interface{}
err := r.ExtractInto(&s)
return s, err
}
type GetEncryptionSpecResult struct {
encryptionShowSpecResult
}

View File

@@ -49,3 +49,23 @@ func accessURL(client *gophercloud.ServiceClient, id string) string {
func accessActionURL(client *gophercloud.ServiceClient, id string) string {
return client.ServiceURL("types", id, "action")
}
func createEncryptionURL(client *gophercloud.ServiceClient, id string) string {
return client.ServiceURL("types", id, "encryption")
}
func deleteEncryptionURL(client *gophercloud.ServiceClient, id, encryptionID string) string {
return client.ServiceURL("types", id, "encryption", encryptionID)
}
func getEncryptionURL(client *gophercloud.ServiceClient, id string) string {
return client.ServiceURL("types", id, "encryption")
}
func getEncryptionSpecURL(client *gophercloud.ServiceClient, id, key string) string {
return client.ServiceURL("types", id, "encryption", key)
}
func updateEncryptionURL(client *gophercloud.ServiceClient, id, encryptionID string) string {
return client.ServiceURL("types", id, "encryption", encryptionID)
}

View File

@@ -21,26 +21,27 @@ type ListOptsBuilder interface {
// by a particular port attribute. SortDir sets the direction, and is either
// `asc' or `desc'. Marker and Limit are used for pagination.
type ListOpts struct {
Status string `q:"status"`
Name string `q:"name"`
Description string `q:"description"`
AdminStateUp *bool `q:"admin_state_up"`
NetworkID string `q:"network_id"`
TenantID string `q:"tenant_id"`
ProjectID string `q:"project_id"`
DeviceOwner string `q:"device_owner"`
MACAddress string `q:"mac_address"`
ID string `q:"id"`
DeviceID string `q:"device_id"`
Limit int `q:"limit"`
Marker string `q:"marker"`
SortKey string `q:"sort_key"`
SortDir string `q:"sort_dir"`
Tags string `q:"tags"`
TagsAny string `q:"tags-any"`
NotTags string `q:"not-tags"`
NotTagsAny string `q:"not-tags-any"`
FixedIPs []FixedIPOpts
Status string `q:"status"`
Name string `q:"name"`
Description string `q:"description"`
AdminStateUp *bool `q:"admin_state_up"`
NetworkID string `q:"network_id"`
TenantID string `q:"tenant_id"`
ProjectID string `q:"project_id"`
DeviceOwner string `q:"device_owner"`
MACAddress string `q:"mac_address"`
ID string `q:"id"`
DeviceID string `q:"device_id"`
Limit int `q:"limit"`
Marker string `q:"marker"`
SortKey string `q:"sort_key"`
SortDir string `q:"sort_dir"`
Tags string `q:"tags"`
TagsAny string `q:"tags-any"`
NotTags string `q:"not-tags"`
NotTagsAny string `q:"not-tags-any"`
SecurityGroups []string `q:"security_groups"`
FixedIPs []FixedIPOpts
}
type FixedIPOpts struct {

View File

@@ -5,7 +5,10 @@ import (
"crypto/hmac"
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"fmt"
"hash"
"io"
"io/ioutil"
"strings"
@@ -17,6 +20,25 @@ import (
"github.com/gophercloud/gophercloud/pagination"
)
// ErrTempURLKeyNotFound is an error indicating that the Temp URL key was
// neigther set nor resolved from a container or account metadata.
type ErrTempURLKeyNotFound struct{ gophercloud.ErrMissingInput }
func (e ErrTempURLKeyNotFound) Error() string {
return "Unable to obtain the Temp URL key."
}
// ErrTempURLDigestNotValid is an error indicating that the requested
// cryptographic hash function is not supported.
type ErrTempURLDigestNotValid struct {
gophercloud.ErrMissingInput
Digest string
}
func (e ErrTempURLDigestNotValid) Error() string {
return fmt.Sprintf("The requested %q digest is not supported.", e.Digest)
}
// ListOptsBuilder allows extensions to add additional parameters to the List
// request.
type ListOptsBuilder interface {
@@ -504,15 +526,20 @@ type HTTPMethod string
var (
// GET represents an HTTP "GET" method.
GET HTTPMethod = "GET"
// HEAD represents an HTTP "HEAD" method.
HEAD HTTPMethod = "HEAD"
// PUT represents an HTTP "PUT" method.
PUT HTTPMethod = "PUT"
// POST represents an HTTP "POST" method.
POST HTTPMethod = "POST"
// DELETE represents an HTTP "DELETE" method.
DELETE HTTPMethod = "DELETE"
)
// CreateTempURLOpts are options for creating a temporary URL for an object.
type CreateTempURLOpts struct {
// (REQUIRED) Method is the HTTP method to allow for users of the temp URL.
// Valid values are "GET" and "POST".
// Valid values are "GET", "HEAD", "PUT", "POST" and "DELETE".
Method HTTPMethod
// (REQUIRED) TTL is the number of seconds the temp URL should be active.
@@ -523,8 +550,21 @@ type CreateTempURLOpts struct {
// empty, the default OpenStack URL split point will be used ("/v1/").
Split string
// Timestamp is a timestamp to calculate Temp URL signature. Optional.
// (Optional) Timestamp is the current timestamp used to calculate the Temp URL
// signature. If not specified, the current UNIX timestamp is used as the base
// timestamp.
Timestamp time.Time
// (Optional) TempURLKey overrides the Swift container or account Temp URL key.
// TempURLKey must correspond to a target container/account key, otherwise the
// generated link will be invalid. If not specified, the key is obtained from
// a Swift container or account.
TempURLKey string
// (Optional) Digest specifies the cryptographic hash function used to
// calculate the signature. Valid values include sha1, sha256, and
// sha512. If not specified, the default hash function is sha1.
Digest string
}
// CreateTempURL is a function for creating a temporary URL for an object. It
@@ -541,50 +581,83 @@ func CreateTempURL(c *gophercloud.ServiceClient, containerName, objectName strin
}
// Initialize time if it was not passed as opts
var date time.Time
if opts.Timestamp.IsZero() {
date = time.Now().UTC()
} else {
date = opts.Timestamp
date := opts.Timestamp
if date.IsZero() {
date = time.Now()
}
duration := time.Duration(opts.TTL) * time.Second
// UNIX time is always UTC
expiry := date.Add(duration).Unix()
getHeader, err := containers.Get(c, containerName, nil).Extract()
if err != nil {
return "", err
}
tempURLKey := getHeader.TempURLKey
// Initialize the tempURLKey to calculate a signature
tempURLKey := opts.TempURLKey
if tempURLKey == "" {
// fallback to an account TempURL key
getHeader, err := accounts.Get(c, nil).Extract()
// fallback to a container TempURL key
getHeader, err := containers.Get(c, containerName, nil).Extract()
if err != nil {
return "", err
}
tempURLKey = getHeader.TempURLKey
if tempURLKey == "" {
// fallback to an account TempURL key
getHeader, err := accounts.Get(c, nil).Extract()
if err != nil {
return "", err
}
tempURLKey = getHeader.TempURLKey
}
if tempURLKey == "" {
return "", ErrTempURLKeyNotFound{}
}
}
secretKey := []byte(tempURLKey)
splitPath := strings.Split(url, opts.Split)
baseURL, objectPath := splitPath[0], splitPath[1]
objectPath = opts.Split + objectPath
body := fmt.Sprintf("%s\n%d\n%s", opts.Method, expiry, objectPath)
hash := hmac.New(sha1.New, secretKey)
var hash hash.Hash
switch opts.Digest {
case "", "sha1":
hash = hmac.New(sha1.New, secretKey)
case "sha256":
hash = hmac.New(sha256.New, secretKey)
case "sha512":
hash = hmac.New(sha512.New, secretKey)
default:
return "", ErrTempURLDigestNotValid{Digest: opts.Digest}
}
hash.Write([]byte(body))
hexsum := fmt.Sprintf("%x", hash.Sum(nil))
return fmt.Sprintf("%s%s?temp_url_sig=%s&temp_url_expires=%d", baseURL, objectPath, hexsum, expiry), nil
}
// BulkDelete is a function that bulk deletes objects.
// In Swift, the maximum number of deletes per request is set by default to 10000.
//
// See:
// * https://github.com/openstack/swift/blob/6d3d4197151f44bf28b51257c1a4c5d33411dcae/etc/proxy-server.conf-sample#L1029-L1034
// * https://github.com/openstack/swift/blob/e8cecf7fcc1630ee83b08f9a73e1e59c07f8d372/swift/common/middleware/bulk.py#L309
func BulkDelete(c *gophercloud.ServiceClient, container string, objects []string) (r BulkDeleteResult) {
// urlencode object names to be on the safe side
// https://github.com/openstack/swift/blob/stable/train/swift/common/middleware/bulk.py#L160
// https://github.com/openstack/swift/blob/stable/train/swift/common/swob.py#L302
encodedObjects := make([]string, len(objects))
for i, v := range objects {
encodedObjects[i] = strings.Join([]string{container, v}, "/")
err := containers.CheckContainerName(container)
if err != nil {
r.Err = err
return
}
b := strings.NewReader(strings.Join(encodedObjects, "\n") + "\n")
resp, err := c.Post(bulkDeleteURL(c), b, &r.Body, &gophercloud.RequestOpts{
var body bytes.Buffer
for i := range objects {
if objects[i] == "" {
r.Err = fmt.Errorf("object names must not be the empty string")
return
}
body.WriteString(container)
body.WriteRune('/')
body.WriteString(objects[i])
body.WriteRune('\n')
}
resp, err := c.Post(bulkDeleteURL(c), &body, &r.Body, &gophercloud.RequestOpts{
MoreHeaders: map[string]string{
"Accept": "application/json",
"Content-Type": "text/plain",

View File

@@ -163,3 +163,54 @@ func Update(client *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// ResetStatusOptsBuilder allows extensions to add additional parameters to the
// ResetStatus request.
type ResetStatusOptsBuilder interface {
ToSnapshotResetStatusMap() (map[string]interface{}, error)
}
// ResetStatusOpts contains options for resetting a Snapshot status.
// For more information about these parameters, please, refer to the shared file systems API v2,
// Snapshot Actions, ResetStatus share documentation.
type ResetStatusOpts struct {
// Status is a snapshot status to reset to. Can be "available", "error",
// "creating", "deleting", "manage_starting", "manage_error",
// "unmanage_starting", "unmanage_error" or "error_deleting".
Status string `json:"status"`
}
// ToSnapshotResetStatusMap assembles a request body based on the contents of a
// ResetStatusOpts.
func (opts ResetStatusOpts) ToSnapshotResetStatusMap() (map[string]interface{}, error) {
return gophercloud.BuildRequestBody(opts, "reset_status")
}
// ResetStatus will reset the existing snapshot status. ResetStatusResult contains only the error.
// To extract it, call the ExtractErr method on the ResetStatusResult.
func ResetStatus(client *gophercloud.ServiceClient, id string, opts ResetStatusOptsBuilder) (r ResetStatusResult) {
b, err := opts.ToSnapshotResetStatusMap()
if err != nil {
r.Err = err
return
}
resp, err := client.Post(resetStatusURL(client, id), b, nil, &gophercloud.RequestOpts{
OkCodes: []int{202},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}
// ForceDelete will delete the existing snapshot in any state. ForceDeleteResult contains only the error.
// To extract it, call the ExtractErr method on the ForceDeleteResult.
func ForceDelete(client *gophercloud.ServiceClient, id string) (r ForceDeleteResult) {
b := map[string]interface{}{
"force_delete": nil,
}
resp, err := client.Post(forceDeleteURL(client, id), b, nil, &gophercloud.RequestOpts{
OkCodes: []int{202},
})
_, r.Header, r.Err = gophercloud.ParseResponse(resp, err)
return
}

View File

@@ -173,3 +173,13 @@ type GetResult struct {
type UpdateResult struct {
commonResult
}
// ResetStatusResult contains the response error from an ResetStatus request.
type ResetStatusResult struct {
gophercloud.ErrResult
}
// ForceDeleteResult contains the response error from an ForceDelete request.
type ForceDeleteResult struct {
gophercloud.ErrResult
}

View File

@@ -21,3 +21,11 @@ func getURL(c *gophercloud.ServiceClient, id string) string {
func updateURL(c *gophercloud.ServiceClient, id string) string {
return c.ServiceURL("snapshots", id)
}
func resetStatusURL(c *gophercloud.ServiceClient, id string) string {
return c.ServiceURL("snapshots", id, "action")
}
func forceDeleteURL(c *gophercloud.ServiceClient, id string) string {
return c.ServiceURL("snapshots", id, "action")
}

View File

@@ -14,7 +14,7 @@ import (
// DefaultUserAgent is the default User-Agent string set in the request header.
const (
DefaultUserAgent = "gophercloud/v1.3.0"
DefaultUserAgent = "gophercloud/v1.6.0"
DefaultMaxBackoffRetries = 60
)

View File

@@ -14,6 +14,7 @@ import (
"github.com/gophercloud/utils/gnocchi"
"github.com/gophercloud/utils/internal"
"github.com/hashicorp/go-uuid"
yaml "gopkg.in/yaml.v2"
)
@@ -884,6 +885,10 @@ func NewServiceClient(service string, opts *ClientOpts) (*gophercloud.ServiceCli
}
switch service {
case "baremetal":
return openstack.NewBareMetalV1(pClient, eo)
case "baremetal-introspection":
return openstack.NewBareMetalIntrospectionV1(pClient, eo)
case "clustering":
return openstack.NewClusteringV1(pClient, eo)
case "compute":
@@ -918,6 +923,12 @@ func NewServiceClient(service string, opts *ClientOpts) (*gophercloud.ServiceCli
return openstack.NewKeyManagerV1(pClient, eo)
case "load-balancer":
return openstack.NewLoadBalancerV2(pClient, eo)
case "messaging":
clientID, err := uuid.GenerateUUID()
if err != nil {
return nil, fmt.Errorf("failed to generate UUID: %w", err)
}
return openstack.NewMessagingV2(pClient, clientID, eo)
case "network":
return openstack.NewNetworkV2(pClient, eo)
case "object-store":
@@ -944,6 +955,8 @@ func NewServiceClient(service string, opts *ClientOpts) (*gophercloud.ServiceCli
default:
return nil, fmt.Errorf("invalid volume API version")
}
case "workflowv2":
return openstack.NewWorkflowV2(pClient, eo)
}
return nil, fmt.Errorf("unable to create a service client for %s", service)

12
vendor/github.com/hashicorp/go-uuid/.travis.yml generated vendored Normal file
View File

@@ -0,0 +1,12 @@
language: go
sudo: false
go:
- 1.4
- 1.5
- 1.6
- tip
script:
- go test -bench . -benchmem -v ./...

365
vendor/github.com/hashicorp/go-uuid/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,365 @@
Copyright © 2015-2022 HashiCorp, Inc.
Mozilla Public License, version 2.0
1. Definitions
1.1. "Contributor"
means each individual or legal entity that creates, contributes to the
creation of, or owns Covered Software.
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used by a
Contributor and that particular Contributor's Contribution.
1.3. "Contribution"
means Covered Software of a particular Contributor.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached the
notice in Exhibit A, the Executable Form of such Source Code Form, and
Modifications of such Source Code Form, in each case including portions
thereof.
1.5. "Incompatible With Secondary Licenses"
means
a. that the initial Contributor has attached the notice described in
Exhibit B to the Covered Software; or
b. that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the terms of
a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in a
separate file or files, that is not Covered Software.
1.8. "License"
means this document.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible, whether
at the time of the initial grant or subsequently, any and all of the
rights conveyed by this License.
1.10. "Modifications"
means any of the following:
a. any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered Software; or
b. any new file in Source Code Form that contains any Covered Software.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the License,
by the making, using, selling, offering for sale, having made, import,
or transfer of either its Contributions or its Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU Lesser
General Public License, Version 2.1, the GNU Affero General Public
License, Version 3.0, or any later versions of those licenses.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that controls, is
controlled by, or is under common control with You. For purposes of this
definition, "control" means (a) the power, direct or indirect, to cause
the direction or management of such entity, whether by contract or
otherwise, or (b) ownership of more than fifty percent (50%) of the
outstanding shares or beneficial ownership of such entity.
2. License Grants and Conditions
2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
a. under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
b. under Patent Claims of such Contributor to make, use, sell, offer for
sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
a. for any code that a Contributor has removed from Covered Software; or
b. for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
c. under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights to
grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
Section 2.1.
3. Responsibilities
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
a. such Covered Software must also be made available in Source Code Form,
as described in Section 3.1, and You must inform recipients of the
Executable Form how they can obtain a copy of such Source Code Form by
reasonable means in a timely manner, at a charge no more than the cost
of distribution to the recipient; and
b. You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter the
recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty, or
limitations of liability) contained within the Source Code Form of the
Covered Software, except that You may alter any license notices to the
extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
If it is impossible for You to comply with any of the terms of this License
with respect to some or all of the Covered Software due to statute,
judicial order, or regulation then You must: (a) comply with the terms of
this License to the maximum extent possible; and (b) describe the
limitations and the code they affect. Such description must be placed in a
text file included with all distributions of the Covered Software under
this License. Except to the extent prohibited by statute or regulation,
such description must be sufficiently detailed for a recipient of ordinary
skill to be able to understand it.
5. Termination
5.1. The rights granted under this License will terminate automatically if You
fail to comply with any of its terms. However, if You become compliant,
then the rights granted under this License from a particular Contributor
are reinstated (a) provisionally, unless and until such Contributor
explicitly and finally terminates Your grants, and (b) on an ongoing
basis, if such Contributor fails to notify You of the non-compliance by
some reasonable means prior to 60 days after You have come back into
compliance. Moreover, Your grants from a particular Contributor are
reinstated on an ongoing basis if such Contributor notifies You of the
non-compliance by some reasonable means, this is the first time You have
received notice of non-compliance with this License from such
Contributor, and You become compliant prior to 30 days after Your receipt
of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
license agreements (excluding distributors and resellers) which have been
validly granted by You or Your distributors under this License prior to
termination shall survive termination.
6. Disclaimer of Warranty
Covered Software is provided under this License on an "as is" basis,
without warranty of any kind, either expressed, implied, or statutory,
including, without limitation, warranties that the Covered Software is free
of defects, merchantable, fit for a particular purpose or non-infringing.
The entire risk as to the quality and performance of the Covered Software
is with You. Should any Covered Software prove defective in any respect,
You (not any Contributor) assume the cost of any necessary servicing,
repair, or correction. This disclaimer of warranty constitutes an essential
part of this License. No use of any Covered Software is authorized under
this License except under this disclaimer.
7. Limitation of Liability
Under no circumstances and under no legal theory, whether tort (including
negligence), contract, or otherwise, shall any Contributor, or anyone who
distributes Covered Software as permitted above, be liable to You for any
direct, indirect, special, incidental, or consequential damages of any
character including, without limitation, damages for lost profits, loss of
goodwill, work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses, even if such party shall have been
informed of the possibility of such damages. This limitation of liability
shall not apply to liability for death or personal injury resulting from
such party's negligence to the extent applicable law prohibits such
limitation. Some jurisdictions do not allow the exclusion or limitation of
incidental or consequential damages, so this exclusion and limitation may
not apply to You.
8. Litigation
Any litigation relating to this License may be brought only in the courts
of a jurisdiction where the defendant maintains its principal place of
business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions. Nothing
in this Section shall prevent a party's ability to bring cross-claims or
counter-claims.
9. Miscellaneous
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides that
the language of a contract shall be construed against the drafter shall not
be used to construe this License against a Contributor.
10. Versions of the License
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses If You choose to distribute Source Code Form that is
Incompatible With Secondary Licenses under the terms of this version of
the License, the notice described in Exhibit B of this License must be
attached.
Exhibit A - Source Code Form License Notice
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular file,
then You may include the notice in a location (such as a LICENSE file in a
relevant directory) where a recipient would be likely to look for such a
notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
This Source Code Form is "Incompatible
With Secondary Licenses", as defined by
the Mozilla Public License, v. 2.0.

8
vendor/github.com/hashicorp/go-uuid/README.md generated vendored Normal file
View File

@@ -0,0 +1,8 @@
# uuid [![Build Status](https://travis-ci.org/hashicorp/go-uuid.svg?branch=master)](https://travis-ci.org/hashicorp/go-uuid)
Generates UUID-format strings using high quality, _purely random_ bytes. It is **not** intended to be RFC compliant, merely to use a well-understood string representation of a 128-bit value. It can also parse UUID-format strings into their component bytes.
Documentation
=============
The full documentation is available on [Godoc](http://godoc.org/github.com/hashicorp/go-uuid).

83
vendor/github.com/hashicorp/go-uuid/uuid.go generated vendored Normal file
View File

@@ -0,0 +1,83 @@
package uuid
import (
"crypto/rand"
"encoding/hex"
"fmt"
"io"
)
// GenerateRandomBytes is used to generate random bytes of given size.
func GenerateRandomBytes(size int) ([]byte, error) {
return GenerateRandomBytesWithReader(size, rand.Reader)
}
// GenerateRandomBytesWithReader is used to generate random bytes of given size read from a given reader.
func GenerateRandomBytesWithReader(size int, reader io.Reader) ([]byte, error) {
if reader == nil {
return nil, fmt.Errorf("provided reader is nil")
}
buf := make([]byte, size)
if _, err := io.ReadFull(reader, buf); err != nil {
return nil, fmt.Errorf("failed to read random bytes: %v", err)
}
return buf, nil
}
const uuidLen = 16
// GenerateUUID is used to generate a random UUID
func GenerateUUID() (string, error) {
return GenerateUUIDWithReader(rand.Reader)
}
// GenerateUUIDWithReader is used to generate a random UUID with a given Reader
func GenerateUUIDWithReader(reader io.Reader) (string, error) {
if reader == nil {
return "", fmt.Errorf("provided reader is nil")
}
buf, err := GenerateRandomBytesWithReader(uuidLen, reader)
if err != nil {
return "", err
}
return FormatUUID(buf)
}
func FormatUUID(buf []byte) (string, error) {
if buflen := len(buf); buflen != uuidLen {
return "", fmt.Errorf("wrong length byte slice (%d)", buflen)
}
return fmt.Sprintf("%x-%x-%x-%x-%x",
buf[0:4],
buf[4:6],
buf[6:8],
buf[8:10],
buf[10:16]), nil
}
func ParseUUID(uuid string) ([]byte, error) {
if len(uuid) != 2 * uuidLen + 4 {
return nil, fmt.Errorf("uuid string is wrong length")
}
if uuid[8] != '-' ||
uuid[13] != '-' ||
uuid[18] != '-' ||
uuid[23] != '-' {
return nil, fmt.Errorf("uuid is improperly formatted")
}
hexStr := uuid[0:8] + uuid[9:13] + uuid[14:18] + uuid[19:23] + uuid[24:36]
ret, err := hex.DecodeString(hexStr)
if err != nil {
return nil, err
}
if len(ret) != uuidLen {
return nil, fmt.Errorf("decoded hex is the wrong length")
}
return ret, nil
}

7
vendor/modules.txt vendored
View File

@@ -539,7 +539,7 @@ github.com/googleapis/gax-go/v2
github.com/googleapis/gax-go/v2/apierror
github.com/googleapis/gax-go/v2/apierror/internal/proto
github.com/googleapis/gax-go/v2/internal
# github.com/gophercloud/gophercloud v1.3.0
# github.com/gophercloud/gophercloud v1.6.0
## explicit; go 1.14
github.com/gophercloud/gophercloud
github.com/gophercloud/gophercloud/openstack
@@ -587,7 +587,7 @@ github.com/gophercloud/gophercloud/openstack/sharedfilesystems/v2/shares
github.com/gophercloud/gophercloud/openstack/sharedfilesystems/v2/snapshots
github.com/gophercloud/gophercloud/openstack/utils
github.com/gophercloud/gophercloud/pagination
# github.com/gophercloud/utils v0.0.0-20230330070308-5bd5e1d608f8
# github.com/gophercloud/utils v0.0.0-20230523080330-de873b9cf00d
## explicit; go 1.15
github.com/gophercloud/utils/env
github.com/gophercloud/utils/gnocchi
@@ -616,6 +616,9 @@ github.com/hashicorp/go-multierror
# github.com/hashicorp/go-retryablehttp v0.7.2
## explicit; go 1.13
github.com/hashicorp/go-retryablehttp
# github.com/hashicorp/go-uuid v1.0.3
## explicit
github.com/hashicorp/go-uuid
# github.com/hashicorp/go-version v1.6.0
## explicit
github.com/hashicorp/go-version