2017-01-18 15:43:09 +01:00
|
|
|
package profitbricks
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
|
|
|
"net/http"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Volume struct {
|
|
|
|
Id string `json:"id,omitempty"`
|
|
|
|
Type_ string `json:"type,omitempty"`
|
|
|
|
Href string `json:"href,omitempty"`
|
|
|
|
Metadata *DatacenterElementMetadata `json:"metadata,omitempty"`
|
|
|
|
Properties VolumeProperties `json:"properties,omitempty"`
|
|
|
|
Response string `json:"Response,omitempty"`
|
|
|
|
Headers *http.Header `json:"headers,omitempty"`
|
|
|
|
StatusCode int `json:"headers,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type VolumeProperties struct {
|
|
|
|
Name string `json:"name,omitempty"`
|
|
|
|
Type string `json:"type,omitempty"`
|
|
|
|
Size int `json:"size,omitempty"`
|
2017-02-02 14:26:14 +01:00
|
|
|
AvailabilityZone string `json:"availabilityZone,omitempty"`
|
2017-01-18 15:43:09 +01:00
|
|
|
Image string `json:"image,omitempty"`
|
|
|
|
ImagePassword string `json:"imagePassword,omitempty"`
|
|
|
|
SshKeys []string `json:"sshKeys,omitempty"`
|
|
|
|
Bus string `json:"bus,omitempty"`
|
|
|
|
LicenceType string `json:"licenceType,omitempty"`
|
|
|
|
CpuHotPlug bool `json:"cpuHotPlug,omitempty"`
|
|
|
|
CpuHotUnplug bool `json:"cpuHotUnplug,omitempty"`
|
|
|
|
RamHotPlug bool `json:"ramHotPlug,omitempty"`
|
|
|
|
RamHotUnplug bool `json:"ramHotUnplug,omitempty"`
|
|
|
|
NicHotPlug bool `json:"nicHotPlug,omitempty"`
|
|
|
|
NicHotUnplug bool `json:"nicHotUnplug,omitempty"`
|
|
|
|
DiscVirtioHotPlug bool `json:"discVirtioHotPlug,omitempty"`
|
|
|
|
DiscVirtioHotUnplug bool `json:"discVirtioHotUnplug,omitempty"`
|
|
|
|
DiscScsiHotPlug bool `json:"discScsiHotPlug,omitempty"`
|
|
|
|
DiscScsiHotUnplug bool `json:"discScsiHotUnplug,omitempty"`
|
|
|
|
DeviceNumber int64 `json:"deviceNumber,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type Volumes struct {
|
|
|
|
Id string `json:"id,omitempty"`
|
|
|
|
Type_ string `json:"type,omitempty"`
|
|
|
|
Href string `json:"href,omitempty"`
|
|
|
|
Items []Volume `json:"items,omitempty"`
|
|
|
|
Response string `json:"Response,omitempty"`
|
|
|
|
Headers *http.Header `json:"headers,omitempty"`
|
|
|
|
StatusCode int `json:"headers,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type CreateVolumeRequest struct {
|
|
|
|
VolumeProperties `json:"properties"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// ListVolumes returns a Collection struct for volumes in the Datacenter
|
|
|
|
func ListVolumes(dcid string) Volumes {
|
|
|
|
path := volume_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 toVolumes(resp)
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetVolume(dcid string, volumeId string) Volume {
|
|
|
|
path := volume_path(dcid, volumeId)
|
|
|
|
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 PatchVolume(dcid string, volid string, request VolumeProperties) Volume {
|
|
|
|
obj, _ := json.Marshal(request)
|
|
|
|
path := volume_path(dcid, volid)
|
|
|
|
url := mk_url(path) + `?depth=` + Depth
|
|
|
|
req, _ := http.NewRequest("PATCH", url, bytes.NewBuffer(obj))
|
|
|
|
req.Header.Add("Content-Type", PatchHeader)
|
|
|
|
return toVolume(do(req))
|
|
|
|
}
|
|
|
|
|
|
|
|
func CreateVolume(dcid string, request Volume) Volume {
|
|
|
|
obj, _ := json.Marshal(request)
|
|
|
|
path := volume_col_path(dcid)
|
|
|
|
url := mk_url(path) + `?depth=` + Depth
|
|
|
|
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(obj))
|
|
|
|
req.Header.Add("Content-Type", FullHeader)
|
|
|
|
return toVolume(do(req))
|
|
|
|
}
|
|
|
|
|
|
|
|
func DeleteVolume(dcid, volid string) Resp {
|
|
|
|
path := volume_path(dcid, volid)
|
|
|
|
return is_delete(path)
|
|
|
|
}
|
|
|
|
|
|
|
|
func CreateSnapshot(dcid string, volid string, name string) Snapshot {
|
|
|
|
var path = volume_path(dcid, volid)
|
|
|
|
path = path + "/create-snapshot"
|
|
|
|
url := mk_url(path)
|
|
|
|
body := json.RawMessage("name=" + name)
|
|
|
|
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(body))
|
|
|
|
req.Header.Add("Content-Type", CommandHeader)
|
|
|
|
return toSnapshot(do(req))
|
|
|
|
}
|
|
|
|
|
|
|
|
func RestoreSnapshot(dcid string, volid string, snapshotId string) Resp {
|
|
|
|
var path = volume_path(dcid, volid)
|
|
|
|
path = path + "/restore-snapshot"
|
|
|
|
|
|
|
|
return is_command(path, "snapshotId="+snapshotId)
|
|
|
|
}
|
|
|
|
|
|
|
|
func toVolume(resp Resp) Volume {
|
|
|
|
var server Volume
|
|
|
|
json.Unmarshal(resp.Body, &server)
|
|
|
|
server.Response = string(resp.Body)
|
|
|
|
server.Headers = &resp.Headers
|
|
|
|
server.StatusCode = resp.StatusCode
|
|
|
|
return server
|
|
|
|
}
|
|
|
|
|
|
|
|
func toVolumes(resp Resp) Volumes {
|
|
|
|
var col Volumes
|
|
|
|
json.Unmarshal(resp.Body, &col)
|
|
|
|
col.Response = string(resp.Body)
|
|
|
|
col.Headers = &resp.Headers
|
|
|
|
col.StatusCode = resp.StatusCode
|
|
|
|
return col
|
|
|
|
}
|