Add resize server action.

This looks like it should do the trick.  Intermittently, however, some
servers created by the acceptance test will end up in an error state.
It is not consistently reproducible.  When it does work, however, it
works as expected.  I'm not sure why the behavior is variable.
diff --git a/acceptance/09-resize-server.go b/acceptance/09-resize-server.go
new file mode 100644
index 0000000..558b2cf
--- /dev/null
+++ b/acceptance/09-resize-server.go
@@ -0,0 +1,122 @@
+package main
+
+import (
+	"fmt"
+	"flag"
+	"github.com/rackspace/gophercloud"
+	"time"
+)
+
+var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
+
+func main() {
+	provider, username, password := getCredentials()
+	flag.Parse()
+
+	acc, err := gophercloud.Authenticate(
+		provider,
+		gophercloud.AuthOptions{
+			Username: username,
+			Password: password,
+		},
+	)
+	if err != nil {
+		panic(err)
+	}
+
+	api, err := gophercloud.ServersApi(acc, gophercloud.ApiCriteria{
+		Name:      "cloudServersOpenStack",
+		Region:    "DFW",
+		VersionId: "2",
+		UrlChoice: gophercloud.PublicURL,
+	})
+	if err != nil {
+		panic(err)
+	}
+
+	// These tests are going to take some time to complete.
+	// So, we'll do two tests at the same time to help amortize test time.
+	done := make(chan bool)
+	go resizeRejectTest(api, done)
+	go resizeAcceptTest(api, done)
+	_ = <- done
+	_ = <- done
+
+	if !*quiet {
+		fmt.Println("Done.")
+	}
+}
+
+func resizeRejectTest(api gophercloud.CloudServersProvider, done chan bool) {
+	withServer(api, func(id string) {
+		newFlavorId := findAlternativeFlavor()
+		err := api.ResizeServer(id, randomString("ACPTTEST", 24), newFlavorId, "")
+		if err != nil {
+			panic(err)
+		}
+
+		waitForVerifyResize(api, id)
+
+		err = api.RevertResize(id)
+		if err != nil {
+			panic(err)
+		}
+	})
+	done <- true
+}
+
+func resizeAcceptTest(api gophercloud.CloudServersProvider, done chan bool) {
+	withServer(api, func(id string) {
+		newFlavorId := findAlternativeFlavor()
+		err := api.ResizeServer(id, randomString("ACPTTEST", 24), newFlavorId, "")
+		if err != nil {
+			panic(err)
+		}
+
+		waitForVerifyResize(api, id)
+
+		err = api.ConfirmResize(id)
+		if err != nil {
+			panic(err)
+		}
+	})
+	done <- true
+}
+
+func waitForVerifyResize(api gophercloud.CloudServersProvider, id string) {
+	for {
+		s, err := api.ServerById(id)
+		if err != nil {
+			panic(err)
+		}
+		if s.Status == "VERIFY_RESIZE" {
+			break
+		}
+		time.Sleep(10 * time.Second)
+	}
+}
+
+func withServer(api gophercloud.CloudServersProvider, f func(string)) {
+	id, err := createServer(api, "", "", "", "")
+	if err != nil {
+		panic(err)
+	}
+
+	for {
+		s, err := api.ServerById(id)
+		if err != nil {
+			panic(err)
+		}
+		if s.Status == "ACTIVE" {
+			break
+		}
+		time.Sleep(10 * time.Second)
+	}
+
+	f(id)
+
+	err = api.DeleteServerById(id)
+	if err != nil {
+		panic(err)
+	}
+}
diff --git a/acceptance/libargs.go b/acceptance/libargs.go
index 405938a..67858f1 100644
--- a/acceptance/libargs.go
+++ b/acceptance/libargs.go
@@ -122,3 +122,9 @@
 
 	return newServer.Id, nil
 }
+
+// findAlternativeFlavor locates a flavor to resize a server to.  It is guaranteed to be different
+// than what aSuitableFlavor() returns.  If none could be found, this function will panic.
+func findAlternativeFlavor() string {
+	return "3"  // 1GB image, up from 512MB image
+}
\ No newline at end of file