diff --git a/pkg/cloudprovider/cloud.go b/pkg/cloudprovider/cloud.go index c6a91394aae..de83e9bd1b6 100644 --- a/pkg/cloudprovider/cloud.go +++ b/pkg/cloudprovider/cloud.go @@ -152,7 +152,10 @@ type Routes interface { DeleteRoute(clusterName string, route *Route) error } -var InstanceNotFound = errors.New("instance not found") +var ( + InstanceNotFound = errors.New("instance not found") + DiskNotFound = errors.New("disk is not found") +) // Zone represents the location of a particular machine. type Zone struct { diff --git a/pkg/cloudprovider/providers/gce/gce.go b/pkg/cloudprovider/providers/gce/gce.go index d8d31c2c0a5..8c8825c9a3b 100644 --- a/pkg/cloudprovider/providers/gce/gce.go +++ b/pkg/cloudprovider/providers/gce/gce.go @@ -2511,6 +2511,10 @@ func (gce *GCECloud) DeleteDisk(diskToDelete string) error { if isGCEError(err, "resourceInUseByAnotherResource") { return volume.NewDeletedVolumeInUseError(err.Error()) } + + if err == cloudprovider.DiskNotFound { + return nil + } return err } @@ -2712,6 +2716,7 @@ func (gce *GCECloud) getDiskByName(diskName string, zone string) (*gceDisk, erro // Scans all managed zones to return the GCE PD // Prefer getDiskByName, if the zone can be established +// Return cloudprovider.DiskNotFound if the given disk cannot be found in any zone func (gce *GCECloud) getDiskByNameUnknownZone(diskName string) (*gceDisk, error) { // Note: this is the gotcha right now with GCE PD support: // disk names are not unique per-region. @@ -2742,7 +2747,8 @@ func (gce *GCECloud) getDiskByNameUnknownZone(diskName string) (*gceDisk, error) if found != nil { return found, nil } - return nil, fmt.Errorf("GCE persistent disk %q not found in managed zones (%s)", diskName, strings.Join(gce.managedZones, ",")) + glog.Warningf("GCE persistent disk %q not found in managed zones (%s)", diskName, strings.Join(gce.managedZones, ",")) + return nil, cloudprovider.DiskNotFound } // GetGCERegion returns region of the gce zone. Zone names diff --git a/test/e2e/pd.go b/test/e2e/pd.go index dfabb8393a7..e92e367fa32 100644 --- a/test/e2e/pd.go +++ b/test/e2e/pd.go @@ -524,6 +524,13 @@ var _ = framework.KubeDescribe("Pod Disks", func() { By("Waiting for pd to detach from host0") framework.ExpectNoError(waitForPDDetach(diskName, host0Name), "Timed out waiting for detach pd") }) + + It("should be able to delete a non-existent PD without error", func() { + framework.SkipUnlessProviderIs("gce") + + By("delete a PD") + framework.DeletePDWithRetry("non-exist") + }) }) func verifyPDContentsViaContainer(f *framework.Framework, podName, containerName string, fileAndContentToVerify map[string]string) {