forked from TrueCloudLab/lego
154 lines
3.7 KiB
Go
154 lines
3.7 KiB
Go
package govultr
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"strconv"
|
|
)
|
|
|
|
// RegionService is the interface to interact with Region endpoints on the Vultr API
|
|
// Link: https://www.vultr.com/api/#regions
|
|
type RegionService interface {
|
|
Availability(ctx context.Context, regionID int, planType string) ([]int, error)
|
|
BareMetalAvailability(ctx context.Context, regionID int) ([]int, error)
|
|
Vc2Availability(ctx context.Context, regionID int) ([]int, error)
|
|
Vdc2Availability(ctx context.Context, regionID int) ([]int, error)
|
|
List(ctx context.Context) ([]Region, error)
|
|
}
|
|
|
|
// RegionServiceHandler handles interaction with the region methods for the Vultr API
|
|
type RegionServiceHandler struct {
|
|
Client *Client
|
|
}
|
|
|
|
// Region represents a Vultr region
|
|
type Region struct {
|
|
RegionID string `json:"DCID"`
|
|
Name string `json:"name"`
|
|
Country string `json:"country"`
|
|
Continent string `json:"continent"`
|
|
State string `json:"state"`
|
|
Ddos bool `json:"ddos_protection"`
|
|
BlockStorage bool `json:"block_storage"`
|
|
RegionCode string `json:"regioncode"`
|
|
}
|
|
|
|
// Availability retrieves a list of the VPSPLANIDs currently available for a given location.
|
|
func (r *RegionServiceHandler) Availability(ctx context.Context, regionID int, planType string) ([]int, error) {
|
|
|
|
uri := "/v1/regions/availability"
|
|
|
|
req, err := r.Client.NewRequest(ctx, http.MethodGet, uri, nil)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
q := req.URL.Query()
|
|
q.Add("DCID", strconv.Itoa(regionID))
|
|
|
|
// Optional planType filter
|
|
if planType != "" {
|
|
q.Add("type", planType)
|
|
}
|
|
req.URL.RawQuery = q.Encode()
|
|
|
|
var regions []int
|
|
err = r.Client.DoWithContext(ctx, req, ®ions)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return regions, nil
|
|
}
|
|
|
|
// BareMetalAvailability retrieve a list of the METALPLANIDs currently available for a given location.
|
|
func (r *RegionServiceHandler) BareMetalAvailability(ctx context.Context, regionID int) ([]int, error) {
|
|
|
|
uri := "/v1/regions/availability_baremetal"
|
|
|
|
regions, err := r.instanceAvailability(ctx, uri, regionID)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return regions, nil
|
|
}
|
|
|
|
// Vc2Availability retrieve a list of the vc2 VPSPLANIDs currently available for a given location.
|
|
func (r *RegionServiceHandler) Vc2Availability(ctx context.Context, regionID int) ([]int, error) {
|
|
|
|
uri := "/v1/regions/availability_vc2"
|
|
|
|
regions, err := r.instanceAvailability(ctx, uri, regionID)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return regions, nil
|
|
}
|
|
|
|
// Vdc2Availability retrieves a list of the vdc2 VPSPLANIDs currently available for a given location.
|
|
func (r *RegionServiceHandler) Vdc2Availability(ctx context.Context, regionID int) ([]int, error) {
|
|
|
|
uri := "/v1/regions/availability_vdc2"
|
|
|
|
regions, err := r.instanceAvailability(ctx, uri, regionID)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return regions, nil
|
|
}
|
|
|
|
// List retrieves a list of all active regions
|
|
func (r *RegionServiceHandler) List(ctx context.Context) ([]Region, error) {
|
|
|
|
uri := "/v1/regions/list"
|
|
|
|
req, err := r.Client.NewRequest(ctx, http.MethodGet, uri, nil)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var regionsMap map[string]Region
|
|
err = r.Client.DoWithContext(ctx, req, ®ionsMap)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var region []Region
|
|
for _, r := range regionsMap {
|
|
region = append(region, r)
|
|
}
|
|
|
|
return region, nil
|
|
}
|
|
|
|
// instanceAvailability keeps the similar calls dry
|
|
func (r *RegionServiceHandler) instanceAvailability(ctx context.Context, uri string, regionID int) ([]int, error) {
|
|
req, err := r.Client.NewRequest(ctx, http.MethodGet, uri, nil)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
q := req.URL.Query()
|
|
q.Add("DCID", strconv.Itoa(regionID))
|
|
req.URL.RawQuery = q.Encode()
|
|
|
|
var regions []int
|
|
err = r.Client.DoWithContext(ctx, req, ®ions)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return regions, nil
|
|
}
|