Boot From Volume Acceptance Test Cleanup

The following changes were made to the bootfromvolume acceptance tests:

* Renamed tests so tests can selectively be run by substring.
* Created createBootFromVolumeServer function
diff --git a/acceptance/openstack/compute/v2/bootfromvolume_test.go b/acceptance/openstack/compute/v2/bootfromvolume_test.go
index d1607be..6b73347 100644
--- a/acceptance/openstack/compute/v2/bootfromvolume_test.go
+++ b/acceptance/openstack/compute/v2/bootfromvolume_test.go
@@ -1,33 +1,32 @@
-// +build acceptance
+// +build acceptance compute bootfromvolume
 
 package v2
 
 import (
 	"testing"
 
+	"github.com/gophercloud/gophercloud"
 	"github.com/gophercloud/gophercloud/acceptance/tools"
 	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
 	"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
-	th "github.com/gophercloud/gophercloud/testhelper"
 )
 
-func TestBootFromVolume(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
+func TestBootFromVolumeSingleVolume(t *testing.T) {
 	if testing.Short() {
 		t.Skip("Skipping test that requires server creation in short mode.")
 	}
 
+	client, err := newClient()
+	if err != nil {
+		t.Fatalf("Unable to create a compute client: %v", err)
+	}
+
 	choices, err := ComputeChoicesFromEnv()
 	if err != nil {
 		t.Fatal(err)
 	}
 
-	name := tools.RandomString("Gophercloud-", 8)
-	t.Logf("Creating server [%s].", name)
-
-	bd := []bootfromvolume.BlockDevice{
+	blockDevices := []bootfromvolume.BlockDevice{
 		bootfromvolume.BlockDevice{
 			UUID:       choices.ImageID,
 			SourceType: bootfromvolume.Image,
@@ -35,48 +34,41 @@
 		},
 	}
 
-	serverCreateOpts := servers.CreateOpts{
-		Name:      name,
-		FlavorRef: choices.FlavorID,
-		ImageRef:  choices.ImageID,
+	server, err := createBootableVolumeServer(t, client, blockDevices, choices)
+	if err != nil {
+		t.Fatal("Unable to create server: %v", err)
 	}
-	server, err := bootfromvolume.Create(client, bootfromvolume.CreateOptsExt{
-		serverCreateOpts,
-		bd,
-	}).Extract()
-	th.AssertNoErr(t, err)
 	if err = waitForStatus(client, server, "ACTIVE"); err != nil {
-		t.Fatal(err)
+		t.Fatal("Unable to wait for server: %v", err)
 	}
+	defer deleteServer(t, client, server)
 
-	t.Logf("Created server: %+v\n", server)
-	defer servers.Delete(client, server.ID)
-	t.Logf("Deleting server [%s]...", name)
+	printServer(t, server)
 }
 
-func TestMultiEphemeral(t *testing.T) {
-	client, err := newClient()
-	th.AssertNoErr(t, err)
-
+func TestBootFromVolumeMultiEphemeral(t *testing.T) {
 	if testing.Short() {
 		t.Skip("Skipping test that requires server creation in short mode.")
 	}
 
+	client, err := newClient()
+	if err != nil {
+		t.Fatalf("Unable to create a compute client: %v", err)
+	}
+
 	choices, err := ComputeChoicesFromEnv()
 	if err != nil {
 		t.Fatal(err)
 	}
 
-	name := tools.RandomString("Gophercloud-", 8)
-	t.Logf("Creating server [%s].", name)
-
-	bd := []bootfromvolume.BlockDevice{
+	blockDevices := []bootfromvolume.BlockDevice{
 		bootfromvolume.BlockDevice{
 			BootIndex:           0,
 			UUID:                choices.ImageID,
 			SourceType:          bootfromvolume.Image,
 			DestinationType:     "local",
 			DeleteOnTermination: true,
+			VolumeSize:          5,
 		},
 		bootfromvolume.BlockDevice{
 			BootIndex:           -1,
@@ -96,21 +88,48 @@
 		},
 	}
 
+	server, err := createBootableVolumeServer(t, client, blockDevices, choices)
+	if err != nil {
+		t.Fatalf("Unable to create server: %v", err)
+	}
+	if err = waitForStatus(client, server, "ACTIVE"); err != nil {
+		t.Fatalf("Unable to wait for server: %v", err)
+	}
+	defer deleteServer(t, client, server)
+
+	printServer(t, server)
+}
+
+func createBootableVolumeServer(t *testing.T, client *gophercloud.ServiceClient, blockDevices []bootfromvolume.BlockDevice, choices *ComputeChoices) (*servers.Server, error) {
+	if testing.Short() {
+		t.Skip("Skipping test that requires server creation in short mode.")
+	}
+
+	networkID, err := getNetworkIDFromTenantNetworks(t, client, choices.NetworkName)
+	if err != nil {
+		t.Fatalf("Failed to obtain network ID: %v", err)
+	}
+
+	name := tools.RandomString("ACPTTEST", 16)
+	t.Logf("Attempting to create bootable volume server: %s", name)
+
 	serverCreateOpts := servers.CreateOpts{
 		Name:      name,
 		FlavorRef: choices.FlavorID,
 		ImageRef:  choices.ImageID,
-	}
-	server, err := bootfromvolume.Create(client, bootfromvolume.CreateOptsExt{
-		serverCreateOpts,
-		bd,
-	}).Extract()
-	th.AssertNoErr(t, err)
-	if err = waitForStatus(client, server, "ACTIVE"); err != nil {
-		t.Fatal(err)
+		Networks: []servers.Network{
+			servers.Network{UUID: networkID},
+		},
 	}
 
-	t.Logf("Created server: %+v\n", server)
-	defer servers.Delete(client, server.ID)
-	t.Logf("Deleting server [%s]...", name)
+	server, err := bootfromvolume.Create(client, bootfromvolume.CreateOptsExt{
+		serverCreateOpts,
+		blockDevices,
+	}).Extract()
+
+	if err != nil {
+		return server, err
+	}
+
+	return server, nil
 }