diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index 2a21959b5d0..2c53133ce48 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -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() } diff --git a/pkg/volume/aws_ebs/aws_util.go b/pkg/volume/aws_ebs/aws_util.go index 1158b6841c3..b0a8141f978 100644 --- a/pkg/volume/aws_ebs/aws_util.go +++ b/pkg/volume/aws_ebs/aws_util.go @@ -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 } diff --git a/plugin/pkg/admission/persistentvolume/label/admission_test.go b/plugin/pkg/admission/persistentvolume/label/admission_test.go index 3fcebc7c246..76289a13096 100644 --- a/plugin/pkg/admission/persistentvolume/label/admission_test.go +++ b/plugin/pkg/admission/persistentvolume/label/admission_test.go @@ -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) { diff --git a/test/e2e/pd.go b/test/e2e/pd.go index 965358696c5..d1b7cefff26 100644 --- a/test/e2e/pd.go +++ b/test/e2e/pd.go @@ -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 + } } }