mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #536 from wanyaoqi/bugfix/wyq/aliyun-snapshot-delete
bugfix: fix aliyun snapshot delete failed, delete linked images first
This commit is contained in:
@@ -317,6 +317,8 @@ func (self *SnapshotDeleteTask) TaskFailed(ctx context.Context, snapshot *models
|
||||
if snapshot.Status == api.SNAPSHOT_DELETING {
|
||||
snapshot.SetStatus(self.UserCred, api.SNAPSHOT_READY, "On SnapshotDeleteTask TaskFailed")
|
||||
}
|
||||
db.OpsLog.LogEvent(snapshot, db.ACT_SNAPSHOT_DELETE_FAIL, reason, self.UserCred)
|
||||
logclient.AddActionLogWithStartable(self, snapshot, logclient.ACT_DELOCATE, reason, self.UserCred, false)
|
||||
self.SetStageFailed(ctx, reason)
|
||||
guest, err := snapshot.GetGuest()
|
||||
if err != nil {
|
||||
|
||||
@@ -278,7 +278,7 @@ func (self *SRegion) GetImage(imageId string) (*SImage, error) {
|
||||
return nil, err
|
||||
}
|
||||
if len(images) == 0 {
|
||||
return nil, fmt.Errorf("image %s not found", imageId)
|
||||
return nil, cloudprovider.ErrNotFound
|
||||
}
|
||||
return &images[0], nil
|
||||
}
|
||||
@@ -294,6 +294,19 @@ func (self *SRegion) GetImageByName(name string) (*SImage, error) {
|
||||
return &images[0], nil
|
||||
}
|
||||
|
||||
func (self *SRegion) GetImagesBySnapshot(snapshotId string, offset int, limit int) ([]SImage, int, error) {
|
||||
if limit > 50 || limit <= 0 {
|
||||
limit = 50
|
||||
}
|
||||
params := make(map[string]string)
|
||||
params["RegionId"] = self.RegionId
|
||||
params["PageSize"] = fmt.Sprintf("%d", limit)
|
||||
params["PageNumber"] = fmt.Sprintf("%d", (offset/limit)+1)
|
||||
params["SnapshotId"] = snapshotId
|
||||
|
||||
return self.getImages(params)
|
||||
}
|
||||
|
||||
func (self *SRegion) GetImageStatus(imageId string) (ImageStatusType, error) {
|
||||
image, err := self.GetImage(imageId)
|
||||
if err != nil {
|
||||
@@ -327,8 +340,10 @@ func (self *SRegion) GetImages(status ImageStatusType, owner ImageOwnerType, ima
|
||||
params["ImageName"] = name
|
||||
}
|
||||
|
||||
// log.Debugf("%s", params)
|
||||
return self.getImages(params)
|
||||
}
|
||||
|
||||
func (self *SRegion) getImages(params map[string]string) ([]SImage, int, error) {
|
||||
body, err := self.ecsRequest("DescribeImages", params)
|
||||
if err != nil {
|
||||
log.Errorf("DescribeImages fail %s", err)
|
||||
|
||||
@@ -44,6 +44,9 @@ func init() {
|
||||
}
|
||||
|
||||
shellutils.R(&SnapshotDeleteOptions{}, "snapshot-delete", "Delete snapshot", func(cli *aliyun.SRegion, args *SnapshotDeleteOptions) error {
|
||||
if err := cli.SnapshotPreDelete(args.ID); err != nil {
|
||||
return fmt.Errorf("Snapshot PreDelete error: %s", err)
|
||||
}
|
||||
return cli.DeleteSnapshot(args.ID)
|
||||
})
|
||||
|
||||
|
||||
@@ -15,7 +15,9 @@
|
||||
package aliyun
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
@@ -127,6 +129,9 @@ func (self *SSnapshot) Delete() error {
|
||||
if self.region == nil {
|
||||
return fmt.Errorf("not init region for snapshot %s", self.SnapshotId)
|
||||
}
|
||||
if err := self.region.SnapshotPreDelete(self.SnapshotId); err != nil {
|
||||
return err
|
||||
}
|
||||
return self.region.DeleteSnapshot(self.SnapshotId)
|
||||
}
|
||||
|
||||
@@ -197,3 +202,22 @@ func (self *SRegion) DeleteSnapshot(snapshotId string) error {
|
||||
func (self *SSnapshot) GetProjectId() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
// If snapshot linked images can't be delete
|
||||
// delete images first -- Aliyun
|
||||
func (self *SRegion) SnapshotPreDelete(snapshotId string) error {
|
||||
images, _, err := self.GetImagesBySnapshot(snapshotId, 0, 0)
|
||||
if err != nil {
|
||||
return fmt.Errorf("PreDelete get images by snapshot %s error: %s", snapshotId, err)
|
||||
}
|
||||
for _, image := range images {
|
||||
image.storageCache = &SStoragecache{region: self}
|
||||
if err := image.Delete(context.Background()); err != nil {
|
||||
return fmt.Errorf("PreDelete image %s error: %s", image.GetId(), err)
|
||||
}
|
||||
if err := cloudprovider.WaitDeleted(&image, 3*time.Second, 300*time.Second); err != nil {
|
||||
return fmt.Errorf("PreDelete waite image %s deleted error: %s", image.GetId(), err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user