packer-cn/vendor/github.com/profitbricks/profitbricks-sdk-go/server.go

207 lines
6.3 KiB
Go

package profitbricks
import (
"bytes"
"encoding/json"
"net/http"
)
type Server struct {
Id string `json:"id,omitempty"`
Type_ string `json:"type,omitempty"`
Href string `json:"href,omitempty"`
Metadata *Metadata `json:"metadata,omitempty"`
Properties ServerProperties `json:"properties,omitempty"`
Entities *ServerEntities `json:"entities,omitempty"`
Response string `json:"Response,omitempty"`
Headers *http.Header `json:"headers,omitempty"`
StatusCode int `json:"headers,omitempty"`
}
type ServerProperties struct {
Name string `json:"name,omitempty"`
Cores int `json:"cores,omitempty"`
Ram int `json:"ram,omitempty"`
AvailabilityZone string `json:"availabilityZone,omitempty"`
VmState string `json:"vmState,omitempty"`
BootCdrom *ResourceReference `json:"bootCdrom,omitempty"`
BootVolume *ResourceReference `json:"bootVolume,omitempty"`
CpuFamily string `json:"cpuFamily,omitempty"`
}
type ServerEntities struct {
Cdroms *Cdroms `json:"cdroms,omitempty"`
Volumes *Volumes `json:"volumes,omitempty"`
Nics *Nics `json:"nics,omitempty"`
}
type Servers struct {
Id string `json:"id,omitempty"`
Type_ string `json:"type,omitempty"`
Href string `json:"href,omitempty"`
Items []Server `json:"items,omitempty"`
Response string `json:"Response,omitempty"`
Headers *http.Header `json:"headers,omitempty"`
StatusCode int `json:"headers,omitempty"`
}
type ResourceReference struct {
Id string `json:"id,omitempty"`
Type_ string `json:"type,omitempty"`
Href string `json:"href,omitempty"`
}
type CreateServerRequest struct {
ServerProperties `json:"properties"`
}
// ListServers returns a server struct collection
func ListServers(dcid string) Servers {
path := server_col_path(dcid)
url := mk_url(path) + `?depth=` + Depth
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Content-Type", FullHeader)
resp := do(req)
return toServers(resp)
}
// CreateServer creates a server from a jason []byte and returns a Instance struct
func CreateServer(dcid string, server Server) Server {
obj, _ := json.Marshal(server)
path := server_col_path(dcid)
url := mk_url(path) + `?depth=` + Depth
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(obj))
req.Header.Add("Content-Type", FullHeader)
return toServer(do(req))
}
// GetServer pulls data for the server where id = srvid returns a Instance struct
func GetServer(dcid, srvid string) Server {
path := server_path(dcid, srvid)
url := mk_url(path) + `?depth=` + Depth
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Content-Type", FullHeader)
return toServer(do(req))
}
// PatchServer partial update of server properties passed in as jason []byte
// Returns Instance struct
func PatchServer(dcid string, srvid string, props ServerProperties) Server {
jason, _ := json.Marshal(props)
path := server_path(dcid, srvid)
url := mk_url(path) + `?depth=` + Depth
req, _ := http.NewRequest("PATCH", url, bytes.NewBuffer(jason))
req.Header.Add("Content-Type", PatchHeader)
return toServer(do(req))
}
// DeleteServer deletes the server where id=srvid and returns Resp struct
func DeleteServer(dcid, srvid string) Resp {
path := server_path(dcid, srvid)
return is_delete(path)
}
func ListAttachedCdroms(dcid, srvid string) Images {
path := server_cdrom_col_path(dcid, srvid)
url := mk_url(path) + `?depth=` + Depth
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Content-Type", FullHeader)
return toImages(do(req))
}
func AttachCdrom(dcid string, srvid string, cdid string) Image {
jason := []byte(`{"id":"` + cdid + `"}`)
path := server_cdrom_col_path(dcid, srvid)
url := mk_url(path) + `?depth=` + Depth
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jason))
req.Header.Add("Content-Type", FullHeader)
return toImage(do(req))
}
func GetAttachedCdrom(dcid, srvid, cdid string) Volume {
path := server_cdrom_path(dcid, srvid, cdid)
url := mk_url(path) + `?depth=` + Depth
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Content-Type", FullHeader)
return toVolume(do(req))
}
func DetachCdrom(dcid, srvid, cdid string) Resp {
path := server_cdrom_path(dcid, srvid, cdid)
return is_delete(path)
}
func ListAttachedVolumes(dcid, srvid string) Volumes {
path := server_volume_col_path(dcid, srvid)
url := mk_url(path) + `?depth=` + Depth
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Content-Type", FullHeader)
resp := do(req)
return toVolumes(resp)
}
func AttachVolume(dcid string, srvid string, volid string) Volume {
jason := []byte(`{"id":"` + volid + `"}`)
path := server_volume_col_path(dcid, srvid)
url := mk_url(path) + `?depth=` + Depth
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jason))
req.Header.Add("Content-Type", FullHeader)
return toVolume(do(req))
}
func GetAttachedVolume(dcid, srvid, volid string) Volume {
path := server_volume_path(dcid, srvid, volid)
url := mk_url(path) + `?depth=` + Depth
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Content-Type", FullHeader)
resp := do(req)
return toVolume(resp)
}
func DetachVolume(dcid, srvid, volid string) Resp {
path := server_volume_path(dcid, srvid, volid)
return is_delete(path)
}
// StartServer starts a server
func StartServer(dcid, srvid string) Resp {
return server_command(dcid, srvid, "start")
}
// StopServer stops a server
func StopServer(dcid, srvid string) Resp {
return server_command(dcid, srvid, "stop")
}
// RebootServer reboots a server
func RebootServer(dcid, srvid string) Resp {
return server_command(dcid, srvid, "reboot")
}
// server_command is a generic function for running server commands
func server_command(dcid, srvid, cmd string) Resp {
jason := `
{}
`
path := server_command_path(dcid, srvid, cmd)
return is_command(path, jason)
}
func toServer(resp Resp) Server {
var server Server
json.Unmarshal(resp.Body, &server)
server.Response = string(resp.Body)
server.Headers = &resp.Headers
server.StatusCode = resp.StatusCode
return server
}
func toServers(resp Resp) Servers {
var col Servers
json.Unmarshal(resp.Body, &col)
col.Response = string(resp.Body)
col.Headers = &resp.Headers
col.StatusCode = resp.StatusCode
return col
}