AWS: Handle deleting volume that no longer exists

The tests in particular double-delete volumes, so we need to handle this
graciously.
This commit is contained in:
Justin Santa Barbara 2015-10-19 22:06:33 -04:00
parent 1ae1db6027
commit 6c87a4be7c
4 changed files with 32 additions and 12 deletions

View File

@ -164,7 +164,9 @@ type Volumes interface {
// Create a volume with the specified options
CreateDisk(volumeOptions *VolumeOptions) (volumeName string, err error)
// Delete the specified volume
DeleteDisk(volumeName string) error
// Returns true iff the volume was deleted
// If the was not found, returns (false, nil)
DeleteDisk(volumeName string) (bool, error)
// Get labels to apply to volume on creation
GetVolumeLabels(volumeName string) (map[string]string, error)
@ -1104,13 +1106,18 @@ func (self *awsDisk) waitForAttachmentStatus(status string) error {
}
// Deletes the EBS disk
func (self *awsDisk) deleteVolume() error {
func (self *awsDisk) deleteVolume() (bool, error) {
request := &ec2.DeleteVolumeInput{VolumeId: aws.String(self.awsID)}
_, err := self.ec2.DeleteVolume(request)
if err != nil {
return fmt.Errorf("error delete EBS volumes: %v", err)
if awsError, ok := err.(awserr.Error); ok {
if awsError.Code() == "InvalidVolume.NotFound" {
return false, nil
}
}
return false, fmt.Errorf("error deleting EBS volumes: %v", err)
}
return nil
return true, nil
}
// Gets the awsInstance for the EC2 instance on which we are running
@ -1328,7 +1335,7 @@ func (s *AWSCloud) CreateDisk(volumeOptions *VolumeOptions) (string, error) {
tagRequest.Tags = tags
if _, err := s.createTags(tagRequest); err != nil {
// delete the volume and hope it succeeds
delerr := s.DeleteDisk(volumeName)
_, delerr := s.DeleteDisk(volumeName)
if delerr != nil {
// delete did not succeed, we have a stray volume!
return "", fmt.Errorf("error tagging volume %s, could not delete the volume: %v", volumeName, delerr)
@ -1340,10 +1347,10 @@ func (s *AWSCloud) CreateDisk(volumeOptions *VolumeOptions) (string, error) {
}
// Implements Volumes.DeleteDisk
func (aws *AWSCloud) DeleteDisk(volumeName string) error {
func (aws *AWSCloud) DeleteDisk(volumeName string) (bool, error) {
awsDisk, err := newAWSDisk(aws, volumeName)
if err != nil {
return err
return false, err
}
return awsDisk.deleteVolume()
}

View File

@ -115,11 +115,16 @@ func (util *AWSDiskUtil) DeleteVolume(d *awsElasticBlockStoreDeleter) error {
return err
}
if err = cloud.DeleteDisk(d.volumeID); err != nil {
deleted, err := cloud.DeleteDisk(d.volumeID)
if err != nil {
glog.V(2).Infof("Error deleting EBS Disk volume %s: %v", d.volumeID, err)
return err
}
glog.V(2).Infof("Successfully deleted EBS Disk volume %s", d.volumeID)
if deleted {
glog.V(2).Infof("Successfully deleted EBS Disk volume %s", d.volumeID)
} else {
glog.V(2).Infof("Successfully deleted EBS Disk volume %s (actually already deleted)", d.volumeID)
}
return nil
}

View File

@ -45,8 +45,8 @@ func (v *mockVolumes) CreateDisk(volumeOptions *aws.VolumeOptions) (volumeName s
return "", fmt.Errorf("not implemented")
}
func (v *mockVolumes) DeleteVolume(volumeName string) error {
return fmt.Errorf("not implemented")
func (v *mockVolumes) DeleteDisk(volumeName string) (bool, error) {
return false, fmt.Errorf("not implemented")
}
func (v *mockVolumes) GetVolumeLabels(volumeName string) (map[string]string, error) {

View File

@ -353,7 +353,15 @@ func deletePD(pdName string) error {
if !ok {
return fmt.Errorf("Provider does not support volumes")
}
return volumes.DeleteDisk(pdName)
deleted, err := volumes.DeleteDisk(pdName)
if err != nil {
return err
} else {
if !deleted {
Logf("Volume deletion implicitly succeeded because volume %q does not exist.", pdName)
}
return nil
}
}
}