Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add availabilityzones extension for blockstorage #2135

Merged
merged 1 commit into from
Apr 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions openstack/blockstorage/extensions/availabilityzones/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
Package availabilityzones provides the ability to get lists of
available volume availability zones.

Example of Get Availability Zone Information

allPages, err := availabilityzones.List(volumeClient).AllPages()
if err != nil {
panic(err)
}

availabilityZoneInfo, err := availabilityzones.ExtractAvailabilityZones(allPages)
if err != nil {
panic(err)
}

for _, zoneInfo := range availabilityZoneInfo {
fmt.Printf("%+v\n", zoneInfo)
}
*/
package availabilityzones
13 changes: 13 additions & 0 deletions openstack/blockstorage/extensions/availabilityzones/requests.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package availabilityzones

import (
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/pagination"
)

// List will return the existing availability zones.
func List(client *gophercloud.ServiceClient) pagination.Pager {
return pagination.NewPager(client, listURL(client), func(r pagination.PageResult) pagination.Page {
return AvailabilityZonePage{pagination.SinglePageBase(r)}
})
}
33 changes: 33 additions & 0 deletions openstack/blockstorage/extensions/availabilityzones/results.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package availabilityzones

import (
"github.com/gophercloud/gophercloud/pagination"
)

// ZoneState represents the current state of the availability zone.
type ZoneState struct {
// Returns true if the availability zone is available
Available bool `json:"available"`
}

// AvailabilityZone contains all the information associated with an OpenStack
// AvailabilityZone.
type AvailabilityZone struct {
// The availability zone name
ZoneName string `json:"zoneName"`
ZoneState ZoneState `json:"zoneState"`
}

type AvailabilityZonePage struct {
pagination.SinglePageBase
}

// ExtractAvailabilityZones returns a slice of AvailabilityZones contained in a
// single page of results.
func ExtractAvailabilityZones(r pagination.Page) ([]AvailabilityZone, error) {
var s struct {
AvailabilityZoneInfo []AvailabilityZone `json:"availabilityZoneInfo"`
}
err := (r.(AvailabilityZonePage)).ExtractInto(&s)
return s.AvailabilityZoneInfo, err
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// availabilityzones unittests
package testing
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package testing

import (
"fmt"
"net/http"
"testing"

az "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/availabilityzones"
th "github.com/gophercloud/gophercloud/testhelper"
"github.com/gophercloud/gophercloud/testhelper/client"
)

const GetOutput = `
{
"availabilityZoneInfo": [
{
"zoneName": "internal",
"zoneState": {
"available": true
}
},
{
"zoneName": "nova",
"zoneState": {
"available": true
}
}
]
}`

var AZResult = []az.AvailabilityZone{
{
ZoneName: "internal",
ZoneState: az.ZoneState{Available: true},
},
{
ZoneName: "nova",
ZoneState: az.ZoneState{Available: true},
},
}

// HandleGetSuccessfully configures the test server to respond to a Get request
// for availability zone information.
func HandleGetSuccessfully(t *testing.T) {
th.Mux.HandleFunc("/os-availability-zone", func(w http.ResponseWriter, r *http.Request) {
th.TestMethod(t, r, "GET")
th.TestHeader(t, r, "X-Auth-Token", client.TokenID)

w.Header().Add("Content-Type", "application/json")
fmt.Fprintf(w, GetOutput)
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package testing

import (
"testing"

az "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/availabilityzones"
th "github.com/gophercloud/gophercloud/testhelper"
"github.com/gophercloud/gophercloud/testhelper/client"
)

// Verifies that availability zones can be listed correctly
func TestList(t *testing.T) {
th.SetupHTTP()
defer th.TeardownHTTP()

HandleGetSuccessfully(t)

allPages, err := az.List(client.ServiceClient()).AllPages()
th.AssertNoErr(t, err)

actual, err := az.ExtractAvailabilityZones(allPages)
th.AssertNoErr(t, err)

th.CheckDeepEquals(t, AZResult, actual)
}
7 changes: 7 additions & 0 deletions openstack/blockstorage/extensions/availabilityzones/urls.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package availabilityzones

import "github.com/gophercloud/gophercloud"

func listURL(c *gophercloud.ServiceClient) string {
return c.ServiceURL("os-availability-zone")
}