Create, delete, and query server
diff --git a/openstack/compute/servers/client.go b/openstack/compute/servers/client.go
index a59a339..8b7d1fb 100644
--- a/openstack/compute/servers/client.go
+++ b/openstack/compute/servers/client.go
@@ -26,6 +26,18 @@
return fmt.Sprintf("%s/servers/detail", c.endpoint)
}
+func (c *Client) getCreateUrl() string {
+ return fmt.Sprintf("%s/servers", c.endpoint)
+}
+
+func (c *Client) getDeleteUrl(id string) string {
+ return fmt.Sprintf("%s/servers/%s", c.endpoint, id)
+}
+
+func (c *Client) getDetailUrl(id string) string {
+ return c.getDeleteUrl(id)
+}
+
func (c *Client) getListHeaders() (map[string]string, error) {
t, err := c.getAuthToken()
if err != nil {
@@ -37,6 +49,18 @@
}, nil
}
+func (c *Client) getCreateHeaders() (map[string]string, error) {
+ return c.getListHeaders()
+}
+
+func (c *Client) getDeleteHeaders() (map[string]string, error) {
+ return c.getListHeaders()
+}
+
+func (c *Client) getDetailHeaders() (map[string]string, error) {
+ return c.getListHeaders()
+}
+
func (c *Client) getAuthToken() (string, error) {
var err error
diff --git a/openstack/compute/servers/requests.go b/openstack/compute/servers/requests.go
index 0c49159..8506aac 100644
--- a/openstack/compute/servers/requests.go
+++ b/openstack/compute/servers/requests.go
@@ -10,6 +10,8 @@
// provided through separate, type-safe accessors or methods.
type ListResult map[string]interface{}
+type ServerResult map[string]interface{}
+
// List makes a request against the API to list servers accessible to you.
func List(c *Client) (ListResult, error) {
var lr ListResult
@@ -26,3 +28,53 @@
return lr, err
}
+// Create requests a server to be provisioned to the user in the current tenant.
+func Create(c *Client, opts map[string]interface{}) (ServerResult, error) {
+ var sr ServerResult
+
+ h, err := c.getCreateHeaders()
+ if err != nil {
+ return nil, err
+ }
+
+ err = perigee.Post(c.getCreateUrl(), perigee.Options{
+ Results: &sr,
+ ReqBody: map[string]interface{} {
+ "server": opts,
+ },
+ MoreHeaders: h,
+ OkCodes: []int{202},
+ })
+ return sr, err
+}
+
+// Delete requests that a server previously provisioned be removed from your account.
+func Delete(c *Client, id string) error {
+ h, err := c.getDeleteHeaders()
+ if err != nil {
+ return err
+ }
+
+ err = perigee.Delete(c.getDeleteUrl(id), perigee.Options{
+ MoreHeaders: h,
+ OkCodes: []int{204},
+ })
+ return err
+}
+
+// GetDetail requests details on a single server, by ID.
+func GetDetail(c *Client, id string) (ServerResult, error) {
+ var sr ServerResult
+
+ h, err := c.getDetailHeaders()
+ if err != nil {
+ return nil, err
+ }
+
+ err = perigee.Get(c.getDetailUrl(id), perigee.Options{
+ Results: &sr,
+ MoreHeaders: h,
+ })
+ return sr, err
+}
+
diff --git a/openstack/compute/servers/servers.go b/openstack/compute/servers/servers.go
index 7061993..c02cf9f 100644
--- a/openstack/compute/servers/servers.go
+++ b/openstack/compute/servers/servers.go
@@ -75,3 +75,15 @@
return servers, nil
}
+// GetServer interprets the result of a call expected to return data on a single server.
+func GetServer(sr ServerResult) (*Server, error) {
+ so, ok := sr["server"]
+ if !ok {
+ return nil, ErrNotImplemented
+ }
+ serverObj := so.(map[string]interface{})
+ s := new(Server)
+ err := mapstructure.Decode(serverObj, s)
+ return s, err
+}
+