github.com/gophercloud/gophercloud@v1.11.0/internal/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/gophercloud/gophercloud/internal/acceptance/clients"
    10  	"github.com/gophercloud/gophercloud/internal/acceptance/tools"
    11  	"github.com/gophercloud/gophercloud/openstack/blockstorage/v3/snapshots"
    12  	"github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
    13  	"github.com/gophercloud/gophercloud/pagination"
    14  	th "github.com/gophercloud/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.RequireAdmin(t)
    71  	clients.RequireLong(t)
    72  
    73  	client, err := clients.NewBlockStorageV3Client()
    74  	th.AssertNoErr(t, err)
    75  
    76  	vt, err := CreateVolumeTypeMultiAttach(t, client)
    77  	th.AssertNoErr(t, err)
    78  	defer DeleteVolumeType(t, client, vt)
    79  
    80  	volumeName := tools.RandomString("ACPTTEST", 16)
    81  
    82  	volOpts := volumes.CreateOpts{
    83  		Size:        1,
    84  		Name:        volumeName,
    85  		Description: "Testing creation of multiattach enabled volume",
    86  		VolumeType:  vt.ID,
    87  	}
    88  
    89  	vol, err := volumes.Create(client, volOpts).Extract()
    90  	th.AssertNoErr(t, err)
    91  	defer DeleteVolume(t, client, vol)
    92  
    93  	err = volumes.WaitForStatus(client, vol.ID, "available", 60)
    94  	th.AssertNoErr(t, err)
    95  
    96  	th.AssertEquals(t, vol.Multiattach, true)
    97  }
    98  
    99  func TestVolumesCascadeDelete(t *testing.T) {
   100  	clients.RequireLong(t)
   101  
   102  	client, err := clients.NewBlockStorageV3Client()
   103  	th.AssertNoErr(t, err)
   104  
   105  	vol, err := CreateVolume(t, client)
   106  	th.AssertNoErr(t, err)
   107  
   108  	err = volumes.WaitForStatus(client, vol.ID, "available", 60)
   109  	th.AssertNoErr(t, err)
   110  
   111  	snapshot1, err := CreateSnapshot(t, client, vol)
   112  	th.AssertNoErr(t, err)
   113  
   114  	snapshot2, err := CreateSnapshot(t, client, vol)
   115  	th.AssertNoErr(t, err)
   116  
   117  	t.Logf("Attempting to delete volume: %s", vol.ID)
   118  
   119  	deleteOpts := volumes.DeleteOpts{Cascade: true}
   120  	err = volumes.Delete(client, vol.ID, deleteOpts).ExtractErr()
   121  	if err != nil {
   122  		t.Fatalf("Unable to delete volume %s: %v", vol.ID, err)
   123  	}
   124  
   125  	for _, sid := range []string{snapshot1.ID, snapshot2.ID} {
   126  		err := tools.WaitFor(func() (bool, error) {
   127  			_, err := snapshots.Get(client, sid).Extract()
   128  			if err != nil {
   129  				return true, nil
   130  			}
   131  			return false, nil
   132  		})
   133  		th.AssertNoErr(t, err)
   134  		t.Logf("Successfully deleted snapshot: %s", sid)
   135  	}
   136  
   137  	err = tools.WaitFor(func() (bool, error) {
   138  		_, err := volumes.Get(client, vol.ID).Extract()
   139  		if err != nil {
   140  			return true, nil
   141  		}
   142  		return false, nil
   143  	})
   144  	th.AssertNoErr(t, err)
   145  
   146  	t.Logf("Successfully deleted volume: %s", vol.ID)
   147  
   148  }