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:
yunion-ci-robot
2019-04-23 16:30:12 +08:00
committed by GitHub
4 changed files with 46 additions and 2 deletions
@@ -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 {
+17 -2
View File
@@ -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)
+3
View File
@@ -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)
})
+24
View File
@@ -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
}