127 lines
3.2 KiB
Go
127 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"
|
||
|
|
||
|
// 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...)
|
||
|
}
|