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