feature/shared file systems: share acceptance tests (#128)

* feature/filestorage: acceptance tests

Implements acceptance tests for `sharedfilesystems/v2/shares`

* sfs/acceptance: create share-network in env script

Adds creation of a share-network in the acceptance test environment
setup script, and stores the network id in an environment variable

* sfs: adds ShareNetworkID to AcceptanceTestChoices

Gets ShareNetworkID from the OS environment variable:
`OS_SHARE_NETWORK_ID`

* sfs: removes hard-coding of the share-network-id

* sfs: add OS_SHARE_NETWORK_ID to acceptance README

* sfs/acceptance: move WaitForStatus to acc. tests

Moves the `WaitForStatus`-function from the actual library to the
acceptance test folder and does not export it
diff --git a/acceptance/openstack/sharedfilesystems/v2/shares.go b/acceptance/openstack/sharedfilesystems/v2/shares.go
new file mode 100644
index 0000000..e9060b4
--- /dev/null
+++ b/acceptance/openstack/sharedfilesystems/v2/shares.go
@@ -0,0 +1,78 @@
+package v2
+
+import (
+	"encoding/json"
+	"github.com/gophercloud/gophercloud"
+	"github.com/gophercloud/gophercloud/acceptance/clients"
+	"github.com/gophercloud/gophercloud/openstack/sharedfilesystems/v2/shares"
+	"testing"
+)
+
+// CreateShare will create a share with a name, and a size of 1Gb. An
+// error will be returned if the share could not be created
+func CreateShare(t *testing.T, client *gophercloud.ServiceClient) (*shares.Share, error) {
+	if testing.Short() {
+		t.Skip("Skipping test that requres share creation in short mode.")
+	}
+
+	choices, err := clients.AcceptanceTestChoicesFromEnv()
+	if err != nil {
+		t.Fatalf("Unable to fetch environment information")
+	}
+
+	t.Logf("Share network id %s", choices.ShareNetworkID)
+	createOpts := shares.CreateOpts{
+		Size:           1,
+		Name:           "My Test Share",
+		ShareProto:     "NFS",
+		ShareNetworkID: choices.ShareNetworkID,
+	}
+
+	share, err := shares.Create(client, createOpts).Extract()
+	if err != nil {
+		return share, err
+	}
+
+	err = waitForStatus(client, share.ID, "available", 60)
+	if err != nil {
+		return share, err
+	}
+
+	return share, nil
+}
+
+// DeleteShare will delete a share. A fatal error will occur if the share
+// failed to be deleted. This works best when used as a deferred function.
+func DeleteShare(t *testing.T, client *gophercloud.ServiceClient, share *shares.Share) {
+	err := shares.Delete(client, share.ID).ExtractErr()
+	if err != nil {
+		t.Fatalf("Unable to delete share %s: %v", share.ID, err)
+	}
+
+	t.Logf("Deleted share: %s", share.ID)
+}
+
+// PrintShare prints some information of the share
+func PrintShare(t *testing.T, share *shares.Share) {
+	asJSON, err := json.MarshalIndent(share, "", " ")
+	if err != nil {
+		t.Logf("Cannot print the contents of %s", share.ID)
+	}
+
+	t.Logf("Share %s", string(asJSON))
+}
+
+func waitForStatus(c *gophercloud.ServiceClient, id, status string, secs int) error {
+	return gophercloud.WaitFor(secs, func() (bool, error) {
+		current, err := shares.Get(c, id).Extract()
+		if err != nil {
+			return false, err
+		}
+
+		if current.Status == status {
+			return true, nil
+		}
+
+		return false, nil
+	})
+}
diff --git a/acceptance/openstack/sharedfilesystems/v2/shares_test.go b/acceptance/openstack/sharedfilesystems/v2/shares_test.go
new file mode 100644
index 0000000..ed5d7cc
--- /dev/null
+++ b/acceptance/openstack/sharedfilesystems/v2/shares_test.go
@@ -0,0 +1,27 @@
+package v2
+
+import (
+	"github.com/gophercloud/gophercloud/acceptance/clients"
+	"github.com/gophercloud/gophercloud/openstack/sharedfilesystems/v2/shares"
+	"testing"
+)
+
+func TestShareCreate(t *testing.T) {
+	client, err := clients.NewSharedFileSystemV2Client()
+	if err != nil {
+		t.Fatalf("Unable to create a sharedfs client: %v", err)
+	}
+
+	share, err := CreateShare(t, client)
+	if err != nil {
+		t.Fatalf("Unable to create a share: %v", err)
+	}
+
+	defer DeleteShare(t, client, share)
+
+	created, err := shares.Get(client, share.ID).Extract()
+	if err != nil {
+		t.Errorf("Unable to retrieve share: %v", err)
+	}
+	PrintShare(t, created)
+}