rename 'blockstorage' to 'blockStorage' for consistency
diff --git a/acceptance/openstack/blockStorage/v1/blockstorage_test.go.bak b/acceptance/openstack/blockStorage/v1/blockstorage_test.go.bak
new file mode 100644
index 0000000..aaabac1
--- /dev/null
+++ b/acceptance/openstack/blockStorage/v1/blockstorage_test.go.bak
@@ -0,0 +1,213 @@
+// +build acceptance
+
+package openstack
+
+import (
+ "fmt"
+ blockstorage "github.com/rackspace/gophercloud/openstack/blockstorage/v1"
+ "github.com/rackspace/gophercloud/openstack/blockstorage/v1/snapshots"
+ "github.com/rackspace/gophercloud/openstack/blockstorage/v1/volumes"
+ identity "github.com/rackspace/gophercloud/openstack/identity/v2"
+ "github.com/rackspace/gophercloud/openstack/utils"
+ "os"
+ "strconv"
+ "testing"
+ "time"
+)
+
+var numVols = 2
+
+func getClient() (*blockstorage.Client, error) {
+ ao, err := utils.AuthOptions()
+ if err != nil {
+ return nil, err
+ }
+
+ r, err := identity.Authenticate(ao)
+ if err != nil {
+ return nil, err
+ }
+
+ sc, err := identity.GetServiceCatalog(r)
+ if err != nil {
+ return nil, err
+ }
+
+ ces, err := sc.CatalogEntries()
+ if err != nil {
+ return nil, err
+ }
+
+ var eps []identity.Endpoint
+ for _, ce := range ces {
+ if ce.Type == "volume" {
+ eps = ce.Endpoints
+ }
+ }
+
+ region := os.Getenv("OS_REGION_NAME")
+ rep := ""
+ for _, ep := range eps {
+ if ep.Region == region {
+ rep = ep.PublicURL
+ }
+ }
+
+ client := blockstorage.NewClient(rep, r, ao)
+
+ return client, nil
+
+}
+
+func TestVolumes(t *testing.T) {
+ client, err := getClient()
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ var cv volumes.Volume
+ for i := 0; i < numVols; i++ {
+ cv, err := volumes.Create(client, volumes.CreateOpts{
+ "size": 1,
+ "display_name": "test-volume" + strconv.Itoa(i),
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ defer func() {
+ time.Sleep(10000 * time.Millisecond)
+ err = volumes.Delete(client, volumes.DeleteOpts{
+ "id": cv.Id,
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ }()
+ }
+
+ vols, err := volumes.List(client, volumes.ListOpts{
+ "full": true,
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ if len(vols) != numVols {
+ t.Errorf("Expected %d volumes, got %d", numVols, len(vols))
+ return
+ }
+
+ vols, err = volumes.List(client, volumes.ListOpts{
+ "full": false,
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ if len(vols) != numVols {
+ t.Errorf("Expected %d volumes, got %d", numVols, len(vols))
+ return
+ }
+
+ _, err = volumes.Get(client, volumes.GetOpts{
+ "id": cv.Id,
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+}
+
+func TestSnapshots(t *testing.T) {
+ client, err := getClient()
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ var css snapshots.Snapshot
+
+ cv, err := volumes.Create(client, volumes.CreateOpts{
+ "size": 1,
+ "display_name": "test-volume",
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ defer func() {
+ for i := 0; i < 60; i++ {
+ gss, _ := snapshots.Get(client, snapshots.GetOpts{
+ "id": css.Id,
+ })
+ if gss.Status == "" {
+ err = volumes.Delete(client, volumes.DeleteOpts{
+ "id": cv.Id,
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ break
+ }
+ time.Sleep(5000 * time.Millisecond)
+ }
+ }()
+
+ for i := 0; i < 60; i++ {
+ gv, err := volumes.Get(client, volumes.GetOpts{
+ "id": cv.Id,
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ if gv.Status == "available" {
+ break
+ }
+ time.Sleep(2000 * time.Millisecond)
+ }
+
+ css, err = snapshots.Create(client, snapshots.CreateOpts{
+ "volume_id": cv.Id,
+ "display_name": "test-snapshot",
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ defer func() {
+ for i := 0; i < 60; i++ {
+ gss, err := snapshots.Get(client, snapshots.GetOpts{
+ "id": css.Id,
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ if gss.Status == "available" {
+ err = snapshots.Delete(client, snapshots.DeleteOpts{
+ "id": css.Id,
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ break
+ }
+ time.Sleep(2000 * time.Millisecond)
+ }
+ }()
+
+ lss, err := snapshots.List(client, snapshots.ListOpts{
+ Full: true,
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+}
diff --git a/acceptance/openstack/blockStorage/v1/snapshots_test.go b/acceptance/openstack/blockStorage/v1/snapshots_test.go
new file mode 100644
index 0000000..0d9d5c7
--- /dev/null
+++ b/acceptance/openstack/blockStorage/v1/snapshots_test.go
@@ -0,0 +1,67 @@
+// +build acceptance
+
+package v1
+
+import (
+ "fmt"
+ "os"
+ "testing"
+ "time"
+
+ "github.com/rackspace/gophercloud"
+ "github.com/rackspace/gophercloud/openstack/blockStorage/v1/snapshots"
+)
+
+func waitForSnapshot(client *gophercloud.ServiceClient, id string) error {
+ for secondsSlept := 0; secondsSlept < 240; secondsSlept++ {
+ fmt.Printf("Seconds slept waiting for snapshot: %d\n", secondsSlept)
+ gss, err := snapshots.Get(client, id).ExtractSnapshot()
+ if err != nil {
+ return err
+ }
+ if gss.Status == "available" {
+ return nil
+ }
+ if gss.Status == "error" {
+ return fmt.Errorf("Error waiting for snapshot to create. Snapshot status is 'error'.")
+ }
+ time.Sleep(1 * time.Second)
+ }
+ gss, err := snapshots.Get(client, id).ExtractSnapshot()
+ if err != nil {
+ return err
+ }
+ return fmt.Errorf("Time out waiting for snapshot to become available: %+v", gss)
+}
+
+func TestSnapshots(t *testing.T) {
+
+ volumeID := os.Getenv("OS_VOLUME_ID")
+ if volumeID == "" {
+ t.Errorf("Expect OS_VOLUME_ID environment variable. Skipping create and delete snapshot functions.")
+ return
+ }
+
+ client, err := newClient()
+ if err != nil {
+ t.Fatalf("Failed to create Block Storage v1 client: %v", err)
+ }
+
+ css, err := snapshots.Create(client, snapshots.CreateOpts{
+ Name: "gophercloud-test-snapshot",
+ VolumeID: volumeID,
+ })
+ if err != nil {
+ t.Errorf("Failed to create snapshot: %v\n", err)
+ }
+
+ err = waitForSnapshot(client, css.ID)
+ if err != nil {
+ t.Errorf("Failed to create snapshot: %v\n", err)
+ }
+
+ err = waitForSnapshot(client, css.ID)
+
+ t.Logf("Created snapshots: %+v\n", *css)
+
+}
diff --git a/acceptance/openstack/blockStorage/v1/volumeTypes_test.go b/acceptance/openstack/blockStorage/v1/volumeTypes_test.go
new file mode 100644
index 0000000..ad6526a
--- /dev/null
+++ b/acceptance/openstack/blockStorage/v1/volumeTypes_test.go
@@ -0,0 +1,72 @@
+// +build acceptance
+
+package v1
+
+import (
+ "strconv"
+ "testing"
+ "time"
+
+ "github.com/rackspace/gophercloud/openstack/blockStorage/v1/volumeTypes"
+ "github.com/rackspace/gophercloud/pagination"
+)
+
+var numVolTypes = 1
+
+func TestVolumeTypes(t *testing.T) {
+ client, err := newClient()
+ if err != nil {
+ t.Fatalf("Failed to create Block Storage v1 client: %v", err)
+ }
+
+ var cvt *volumeTypes.VolumeType
+ for i := 0; i < numVolTypes; i++ {
+ cvt, err = volumeTypes.Create(client, volumeTypes.CreateOpts{
+ ExtraSpecs: map[string]interface{}{
+ "capabilities": "gpu",
+ "priority": 3,
+ },
+ Name: "gophercloud-test-volumeType-" + strconv.Itoa(i),
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ defer func() {
+ time.Sleep(10000 * time.Millisecond)
+ err = volumeTypes.Delete(client, cvt.ID)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ }()
+ t.Logf("Created volume type: %+v\n", cvt)
+ }
+
+ gr, err := volumeTypes.Get(client, cvt.ID)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ v, err := volumeTypes.ExtractVolumeType(gr)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ t.Logf("Got volume type: %+v\n", v)
+
+ pager := volumeTypes.List(client, volumeTypes.ListOpts{})
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ err = pager.EachPage(func(page pagination.Page) (bool, error) {
+ volTypes, err := volumeTypes.ExtractVolumeTypes(page)
+ if len(volTypes) != numVolTypes {
+ t.Errorf("Expected %d volume types, got %d", numVolTypes, len(volTypes))
+ }
+ t.Logf("Listing volume types: %+v\n", volTypes)
+ return true, err
+ })
+
+}
diff --git a/acceptance/openstack/blockStorage/v1/volumes_test.go b/acceptance/openstack/blockStorage/v1/volumes_test.go
new file mode 100644
index 0000000..22d9653
--- /dev/null
+++ b/acceptance/openstack/blockStorage/v1/volumes_test.go
@@ -0,0 +1,95 @@
+// +build acceptance blockstorage
+
+package v1
+
+import (
+ "fmt"
+ "os"
+ "strconv"
+ "testing"
+ "time"
+
+ "github.com/rackspace/gophercloud"
+ "github.com/rackspace/gophercloud/openstack"
+ "github.com/rackspace/gophercloud/openstack/blockStorage/v1/volumes"
+ "github.com/rackspace/gophercloud/openstack/utils"
+ "github.com/rackspace/gophercloud/pagination"
+)
+
+var numVols = 1
+
+func newClient() (*gophercloud.ServiceClient, error) {
+ ao, err := utils.AuthOptions()
+ if err != nil {
+ return nil, err
+ }
+
+ client, err := openstack.AuthenticatedClient(ao)
+ if err != nil {
+ return nil, err
+ }
+
+ return openstack.NewBlockStorageV1(client, gophercloud.EndpointOpts{
+ Region: os.Getenv("OS_REGION_NAME"),
+ })
+}
+
+func TestVolumes(t *testing.T) {
+ client, err := newClient()
+ if err != nil {
+ t.Fatalf("Failed to create Block Storage v1 client: %v", err)
+ }
+
+ var cv *volumes.Volume
+ for i := 0; i < numVols; i++ {
+ cv, err = volumes.Create(client, volumes.CreateOpts{
+ Size: 1,
+ Name: "gophercloud-test-volume-" + strconv.Itoa(i),
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ defer func() {
+ time.Sleep(10000 * time.Millisecond)
+ err = volumes.Delete(client, cv.ID)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ }()
+
+ }
+
+ _, err = volumes.Update(client, cv.ID, volumes.UpdateOpts{
+ Name: "gophercloud-updated-volume",
+ })
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ v, err := volumes.Get(client, cv.ID).ExtractVolume()
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ fmt.Printf("Got volume: %+v\n", v)
+
+ if v.Name != "gophercloud-updated-volume" {
+ t.Errorf("Unable to update volume: Expected name: gophercloud-updated-volume\nActual name: %s", v.Name)
+ }
+
+ pager := volumes.List(client, volumes.ListOpts{})
+ if err != nil {
+ t.Error(err)
+ return
+ }
+ err = pager.EachPage(func(page pagination.Page) (bool, error) {
+ vols, err := volumes.ExtractVolumes(page)
+ if len(vols) != numVols {
+ t.Errorf("Expected %d volumes, got %d", numVols, len(vols))
+ }
+ return true, err
+ })
+}