Merge pull request #6703 from shield-9/wait_volume

OpenStack: wait for volume availability when cleaning up
This commit is contained in:
Megan Marsh 2018-10-19 10:25:51 -07:00 committed by GitHub
commit 9fe27c225b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 3 deletions

View File

@ -102,6 +102,23 @@ func (s *StepCreateVolume) Cleanup(state multistep.StateBag) {
return return
} }
// Wait for volume to become available.
status, err := GetVolumeStatus(blockStorageClient, s.volumeID)
if err != nil {
ui.Error(fmt.Sprintf(
"Error getting the volume information. Please delete the volume manually: %s", s.volumeID))
return
}
if status != "available" {
ui.Say(fmt.Sprintf(
"Waiting for volume %s (volume id: %s) to become available...", s.VolumeName, s.volumeID))
if err := WaitForVolume(blockStorageClient, s.volumeID); err != nil {
ui.Error(fmt.Sprintf(
"Error getting the volume information. Please delete the volume manually: %s", s.volumeID))
return
}
}
ui.Say(fmt.Sprintf("Deleting volume: %s ...", s.volumeID)) ui.Say(fmt.Sprintf("Deleting volume: %s ...", s.volumeID))
err = volumes.Delete(blockStorageClient, s.volumeID).ExtractErr() err = volumes.Delete(blockStorageClient, s.volumeID).ExtractErr()
if err != nil { if err != nil {

View File

@ -15,7 +15,7 @@ func WaitForVolume(blockStorageClient *gophercloud.ServiceClient, volumeID strin
numErrors := 0 numErrors := 0
for { for {
volume, err := volumes.Get(blockStorageClient, volumeID).Extract() status, err := GetVolumeStatus(blockStorageClient, volumeID)
if err != nil { if err != nil {
errCode, ok := err.(*gophercloud.ErrUnexpectedResponseCode) errCode, ok := err.(*gophercloud.ErrUnexpectedResponseCode)
if ok && (errCode.Actual == 500 || errCode.Actual == 404) { if ok && (errCode.Actual == 500 || errCode.Actual == 404) {
@ -32,11 +32,11 @@ func WaitForVolume(blockStorageClient *gophercloud.ServiceClient, volumeID strin
return err return err
} }
if volume.Status == "available" { if status == "available" {
return nil return nil
} }
log.Printf("Waiting for volume creation status: %s", volume.Status) log.Printf("Waiting for volume creation status: %s", status)
time.Sleep(2 * time.Second) time.Sleep(2 * time.Second)
} }
} }
@ -65,3 +65,12 @@ func GetVolumeSize(imageClient *gophercloud.ServiceClient, imageID string) (int,
return volumeSizeGB, nil return volumeSizeGB, nil
} }
func GetVolumeStatus(blockStorageClient *gophercloud.ServiceClient, volumeID string) (string, error) {
volume, err := volumes.Get(blockStorageClient, volumeID).Extract()
if err != nil {
return "", err
}
return volume.Status, nil
}