github.com/leeclow-ops/gophercloud@v1.2.1/acceptance/openstack/blockstorage/v3/volumes_test.go (about) 1 //go:build acceptance || blockstorage 2 // +build acceptance blockstorage 3 4 package v3 5 6 import ( 7 "testing" 8 9 "github.com/leeclow-ops/gophercloud/acceptance/clients" 10 "github.com/leeclow-ops/gophercloud/acceptance/tools" 11 "github.com/leeclow-ops/gophercloud/openstack/blockstorage/v3/snapshots" 12 "github.com/leeclow-ops/gophercloud/openstack/blockstorage/v3/volumes" 13 "github.com/leeclow-ops/gophercloud/pagination" 14 th "github.com/leeclow-ops/gophercloud/testhelper" 15 ) 16 17 func TestVolumes(t *testing.T) { 18 clients.RequireLong(t) 19 20 client, err := clients.NewBlockStorageV3Client() 21 th.AssertNoErr(t, err) 22 23 volume1, err := CreateVolume(t, client) 24 th.AssertNoErr(t, err) 25 defer DeleteVolume(t, client, volume1) 26 27 volume2, err := CreateVolume(t, client) 28 th.AssertNoErr(t, err) 29 defer DeleteVolume(t, client, volume2) 30 31 // Update volume 32 updatedVolumeName := "" 33 updatedVolumeDescription := "" 34 updateOpts := volumes.UpdateOpts{ 35 Name: &updatedVolumeName, 36 Description: &updatedVolumeDescription, 37 } 38 updatedVolume, err := volumes.Update(client, volume1.ID, updateOpts).Extract() 39 th.AssertNoErr(t, err) 40 41 tools.PrintResource(t, updatedVolume) 42 th.AssertEquals(t, updatedVolume.Name, updatedVolumeName) 43 th.AssertEquals(t, updatedVolume.Description, updatedVolumeDescription) 44 45 listOpts := volumes.ListOpts{ 46 Limit: 1, 47 } 48 49 err = volumes.List(client, listOpts).EachPage(func(page pagination.Page) (bool, error) { 50 actual, err := volumes.ExtractVolumes(page) 51 th.AssertNoErr(t, err) 52 th.AssertEquals(t, 1, len(actual)) 53 54 var found bool 55 for _, v := range actual { 56 if v.ID == volume1.ID || v.ID == volume2.ID { 57 found = true 58 } 59 } 60 61 th.AssertEquals(t, found, true) 62 63 return true, nil 64 }) 65 66 th.AssertNoErr(t, err) 67 } 68 69 func TestVolumesMultiAttach(t *testing.T) { 70 clients.RequireLong(t) 71 72 client, err := clients.NewBlockStorageV3Client() 73 th.AssertNoErr(t, err) 74 75 volumeName := tools.RandomString("ACPTTEST", 16) 76 77 volOpts := volumes.CreateOpts{ 78 Size: 1, 79 Name: volumeName, 80 Description: "Testing creation of multiattach enabled volume", 81 Multiattach: true, 82 } 83 84 vol, err := volumes.Create(client, volOpts).Extract() 85 th.AssertNoErr(t, err) 86 87 err = volumes.WaitForStatus(client, vol.ID, "available", 60) 88 th.AssertNoErr(t, err) 89 90 th.AssertEquals(t, vol.Multiattach, true) 91 92 err = volumes.Delete(client, vol.ID, volumes.DeleteOpts{}).ExtractErr() 93 th.AssertNoErr(t, err) 94 } 95 96 func TestVolumesCascadeDelete(t *testing.T) { 97 clients.RequireLong(t) 98 99 client, err := clients.NewBlockStorageV3Client() 100 th.AssertNoErr(t, err) 101 102 vol, err := CreateVolume(t, client) 103 th.AssertNoErr(t, err) 104 105 err = volumes.WaitForStatus(client, vol.ID, "available", 60) 106 th.AssertNoErr(t, err) 107 108 snapshot1, err := CreateSnapshot(t, client, vol) 109 th.AssertNoErr(t, err) 110 111 snapshot2, err := CreateSnapshot(t, client, vol) 112 th.AssertNoErr(t, err) 113 114 t.Logf("Attempting to delete volume: %s", vol.ID) 115 116 deleteOpts := volumes.DeleteOpts{Cascade: true} 117 err = volumes.Delete(client, vol.ID, deleteOpts).ExtractErr() 118 if err != nil { 119 t.Fatalf("Unable to delete volume %s: %v", vol.ID, err) 120 } 121 122 for _, sid := range []string{snapshot1.ID, snapshot2.ID} { 123 err := tools.WaitFor(func() (bool, error) { 124 _, err := snapshots.Get(client, sid).Extract() 125 if err != nil { 126 return true, nil 127 } 128 return false, nil 129 }) 130 th.AssertNoErr(t, err) 131 t.Logf("Successfully deleted snapshot: %s", sid) 132 } 133 134 err = tools.WaitFor(func() (bool, error) { 135 _, err := volumes.Get(client, vol.ID).Extract() 136 if err != nil { 137 return true, nil 138 } 139 return false, nil 140 }) 141 th.AssertNoErr(t, err) 142 143 t.Logf("Successfully deleted volume: %s", vol.ID) 144 145 }