77 lines
2.0 KiB
Go
77 lines
2.0 KiB
Go
package availabilityzones
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"github.com/gophercloud/gophercloud"
|
|
"github.com/gophercloud/gophercloud/pagination"
|
|
)
|
|
|
|
// ServerAvailabilityZoneExt is an extension to the base Server object.
|
|
type ServerAvailabilityZoneExt struct {
|
|
// AvailabilityZone is the availabilty zone the server is in.
|
|
AvailabilityZone string `json:"OS-EXT-AZ:availability_zone"`
|
|
}
|
|
|
|
// ServiceState represents the state of a service in an AvailabilityZone.
|
|
type ServiceState struct {
|
|
Active bool `json:"active"`
|
|
Available bool `json:"available"`
|
|
UpdatedAt time.Time `json:"-"`
|
|
}
|
|
|
|
// UnmarshalJSON to override default
|
|
func (r *ServiceState) UnmarshalJSON(b []byte) error {
|
|
type tmp ServiceState
|
|
var s struct {
|
|
tmp
|
|
UpdatedAt gophercloud.JSONRFC3339MilliNoZ `json:"updated_at"`
|
|
}
|
|
err := json.Unmarshal(b, &s)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*r = ServiceState(s.tmp)
|
|
|
|
r.UpdatedAt = time.Time(s.UpdatedAt)
|
|
|
|
return nil
|
|
}
|
|
|
|
// Services is a map of services contained in an AvailabilityZone.
|
|
type Services map[string]ServiceState
|
|
|
|
// Hosts is map of hosts/nodes contained in an AvailabilityZone.
|
|
// Each host can have multiple services.
|
|
type Hosts map[string]Services
|
|
|
|
// 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 {
|
|
Hosts Hosts `json:"hosts"`
|
|
// 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
|
|
}
|