// CreateVolume will create a volume with a random name and size of 1GB. An // error will be returned if the volume was unable to be created. func CreateVolume(t *testing.T, client *gophercloud.ServiceClient) (*volumes.Volume, error) { if testing.Short() { t.Skip("Skipping test that requires volume creation in short mode.") } volumeName := tools.RandomString("ACPTTEST", 16) t.Logf("Attempting to create volume: %s", volumeName) createOpts := volumes.CreateOpts{ Size: 1, Name: volumeName, } volume, err := volumes.Create(client, createOpts).Extract() if err != nil { return volume, err } err = volumes.WaitForStatus(client, volume.ID, "available", 60) if err != nil { return volume, err } return volume, nil }
// DeleteVolumeAttachment will disconnect a volume from an instance. A fatal // error will occur if the volume failed to detach. This works best when used // as a deferred function. func DeleteVolumeAttachment(t *testing.T, client *gophercloud.ServiceClient, blockClient *gophercloud.ServiceClient, server *servers.Server, volumeAttachment *volumeattach.VolumeAttachment) { err := volumeattach.Delete(client, server.ID, volumeAttachment.VolumeID).ExtractErr() if err != nil { t.Fatalf("Unable to detach volume: %v", err) } if err := volumes.WaitForStatus(blockClient, volumeAttachment.ID, "available", 60); err != nil { t.Fatalf("Unable to wait for volume: %v", err) } t.Logf("Deleted volume: %s", volumeAttachment.VolumeID) }
// CreateVolumeAttachment will attach a volume to a server. An error will be // returned if the volume failed to attach. func CreateVolumeAttachment(t *testing.T, client *gophercloud.ServiceClient, blockClient *gophercloud.ServiceClient, server *servers.Server, volume *volumes.Volume) (*volumeattach.VolumeAttachment, error) { volumeAttachOptions := volumeattach.CreateOpts{ VolumeID: volume.ID, } t.Logf("Attempting to attach volume %s to server %s", volume.ID, server.ID) volumeAttachment, err := volumeattach.Create(client, server.ID, volumeAttachOptions).Extract() if err != nil { return volumeAttachment, err } if err := volumes.WaitForStatus(blockClient, volume.ID, "in-use", 60); err != nil { return volumeAttachment, err } return volumeAttachment, nil }
func TestVolumeAttachAttachment(t *testing.T) { if testing.Short() { t.Skip("Skipping test that requires server creation in short mode.") } client, err := clients.NewComputeV2Client() if err != nil { t.Fatalf("Unable to create a compute client: %v", err) } choices, err := clients.AcceptanceTestChoicesFromEnv() if err != nil { t.Fatal(err) } blockClient, err := clients.NewBlockStorageV1Client() if err != nil { t.Fatalf("Unable to create a blockstorage client: %v", err) } server, err := CreateServer(t, client, choices) if err != nil { t.Fatalf("Unable to create server: %v", err) } defer DeleteServer(t, client, server) volume, err := createVolume(t, blockClient) if err != nil { t.Fatalf("Unable to create volume: %v", err) } if err = volumes.WaitForStatus(blockClient, volume.ID, "available", 60); err != nil { t.Fatalf("Unable to wait for volume: %v", err) } defer deleteVolume(t, blockClient, volume) volumeAttachment, err := CreateVolumeAttachment(t, client, blockClient, server, volume) if err != nil { t.Fatalf("Unable to attach volume: %v", err) } defer DeleteVolumeAttachment(t, client, blockClient, server, volumeAttachment) PrintVolumeAttachment(t, volumeAttachment) }