godep/exoscale: update egoscale

Signed-off-by: Vincent Bernat <Vincent.Bernat@exoscale.ch>
This commit is contained in:
Vincent Bernat 2015-05-20 10:54:10 +02:00
parent 1f4502e3e0
commit b35ad0d322
8 changed files with 353 additions and 312 deletions

2
Godeps/Godeps.json generated
View File

@ -132,7 +132,7 @@
}, },
{ {
"ImportPath": "github.com/pyr/egoscale/src/egoscale", "ImportPath": "github.com/pyr/egoscale/src/egoscale",
"Rev": "8bdfe1d0420634bdd37d73d00d51f86f8d08e481" "Rev": "5759f42eb6041d8dbf837a642e6c061c2bb62f47"
}, },
{ {
"ImportPath": "github.com/tent/http-link-go", "ImportPath": "github.com/tent/http-link-go",

View File

@ -2,8 +2,8 @@ package egoscale
import ( import (
"encoding/json" "encoding/json"
"net/url"
"fmt" "fmt"
"net/url"
) )
func (exo *Client) CreateEgressRule(rule SecurityGroupRule) (*AuthorizeSecurityGroupEgressResponse, error) { func (exo *Client) CreateEgressRule(rule SecurityGroupRule) (*AuthorizeSecurityGroupEgressResponse, error) {
@ -16,7 +16,7 @@ func (exo *Client) CreateEgressRule(rule SecurityGroupRule) (*AuthorizeSecurityG
if rule.Protocol == "ICMP" { if rule.Protocol == "ICMP" {
params.Set("icmpcode", fmt.Sprintf("%d", rule.IcmpCode)) params.Set("icmpcode", fmt.Sprintf("%d", rule.IcmpCode))
params.Set("icmptype", fmt.Sprintf("%d", rule.IcmpType)) params.Set("icmptype", fmt.Sprintf("%d", rule.IcmpType))
} else if (rule.Protocol == "TCP" || rule.Protocol == "UDP") { } else if rule.Protocol == "TCP" || rule.Protocol == "UDP" {
params.Set("startport", fmt.Sprintf("%d", rule.Port)) params.Set("startport", fmt.Sprintf("%d", rule.Port))
params.Set("endport", fmt.Sprintf("%d", rule.Port)) params.Set("endport", fmt.Sprintf("%d", rule.Port))
} else { } else {
@ -46,7 +46,7 @@ func (exo *Client) CreateIngressRule(rule SecurityGroupRule) (*AuthorizeSecurity
if rule.Protocol == "ICMP" { if rule.Protocol == "ICMP" {
params.Set("icmpcode", fmt.Sprintf("%d", rule.IcmpCode)) params.Set("icmpcode", fmt.Sprintf("%d", rule.IcmpCode))
params.Set("icmptype", fmt.Sprintf("%d", rule.IcmpType)) params.Set("icmptype", fmt.Sprintf("%d", rule.IcmpType))
} else if (rule.Protocol == "TCP" || rule.Protocol == "UDP") { } else if rule.Protocol == "TCP" || rule.Protocol == "UDP" {
params.Set("startport", fmt.Sprintf("%d", rule.Port)) params.Set("startport", fmt.Sprintf("%d", rule.Port))
params.Set("endport", fmt.Sprintf("%d", rule.Port)) params.Set("endport", fmt.Sprintf("%d", rule.Port))
} else { } else {
@ -85,18 +85,18 @@ func (exo *Client) CreateSecurityGroupWithRules(name string, ingress []SecurityG
sgid := r.Wrapped.Id sgid := r.Wrapped.Id
for _, erule := range(egress) { for _, erule := range egress {
erule.SecurityGroupId = sgid erule.SecurityGroupId = sgid
_, err = exo.CreateEgressRule(erule) _, err = exo.CreateEgressRule(erule)
if (err != nil) { if err != nil {
return nil, err return nil, err
} }
} }
for _, inrule := range(ingress) { for _, inrule := range ingress {
inrule.SecurityGroupId = sgid inrule.SecurityGroupId = sgid
_, err = exo.CreateIngressRule(inrule) _, err = exo.CreateIngressRule(inrule)
if (err != nil) { if err != nil {
return nil, err return nil, err
} }
} }

View File

@ -1,20 +1,20 @@
package egoscale package egoscale
import ( import (
"net/http"
"crypto/tls" "crypto/tls"
"net/http"
) )
func NewClient(endpoint string, apiKey string, apiSecret string) *Client { func NewClient(endpoint string, apiKey string, apiSecret string) *Client {
cs := &Client { cs := &Client{
client: &http.Client { client: &http.Client{
Transport: &http.Transport { Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment, Proxy: http.ProxyFromEnvironment,
TLSClientConfig: &tls.Config { InsecureSkipVerify: false }, TLSClientConfig: &tls.Config{InsecureSkipVerify: false},
}, },
}, },
endpoint: endpoint, endpoint: endpoint,
apiKey: apiKey, apiKey: apiKey,
apiSecret: apiSecret, apiSecret: apiSecret,
} }
return cs return cs

View File

@ -21,3 +21,21 @@ func (exo *Client) CreateKeypair(name string) (*CreateSSHKeyPairResponse, error)
return &r.Wrapped, nil return &r.Wrapped, nil
} }
func (exo *Client) DeleteKeypair(name string) (*StandardResponse, error) {
params := url.Values{}
params.Set("name", name)
resp, err := exo.Request("deleteSSHKeyPair", params)
if err != nil {
return nil, err
}
var r StandardResponse
if err := json.Unmarshal(resp, &r); err != nil {
return nil, err
}
return &r, nil
}

View File

@ -23,7 +23,7 @@ func rawValue(b json.RawMessage) (json.RawMessage, error) {
return nil, fmt.Errorf("Unable to extract raw value from:\n\n%s\n\n", string(b)) return nil, fmt.Errorf("Unable to extract raw value from:\n\n%s\n\n", string(b))
} }
func (exo *Client) Request (command string, params url.Values) (json.RawMessage, error) { func (exo *Client) Request(command string, params url.Values) (json.RawMessage, error) {
mac := hmac.New(sha1.New, []byte(exo.apiSecret)) mac := hmac.New(sha1.New, []byte(exo.apiSecret))

View File

@ -2,10 +2,10 @@ package egoscale
import ( import (
"encoding/json" "encoding/json"
"net/url"
"strings"
"fmt" "fmt"
"net/url"
"regexp" "regexp"
"strings"
) )
func (exo *Client) GetSecurityGroups() (map[string]string, error) { func (exo *Client) GetSecurityGroups() (map[string]string, error) {
@ -23,7 +23,7 @@ func (exo *Client) GetSecurityGroups() (map[string]string, error) {
} }
sgs = make(map[string]string) sgs = make(map[string]string)
for _, sg := range(r.SecurityGroups) { for _, sg := range r.SecurityGroups {
sgs[sg.Name] = sg.Id sgs[sg.Name] = sg.Id
} }
return sgs, nil return sgs, nil
@ -44,7 +44,7 @@ func (exo *Client) GetZones() (map[string]string, error) {
} }
zones = make(map[string]string) zones = make(map[string]string)
for _, zone := range(r.Zones) { for _, zone := range r.Zones {
zones[zone.Name] = zone.Id zones[zone.Name] = zone.Id
} }
return zones, nil return zones, nil
@ -66,7 +66,7 @@ func (exo *Client) GetProfiles() (map[string]string, error) {
} }
profiles = make(map[string]string) profiles = make(map[string]string)
for _, offering := range(r.ServiceOfferings) { for _, offering := range r.ServiceOfferings {
profiles[strings.ToLower(offering.Name)] = offering.Id profiles[strings.ToLower(offering.Name)] = offering.Id
} }
@ -90,7 +90,7 @@ func (exo *Client) GetKeypairs() ([]string, error) {
} }
keypairs = make([]string, r.Count, r.Count) keypairs = make([]string, r.Count, r.Count)
for i, keypair := range(r.SSHKeyPairs) { for i, keypair := range r.SSHKeyPairs {
keypairs[i] = keypair.Name keypairs[i] = keypair.Name
} }
return keypairs, nil return keypairs, nil
@ -115,7 +115,7 @@ func (exo *Client) GetImages() (map[string]map[int]string, error) {
} }
re := regexp.MustCompile(`^Linux (?P<name>Ubuntu|Debian) (?P<version>[0-9.]+).*$`) re := regexp.MustCompile(`^Linux (?P<name>Ubuntu|Debian) (?P<version>[0-9.]+).*$`)
for _, template := range(r.Templates) { for _, template := range r.Templates {
size := template.Size / (1024 * 1024 * 1024) size := template.Size / (1024 * 1024 * 1024)
submatch := re.FindStringSubmatch(template.Name) submatch := re.FindStringSubmatch(template.Name)
if len(submatch) > 0 { if len(submatch) > 0 {
@ -124,7 +124,7 @@ func (exo *Client) GetImages() (map[string]map[int]string, error) {
image := fmt.Sprintf("%s-%s", name, version) image := fmt.Sprintf("%s-%s", name, version)
_, present := images[image] _, present := images[image]
if (!present) { if !present {
images[image] = make(map[int]string) images[image] = make(map[int]string)
} }
images[image][size] = template.Id images[image][size] = template.Id
@ -138,31 +138,31 @@ func (exo *Client) GetImages() (map[string]map[int]string, error) {
func (exo *Client) GetTopology() (*Topology, error) { func (exo *Client) GetTopology() (*Topology, error) {
zones, err := exo.GetZones() zones, err := exo.GetZones()
if (err != nil) { if err != nil {
return nil, err return nil, err
} }
images, err := exo.GetImages() images, err := exo.GetImages()
if (err != nil) { if err != nil {
return nil, err return nil, err
} }
groups, err := exo.GetSecurityGroups() groups, err := exo.GetSecurityGroups()
if (err != nil) { if err != nil {
return nil, err return nil, err
} }
keypairs, err := exo.GetKeypairs() keypairs, err := exo.GetKeypairs()
if (err != nil) { if err != nil {
return nil, err return nil, err
} }
profiles, err := exo.GetProfiles() profiles, err := exo.GetProfiles()
if (err != nil) { if err != nil {
return nil, err return nil, err
} }
topo := &Topology{ topo := &Topology{
Zones: zones, Zones: zones,
Profiles: profiles, Profiles: profiles,
Images: images, Images: images,
Keypairs: keypairs, Keypairs: keypairs,
SecurityGroups: groups, SecurityGroups: groups,
} }

View File

@ -1,205 +1,208 @@
package egoscale package egoscale
import ( import (
"net/http"
"encoding/json" "encoding/json"
"net/http"
) )
type Client struct { type Client struct {
client *http.Client client *http.Client
endpoint string endpoint string
apiKey string apiKey string
apiSecret string apiSecret string
} }
type Error struct { type Error struct {
ErrorCode int `json:"errorcode"` ErrorCode int `json:"errorcode"`
CSErrorCode int `json:"cserrorcode"` CSErrorCode int `json:"cserrorcode"`
ErrorText string `json:"errortext"` ErrorText string `json:"errortext"`
}
type StandardResponse struct {
Success string `json:"success"`
DisplayText string `json:"displaytext"`
} }
type Topology struct { type Topology struct {
Zones map[string]string Zones map[string]string
Images map[string]map[int]string Images map[string]map[int]string
Profiles map[string]string Profiles map[string]string
Keypairs []string Keypairs []string
SecurityGroups map[string]string SecurityGroups map[string]string
} }
type SecurityGroupRule struct { type SecurityGroupRule struct {
Cidr string Cidr string
IcmpType int IcmpType int
IcmpCode int IcmpCode int
Port int Port int
Protocol string Protocol string
SecurityGroupId string SecurityGroupId string
} }
type MachineProfile struct { type MachineProfile struct {
Name string Name string
SecurityGroups []string SecurityGroups []string
Keypair string Keypair string
Userdata string Userdata string
ServiceOffering string ServiceOffering string
Template string Template string
Zone string Zone string
} }
type ListZonesResponse struct { type ListZonesResponse struct {
Count int `json:"count"` Count int `json:"count"`
Zones []*Zone `json:"zone"` Zones []*Zone `json:"zone"`
} }
type Zone struct { type Zone struct {
Allocationstate string `json:"allocationstate,omitempty"` Allocationstate string `json:"allocationstate,omitempty"`
Description string `json:"description,omitempty"` Description string `json:"description,omitempty"`
Displaytext string `json:"displaytext,omitempty"` Displaytext string `json:"displaytext,omitempty"`
Domain string `json:"domain,omitempty"` Domain string `json:"domain,omitempty"`
Domainid string `json:"domainid,omitempty"` Domainid string `json:"domainid,omitempty"`
Domainname string `json:"domainname,omitempty"` Domainname string `json:"domainname,omitempty"`
Id string `json:"id,omitempty"` Id string `json:"id,omitempty"`
Internaldns1 string `json:"internaldns1,omitempty"` Internaldns1 string `json:"internaldns1,omitempty"`
Internaldns2 string `json:"internaldns2,omitempty"` Internaldns2 string `json:"internaldns2,omitempty"`
Ip6dns1 string `json:"ip6dns1,omitempty"` Ip6dns1 string `json:"ip6dns1,omitempty"`
Ip6dns2 string `json:"ip6dns2,omitempty"` Ip6dns2 string `json:"ip6dns2,omitempty"`
Localstorageenabled bool `json:"localstorageenabled,omitempty"` Localstorageenabled bool `json:"localstorageenabled,omitempty"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
Networktype string `json:"networktype,omitempty"` Networktype string `json:"networktype,omitempty"`
Resourcedetails map[string]string `json:"resourcedetails,omitempty"` Resourcedetails map[string]string `json:"resourcedetails,omitempty"`
Securitygroupsenabled bool `json:"securitygroupsenabled,omitempty"` Securitygroupsenabled bool `json:"securitygroupsenabled,omitempty"`
Vlan string `json:"vlan,omitempty"` Vlan string `json:"vlan,omitempty"`
Zonetoken string `json:"zonetoken,omitempty"` Zonetoken string `json:"zonetoken,omitempty"`
} }
type ListServiceOfferingsResponse struct { type ListServiceOfferingsResponse struct {
Count int `json:"count"` Count int `json:"count"`
ServiceOfferings []*ServiceOffering `json:"serviceoffering"` ServiceOfferings []*ServiceOffering `json:"serviceoffering"`
} }
type ServiceOffering struct { type ServiceOffering struct {
Cpunumber int `json:"cpunumber,omitempty"` Cpunumber int `json:"cpunumber,omitempty"`
Cpuspeed int `json:"cpuspeed,omitempty"` Cpuspeed int `json:"cpuspeed,omitempty"`
Displaytext string `json:"displaytext,omitempty"` Displaytext string `json:"displaytext,omitempty"`
Domain string `json:"domain,omitempty"` Domain string `json:"domain,omitempty"`
Domainid string `json:"domainid,omitempty"` Domainid string `json:"domainid,omitempty"`
Hosttags string `json:"hosttags,omitempty"` Hosttags string `json:"hosttags,omitempty"`
Id string `json:"id,omitempty"` Id string `json:"id,omitempty"`
Iscustomized bool `json:"iscustomized,omitempty"` Iscustomized bool `json:"iscustomized,omitempty"`
Issystem bool `json:"issystem,omitempty"` Issystem bool `json:"issystem,omitempty"`
Isvolatile bool `json:"isvolatile,omitempty"` Isvolatile bool `json:"isvolatile,omitempty"`
Memory int `json:"memory,omitempty"` Memory int `json:"memory,omitempty"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
Networkrate int `json:"networkrate,omitempty"` Networkrate int `json:"networkrate,omitempty"`
Serviceofferingdetails map[string]string `json:"serviceofferingdetails,omitempty"` Serviceofferingdetails map[string]string `json:"serviceofferingdetails,omitempty"`
} }
type ListTemplatesResponse struct { type ListTemplatesResponse struct {
Count int `json:"count"` Count int `json:"count"`
Templates []*Template `json:"template"` Templates []*Template `json:"template"`
} }
type Template struct { type Template struct {
Account string `json:"account,omitempty"` Account string `json:"account,omitempty"`
Accountid string `json:"accountid,omitempty"` Accountid string `json:"accountid,omitempty"`
Bootable bool `json:"bootable,omitempty"` Bootable bool `json:"bootable,omitempty"`
Checksum string `json:"checksum,omitempty"` Checksum string `json:"checksum,omitempty"`
Created string `json:"created,omitempty"` Created string `json:"created,omitempty"`
CrossZones bool `json:"crossZones,omitempty"` CrossZones bool `json:"crossZones,omitempty"`
Details map[string]string `json:"details,omitempty"` Details map[string]string `json:"details,omitempty"`
Displaytext string `json:"displaytext,omitempty"` Displaytext string `json:"displaytext,omitempty"`
Domain string `json:"domain,omitempty"` Domain string `json:"domain,omitempty"`
Domainid string `json:"domainid,omitempty"` Domainid string `json:"domainid,omitempty"`
Format string `json:"format,omitempty"` Format string `json:"format,omitempty"`
Hostid string `json:"hostid,omitempty"` Hostid string `json:"hostid,omitempty"`
Hostname string `json:"hostname,omitempty"` Hostname string `json:"hostname,omitempty"`
Hypervisor string `json:"hypervisor,omitempty"` Hypervisor string `json:"hypervisor,omitempty"`
Id string `json:"id,omitempty"` Id string `json:"id,omitempty"`
Isdynamicallyscalable bool `json:"isdynamicallyscalable,omitempty"` Isdynamicallyscalable bool `json:"isdynamicallyscalable,omitempty"`
Isextractable bool `json:"isextractable,omitempty"` Isextractable bool `json:"isextractable,omitempty"`
Isfeatured bool `json:"isfeatured,omitempty"` Isfeatured bool `json:"isfeatured,omitempty"`
Ispublic bool `json:"ispublic,omitempty"` Ispublic bool `json:"ispublic,omitempty"`
Isready bool `json:"isready,omitempty"` Isready bool `json:"isready,omitempty"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
Ostypeid string `json:"ostypeid,omitempty"` Ostypeid string `json:"ostypeid,omitempty"`
Ostypename string `json:"ostypename,omitempty"` Ostypename string `json:"ostypename,omitempty"`
Passwordenabled bool `json:"passwordenabled,omitempty"` Passwordenabled bool `json:"passwordenabled,omitempty"`
Project string `json:"project,omitempty"` Project string `json:"project,omitempty"`
Projectid string `json:"projectid,omitempty"` Projectid string `json:"projectid,omitempty"`
Removed string `json:"removed,omitempty"` Removed string `json:"removed,omitempty"`
Size int `json:"size,omitempty"` Size int `json:"size,omitempty"`
Sourcetemplateid string `json:"sourcetemplateid,omitempty"` Sourcetemplateid string `json:"sourcetemplateid,omitempty"`
Sshkeyenabled bool `json:"sshkeyenabled,omitempty"` Sshkeyenabled bool `json:"sshkeyenabled,omitempty"`
Status string `json:"status,omitempty"` Status string `json:"status,omitempty"`
Zoneid string `json:"zoneid,omitempty"` Zoneid string `json:"zoneid,omitempty"`
Zonename string `json:"zonename,omitempty"` Zonename string `json:"zonename,omitempty"`
} }
type ListSSHKeyPairsResponse struct { type ListSSHKeyPairsResponse struct {
Count int `json:"count"` Count int `json:"count"`
SSHKeyPairs []*SSHKeyPair `json:"sshkeypair"` SSHKeyPairs []*SSHKeyPair `json:"sshkeypair"`
} }
type SSHKeyPair struct { type SSHKeyPair struct {
Fingerprint string `json:"fingerprint,omitempty"` Fingerprint string `json:"fingerprint,omitempty"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
} }
type ListSecurityGroupsResponse struct { type ListSecurityGroupsResponse struct {
Count int `json:"count"` Count int `json:"count"`
SecurityGroups []*SecurityGroup `json:"securitygroup"` SecurityGroups []*SecurityGroup `json:"securitygroup"`
} }
type SecurityGroup struct { type SecurityGroup struct {
Account string `json:"account,omitempty"` Account string `json:"account,omitempty"`
Description string `json:"description,omitempty"` Description string `json:"description,omitempty"`
Domain string `json:"domain,omitempty"` Domain string `json:"domain,omitempty"`
Domainid string `json:"domainid,omitempty"` Domainid string `json:"domainid,omitempty"`
Id string `json:"id,omitempty"` Id string `json:"id,omitempty"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
Project string `json:"project,omitempty"` Project string `json:"project,omitempty"`
Projectid string `json:"projectid,omitempty"` Projectid string `json:"projectid,omitempty"`
} }
type CreateSecurityGroupResponseWrapper struct { type CreateSecurityGroupResponseWrapper struct {
Wrapped CreateSecurityGroupResponse `json:"securitygroup"` Wrapped CreateSecurityGroupResponse `json:"securitygroup"`
} }
type CreateSecurityGroupResponse struct { type CreateSecurityGroupResponse struct {
Account string `json:"account,omitempty"` Account string `json:"account,omitempty"`
Description string `json:"description,omitempty"` Description string `json:"description,omitempty"`
Domain string `json:"domain,omitempty"` Domain string `json:"domain,omitempty"`
Domainid string `json:"domainid,omitempty"` Domainid string `json:"domainid,omitempty"`
Id string `json:"id,omitempty"` Id string `json:"id,omitempty"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
Project string `json:"project,omitempty"` Project string `json:"project,omitempty"`
Projectid string `json:"projectid,omitempty"` Projectid string `json:"projectid,omitempty"`
} }
type AuthorizeSecurityGroupIngressResponse struct { type AuthorizeSecurityGroupIngressResponse struct {
JobID string `json:"jobid,omitempty"` JobID string `json:"jobid,omitempty"`
Account string `json:"account,omitempty"` Account string `json:"account,omitempty"`
Cidr string `json:"cidr,omitempty"` Cidr string `json:"cidr,omitempty"`
Endport int `json:"endport,omitempty"` Endport int `json:"endport,omitempty"`
Icmpcode int `json:"icmpcode,omitempty"` Icmpcode int `json:"icmpcode,omitempty"`
Icmptype int `json:"icmptype,omitempty"` Icmptype int `json:"icmptype,omitempty"`
Protocol string `json:"protocol,omitempty"` Protocol string `json:"protocol,omitempty"`
Ruleid string `json:"ruleid,omitempty"` Ruleid string `json:"ruleid,omitempty"`
Securitygroupname string `json:"securitygroupname,omitempty"` Securitygroupname string `json:"securitygroupname,omitempty"`
Startport int `json:"startport,omitempty"` Startport int `json:"startport,omitempty"`
} }
type AuthorizeSecurityGroupEgressResponse struct { type AuthorizeSecurityGroupEgressResponse struct {
JobID string `json:"jobid,omitempty"` JobID string `json:"jobid,omitempty"`
Account string `json:"account,omitempty"` Account string `json:"account,omitempty"`
Cidr string `json:"cidr,omitempty"` Cidr string `json:"cidr,omitempty"`
Endport int `json:"endport,omitempty"` Endport int `json:"endport,omitempty"`
Icmpcode int `json:"icmpcode,omitempty"` Icmpcode int `json:"icmpcode,omitempty"`
Icmptype int `json:"icmptype,omitempty"` Icmptype int `json:"icmptype,omitempty"`
Protocol string `json:"protocol,omitempty"` Protocol string `json:"protocol,omitempty"`
Ruleid string `json:"ruleid,omitempty"` Ruleid string `json:"ruleid,omitempty"`
Securitygroupname string `json:"securitygroupname,omitempty"` Securitygroupname string `json:"securitygroupname,omitempty"`
Startport int `json:"startport,omitempty"` Startport int `json:"startport,omitempty"`
} }
type DeployVirtualMachineWrappedResponse struct { type DeployVirtualMachineWrappedResponse struct {
@ -207,177 +210,174 @@ type DeployVirtualMachineWrappedResponse struct {
} }
type DeployVirtualMachineResponse struct { type DeployVirtualMachineResponse struct {
JobID string `json:"jobid,omitempty"` JobID string `json:"jobid,omitempty"`
Account string `json:"account,omitempty"` Account string `json:"account,omitempty"`
Affinitygroup []struct { Affinitygroup []struct {
Account string `json:"account,omitempty"` Account string `json:"account,omitempty"`
Description string `json:"description,omitempty"` Description string `json:"description,omitempty"`
Domain string `json:"domain,omitempty"` Domain string `json:"domain,omitempty"`
Domainid string `json:"domainid,omitempty"` Domainid string `json:"domainid,omitempty"`
Id string `json:"id,omitempty"` Id string `json:"id,omitempty"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
Type string `json:"type,omitempty"` Type string `json:"type,omitempty"`
VirtualmachineIds []string `json:"virtualmachineIds,omitempty"` VirtualmachineIds []string `json:"virtualmachineIds,omitempty"`
} `json:"affinitygroup,omitempty"` } `json:"affinitygroup,omitempty"`
Cpunumber int `json:"cpunumber,omitempty"` Cpunumber int `json:"cpunumber,omitempty"`
Cpuspeed int `json:"cpuspeed,omitempty"` Cpuspeed int `json:"cpuspeed,omitempty"`
Cpuused string `json:"cpuused,omitempty"` Cpuused string `json:"cpuused,omitempty"`
Created string `json:"created,omitempty"` Created string `json:"created,omitempty"`
Details map[string]string `json:"details,omitempty"` Details map[string]string `json:"details,omitempty"`
Diskioread int `json:"diskioread,omitempty"` Diskioread int `json:"diskioread,omitempty"`
Diskiowrite int `json:"diskiowrite,omitempty"` Diskiowrite int `json:"diskiowrite,omitempty"`
Diskkbsread int `json:"diskkbsread,omitempty"` Diskkbsread int `json:"diskkbsread,omitempty"`
Diskkbswrite int `json:"diskkbswrite,omitempty"` Diskkbswrite int `json:"diskkbswrite,omitempty"`
Displayname string `json:"displayname,omitempty"` Displayname string `json:"displayname,omitempty"`
Displayvm bool `json:"displayvm,omitempty"` Displayvm bool `json:"displayvm,omitempty"`
Domain string `json:"domain,omitempty"` Domain string `json:"domain,omitempty"`
Domainid string `json:"domainid,omitempty"` Domainid string `json:"domainid,omitempty"`
Forvirtualnetwork bool `json:"forvirtualnetwork,omitempty"` Forvirtualnetwork bool `json:"forvirtualnetwork,omitempty"`
Group string `json:"group,omitempty"` Group string `json:"group,omitempty"`
Groupid string `json:"groupid,omitempty"` Groupid string `json:"groupid,omitempty"`
Guestosid string `json:"guestosid,omitempty"` Guestosid string `json:"guestosid,omitempty"`
Haenable bool `json:"haenable,omitempty"` Haenable bool `json:"haenable,omitempty"`
Hostid string `json:"hostid,omitempty"` Hostid string `json:"hostid,omitempty"`
Hostname string `json:"hostname,omitempty"` Hostname string `json:"hostname,omitempty"`
Hypervisor string `json:"hypervisor,omitempty"` Hypervisor string `json:"hypervisor,omitempty"`
Id string `json:"id,omitempty"` Id string `json:"id,omitempty"`
Instancename string `json:"instancename,omitempty"` Instancename string `json:"instancename,omitempty"`
Isdynamicallyscalable bool `json:"isdynamicallyscalable,omitempty"` Isdynamicallyscalable bool `json:"isdynamicallyscalable,omitempty"`
Isodisplaytext string `json:"isodisplaytext,omitempty"` Isodisplaytext string `json:"isodisplaytext,omitempty"`
Isoid string `json:"isoid,omitempty"` Isoid string `json:"isoid,omitempty"`
Isoname string `json:"isoname,omitempty"` Isoname string `json:"isoname,omitempty"`
Keypair string `json:"keypair,omitempty"` Keypair string `json:"keypair,omitempty"`
Memory int `json:"memory,omitempty"` Memory int `json:"memory,omitempty"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
Networkkbsread int `json:"networkkbsread,omitempty"` Networkkbsread int `json:"networkkbsread,omitempty"`
Networkkbswrite int `json:"networkkbswrite,omitempty"` Networkkbswrite int `json:"networkkbswrite,omitempty"`
Nic []struct { Nic []struct {
Broadcasturi string `json:"broadcasturi,omitempty"` Broadcasturi string `json:"broadcasturi,omitempty"`
Gateway string `json:"gateway,omitempty"` Gateway string `json:"gateway,omitempty"`
Id string `json:"id,omitempty"` Id string `json:"id,omitempty"`
Ipaddress string `json:"ipaddress,omitempty"` Ipaddress string `json:"ipaddress,omitempty"`
Isdefault bool `json:"isdefault,omitempty"` Isdefault bool `json:"isdefault,omitempty"`
Isolationuri string `json:"isolationuri,omitempty"` Isolationuri string `json:"isolationuri,omitempty"`
Macaddress string `json:"macaddress,omitempty"` Macaddress string `json:"macaddress,omitempty"`
Netmask string `json:"netmask,omitempty"` Netmask string `json:"netmask,omitempty"`
Networkid string `json:"networkid,omitempty"` Networkid string `json:"networkid,omitempty"`
Networkname string `json:"networkname,omitempty"` Networkname string `json:"networkname,omitempty"`
Secondaryip []string `json:"secondaryip,omitempty"` Secondaryip []string `json:"secondaryip,omitempty"`
Traffictype string `json:"traffictype,omitempty"` Traffictype string `json:"traffictype,omitempty"`
Type string `json:"type,omitempty"` Type string `json:"type,omitempty"`
} `json:"nic,omitempty"` } `json:"nic,omitempty"`
Password string `json:"password,omitempty"` Password string `json:"password,omitempty"`
Passwordenabled bool `json:"passwordenabled,omitempty"` Passwordenabled bool `json:"passwordenabled,omitempty"`
Project string `json:"project,omitempty"` Project string `json:"project,omitempty"`
Projectid string `json:"projectid,omitempty"` Projectid string `json:"projectid,omitempty"`
Publicip string `json:"publicip,omitempty"` Publicip string `json:"publicip,omitempty"`
Publicipid string `json:"publicipid,omitempty"` Publicipid string `json:"publicipid,omitempty"`
Rootdeviceid int `json:"rootdeviceid,omitempty"` Rootdeviceid int `json:"rootdeviceid,omitempty"`
Rootdevicetype string `json:"rootdevicetype,omitempty"` Rootdevicetype string `json:"rootdevicetype,omitempty"`
Serviceofferingid string `json:"serviceofferingid,omitempty"` Serviceofferingid string `json:"serviceofferingid,omitempty"`
Serviceofferingname string `json:"serviceofferingname,omitempty"` Serviceofferingname string `json:"serviceofferingname,omitempty"`
Servicestate string `json:"servicestate,omitempty"` Servicestate string `json:"servicestate,omitempty"`
State string `json:"state,omitempty"` State string `json:"state,omitempty"`
Templatedisplaytext string `json:"templatedisplaytext,omitempty"` Templatedisplaytext string `json:"templatedisplaytext,omitempty"`
Templateid string `json:"templateid,omitempty"` Templateid string `json:"templateid,omitempty"`
Templatename string `json:"templatename,omitempty"` Templatename string `json:"templatename,omitempty"`
Zoneid string `json:"zoneid,omitempty"` Zoneid string `json:"zoneid,omitempty"`
Zonename string `json:"zonename,omitempty"` Zonename string `json:"zonename,omitempty"`
} }
type QueryAsyncJobResultResponse struct { type QueryAsyncJobResultResponse struct {
Accountid string `json:"accountid,omitempty"` Accountid string `json:"accountid,omitempty"`
Cmd string `json:"cmd,omitempty"` Cmd string `json:"cmd,omitempty"`
Created string `json:"created,omitempty"` Created string `json:"created,omitempty"`
Jobinstanceid string `json:"jobinstanceid,omitempty"` Jobinstanceid string `json:"jobinstanceid,omitempty"`
Jobinstancetype string `json:"jobinstancetype,omitempty"` Jobinstancetype string `json:"jobinstancetype,omitempty"`
Jobprocstatus int `json:"jobprocstatus,omitempty"` Jobprocstatus int `json:"jobprocstatus,omitempty"`
Jobresult json.RawMessage `json:"jobresult,omitempty"` Jobresult json.RawMessage `json:"jobresult,omitempty"`
Jobresultcode int `json:"jobresultcode,omitempty"` Jobresultcode int `json:"jobresultcode,omitempty"`
Jobresulttype string `json:"jobresulttype,omitempty"` Jobresulttype string `json:"jobresulttype,omitempty"`
Jobstatus int `json:"jobstatus,omitempty"` Jobstatus int `json:"jobstatus,omitempty"`
Userid string `json:"userid,omitempty"` Userid string `json:"userid,omitempty"`
} }
type ListVirtualMachinesResponse struct { type ListVirtualMachinesResponse struct {
Count int `json:"count"` Count int `json:"count"`
VirtualMachines []*VirtualMachine `json:"virtualmachine"` VirtualMachines []*VirtualMachine `json:"virtualmachine"`
} }
type VirtualMachine struct { type VirtualMachine struct {
Account string `json:"account,omitempty"` Account string `json:"account,omitempty"`
Cpunumber int `json:"cpunumber,omitempty"` Cpunumber int `json:"cpunumber,omitempty"`
Cpuspeed int `json:"cpuspeed,omitempty"` Cpuspeed int `json:"cpuspeed,omitempty"`
Cpuused string `json:"cpuused,omitempty"` Cpuused string `json:"cpuused,omitempty"`
Created string `json:"created,omitempty"` Created string `json:"created,omitempty"`
Details map[string]string `json:"details,omitempty"` Details map[string]string `json:"details,omitempty"`
Diskioread int `json:"diskioread,omitempty"` Diskioread int `json:"diskioread,omitempty"`
Diskiowrite int `json:"diskiowrite,omitempty"` Diskiowrite int `json:"diskiowrite,omitempty"`
Diskkbsread int `json:"diskkbsread,omitempty"` Diskkbsread int `json:"diskkbsread,omitempty"`
Diskkbswrite int `json:"diskkbswrite,omitempty"` Diskkbswrite int `json:"diskkbswrite,omitempty"`
Displayname string `json:"displayname,omitempty"` Displayname string `json:"displayname,omitempty"`
Displayvm bool `json:"displayvm,omitempty"` Displayvm bool `json:"displayvm,omitempty"`
Domain string `json:"domain,omitempty"` Domain string `json:"domain,omitempty"`
Domainid string `json:"domainid,omitempty"` Domainid string `json:"domainid,omitempty"`
Forvirtualnetwork bool `json:"forvirtualnetwork,omitempty"` Forvirtualnetwork bool `json:"forvirtualnetwork,omitempty"`
Group string `json:"group,omitempty"` Group string `json:"group,omitempty"`
Groupid string `json:"groupid,omitempty"` Groupid string `json:"groupid,omitempty"`
Guestosid string `json:"guestosid,omitempty"` Guestosid string `json:"guestosid,omitempty"`
Haenable bool `json:"haenable,omitempty"` Haenable bool `json:"haenable,omitempty"`
Hostid string `json:"hostid,omitempty"` Hostid string `json:"hostid,omitempty"`
Hostname string `json:"hostname,omitempty"` Hostname string `json:"hostname,omitempty"`
Hypervisor string `json:"hypervisor,omitempty"` Hypervisor string `json:"hypervisor,omitempty"`
Id string `json:"id,omitempty"` Id string `json:"id,omitempty"`
Instancename string `json:"instancename,omitempty"` Instancename string `json:"instancename,omitempty"`
Isdynamicallyscalable bool `json:"isdynamicallyscalable,omitempty"` Isdynamicallyscalable bool `json:"isdynamicallyscalable,omitempty"`
Isodisplaytext string `json:"isodisplaytext,omitempty"` Isodisplaytext string `json:"isodisplaytext,omitempty"`
Isoid string `json:"isoid,omitempty"` Isoid string `json:"isoid,omitempty"`
Isoname string `json:"isoname,omitempty"` Isoname string `json:"isoname,omitempty"`
Keypair string `json:"keypair,omitempty"` Keypair string `json:"keypair,omitempty"`
Memory int `json:"memory,omitempty"` Memory int `json:"memory,omitempty"`
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
Networkkbsread int `json:"networkkbsread,omitempty"` Networkkbsread int `json:"networkkbsread,omitempty"`
Networkkbswrite int `json:"networkkbswrite,omitempty"` Networkkbswrite int `json:"networkkbswrite,omitempty"`
Nic []struct { Nic []struct {
Broadcasturi string `json:"broadcasturi,omitempty"` Broadcasturi string `json:"broadcasturi,omitempty"`
Gateway string `json:"gateway,omitempty"` Gateway string `json:"gateway,omitempty"`
Id string `json:"id,omitempty"` Id string `json:"id,omitempty"`
Ip6address string `json:"ip6address,omitempty"` Ip6address string `json:"ip6address,omitempty"`
Ip6cidr string `json:"ip6cidr,omitempty"` Ip6cidr string `json:"ip6cidr,omitempty"`
Ip6gateway string `json:"ip6gateway,omitempty"` Ip6gateway string `json:"ip6gateway,omitempty"`
Ipaddress string `json:"ipaddress,omitempty"` Ipaddress string `json:"ipaddress,omitempty"`
Isdefault bool `json:"isdefault,omitempty"` Isdefault bool `json:"isdefault,omitempty"`
Isolationuri string `json:"isolationuri,omitempty"` Isolationuri string `json:"isolationuri,omitempty"`
Macaddress string `json:"macaddress,omitempty"` Macaddress string `json:"macaddress,omitempty"`
Netmask string `json:"netmask,omitempty"` Netmask string `json:"netmask,omitempty"`
Networkid string `json:"networkid,omitempty"` Networkid string `json:"networkid,omitempty"`
Networkname string `json:"networkname,omitempty"` Networkname string `json:"networkname,omitempty"`
Secondaryip []string `json:"secondaryip,omitempty"` Secondaryip []string `json:"secondaryip,omitempty"`
Traffictype string `json:"traffictype,omitempty"` Traffictype string `json:"traffictype,omitempty"`
Type string `json:"type,omitempty"` Type string `json:"type,omitempty"`
} `json:"nic,omitempty"` } `json:"nic,omitempty"`
Password string `json:"password,omitempty"` Password string `json:"password,omitempty"`
Passwordenabled bool `json:"passwordenabled,omitempty"` Passwordenabled bool `json:"passwordenabled,omitempty"`
Project string `json:"project,omitempty"` Project string `json:"project,omitempty"`
Projectid string `json:"projectid,omitempty"` Projectid string `json:"projectid,omitempty"`
Publicip string `json:"publicip,omitempty"` Publicip string `json:"publicip,omitempty"`
Publicipid string `json:"publicipid,omitempty"` Publicipid string `json:"publicipid,omitempty"`
Rootdeviceid int `json:"rootdeviceid,omitempty"` Rootdeviceid int `json:"rootdeviceid,omitempty"`
Rootdevicetype string `json:"rootdevicetype,omitempty"` Rootdevicetype string `json:"rootdevicetype,omitempty"`
Serviceofferingid string `json:"serviceofferingid,omitempty"` Serviceofferingid string `json:"serviceofferingid,omitempty"`
Serviceofferingname string `json:"serviceofferingname,omitempty"` Serviceofferingname string `json:"serviceofferingname,omitempty"`
Servicestate string `json:"servicestate,omitempty"` Servicestate string `json:"servicestate,omitempty"`
State string `json:"state,omitempty"` State string `json:"state,omitempty"`
Templatedisplaytext string `json:"templatedisplaytext,omitempty"` Templatedisplaytext string `json:"templatedisplaytext,omitempty"`
Templateid string `json:"templateid,omitempty"` Templateid string `json:"templateid,omitempty"`
Templatename string `json:"templatename,omitempty"` Templatename string `json:"templatename,omitempty"`
Zoneid string `json:"zoneid,omitempty"` Zoneid string `json:"zoneid,omitempty"`
Zonename string `json:"zonename,omitempty"` Zonename string `json:"zonename,omitempty"`
} }
type StartVirtualMachineResponse struct { type StartVirtualMachineResponse struct {
JobID string `json:"jobid,omitempty"` JobID string `json:"jobid,omitempty"`
} }
@ -390,7 +390,6 @@ type DestroyVirtualMachineResponse struct {
JobID string `json:"jobid,omitempty"` JobID string `json:"jobid,omitempty"`
} }
type RebootVirtualMachineResponse struct { type RebootVirtualMachineResponse struct {
JobID string `json:"jobid,omitempty"` JobID string `json:"jobid,omitempty"`
} }
@ -402,3 +401,7 @@ type CreateSSHKeyPairWrappedResponse struct {
type CreateSSHKeyPairResponse struct { type CreateSSHKeyPairResponse struct {
Privatekey string `json:"privatekey,omitempty"` Privatekey string `json:"privatekey,omitempty"`
} }
type DeleteSSHKeyPairResponse struct {
Privatekey string `json:"privatekey,omitempty"`
}

View File

@ -3,9 +3,9 @@ package egoscale
import ( import (
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"fmt"
"net/url" "net/url"
"strings" "strings"
"fmt"
) )
func (exo *Client) CreateVirtualMachine(p MachineProfile) (string, error) { func (exo *Client) CreateVirtualMachine(p MachineProfile) (string, error) {
@ -140,3 +140,23 @@ func (exo *Client) GetVirtualMachine(id string) (*VirtualMachine, error) {
return nil, fmt.Errorf("cannot retrieve virtualmachine with id %s", id) return nil, fmt.Errorf("cannot retrieve virtualmachine with id %s", id)
} }
} }
func (exo *Client) ListVirtualMachines(id string) ([]*VirtualMachine, error) {
params := url.Values{}
params.Set("id", id)
resp, err := exo.Request("listVirtualMachines", params)
if err != nil {
return nil, err
}
var r ListVirtualMachinesResponse
if err := json.Unmarshal(resp, &r); err != nil {
return nil, err
}
return r.VirtualMachines, nil
}