From bdaeb6df362c4bbcb04b1f635a5f633a004dbfe1 Mon Sep 17 00:00:00 2001 From: Jesse Haka Date: Mon, 11 May 2020 08:06:13 +0300 Subject: [PATCH] upgrade to cinder v3 to use api --- pkg/resources/openstack/BUILD.bazel | 2 +- pkg/resources/openstack/volumes.go | 2 +- protokube/pkg/protokube/BUILD.bazel | 2 +- protokube/pkg/protokube/openstack_volume.go | 6 ++--- upup/pkg/fi/cloudup/openstack/BUILD.bazel | 2 +- upup/pkg/fi/cloudup/openstack/cloud.go | 7 +++--- upup/pkg/fi/cloudup/openstack/status.go | 4 ++-- upup/pkg/fi/cloudup/openstack/volume.go | 2 +- .../pkg/fi/cloudup/openstacktasks/BUILD.bazel | 2 +- upup/pkg/fi/cloudup/openstacktasks/volume.go | 6 ++--- .../openstack/blockstorage/v2/volumes/doc.go | 5 ---- .../{v2 => v3}/volumes/BUILD.bazel | 4 ++-- .../openstack/blockstorage/v3/volumes/doc.go | 23 +++++++++++++++++++ .../{v2 => v3}/volumes/requests.go | 7 +++++- .../{v2 => v3}/volumes/results.go | 16 +++++++++---- .../blockstorage/{v2 => v3}/volumes/urls.go | 0 .../blockstorage/{v2 => v3}/volumes/util.go | 0 vendor/modules.txt | 2 +- 18 files changed, 61 insertions(+), 31 deletions(-) delete mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/doc.go rename vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/{v2 => v3}/volumes/BUILD.bazel (89%) create mode 100644 vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/doc.go rename vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/{v2 => v3}/volumes/requests.go (95%) rename vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/{v2 => v3}/volumes/results.go (86%) rename vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/{v2 => v3}/volumes/urls.go (100%) rename vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/{v2 => v3}/volumes/util.go (100%) diff --git a/pkg/resources/openstack/BUILD.bazel b/pkg/resources/openstack/BUILD.bazel index 5ca6361777..69573cbc72 100644 --- a/pkg/resources/openstack/BUILD.bazel +++ b/pkg/resources/openstack/BUILD.bazel @@ -21,7 +21,7 @@ go_library( "//pkg/resources:go_default_library", "//upup/pkg/fi:go_default_library", "//upup/pkg/fi/cloudup/openstack:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes:go_default_library", + "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/dns/v2/zones:go_default_library", diff --git a/pkg/resources/openstack/volumes.go b/pkg/resources/openstack/volumes.go index d02050a0b1..1a4651a7cc 100644 --- a/pkg/resources/openstack/volumes.go +++ b/pkg/resources/openstack/volumes.go @@ -17,7 +17,7 @@ limitations under the License. package openstack import ( - cinder "github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes" + cinder "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes" "k8s.io/kops/pkg/resources" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/openstack" diff --git a/protokube/pkg/protokube/BUILD.bazel b/protokube/pkg/protokube/BUILD.bazel index 3c982f971f..0c63fa8bf1 100644 --- a/protokube/pkg/protokube/BUILD.bazel +++ b/protokube/pkg/protokube/BUILD.bazel @@ -59,7 +59,7 @@ go_library( "//vendor/github.com/denverdino/aliyungo/ecs:go_default_library", "//vendor/github.com/denverdino/aliyungo/metadata:go_default_library", "//vendor/github.com/digitalocean/godo:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes:go_default_library", + "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach:go_default_library", "//vendor/google.golang.org/api/compute/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", diff --git a/protokube/pkg/protokube/openstack_volume.go b/protokube/pkg/protokube/openstack_volume.go index 20eb5ad970..9170234754 100644 --- a/protokube/pkg/protokube/openstack_volume.go +++ b/protokube/pkg/protokube/openstack_volume.go @@ -25,7 +25,7 @@ import ( "os" "strings" - cinderv2 "github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes" + cinderv3 "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach" "k8s.io/klog" "k8s.io/kops/protokube/pkg/etcd" @@ -192,7 +192,7 @@ func (a *OpenstackVolumes) discoverTags() error { return nil } -func (v *OpenstackVolumes) buildOpenstackVolume(d *cinderv2.Volume) (*Volume, error) { +func (v *OpenstackVolumes) buildOpenstackVolume(d *cinderv3.Volume) (*Volume, error) { volumeName := d.Name vol := &Volume{ ID: d.ID, @@ -231,7 +231,7 @@ func (v *OpenstackVolumes) FindVolumes() ([]*Volume, error) { klog.V(2).Infof("Listing Openstack disks in %s/%s", v.project, v.meta.AvailabilityZone) - vols, err := v.cloud.ListVolumes(cinderv2.ListOpts{ + vols, err := v.cloud.ListVolumes(cinderv3.ListOpts{ TenantID: v.project, }) if err != nil { diff --git a/upup/pkg/fi/cloudup/openstack/BUILD.bazel b/upup/pkg/fi/cloudup/openstack/BUILD.bazel index 1976f93b9a..9d26568930 100644 --- a/upup/pkg/fi/cloudup/openstack/BUILD.bazel +++ b/upup/pkg/fi/cloudup/openstack/BUILD.bazel @@ -35,7 +35,7 @@ go_library( "//util/pkg/vfs:go_default_library", "//vendor/github.com/gophercloud/gophercloud:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes:go_default_library", + "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs:go_default_library", diff --git a/upup/pkg/fi/cloudup/openstack/cloud.go b/upup/pkg/fi/cloudup/openstack/cloud.go index 405a7ea1d9..3fee96f5b7 100644 --- a/upup/pkg/fi/cloudup/openstack/cloud.go +++ b/upup/pkg/fi/cloudup/openstack/cloud.go @@ -25,7 +25,7 @@ import ( "github.com/gophercloud/gophercloud" os "github.com/gophercloud/gophercloud/openstack" - cinder "github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes" + cinder "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes" az "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs" @@ -355,9 +355,8 @@ func NewOpenstackCloud(tags map[string]string, spec *kops.ClusterSpec) (Openstac return nil, fmt.Errorf("error building openstack authenticated client: %v", err) } - //TODO: maybe try v2, and v3? - cinderClient, err := os.NewBlockStorageV2(provider, gophercloud.EndpointOpts{ - Type: "volumev2", + cinderClient, err := os.NewBlockStorageV3(provider, gophercloud.EndpointOpts{ + Type: "volumev3", Region: region, }) if err != nil { diff --git a/upup/pkg/fi/cloudup/openstack/status.go b/upup/pkg/fi/cloudup/openstack/status.go index 028ca7e3f8..ff07e6a261 100644 --- a/upup/pkg/fi/cloudup/openstack/status.go +++ b/upup/pkg/fi/cloudup/openstack/status.go @@ -33,7 +33,7 @@ import ( "fmt" "strings" - cinderv2 "github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes" + cinderv3 "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes" "k8s.io/klog" "k8s.io/kops/pkg/apis/kops" "k8s.io/kops/protokube/pkg/etcd" @@ -57,7 +57,7 @@ func (c *openstackCloud) FindClusterStatus(cluster *kops.Cluster) (*kops.Cluster func findEtcdStatus(c *openstackCloud, cluster *kops.Cluster) ([]kops.EtcdClusterStatus, error) { statusMap := make(map[string]*kops.EtcdClusterStatus) klog.V(2).Infof("Querying Openstack for etcd volumes") - opt := cinderv2.ListOpts{ + opt := cinderv3.ListOpts{ Metadata: c.tags, } volumes, err := c.ListVolumes(opt) diff --git a/upup/pkg/fi/cloudup/openstack/volume.go b/upup/pkg/fi/cloudup/openstack/volume.go index df66e80e02..1942c4d998 100644 --- a/upup/pkg/fi/cloudup/openstack/volume.go +++ b/upup/pkg/fi/cloudup/openstack/volume.go @@ -19,7 +19,7 @@ package openstack import ( "fmt" - cinder "github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes" + cinder "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/volumeattach" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/klog" diff --git a/upup/pkg/fi/cloudup/openstacktasks/BUILD.bazel b/upup/pkg/fi/cloudup/openstacktasks/BUILD.bazel index a843791b7b..0a7f6230f0 100644 --- a/upup/pkg/fi/cloudup/openstacktasks/BUILD.bazel +++ b/upup/pkg/fi/cloudup/openstacktasks/BUILD.bazel @@ -44,7 +44,7 @@ go_library( "//upup/pkg/fi/cloudup/openstack:go_default_library", "//util/pkg/vfs:go_default_library", "//vendor/github.com/gophercloud/gophercloud:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes:go_default_library", + "//vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips:go_default_library", "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs:go_default_library", diff --git a/upup/pkg/fi/cloudup/openstacktasks/volume.go b/upup/pkg/fi/cloudup/openstacktasks/volume.go index 6011ebdacc..26c573b78a 100644 --- a/upup/pkg/fi/cloudup/openstacktasks/volume.go +++ b/upup/pkg/fi/cloudup/openstacktasks/volume.go @@ -19,7 +19,7 @@ package openstacktasks import ( "fmt" - cinderv2 "github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes" + cinderv3 "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes" "k8s.io/klog" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/openstack" @@ -44,7 +44,7 @@ func (c *Volume) CompareWithID() *string { func (c *Volume) Find(context *fi.Context) (*Volume, error) { cloud := context.Cloud.(openstack.OpenstackCloud) - opt := cinderv2.ListOpts{ + opt := cinderv3.ListOpts{ Name: fi.StringValue(c.Name), Metadata: c.Tags, } @@ -126,7 +126,7 @@ func (_ *Volume) RenderOpenstack(t *openstack.OpenstackAPITarget, a, e, changes return fmt.Errorf("Failed to get storage availability zone: %s", err) } - opt := cinderv2.CreateOpts{ + opt := cinderv3.CreateOpts{ Size: int(*e.SizeGB), AvailabilityZone: storageAZ.ZoneName, Metadata: e.Tags, diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/doc.go b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/doc.go deleted file mode 100644 index 307b8b12d2..0000000000 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// 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 diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/BUILD.bazel b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/BUILD.bazel similarity index 89% rename from vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/BUILD.bazel rename to vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/BUILD.bazel index 89b5e67974..094a09ccd6 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/BUILD.bazel +++ b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/BUILD.bazel @@ -9,8 +9,8 @@ go_library( "urls.go", "util.go", ], - importmap = "k8s.io/kops/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes", - importpath = "github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes", + importmap = "k8s.io/kops/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes", + importpath = "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes", visibility = ["//visibility:public"], deps = [ "//vendor/github.com/gophercloud/gophercloud:go_default_library", diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/doc.go b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/doc.go new file mode 100644 index 0000000000..0b834852dd --- /dev/null +++ b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/doc.go @@ -0,0 +1,23 @@ +/* +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. + +Example to create a Volume from a Backup + + backupID := "20c792f0-bb03-434f-b653-06ef238e337e" + options := volumes.CreateOpts{ + Name: "vol-001", + BackupID: &backupID, + } + + client.Microversion = "3.47" + volume, err := volumes.Create(client, options).Extract() + if err != nil { + panic(err) + } + + fmt.Println(volume) +*/ +package volumes diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/requests.go b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/requests.go similarity index 95% rename from vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/requests.go rename to vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/requests.go index ed6d2aa9bc..609b545028 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/requests.go +++ b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/requests.go @@ -16,7 +16,7 @@ type CreateOptsBuilder interface { // see the Volume object. type CreateOpts struct { // The size of the volume, in GB - Size int `json:"size" required:"true"` + Size int `json:"size,omitempty"` // The availability zone AvailabilityZone string `json:"availability_zone,omitempty"` // ConsistencyGroupID is the ID of a consistency group @@ -36,8 +36,13 @@ type CreateOpts struct { // The ID of the image from which you want to create the volume. // Required to create a bootable volume. ImageID string `json:"imageRef,omitempty"` + // Specifies the backup ID, from which you want to create the volume. + // Create a volume from a backup is supported since 3.47 microversion + BackupID string `json:"backup_id,omitempty"` // The associated volume type VolumeType string `json:"volume_type,omitempty"` + // Multiattach denotes if the volume is multi-attach capable. + Multiattach bool `json:"multiattach,omitempty"` } // ToVolumeCreateMap assembles a request body based on the contents of a diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/results.go b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/results.go similarity index 86% rename from vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/results.go rename to vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/results.go index 96572b01b4..6f46685b6e 100644 --- a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/results.go +++ b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/results.go @@ -8,6 +8,7 @@ import ( "github.com/gophercloud/gophercloud/pagination" ) +// Attachment represents a Volume Attachment record type Attachment struct { AttachedAt time.Time `json:"-"` AttachmentID string `json:"attachment_id"` @@ -18,6 +19,7 @@ type Attachment struct { VolumeID string `json:"volume_id"` } +// UnmarshalJSON is our unmarshalling helper func (r *Attachment) UnmarshalJSON(b []byte) error { type tmp Attachment var s struct { @@ -61,6 +63,9 @@ type Volume struct { SnapshotID string `json:"snapshot_id"` // The ID of another block storage volume from which the current volume was created SourceVolID string `json:"source_volid"` + // The backup ID, from which the volume was restored + // This field is supported since 3.47 microversion + BackupID *string `json:"backup_id"` // 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. @@ -75,8 +80,11 @@ type Volume struct { ConsistencyGroupID string `json:"consistencygroup_id"` // Multiattach denotes if the volume is multi-attach capable. Multiattach bool `json:"multiattach"` + // Image metadata entries, only included for volumes that were created from an image, or from a snapshot of a volume originally created from an image. + VolumeImageMetadata map[string]string `json:"volume_image_metadata"` } +// UnmarshalJSON another unmarshalling function func (r *Volume) UnmarshalJSON(b []byte) error { type tmp Volume var s struct { @@ -107,13 +115,11 @@ func (r VolumePage) IsEmpty() (bool, error) { return len(volumes) == 0, err } -// NextPageURL uses the response's embedded link reference to navigate to the -// next page of results. -func (r VolumePage) NextPageURL() (string, error) { +func (page VolumePage) NextPageURL() (string, error) { var s struct { Links []gophercloud.Link `json:"volumes_links"` } - err := r.ExtractInto(&s) + err := page.ExtractInto(&s) if err != nil { return "", err } @@ -138,10 +144,12 @@ func (r commonResult) Extract() (*Volume, error) { 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") } diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/urls.go b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/urls.go similarity index 100% rename from vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/urls.go rename to vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/urls.go diff --git a/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/util.go b/vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/util.go similarity index 100% rename from vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes/util.go rename to vendor/github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes/util.go diff --git a/vendor/modules.txt b/vendor/modules.txt index d3ef994ccd..e0cf598d94 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -255,7 +255,7 @@ github.com/googleapis/gnostic/extensions github.com/gophercloud/gophercloud github.com/gophercloud/gophercloud/internal github.com/gophercloud/gophercloud/openstack -github.com/gophercloud/gophercloud/openstack/blockstorage/v2/volumes +github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips