mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-16 07:13:53 +00:00
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:
parent
1ae1db6027
commit
6c87a4be7c
@ -164,7 +164,9 @@ type Volumes interface {
|
|||||||
// Create a volume with the specified options
|
// Create a volume with the specified options
|
||||||
CreateDisk(volumeOptions *VolumeOptions) (volumeName string, err error)
|
CreateDisk(volumeOptions *VolumeOptions) (volumeName string, err error)
|
||||||
// Delete the specified volume
|
// 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
|
// Get labels to apply to volume on creation
|
||||||
GetVolumeLabels(volumeName string) (map[string]string, error)
|
GetVolumeLabels(volumeName string) (map[string]string, error)
|
||||||
@ -1104,13 +1106,18 @@ func (self *awsDisk) waitForAttachmentStatus(status string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Deletes the EBS disk
|
// Deletes the EBS disk
|
||||||
func (self *awsDisk) deleteVolume() error {
|
func (self *awsDisk) deleteVolume() (bool, error) {
|
||||||
request := &ec2.DeleteVolumeInput{VolumeId: aws.String(self.awsID)}
|
request := &ec2.DeleteVolumeInput{VolumeId: aws.String(self.awsID)}
|
||||||
_, err := self.ec2.DeleteVolume(request)
|
_, err := self.ec2.DeleteVolume(request)
|
||||||
if err != nil {
|
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 nil
|
}
|
||||||
|
return false, fmt.Errorf("error deleting EBS volumes: %v", err)
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gets the awsInstance for the EC2 instance on which we are running
|
// 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
|
tagRequest.Tags = tags
|
||||||
if _, err := s.createTags(tagRequest); err != nil {
|
if _, err := s.createTags(tagRequest); err != nil {
|
||||||
// delete the volume and hope it succeeds
|
// delete the volume and hope it succeeds
|
||||||
delerr := s.DeleteDisk(volumeName)
|
_, delerr := s.DeleteDisk(volumeName)
|
||||||
if delerr != nil {
|
if delerr != nil {
|
||||||
// delete did not succeed, we have a stray volume!
|
// delete did not succeed, we have a stray volume!
|
||||||
return "", fmt.Errorf("error tagging volume %s, could not delete the volume: %v", volumeName, delerr)
|
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
|
// Implements Volumes.DeleteDisk
|
||||||
func (aws *AWSCloud) DeleteDisk(volumeName string) error {
|
func (aws *AWSCloud) DeleteDisk(volumeName string) (bool, error) {
|
||||||
awsDisk, err := newAWSDisk(aws, volumeName)
|
awsDisk, err := newAWSDisk(aws, volumeName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return false, err
|
||||||
}
|
}
|
||||||
return awsDisk.deleteVolume()
|
return awsDisk.deleteVolume()
|
||||||
}
|
}
|
||||||
|
@ -115,11 +115,16 @@ func (util *AWSDiskUtil) DeleteVolume(d *awsElasticBlockStoreDeleter) error {
|
|||||||
return err
|
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)
|
glog.V(2).Infof("Error deleting EBS Disk volume %s: %v", d.volumeID, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if deleted {
|
||||||
glog.V(2).Infof("Successfully deleted EBS Disk volume %s", d.volumeID)
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,8 +45,8 @@ func (v *mockVolumes) CreateDisk(volumeOptions *aws.VolumeOptions) (volumeName s
|
|||||||
return "", fmt.Errorf("not implemented")
|
return "", fmt.Errorf("not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *mockVolumes) DeleteVolume(volumeName string) error {
|
func (v *mockVolumes) DeleteDisk(volumeName string) (bool, error) {
|
||||||
return fmt.Errorf("not implemented")
|
return false, fmt.Errorf("not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *mockVolumes) GetVolumeLabels(volumeName string) (map[string]string, error) {
|
func (v *mockVolumes) GetVolumeLabels(volumeName string) (map[string]string, error) {
|
||||||
|
@ -353,7 +353,15 @@ func deletePD(pdName string) error {
|
|||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("Provider does not support volumes")
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user