packer-cn/vendor/github.com/1and1/oneandone-cloudserver-sdk-go/oneandone.go

164 lines
3.9 KiB
Go

package oneandone
import (
"errors"
"net/http"
"reflect"
"time"
)
// Struct to hold the required information for accessing the API.
//
// Instances of this type contain the URL of the endpoint to access the API as well as the API access token to be used.
// They offer also all methods that allow to access the various objects that are returned by top level resources of
// the API.
type API struct {
Endpoint string
Client *restClient
}
type ApiPtr struct {
api *API
}
type idField struct {
Id string `json:"id,omitempty"`
}
type typeField struct {
Type string `json:"type,omitempty"`
}
type nameField struct {
Name string `json:"name,omitempty"`
}
type descField struct {
Description string `json:"description,omitempty"`
}
type countField struct {
Count int `json:"count,omitempty"`
}
type serverIps struct {
ServerIps []string `json:"server_ips"`
}
type servers struct {
Servers []string `json:"servers"`
}
type ApiInstance interface {
GetState() (string, error)
}
const (
datacenterPathSegment = "datacenters"
dvdIsoPathSegment = "dvd_isos"
firewallPolicyPathSegment = "firewall_policies"
imagePathSegment = "images"
loadBalancerPathSegment = "load_balancers"
logPathSegment = "logs"
monitorCenterPathSegment = "monitoring_center"
monitorPolicyPathSegment = "monitoring_policies"
pingPathSegment = "ping"
pingAuthPathSegment = "ping_auth"
pricingPathSegment = "pricing"
privateNetworkPathSegment = "private_networks"
publicIpPathSegment = "public_ips"
rolePathSegment = "roles"
serverPathSegment = "servers"
serverAppliancePathSegment = "server_appliances"
sharedStoragePathSegment = "shared_storages"
usagePathSegment = "usages"
userPathSegment = "users"
vpnPathSegment = "vpns"
)
// Struct to hold the status of an API object.
//
// Values of this type are used to represent the status of API objects like servers, firewall policies and the like.
//
// The value of the "State" field can represent fixed states like "ACTIVE" or "POWERED_ON" but also transitional
// states like "POWERING_ON" or "CONFIGURING".
//
// For fixed states the "Percent" field is empty where as for transitional states it contains the progress of the
// transition in percent.
type Status struct {
State string `json:"state"`
Percent int `json:"percent"`
}
type statusState struct {
State string `json:"state,omitempty"`
}
type Identity struct {
idField
nameField
}
type License struct {
nameField
}
// Creates a new API instance.
//
// Explanations about given token and url information can be found online under the following url TODO add url!
func New(token string, url string) *API {
api := new(API)
api.Endpoint = url
api.Client = newRestClient(token)
return api
}
// Converts a given integer value into a pointer of the same type.
func Int2Pointer(input int) *int {
result := new(int)
*result = input
return result
}
// Converts a given boolean value into a pointer of the same type.
func Bool2Pointer(input bool) *bool {
result := new(bool)
*result = input
return result
}
// Performs busy-waiting for types that implement ApiInstance interface.
func (api *API) WaitForState(in ApiInstance, state string, sec time.Duration, count int) error {
if in != nil {
for i := 0; i < count; i++ {
s, err := in.GetState()
if err != nil {
return err
}
if s == state {
return nil
}
time.Sleep(sec * time.Second)
}
return errors.New(reflect.ValueOf(in).Type().String() + " operation timeout.")
}
return nil
}
// Waits until instance is deleted for types that implement ApiInstance interface.
func (api *API) WaitUntilDeleted(in ApiInstance) error {
var err error
for in != nil {
_, err = in.GetState()
if err != nil {
if apiError, ok := err.(apiError); ok && apiError.httpStatusCode == http.StatusNotFound {
return nil
} else {
return err
}
}
time.Sleep(5 * time.Second)
}
return nil
}