128 lines
3.2 KiB
Go
128 lines
3.2 KiB
Go
/*
|
|
Package cloudapi interacts with the Cloud API (http://apidocs.joyent.com/cloudapi/).
|
|
|
|
Licensed under the Mozilla Public License version 2.0
|
|
|
|
Copyright (c) Joyent Inc.
|
|
*/
|
|
package cloudapi
|
|
|
|
import (
|
|
"net/http"
|
|
"net/url"
|
|
"path"
|
|
|
|
"github.com/joyent/gocommon/client"
|
|
jh "github.com/joyent/gocommon/http"
|
|
)
|
|
|
|
const (
|
|
// DefaultAPIVersion defines the default version of the Cloud API to use
|
|
DefaultAPIVersion = "~7.3"
|
|
|
|
// CloudAPI URL parts
|
|
apiKeys = "keys"
|
|
apiPackages = "packages"
|
|
apiImages = "images"
|
|
apiDatacenters = "datacenters"
|
|
apiMachines = "machines"
|
|
apiMetadata = "metadata"
|
|
apiSnapshots = "snapshots"
|
|
apiTags = "tags"
|
|
apiAnalytics = "analytics"
|
|
apiInstrumentations = "instrumentations"
|
|
apiInstrumentationsValue = "value"
|
|
apiInstrumentationsRaw = "raw"
|
|
apiInstrumentationsHeatmap = "heatmap"
|
|
apiInstrumentationsImage = "image"
|
|
apiInstrumentationsDetails = "details"
|
|
apiUsage = "usage"
|
|
apiAudit = "audit"
|
|
apiFirewallRules = "fwrules"
|
|
apiFirewallRulesEnable = "enable"
|
|
apiFirewallRulesDisable = "disable"
|
|
apiNetworks = "networks"
|
|
apiFabricVLANs = "fabrics/default/vlans"
|
|
apiFabricNetworks = "networks"
|
|
apiNICs = "nics"
|
|
apiServices = "services"
|
|
|
|
// CloudAPI actions
|
|
actionExport = "export"
|
|
actionStop = "stop"
|
|
actionStart = "start"
|
|
actionReboot = "reboot"
|
|
actionResize = "resize"
|
|
actionRename = "rename"
|
|
actionEnableFw = "enable_firewall"
|
|
actionDisableFw = "disable_firewall"
|
|
)
|
|
|
|
// Client provides a means to access the Joyent CloudAPI
|
|
type Client struct {
|
|
client client.Client
|
|
}
|
|
|
|
// New creates a new Client.
|
|
func New(client client.Client) *Client {
|
|
return &Client{client}
|
|
}
|
|
|
|
// Filter represents a filter that can be applied to an API request.
|
|
type Filter struct {
|
|
v url.Values
|
|
}
|
|
|
|
// NewFilter creates a new Filter.
|
|
func NewFilter() *Filter {
|
|
return &Filter{make(url.Values)}
|
|
}
|
|
|
|
// Set a value for the specified filter.
|
|
func (f *Filter) Set(filter, value string) {
|
|
f.v.Set(filter, value)
|
|
}
|
|
|
|
// Add a value for the specified filter.
|
|
func (f *Filter) Add(filter, value string) {
|
|
f.v.Add(filter, value)
|
|
}
|
|
|
|
// request represents an API request
|
|
type request struct {
|
|
method string
|
|
url string
|
|
filter *Filter
|
|
reqValue interface{}
|
|
reqHeader http.Header
|
|
resp interface{}
|
|
respHeader *http.Header
|
|
expectedStatus int
|
|
}
|
|
|
|
// Helper method to send an API request
|
|
func (c *Client) sendRequest(req request) (*jh.ResponseData, error) {
|
|
request := jh.RequestData{
|
|
ReqValue: req.reqValue,
|
|
ReqHeaders: req.reqHeader,
|
|
}
|
|
if req.filter != nil {
|
|
request.Params = &req.filter.v
|
|
}
|
|
if req.expectedStatus == 0 {
|
|
req.expectedStatus = http.StatusOK
|
|
}
|
|
respData := jh.ResponseData{
|
|
RespValue: req.resp,
|
|
RespHeaders: req.respHeader,
|
|
ExpectedStatus: []int{req.expectedStatus},
|
|
}
|
|
err := c.client.SendRequest(req.method, req.url, "", &request, &respData)
|
|
return &respData, err
|
|
}
|
|
|
|
// Helper method to create the API URL
|
|
func makeURL(parts ...string) string {
|
|
return path.Join(parts...)
|
|
}
|