github.com/gophercloud/gophercloud@v1.11.0/internal/acceptance/openstack/blockstorage/v3/snapshots_test.go (about) 1 //go:build acceptance || blockstorage 2 // +build acceptance blockstorage 3 4 package v3 5 6 import ( 7 "fmt" 8 "testing" 9 10 "github.com/gophercloud/gophercloud" 11 "github.com/gophercloud/gophercloud/internal/acceptance/clients" 12 "github.com/gophercloud/gophercloud/internal/acceptance/tools" 13 "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/snapshots" 14 "github.com/gophercloud/gophercloud/pagination" 15 th "github.com/gophercloud/gophercloud/testhelper" 16 ) 17 18 func TestSnapshots(t *testing.T) { 19 clients.RequireLong(t) 20 21 client, err := clients.NewBlockStorageV3Client() 22 th.AssertNoErr(t, err) 23 24 volume1, err := CreateVolume(t, client) 25 th.AssertNoErr(t, err) 26 defer DeleteVolume(t, client, volume1) 27 28 snapshot1, err := CreateSnapshot(t, client, volume1) 29 th.AssertNoErr(t, err) 30 defer DeleteSnapshot(t, client, snapshot1) 31 32 // Update snapshot 33 updatedSnapshotName := tools.RandomString("ACPTTEST", 16) 34 updatedSnapshotDescription := tools.RandomString("ACPTTEST", 16) 35 updateOpts := snapshots.UpdateOpts{ 36 Name: &updatedSnapshotName, 37 Description: &updatedSnapshotDescription, 38 } 39 t.Logf("Attempting to update snapshot: %s", updatedSnapshotName) 40 updatedSnapshot, err := snapshots.Update(client, snapshot1.ID, updateOpts).Extract() 41 th.AssertNoErr(t, err) 42 43 tools.PrintResource(t, updatedSnapshot) 44 th.AssertEquals(t, updatedSnapshot.Name, updatedSnapshotName) 45 th.AssertEquals(t, updatedSnapshot.Description, updatedSnapshotDescription) 46 47 volume2, err := CreateVolume(t, client) 48 th.AssertNoErr(t, err) 49 defer DeleteVolume(t, client, volume2) 50 51 snapshot2, err := CreateSnapshot(t, client, volume2) 52 th.AssertNoErr(t, err) 53 defer DeleteSnapshot(t, client, snapshot2) 54 55 listOpts := snapshots.ListOpts{ 56 Limit: 1, 57 } 58 59 err = snapshots.List(client, listOpts).EachPage(func(page pagination.Page) (bool, error) { 60 actual, err := snapshots.ExtractSnapshots(page) 61 th.AssertNoErr(t, err) 62 th.AssertEquals(t, 1, len(actual)) 63 64 var found bool 65 for _, v := range actual { 66 if v.ID == snapshot1.ID || v.ID == snapshot2.ID { 67 found = true 68 } 69 } 70 71 th.AssertEquals(t, found, true) 72 73 return true, nil 74 }) 75 76 th.AssertNoErr(t, err) 77 } 78 79 func TestSnapshotsResetStatus(t *testing.T) { 80 clients.RequireLong(t) 81 82 client, err := clients.NewBlockStorageV3Client() 83 th.AssertNoErr(t, err) 84 85 volume1, err := CreateVolume(t, client) 86 th.AssertNoErr(t, err) 87 defer DeleteVolume(t, client, volume1) 88 89 snapshot1, err := CreateSnapshot(t, client, volume1) 90 th.AssertNoErr(t, err) 91 defer DeleteSnapshot(t, client, snapshot1) 92 93 // Reset snapshot status to error 94 resetOpts := snapshots.ResetStatusOpts{ 95 Status: "error", 96 } 97 t.Logf("Attempting to reset snapshot status to %s", resetOpts.Status) 98 err = snapshots.ResetStatus(client, snapshot1.ID, resetOpts).ExtractErr() 99 th.AssertNoErr(t, err) 100 101 snapshot, err := snapshots.Get(client, snapshot1.ID).Extract() 102 th.AssertNoErr(t, err) 103 104 if snapshot.Status != resetOpts.Status { 105 th.AssertNoErr(t, fmt.Errorf("unexpected %q snapshot status", snapshot.Status)) 106 } 107 108 // Reset snapshot status to available 109 resetOpts = snapshots.ResetStatusOpts{ 110 Status: "available", 111 } 112 t.Logf("Attempting to reset snapshot status to %s", resetOpts.Status) 113 err = snapshots.ResetStatus(client, snapshot1.ID, resetOpts).ExtractErr() 114 th.AssertNoErr(t, err) 115 116 snapshot, err = snapshots.Get(client, snapshot1.ID).Extract() 117 th.AssertNoErr(t, err) 118 119 if snapshot.Status != resetOpts.Status { 120 th.AssertNoErr(t, fmt.Errorf("unexpected %q snapshot status", snapshot.Status)) 121 } 122 } 123 124 func TestSnapshotsUpdateStatus(t *testing.T) { 125 clients.RequireLong(t) 126 127 client, err := clients.NewBlockStorageV3Client() 128 th.AssertNoErr(t, err) 129 130 volume1, err := CreateVolume(t, client) 131 th.AssertNoErr(t, err) 132 defer DeleteVolume(t, client, volume1) 133 134 snapshot1, err := CreateSnapshot(t, client, volume1) 135 th.AssertNoErr(t, err) 136 defer DeleteSnapshot(t, client, snapshot1) 137 138 // Update snapshot status to error 139 resetOpts := snapshots.ResetStatusOpts{ 140 Status: "creating", 141 } 142 t.Logf("Attempting to update snapshot status to %s", resetOpts.Status) 143 err = snapshots.ResetStatus(client, snapshot1.ID, resetOpts).ExtractErr() 144 th.AssertNoErr(t, err) 145 146 snapshot, err := snapshots.Get(client, snapshot1.ID).Extract() 147 th.AssertNoErr(t, err) 148 149 if snapshot.Status != resetOpts.Status { 150 th.AssertNoErr(t, fmt.Errorf("unexpected %q snapshot status", snapshot.Status)) 151 } 152 153 // Update snapshot status to available 154 updateOpts := snapshots.UpdateStatusOpts{ 155 Status: "available", 156 } 157 t.Logf("Attempting to update snapshot status to %s", updateOpts.Status) 158 err = snapshots.UpdateStatus(client, snapshot1.ID, updateOpts).ExtractErr() 159 th.AssertNoErr(t, err) 160 161 snapshot, err = snapshots.Get(client, snapshot1.ID).Extract() 162 th.AssertNoErr(t, err) 163 164 if snapshot.Status != updateOpts.Status { 165 th.AssertNoErr(t, fmt.Errorf("unexpected %q snapshot status", snapshot.Status)) 166 } 167 } 168 169 func TestSnapshotsForceDelete(t *testing.T) { 170 clients.RequireLong(t) 171 172 client, err := clients.NewBlockStorageV3Client() 173 th.AssertNoErr(t, err) 174 175 volume, err := CreateVolume(t, client) 176 th.AssertNoErr(t, err) 177 defer DeleteVolume(t, client, volume) 178 179 snapshot, err := CreateSnapshot(t, client, volume) 180 th.AssertNoErr(t, err) 181 defer DeleteSnapshot(t, client, snapshot) 182 183 // Force delete snapshot 184 t.Logf("Attempting to force delete %s snapshot", snapshot.ID) 185 err = snapshots.ForceDelete(client, snapshot.ID).ExtractErr() 186 th.AssertNoErr(t, err) 187 188 err = tools.WaitFor(func() (bool, error) { 189 _, err := snapshots.Get(client, snapshot.ID).Extract() 190 if err != nil { 191 if _, ok := err.(gophercloud.ErrDefault404); ok { 192 return true, nil 193 } 194 } 195 196 return false, nil 197 }) 198 th.AssertNoErr(t, err) 199 }