Make change-admin-password acceptence test autonomous

Up to this commit, 09-change-admin-password.go required human
intervention to run.
diff --git a/acceptance/04-create-server.go b/acceptance/04-create-server.go
index 9377b75..06c541b 100644
--- a/acceptance/04-create-server.go
+++ b/acceptance/04-create-server.go
@@ -46,7 +46,7 @@
 		panic(err)
 	}
 
-	err = createServer(servers, *imageRef, *flavorRef, *serverName, *adminPass)
+	_, err = createServer(servers, *imageRef, *flavorRef, *serverName, *adminPass)
 	if err != nil {
 		panic(err)
 	}
diff --git a/acceptance/09-change-admin-password.go b/acceptance/09-change-admin-password.go
index 4804726..2ce7bbe 100644
--- a/acceptance/09-change-admin-password.go
+++ b/acceptance/09-change-admin-password.go
@@ -4,6 +4,7 @@
 	"flag"
 	"fmt"
 	"github.com/rackspace/gophercloud"
+	"time"
 )
 
 var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
@@ -14,14 +15,6 @@
 	provider, username, password := getCredentials()
 	flag.Parse()
 
-	if *serverId == "" {
-		panic("Server ID expected [use -i option]")
-	}
-
-	if *newPass == "" {
-		panic("Password expected [use -p option]")
-	}
-
 	acc, err := gophercloud.Authenticate(
 		provider,
 		gophercloud.AuthOptions{
@@ -43,6 +36,32 @@
 		panic(err)
 	}
 
+	// If user doesn't explicitly provide a server ID, create one dynamically.
+	if *serverId == "" {
+		var err error
+		*serverId, err = createServer(api, "", "", "", "")
+		if err != nil {
+			panic(err)
+		}
+
+		// Wait for server to finish provisioning.
+		for {
+			s, err := api.ServerById(*serverId)
+			if err != nil {
+				panic(err)
+			}
+			if s.Status == "ACTIVE" {
+				break
+			}
+			time.Sleep(10 * time.Second)
+		}
+	}
+
+	// If no password is provided, create one dynamically.
+	if *newPass == "" {
+		*newPass = randomString("", 16)
+	}
+
 	err = api.SetAdminPassword(*serverId, *newPass)
 	if err != nil {
 		panic(err)
diff --git a/acceptance/libargs.go b/acceptance/libargs.go
index 99d128f..405938a 100644
--- a/acceptance/libargs.go
+++ b/acceptance/libargs.go
@@ -92,7 +92,7 @@
 // A blank admin password will cause a password to be automatically generated; however,
 // at present no means of recovering this password exists, as no acceptance tests yet require
 // this data.
-func createServer(servers gophercloud.CloudServersProvider, imageRef, flavorRef, name, adminPass string) error {
+func createServer(servers gophercloud.CloudServersProvider, imageRef, flavorRef, name, adminPass string) (string, error) {
 	if imageRef == "" {
 		imageRef = aSuitableImage(servers)
 	}
@@ -109,12 +109,16 @@
 		name = fmt.Sprintf("ACPTTEST--%s", name)
 	}
 
-	_, err := servers.CreateServer(gophercloud.NewServer{
+	newServer, err := servers.CreateServer(gophercloud.NewServer{
 		Name:      name,
 		ImageRef:  imageRef,
 		FlavorRef: flavorRef,
 		AdminPass: adminPass,
 	})
 
-	return err
+	if err != nil {
+		return "", err
+	}
+
+	return newServer.Id, nil
 }