Skip to content

Commit 6fb7d11

Browse files
blockstorage: acceptance test for manage/unmanage volume
Added acceptance test for managing a existing volume and unmanaging a volume api calls.
1 parent 469ca6a commit 6fb7d11

2 files changed

Lines changed: 128 additions & 0 deletions

File tree

internal/acceptance/openstack/blockstorage/v3/blockstorage.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/gophercloud/gophercloud/v2"
1515
"github.com/gophercloud/gophercloud/v2/internal/acceptance/tools"
1616
"github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/backups"
17+
"github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/manageablevolumes"
1718
"github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/qos"
1819
"github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/snapshots"
1920
"github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
@@ -779,3 +780,73 @@ func ReImage(t *testing.T, client *gophercloud.ServiceClient, volume *volumes.Vo
779780

780781
return nil
781782
}
783+
784+
func Unmanage(t *testing.T, client *gophercloud.ServiceClient, volume *volumes.Volume) error {
785+
t.Logf("Attempting to unmanage volume %s", volume.ID)
786+
787+
err := volumes.Unmanage(context.TODO(), client, volume.ID).ExtractErr()
788+
if err != nil {
789+
return err
790+
}
791+
792+
gophercloud.WaitFor(context.TODO(), func(ctx context.Context) (bool, error) {
793+
if _, err := volumes.Get(ctx, client, volume.ID).Extract(); err != nil {
794+
if _, ok := err.(gophercloud.ErrResourceNotFound); ok {
795+
return true, nil
796+
}
797+
return false, err
798+
}
799+
return false, nil
800+
})
801+
802+
t.Logf("Successfully unmanaged volume %s", volume.ID)
803+
804+
return nil
805+
}
806+
807+
func ManageExisting(t *testing.T, client *gophercloud.ServiceClient, volume *volumes.Volume) (*volumes.Volume, error) {
808+
t.Logf("Attempting to manage existing volume %s", volume.Name)
809+
810+
manageOpts := manageablevolumes.ManageExistingOpts{
811+
Host: volume.Host,
812+
Ref: map[string]string{
813+
"source-name": fmt.Sprintf("volume-%s", volume.ID),
814+
},
815+
Name: volume.Name,
816+
AvailabilityZone: volume.AvailabilityZone,
817+
Description: volume.Description,
818+
VolumeType: volume.VolumeType,
819+
Bootable: volume.Bootable == "true",
820+
Metadata: volume.Metadata,
821+
}
822+
823+
managed, err := manageablevolumes.ManageExisting(context.TODO(), client, manageOpts).Extract()
824+
if err != nil {
825+
return managed, err
826+
}
827+
828+
ctx, cancel := context.WithTimeout(context.TODO(), 60*time.Second)
829+
defer cancel()
830+
831+
if err := volumes.WaitForStatus(ctx, client, managed.ID, "available"); err != nil {
832+
return managed, err
833+
}
834+
835+
managed, err = volumes.Get(context.TODO(), client, managed.ID).Extract()
836+
if err != nil {
837+
return managed, err
838+
}
839+
840+
tools.PrintResource(t, managed)
841+
th.AssertEquals(t, managed.Host, volume.Host)
842+
th.AssertEquals(t, managed.Name, volume.Name)
843+
th.AssertEquals(t, managed.AvailabilityZone, volume.AvailabilityZone)
844+
th.AssertEquals(t, managed.Description, volume.Description)
845+
th.AssertEquals(t, managed.VolumeType, volume.VolumeType)
846+
th.AssertEquals(t, managed.Bootable, volume.Bootable)
847+
th.AssertDeepEquals(t, managed.Metadata, volume.Metadata)
848+
849+
t.Logf("Successfully managed existing volume %s", managed.ID)
850+
851+
return managed, nil
852+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//go:build acceptance || blockstorage || volumes
2+
3+
package v3
4+
5+
import (
6+
"context"
7+
"testing"
8+
9+
"github.com/gophercloud/gophercloud/v2/internal/acceptance/clients"
10+
"github.com/gophercloud/gophercloud/v2/openstack/blockstorage/v3/volumes"
11+
th "github.com/gophercloud/gophercloud/v2/testhelper"
12+
)
13+
14+
func TestManageableVolumes(t *testing.T) {
15+
clients.RequireLong(t)
16+
17+
client, err := clients.NewBlockStorageV3Client()
18+
th.AssertNoErr(t, err)
19+
20+
client.Microversion = "3.8"
21+
22+
volume1, err := CreateVolume(t, client)
23+
th.AssertNoErr(t, err)
24+
25+
err = Unmanage(t, client, volume1)
26+
if err != nil {
27+
DeleteVolume(t, client, volume1)
28+
}
29+
th.AssertNoErr(t, err)
30+
31+
managed1, err := ManageExisting(t, client, volume1)
32+
th.AssertNoErr(t, err)
33+
defer DeleteVolume(t, client, managed1)
34+
35+
th.CheckEquals(t, volume1.Host, managed1.Host)
36+
th.AssertEquals(t, volume1.Name, managed1.Name)
37+
th.AssertEquals(t, volume1.AvailabilityZone, managed1.AvailabilityZone)
38+
th.AssertEquals(t, volume1.Description, managed1.Description)
39+
th.AssertEquals(t, volume1.VolumeType, managed1.VolumeType)
40+
th.AssertEquals(t, volume1.Bootable, managed1.Bootable)
41+
th.AssertDeepEquals(t, volume1.Metadata, managed1.Metadata)
42+
th.AssertEquals(t, volume1.Size, managed1.Size)
43+
44+
allPages, err := volumes.List(client, volumes.ListOpts{}).AllPages(context.TODO())
45+
th.AssertNoErr(t, err)
46+
allVolumes, err := volumes.ExtractVolumes(allPages)
47+
th.AssertNoErr(t, err)
48+
49+
var found bool
50+
for _, v := range allVolumes {
51+
if v.ID == managed1.ID {
52+
found = true
53+
break
54+
}
55+
}
56+
th.AssertEquals(t, true, found)
57+
}

0 commit comments

Comments
 (0)