Expose reboot server support.
diff --git a/acceptance/10-reboot-server.go b/acceptance/10-reboot-server.go
new file mode 100644
index 0000000..78ab357
--- /dev/null
+++ b/acceptance/10-reboot-server.go
@@ -0,0 +1,43 @@
+package main
+
+import (
+ "fmt"
+ "flag"
+ "github.com/rackspace/gophercloud"
+)
+
+var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing. $? still indicates errors though.")
+
+func main() {
+ flag.Parse()
+
+ withIdentity(false, func(acc gophercloud.AccessProvider) {
+ withServerApi(acc, func(servers gophercloud.CloudServersProvider) {
+ log("Creating server")
+ serverId, err := createServer(servers, "", "", "", "")
+ if err != nil {
+ panic(err)
+ }
+ waitForServerState(servers, serverId, "ACTIVE")
+
+ log("Soft-rebooting server")
+ servers.RebootServer(serverId, false)
+ waitForServerState(servers, serverId, "REBOOT")
+ waitForServerState(servers, serverId, "ACTIVE")
+
+ log("Hard-rebooting server")
+ servers.RebootServer(serverId, true)
+ waitForServerState(servers, serverId, "HARD_REBOOT")
+ waitForServerState(servers, serverId, "ACTIVE")
+
+ log("Done")
+ servers.DeleteServerById(serverId)
+ })
+ })
+}
+
+func log(s string) {
+ if !*quiet {
+ fmt.Println(s)
+ }
+}
diff --git a/interfaces.go b/interfaces.go
index de1f7c8..e05bdc4 100644
--- a/interfaces.go
+++ b/interfaces.go
@@ -35,6 +35,7 @@
ResizeServer(id, newName, newFlavor, newDiskConfig string) error
RevertResize(id string) error
ConfirmResize(id string) error
+ RebootServer(id string, hard bool) error
// Images
diff --git a/servers.go b/servers.go
index 78ad350..c1026b4 100644
--- a/servers.go
+++ b/servers.go
@@ -187,6 +187,29 @@
return err
}
+// See the CloudServersProvider interface for details
+func (gsp *genericServersProvider) RebootServer(id string, hard bool) error {
+ return gsp.context.WithReauth(gsp.access, func() error {
+ url := fmt.Sprintf("%s/servers/%s/action", gsp.endpoint, id)
+ types := map[bool]string{false: "SOFT", true: "HARD"}
+ return perigee.Post(url, perigee.Options{
+ ReqBody: &struct{
+ Reboot struct {
+ Type string `json:"type"`
+ } `json:"reboot"`
+ }{
+ struct {
+ Type string `json:"type"`
+ }{types[hard]},
+ },
+ OkCodes: []int{202},
+ MoreHeaders: map[string]string{
+ "X-Auth-Token": gsp.access.AuthToken(),
+ },
+ })
+ })
+}
+
// RaxBandwidth provides measurement of server bandwidth consumed over a given audit interval.
type RaxBandwidth struct {
AuditPeriodEnd string `json:"audit_period_end"`