mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-05-11 05:55:12 +00:00
255 lines
6.2 KiB
Go
255 lines
6.2 KiB
Go
package govultr
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/url"
|
|
"strconv"
|
|
)
|
|
|
|
// ObjectStorageService is the interface to interact with the object storage endpoints on the Vultr API.
|
|
// Link: https://www.vultr.com/api/#objectstorage
|
|
type ObjectStorageService interface {
|
|
Create(ctx context.Context, objectStoreClusterID int, Label string) (*struct{ ID int `json:"SUBID"` }, error)
|
|
Delete(ctx context.Context, id int) error
|
|
SetLabel(ctx context.Context, id int, label string) error
|
|
List(ctx context.Context, options *ObjectListOptions) ([]ObjectStorage, error)
|
|
Get(ctx context.Context, id int) (*ObjectStorage, error)
|
|
ListCluster(ctx context.Context) ([]ObjectStorageCluster, error)
|
|
RegenerateKeys(ctx context.Context, id int, s3AccessKey string) (*S3Keys, error)
|
|
}
|
|
|
|
// ObjectStorageServiceHandler handles interaction with the firewall rule methods for the Vultr API.
|
|
type ObjectStorageServiceHandler struct {
|
|
client *Client
|
|
}
|
|
|
|
// ObjectStorage represents a Vultr Object Storage subscription.
|
|
type ObjectStorage struct {
|
|
ID int `json:"SUBID"`
|
|
DateCreated string `json:"date_created"`
|
|
ObjectStoreClusterID int `json:"OBJSTORECLUSTERID"`
|
|
RegionID int `json:"DCID"`
|
|
Location string
|
|
Label string
|
|
Status string
|
|
S3Keys
|
|
}
|
|
|
|
// ObjectStorageCluster represents a Vultr Object Storage cluster.
|
|
type ObjectStorageCluster struct {
|
|
ObjectStoreClusterID int `json:"OBJSTORECLUSTERID"`
|
|
RegionID int `json:"DCID"`
|
|
Location string
|
|
Hostname string
|
|
Deploy string
|
|
}
|
|
|
|
// S3Keys define your api access to your cluster
|
|
type S3Keys struct {
|
|
S3Hostname string `json:"s3_hostname"`
|
|
S3AccessKey string `json:"s3_access_key"`
|
|
S3SecretKey string `json:"s3_secret_key"`
|
|
}
|
|
|
|
// ObjectListOptions are your optional params you have available to list data.
|
|
type ObjectListOptions struct {
|
|
IncludeS3 bool
|
|
Label string
|
|
}
|
|
|
|
// Create an object storage subscription
|
|
func (o *ObjectStorageServiceHandler) Create(ctx context.Context, objectStoreClusterID int, Label string) (*struct{ ID int `json:"SUBID"` }, error) {
|
|
uri := "/v1/objectstorage/create"
|
|
|
|
values := url.Values{
|
|
"OBJSTORECLUSTERID": {strconv.Itoa(objectStoreClusterID)},
|
|
"label": {Label},
|
|
}
|
|
|
|
req, err := o.client.NewRequest(ctx, http.MethodPost, uri, values)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
id := struct {
|
|
ID int `json:"SUBID"`
|
|
}{}
|
|
|
|
err = o.client.DoWithContext(ctx, req, &id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &id, nil
|
|
}
|
|
|
|
// Delete an object storage subscription.
|
|
func (o *ObjectStorageServiceHandler) Delete(ctx context.Context, id int) error {
|
|
uri := "/v1/objectstorage/destroy"
|
|
|
|
values := url.Values{
|
|
"SUBID": {strconv.Itoa(id)},
|
|
}
|
|
|
|
req, err := o.client.NewRequest(ctx, http.MethodPost, uri, values)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = o.client.DoWithContext(ctx, req, nil)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// SetLabel of an object storage subscription.
|
|
func (o *ObjectStorageServiceHandler) SetLabel(ctx context.Context, id int, label string) error {
|
|
uri := "/v1/objectstorage/label_set"
|
|
|
|
values := url.Values{
|
|
"SUBID": {strconv.Itoa(id)},
|
|
"label": {label},
|
|
}
|
|
|
|
req, err := o.client.NewRequest(ctx, http.MethodPost, uri, values)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = o.client.DoWithContext(ctx, req, nil)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// List returns all object storage subscriptions on the current account. This includes both pending and active subscriptions.
|
|
func (o *ObjectStorageServiceHandler) List(ctx context.Context, options *ObjectListOptions) ([]ObjectStorage, error) {
|
|
uri := "/v1/objectstorage/list"
|
|
|
|
req, err := o.client.NewRequest(ctx, http.MethodGet, uri, nil)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if options != nil {
|
|
q := req.URL.Query()
|
|
|
|
// default behavior is true
|
|
if options.IncludeS3 == false {
|
|
q.Add("include_s3", "false")
|
|
}
|
|
|
|
if options.Label != "" {
|
|
q.Add("label", options.Label)
|
|
}
|
|
|
|
req.URL.RawQuery = q.Encode()
|
|
}
|
|
|
|
var objectStorageMap map[string]ObjectStorage
|
|
|
|
err = o.client.DoWithContext(ctx, req, &objectStorageMap)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var objectStorages []ObjectStorage
|
|
|
|
for _, o := range objectStorageMap {
|
|
objectStorages = append(objectStorages, o)
|
|
}
|
|
|
|
return objectStorages, nil
|
|
}
|
|
|
|
// Get returns a specified object storage by the provided ID
|
|
func (o *ObjectStorageServiceHandler) Get(ctx context.Context, id int) (*ObjectStorage, error) {
|
|
uri := "/v1/objectstorage/list"
|
|
|
|
req, err := o.client.NewRequest(ctx, http.MethodGet, uri, nil)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if id != 0 {
|
|
q := req.URL.Query()
|
|
q.Add("SUBID", strconv.Itoa(id))
|
|
req.URL.RawQuery = q.Encode()
|
|
}
|
|
|
|
objectStorage := new(ObjectStorage)
|
|
|
|
err = o.client.DoWithContext(ctx, req, objectStorage)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return objectStorage, nil
|
|
}
|
|
|
|
// ListCluster returns back your object storage clusters.
|
|
// Clusters may be removed over time. The "deploy" field can be used to determine whether or not new deployments are allowed in the cluster.
|
|
func (o *ObjectStorageServiceHandler) ListCluster(ctx context.Context) ([]ObjectStorageCluster, error) {
|
|
uri := "/v1/objectstorage/list_cluster"
|
|
req, err := o.client.NewRequest(ctx, http.MethodGet, uri, nil)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var objectClusterMap map[string]ObjectStorageCluster
|
|
|
|
err = o.client.DoWithContext(ctx, req, &objectClusterMap)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var objectStorageCluster []ObjectStorageCluster
|
|
|
|
for _, o := range objectClusterMap {
|
|
objectStorageCluster = append(objectStorageCluster, o)
|
|
}
|
|
|
|
return objectStorageCluster, nil
|
|
}
|
|
|
|
// RegenerateKeys of the S3 API Keys for an object storage subscription
|
|
func (o *ObjectStorageServiceHandler) RegenerateKeys(ctx context.Context, id int, s3AccessKey string) (*S3Keys, error) {
|
|
uri := "/v1/objectstorage/s3key_regenerate"
|
|
|
|
values := url.Values{
|
|
"SUBID": {strconv.Itoa(id)},
|
|
"s3_access_key": {s3AccessKey},
|
|
}
|
|
|
|
req, err := o.client.NewRequest(ctx, http.MethodPost, uri, values)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
s3Keys := new(S3Keys)
|
|
err = o.client.DoWithContext(ctx, req, s3Keys)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return s3Keys, nil
|
|
}
|