More technical debt payoff.

Applied refactoring across the entire acceptance test code base.
diff --git a/acceptance/02-list-servers.go b/acceptance/02-list-servers.go
index df9e28c..77bf82f 100644
--- a/acceptance/02-list-servers.go
+++ b/acceptance/02-list-servers.go
@@ -11,7 +11,7 @@
 func main() {
 	flag.Parse()
 
-	withIdentity(func(acc gophercloud.AccessProvider) {
+	withIdentity(false, func(acc gophercloud.AccessProvider) {
 		withServerApi(acc, func(api gophercloud.CloudServersProvider) {
 			tryFullDetails(api)
 			tryLinksOnly(api)
diff --git a/acceptance/03-get-server-details.go b/acceptance/03-get-server-details.go
index 77fa522..88d7978 100644
--- a/acceptance/03-get-server-details.go
+++ b/acceptance/03-get-server-details.go
@@ -13,7 +13,7 @@
 func main() {
 	flag.Parse()
 
-	withIdentity(func(auth gophercloud.AccessProvider) {
+	withIdentity(false, func(auth gophercloud.AccessProvider) {
 		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
 			var (
 				err error
diff --git a/acceptance/04-create-server.go b/acceptance/04-create-server.go
index 06c541b..05d8896 100644
--- a/acceptance/04-create-server.go
+++ b/acceptance/04-create-server.go
@@ -6,14 +6,11 @@
 	"github.com/rackspace/gophercloud"
 )
 
-var provider, username, password string
-
 var region, serverName, imageRef, flavorRef *string
 var adminPass = flag.String("a", "", "Administrator password (auto-assigned if none)")
 var quiet = flag.Bool("quiet", false, "Quiet mode for acceptance tests.  $? non-zero if error.")
 
 func configure() {
-	provider, username, password = getCredentials()
 	region = flag.String("r", "DFW", "Rackspace region in which to create the server")
 	serverName = flag.String("n", randomString("ACPTTEST--", 16), "Server name (what you see in the control panel)")
 	imageRef = flag.String("i", "", "ID of image to deploy onto the server")
@@ -25,41 +22,24 @@
 func main() {
 	configure()
 
-	auth, err := gophercloud.Authenticate(
-		provider,
-		gophercloud.AuthOptions{
-			Username: username,
-			Password: password,
-		},
-	)
-	if err != nil {
-		panic(err)
-	}
+	withIdentity(false, func(auth gophercloud.AccessProvider) {
+		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
+			_, err := createServer(servers, *imageRef, *flavorRef, *serverName, *adminPass)
+			if err != nil {
+				panic(err)
+			}
 
-	servers, err := gophercloud.ServersApi(auth, gophercloud.ApiCriteria{
-		Name:      "cloudServersOpenStack",
-		Region:    *region,
-		VersionId: "2",
-		UrlChoice: gophercloud.PublicURL,
+			allServers, err := servers.ListServers()
+			if err != nil {
+				panic(err)
+			}
+
+			if !*quiet {
+				fmt.Printf("ID,Name,Status,Progress\n")
+				for _, i := range allServers {
+					fmt.Printf("%s,\"%s\",%s,%d\n", i.Id, i.Name, i.Status, i.Progress)
+				}
+			}
+		})
 	})
-	if err != nil {
-		panic(err)
-	}
-
-	_, err = createServer(servers, *imageRef, *flavorRef, *serverName, *adminPass)
-	if err != nil {
-		panic(err)
-	}
-
-	allServers, err := servers.ListServers()
-	if err != nil {
-		panic(err)
-	}
-
-	if !*quiet {
-		fmt.Printf("ID,Name,Status,Progress\n")
-		for _, i := range allServers {
-			fmt.Printf("%s,\"%s\",%s,%d\n", i.Id, i.Name, i.Status, i.Progress)
-		}
-	}
 }
diff --git a/acceptance/05-list-images.go b/acceptance/05-list-images.go
index 211a5ed..b28b3f5 100644
--- a/acceptance/05-list-images.go
+++ b/acceptance/05-list-images.go
@@ -10,39 +10,21 @@
 var rgn = flag.String("r", "DFW", "Datacenter region to interrogate.")
 
 func main() {
-	provider, username, password := getCredentials()
 	flag.Parse()
 
-	auth, err := gophercloud.Authenticate(
-		provider,
-		gophercloud.AuthOptions{
-			Username: username,
-			Password: password,
-		},
-	)
-	if err != nil {
-		panic(err)
-	}
+	withIdentity(false, func(auth gophercloud.AccessProvider) {
+		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
+			images, err := servers.ListImages()
+			if err != nil {
+				panic(err)
+			}
 
-	servers, err := gophercloud.ServersApi(auth, gophercloud.ApiCriteria{
-		Name:      "cloudServersOpenStack",
-		Region:    *rgn,
-		VersionId: "2",
-		UrlChoice: gophercloud.PublicURL,
+			if !*quiet {
+				fmt.Println("ID,Name,MinRam,MinDisk")
+				for _, image := range images {
+					fmt.Printf("%s,\"%s\",%d,%d\n", image.Id, image.Name, image.MinRam, image.MinRam)
+				}
+			}
+		})
 	})
-	if err != nil {
-		panic(err)
-	}
-
-	images, err := servers.ListImages()
-	if err != nil {
-		panic(err)
-	}
-
-	if !*quiet {
-		fmt.Println("ID,Name,MinRam,MinDisk")
-		for _, image := range images {
-			fmt.Printf("%s,\"%s\",%d,%d\n", image.Id, image.Name, image.MinRam, image.MinRam)
-		}
-	}
 }
diff --git a/acceptance/06-list-flavors.go b/acceptance/06-list-flavors.go
index ad56988..28ac215 100644
--- a/acceptance/06-list-flavors.go
+++ b/acceptance/06-list-flavors.go
@@ -10,39 +10,21 @@
 var rgn = flag.String("r", "DFW", "Datacenter region to interrogate.")
 
 func main() {
-	provider, username, password := getCredentials()
 	flag.Parse()
 
-	auth, err := gophercloud.Authenticate(
-		provider,
-		gophercloud.AuthOptions{
-			Username: username,
-			Password: password,
-		},
-	)
-	if err != nil {
-		panic(err)
-	}
+	withIdentity(false, func(auth gophercloud.AccessProvider) {
+		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
+			flavors, err := servers.ListFlavors()
+			if err != nil {
+				panic(err)
+			}
 
-	servers, err := gophercloud.ServersApi(auth, gophercloud.ApiCriteria{
-		Name:      "cloudServersOpenStack",
-		Region:    *rgn,
-		VersionId: "2",
-		UrlChoice: gophercloud.PublicURL,
+			if !*quiet {
+				fmt.Println("ID,Name,MinRam,MinDisk")
+				for _, f := range flavors {
+					fmt.Printf("%s,\"%s\",%d,%d\n", f.Id, f.Name, f.Ram, f.Disk)
+				}
+			}
+		})
 	})
-	if err != nil {
-		panic(err)
-	}
-
-	flavors, err := servers.ListFlavors()
-	if err != nil {
-		panic(err)
-	}
-
-	if !*quiet {
-		fmt.Println("ID,Name,MinRam,MinDisk")
-		for _, f := range flavors {
-			fmt.Printf("%s,\"%s\",%d,%d\n", f.Id, f.Name, f.Ram, f.Disk)
-		}
-	}
 }
diff --git a/acceptance/07-change-admin-password.go b/acceptance/07-change-admin-password.go
index 2ce7bbe..e44bda0 100644
--- a/acceptance/07-change-admin-password.go
+++ b/acceptance/07-change-admin-password.go
@@ -4,7 +4,6 @@
 	"flag"
 	"fmt"
 	"github.com/rackspace/gophercloud"
-	"time"
 )
 
 var quiet = flag.Bool("quiet", false, "Quiet mode, for acceptance testing.  $? still indicates errors though.")
@@ -12,62 +11,37 @@
 var newPass = flag.String("p", "", "New password for the server.")
 
 func main() {
-	provider, username, password := getCredentials()
 	flag.Parse()
 
-	acc, err := gophercloud.Authenticate(
-		provider,
-		gophercloud.AuthOptions{
-			Username: username,
-			Password: password,
-		},
-	)
-	if err != nil {
-		panic(err)
-	}
+	withIdentity(func(acc gophercloud.AccessProvider) {
+		withServerApi(acc, func(api gophercloud.CloudServersProvider) {
+			// 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)
+				}
+				waitForServerState(api, *serverId, "ACTIVE")
+			}
 
-	api, err := gophercloud.ServersApi(acc, gophercloud.ApiCriteria{
-		Name:      "cloudServersOpenStack",
-		Region:    "DFW",
-		VersionId: "2",
-		UrlChoice: gophercloud.PublicURL,
-	})
-	if err != nil {
-		panic(err)
-	}
+			// If no password is provided, create one dynamically.
+			if *newPass == "" {
+				*newPass = randomString("", 16)
+			}
 
-	// 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)
+			// Submit the request for changing the admin password.
+			// Note that we don't verify this actually completes;
+			// doing so is beyond the scope of the SDK, and should be
+			// the responsibility of your specific OpenStack provider.
+			err := api.SetAdminPassword(*serverId, *newPass)
 			if err != nil {
 				panic(err)
 			}
-			if s.Status == "ACTIVE" {
-				break
+
+			if !*quiet {
+				fmt.Println("Password change request submitted.")
 			}
-			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)
-	}
-
-	if !*quiet {
-		fmt.Println("Password change request submitted.")
-	}
+		})
+	})
 }
diff --git a/acceptance/08-reauthentication.go b/acceptance/08-reauthentication.go
index 8b198c7..b15e5e0 100644
--- a/acceptance/08-reauthentication.go
+++ b/acceptance/08-reauthentication.go
@@ -10,56 +10,39 @@
 var rgn = flag.String("r", "DFW", "Datacenter region to interrogate.")
 
 func main() {
-	provider, username, password := getCredentials()
 	flag.Parse()
 
-	// Authenticate initially against the service.
-	auth, err := gophercloud.Authenticate(
-		provider,
-		gophercloud.AuthOptions{
-			Username: username,
-			Password: password,
-			AllowReauth: true,		// This enables reauthentication.
-		},
-	)
-	if err != nil {
-		panic(err)
-	}
+	// Invoke withIdentity such that re-auth is enabled.
+	withIdentity(true, func(auth gophercloud.AccessProvider) {
+		token1 := auth.AuthToken()
 
-	// Cache our initial authentication token.
-	token1 := auth.AuthToken()
+		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
+			// Just to confirm everything works, we should be able to list images without error.
+			_, err := servers.ListImages()
+			if err != nil {
+				panic(err)
+			}
 
-	// Acquire access to the cloud servers API.
-	servers, err := gophercloud.ServersApi(auth, gophercloud.ApiCriteria{
-		Name:      "cloudServersOpenStack",
-		Region:    *rgn,
-		VersionId: "2",
-		UrlChoice: gophercloud.PublicURL,
+			// Revoke our current authentication token.
+			auth.Revoke(auth.AuthToken())
+
+			// Attempt to list images again.  This should _succeed_, because we enabled re-authentication.
+			_, err = servers.ListImages()
+			if err != nil {
+				panic(err)
+			}
+
+			// However, our new authentication token should differ.
+			token2 := auth.AuthToken()
+
+			if !*quiet {
+				fmt.Println("Old authentication token: ", token1)
+				fmt.Println("New authentication token: ", token2)
+			}
+
+			if token1 == token2 {
+				panic("Tokens should differ")
+			}
+		})
 	})
-	if err != nil {
-		panic(err)
-	}
-
-	// Just to confirm everything works, we should be able to list images without error.
-	_, err = servers.ListImages()
-	if err != nil {
-		panic(err)
-	}
-
-	// Revoke our current authentication token.
-	auth.Revoke(auth.AuthToken())
-
-	// Attempt to list images again.  This should _succeed_, because we enabled re-authentication.
-	_, err = servers.ListImages()
-	if err != nil {
-		panic(err)
-	}
-
-	// However, our new authentication token should differ.
-	token2 := auth.AuthToken()
-
-	if !*quiet {
-		fmt.Println("Old authentication token: ", token1)
-		fmt.Println("New authentication token: ", token2)
-	}
 }
diff --git a/acceptance/09-resize-server.go b/acceptance/09-resize-server.go
index 558b2cf..b12ef4b 100644
--- a/acceptance/09-resize-server.go
+++ b/acceptance/09-resize-server.go
@@ -10,43 +10,26 @@
 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)
-	}
+	withIdentity(false, func(acc gophercloud.AccessProvider) {
+		withServerApi(acc, func(api gophercloud.CloudServersProvider) {
+			// 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
 
-	api, err := gophercloud.ServersApi(acc, gophercloud.ApiCriteria{
-		Name:      "cloudServersOpenStack",
-		Region:    "DFW",
-		VersionId: "2",
-		UrlChoice: gophercloud.PublicURL,
+			if !*quiet {
+				fmt.Println("Done.")
+			}
+		})
 	})
-	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.")
-	}
 }
 
+// Perform the resize test, but reject the resize request.
 func resizeRejectTest(api gophercloud.CloudServersProvider, done chan bool) {
 	withServer(api, func(id string) {
 		newFlavorId := findAlternativeFlavor()
@@ -55,7 +38,7 @@
 			panic(err)
 		}
 
-		waitForVerifyResize(api, id)
+		waitForServerState(api, id, "VERIFY_RESIZE")
 
 		err = api.RevertResize(id)
 		if err != nil {
@@ -65,6 +48,7 @@
 	done <- true
 }
 
+// Perform the resize test, but accept the resize request.
 func resizeAcceptTest(api gophercloud.CloudServersProvider, done chan bool) {
 	withServer(api, func(id string) {
 		newFlavorId := findAlternativeFlavor()
@@ -73,7 +57,7 @@
 			panic(err)
 		}
 
-		waitForVerifyResize(api, id)
+		waitForServerState(api, id, "VERIFY_RESIZE")
 
 		err = api.ConfirmResize(id)
 		if err != nil {
@@ -83,19 +67,6 @@
 	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 {
@@ -115,6 +86,13 @@
 
 	f(id)
 
+	// I've learned that resizing an instance can fail if a delete request
+	// comes in prior to its completion.  This ends up leaving the server
+	// in an error state, and neither the resize NOR the delete complete.
+	// This is a bug in OpenStack, as far as I'm concerned, but thankfully,
+	// there's an easy work-around -- just wait for your server to return to
+	// active state first!
+	waitForServerState(api, id, "ACTIVE")
 	err = api.DeleteServerById(id)
 	if err != nil {
 		panic(err)
diff --git a/acceptance/99-delete-server.go b/acceptance/99-delete-server.go
index 8d05e8e..c39e44c 100644
--- a/acceptance/99-delete-server.go
+++ b/acceptance/99-delete-server.go
@@ -10,47 +10,37 @@
 var region = flag.String("r", "DFW", "Datacenter region")
 
 func main() {
-	provider, username, password := getCredentials()
 	flag.Parse()
 
-	auth, err := gophercloud.Authenticate(provider, gophercloud.AuthOptions{
-		Username: username,
-		Password: password,
-	})
-	if err != nil {
-		panic(err)
-	}
-
-	servers, err := gophercloud.ServersApi(auth, gophercloud.ApiCriteria{
-		Name:      "cloudServersOpenStack",
-		Region:    *region,
-		VersionId: "2",
-		UrlChoice: gophercloud.PublicURL,
-	})
-	if err != nil {
-		panic(err)
-	}
-
-	ss, err := servers.ListServers()
-	if err != nil {
-		panic(err)
-	}
-
-	n := 0
-	for _, s := range ss {
-		if len(s.Name) < 10 {
-			continue
-		}
-		if s.Name[0:10] == "ACPTTEST--" {
-			err := servers.DeleteServerById(s.Id)
+	withIdentity(false, func(auth gophercloud.AccessProvider) {
+		withServerApi(auth, func(servers gophercloud.CloudServersProvider) {
+			// Grab a listing of all servers.
+			ss, err := servers.ListServers()
 			if err != nil {
 				panic(err)
 			}
-			n++
-		}
-	}
 
-	if !*quiet {
-		fmt.Printf("%d servers removed.\n", n)
-	}
+			// And for each one that starts with the ACPTTEST prefix, delete it.
+			// These are likely left-overs from previously running acceptance tests.
+			// Note that 04-create-servers.go is intended to leak servers by intention,
+			// so as to test this code.  :)
+			n := 0
+			for _, s := range ss {
+				if len(s.Name) < 8 {
+					continue
+				}
+				if s.Name[0:8] == "ACPTTEST" {
+					err := servers.DeleteServerById(s.Id)
+					if err != nil {
+						panic(err)
+					}
+					n++
+				}
+			}
+
+			if !*quiet {
+				fmt.Printf("%d servers removed.\n", n)
+			}
+		})
+	})	
 }
diff --git a/acceptance/libargs.go b/acceptance/libargs.go
index d9eae11..932e61e 100644
--- a/acceptance/libargs.go
+++ b/acceptance/libargs.go
@@ -132,13 +132,14 @@
 
 // withIdentity authenticates the user against the provider's identity service, and provides an
 // accessor for additional services.
-func withIdentity(f func(gophercloud.AccessProvider)) {
+func withIdentity(ar bool, f func(gophercloud.AccessProvider)) {
 	provider, username, password := getCredentials()
 	acc, err := gophercloud.Authenticate(
 		provider,
 		gophercloud.AuthOptions{
 			Username: username,
 			Password: password,
+			AllowReauth: ar,
 		},
 	)
 	if err != nil {