func (os *OpenStack) DeleteVolume(volumeName string) error { used, err := os.diskIsUsed(volumeName) if err != nil { return err } if used { msg := fmt.Sprintf("Cannot delete the volume %q, it's still attached to a node", volumeName) return volume.NewDeletedVolumeInUseError(msg) } sClient, err := openstack.NewBlockStorageV1(os.provider, gophercloud.EndpointOpts{ Region: os.region, }) if err != nil || sClient == nil { glog.Errorf("Unable to initialize cinder client for region: %s", os.region) return err } err = volumes.Delete(sClient, volumeName).ExtractErr() if err != nil { glog.Errorf("Cannot delete volume %s: %v", volumeName, err) } return err }
// DeleteVolume deletes a VHD blob func (az *Cloud) DeleteVolume(name, uri string) error { accountName, blob, err := az.getBlobNameAndAccountFromURI(uri) if err != nil { return fmt.Errorf("failed to parse vhd URI %v", err) } key, err := az.getStorageAccesskey(accountName) if err != nil { return fmt.Errorf("no key for storage account %s, err %v", accountName, err) } err = az.deleteVhdBlob(accountName, key, blob) if err != nil { glog.Warningf("failed to delete blob %s err: %v", uri, err) detail := err.Error() if strings.Contains(detail, errLeaseIDMissing) { // disk is still being used // see https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.protocol.bloberrorcodestrings.leaseidmissing.aspx return volume.NewDeletedVolumeInUseError(fmt.Sprintf("disk %q is still in use while being deleted", name)) } return fmt.Errorf("failed to delete vhd %v, account %s, blob %s, err: %v", uri, accountName, blob, err) } glog.V(4).Infof("blob %s deleted", uri) return nil }