Networking Acceptance Test Cleanup (#79)

diff --git a/acceptance/openstack/networking/v2/networking.go b/acceptance/openstack/networking/v2/networking.go
new file mode 100644
index 0000000..86c3545
--- /dev/null
+++ b/acceptance/openstack/networking/v2/networking.go
@@ -0,0 +1,182 @@
+package v2
+
+import (
+	"fmt"
+	"testing"
+
+	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/acceptance/tools"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/apiversions"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
+	"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
+)
+
+// CreateNetwork will create basic network. An error will be returned if the
+// network could not be created.
+func CreateNetwork(t *testing.T, client *gophercloud.ServiceClient) (*networks.Network, error) {
+	networkName := tools.RandomString("TESTACC-", 8)
+	createOpts := networks.CreateOpts{
+		Name:         networkName,
+		AdminStateUp: gophercloud.Enabled,
+	}
+
+	t.Logf("Attempting to create network: %s", networkName)
+
+	network, err := networks.Create(client, createOpts).Extract()
+	if err != nil {
+		return network, err
+	}
+
+	t.Logf("Successfully created network.")
+	return network, nil
+}
+
+// CreatePort will create a port on the specified subnet. An error will be
+// returned if the port could not be created.
+func CreatePort(t *testing.T, client *gophercloud.ServiceClient, networkID, subnetID string) (*ports.Port, error) {
+	portName := tools.RandomString("TESTACC-", 8)
+
+	t.Logf("Attempting to create port: %s", portName)
+
+	createOpts := ports.CreateOpts{
+		NetworkID:    networkID,
+		Name:         portName,
+		AdminStateUp: gophercloud.Disabled,
+		FixedIPs:     []ports.IP{ports.IP{SubnetID: subnetID}},
+	}
+
+	port, err := ports.Create(client, createOpts).Extract()
+	if err != nil {
+		return port, err
+	}
+
+	t.Logf("Successfully created port: %s", portName)
+
+	return port, nil
+}
+
+// CreateSubnet will create a subnet on the specified Network ID. An error
+// will be returned if the subnet could not be created.
+func CreateSubnet(t *testing.T, client *gophercloud.ServiceClient, networkID string) (*subnets.Subnet, error) {
+	subnetName := tools.RandomString("TESTACC-", 8)
+	subnetOctet := tools.RandomInt(1, 250)
+	subnetCIDR := fmt.Sprintf("192.168.%d.0/24", subnetOctet)
+	subnetGateway := fmt.Sprintf("192.168.%d.1", subnetOctet)
+	iFalse := false
+	createOpts := subnets.CreateOpts{
+		NetworkID:  networkID,
+		CIDR:       subnetCIDR,
+		IPVersion:  4,
+		Name:       subnetName,
+		EnableDHCP: &iFalse,
+		GatewayIP:  &subnetGateway,
+	}
+
+	t.Logf("Attempting to create subnet: %s", subnetName)
+
+	subnet, err := subnets.Create(client, createOpts).Extract()
+	if err != nil {
+		return subnet, err
+	}
+
+	t.Logf("Successfully created subnet.")
+	return subnet, nil
+}
+
+// DeleteNetwork will delete a network with a specified ID. A fatal error will
+// occur if the delete was not successful. This works best when used as a
+// deferred function.
+func DeleteNetwork(t *testing.T, client *gophercloud.ServiceClient, networkID string) {
+	t.Logf("Attempting to delete network: %s", networkID)
+
+	err := networks.Delete(client, networkID).ExtractErr()
+	if err != nil {
+		t.Fatalf("Unable to delete network %s: %v", networkID, err)
+	}
+
+	t.Logf("Deleted network: %s", networkID)
+}
+
+// DeletePort will delete a port with a specified ID. A fatal error will
+// occur if the delete was not successful. This works best when used as a
+// deferred function.
+func DeletePort(t *testing.T, client *gophercloud.ServiceClient, portID string) {
+	t.Logf("Attempting to delete port: %s", portID)
+
+	err := ports.Delete(client, portID).ExtractErr()
+	if err != nil {
+		t.Fatalf("Unable to delete port %s: %v", portID, err)
+	}
+
+	t.Logf("Deleted port: %s", portID)
+}
+
+// DeleteSubnet will delete a subnet with a specified ID. A fatal error will
+// occur if the delete was not successful. This works best when used as a
+// deferred function.
+func DeleteSubnet(t *testing.T, client *gophercloud.ServiceClient, subnetID string) {
+	t.Logf("Attempting to delete subnet: %s", subnetID)
+
+	err := subnets.Delete(client, subnetID).ExtractErr()
+	if err != nil {
+		t.Fatalf("Unable to delete subnet %s: %v", subnetID, err)
+	}
+
+	t.Logf("Deleted subnet: %s", subnetID)
+}
+
+// PrintAPIVersion will print an API version and all of its attributes.
+func PrintAPIVersion(t *testing.T, apiVersion *apiversions.APIVersion) {
+	t.Logf("ID: %s", apiVersion.ID)
+	t.Logf("Status: %s", apiVersion.Status)
+}
+
+// PrintNetwork will print a network and all of its attributes.
+func PrintNetwork(t *testing.T, network *networks.Network) {
+	t.Logf("ID: %s", network.ID)
+	t.Logf("Name: %s", network.Name)
+	t.Logf("AdminStateUp: %t", network.AdminStateUp)
+	t.Logf("Status: %s", network.Status)
+	t.Logf("TenantID: %s", network.TenantID)
+	t.Logf("Shared: %t", network.Shared)
+	t.Logf("Subnets: %s", network.Subnets)
+}
+
+// PrintPort will print a port and all of its attributes.
+func PrintPort(t *testing.T, port *ports.Port) {
+	t.Logf("ID: %s", port.ID)
+	t.Logf("NetworkID: %s", port.NetworkID)
+	t.Logf("Name: %s", port.Name)
+	t.Logf("AdminStateUp: %t", port.AdminStateUp)
+	t.Logf("Status: %s", port.Status)
+	t.Logf("MACAddress: %s", port.MACAddress)
+	t.Logf("FixedIPs: %s", port.FixedIPs)
+	t.Logf("TenantID: %s", port.TenantID)
+	t.Logf("DeviceOwner: %s", port.DeviceOwner)
+	t.Logf("SecurityGroups: %s", port.SecurityGroups)
+	t.Logf("DeviceID: %s", port.DeviceID)
+	t.Logf("DeviceOwner: %s", port.DeviceOwner)
+	t.Logf("AllowedAddressPairs: %s", port.AllowedAddressPairs)
+}
+
+// PrintSubnet will print a subnet and all of its attributes.
+func PrintSubnet(t *testing.T, subnet *subnets.Subnet) {
+	t.Logf("ID: %s", subnet.ID)
+	t.Logf("NetworkID: %s", subnet.NetworkID)
+	t.Logf("Name: %s", subnet.Name)
+	t.Logf("IPVersion: %d", subnet.IPVersion)
+	t.Logf("CIDR: %s", subnet.CIDR)
+	t.Logf("GatewayIP: %s", subnet.GatewayIP)
+	t.Logf("DNSNameservers: %s", subnet.DNSNameservers)
+	t.Logf("AllocationPools: %s", subnet.AllocationPools)
+	t.Logf("HostRoutes: %s", subnet.HostRoutes)
+	t.Logf("EnableDHCP: %t", subnet.EnableDHCP)
+	t.Logf("TenantID: %s", subnet.TenantID)
+}
+
+// PrintVersionResource will print an API version resource and all of its attributes.
+func PrintVersionResource(t *testing.T, versionResource *apiversions.APIVersionResource) {
+	t.Logf("Name: %s", versionResource.Name)
+	t.Logf("Collection: %s", versionResource.Collection)
+}