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  }