From 9bd15451ae89fdc0bf7d53ebd3297fa32d994ebb Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 13 Feb 2019 00:10:03 +0800 Subject: [PATCH 1/2] fix image misc bugs --- cmd/climc/shell/images.go | 15 ++++++++------- pkg/cloudcommon/options.go | 2 ++ pkg/image/models/images.go | 8 ++++++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/cmd/climc/shell/images.go b/cmd/climc/shell/images.go index 46100e7c1c..1ffed7d655 100644 --- a/cmd/climc/shell/images.go +++ b/cmd/climc/shell/images.go @@ -251,16 +251,17 @@ func init() { ID string `help:"Image ID or name"` } - R(&ImageDetailOptions{}, "image-delete", "Delete a image", func(s *mcclient.ClientSession, args *ImageDetailOptions) error { - imgID, err := modules.Images.GetId(s, args.ID, nil) + type ImageDeleteOptions struct { + ID []string `help:"Image ID or name"` + OverridePendingDelete *bool `help:"Delete image directly instead of pending delete"` + } + R(&ImageDeleteOptions{}, "image-delete", "Delete a image", func(s *mcclient.ClientSession, args *ImageDeleteOptions) error { + params, err := options.StructToParams(args) if err != nil { return err } - if result, err := modules.Images.Delete(s, imgID, nil); err != nil { - return err - } else { - printObject(result) - } + ret := modules.Images.BatchDeleteWithParam(s, args.ID, params, nil) + printBatchResults(ret, modules.Images.GetColumns(s)) return nil }) diff --git a/pkg/cloudcommon/options.go b/pkg/cloudcommon/options.go index fc94689fd0..da63c8bcb8 100644 --- a/pkg/cloudcommon/options.go +++ b/pkg/cloudcommon/options.go @@ -121,6 +121,8 @@ func ParseOptions(optStruct interface{}, args []string, configFileName string, s } } + parser.SetDefault() + if len(optionsRef.ApplicationID) == 0 { optionsRef.ApplicationID = serviceName } diff --git a/pkg/image/models/images.go b/pkg/image/models/images.go index 3b70404245..bca0c4255f 100644 --- a/pkg/image/models/images.go +++ b/pkg/image/models/images.go @@ -533,7 +533,7 @@ func (self *SImage) CustomizeDelete(ctx context.Context, userCred mcclient.Token overridePendingDelete = jsonutils.QueryBoolean(query, "override_pending_delete", false) purge = jsonutils.QueryBoolean(query, "purge", false) } - if self.Status != IMAGE_STATUS_ACTIVE { + if self.Status != IMAGE_STATUS_ACTIVE && self.Status != IMAGE_STATUS_CONVERTING { overridePendingDelete = true } return self.startDeleteImageTask(ctx, userCred, "", purge, overridePendingDelete) @@ -827,6 +827,7 @@ func (self *SImage) MakeSubImages() error { if self.GetImageType() == ImageTypeISO { return nil } + log.Debugf("[MakeSubImages] convert image to %#v", options.Options.TargetImageFormats) for _, format := range options.Options.TargetImageFormats { if !qemuimg.IsSupportedImageFormat(format) { continue @@ -848,6 +849,9 @@ func (self *SImage) MakeSubImages() error { func (self *SImage) ConvertAllSubformats() error { subimgs := ImageSubformatManager.GetAllSubImages(self.Id) for i := 0; i < len(subimgs); i += 1 { + if !utils.IsInStringArray(subimgs[i].Format, options.Options.TargetImageFormats) { + continue + } err := subimgs[i].DoConvert(self) if err != nil { return err @@ -1016,7 +1020,7 @@ func (self *SImage) DoCheckStatus(ctx context.Context, userCred mcclient.TokenCr } for i := 0; i < len(subimgs); i += 1 { subimgs[i].checkStatus(useFast) - if subimgs[i].Status != IMAGE_STATUS_ACTIVE || subimgs[i].TorrentStatus != IMAGE_STATUS_ACTIVE { + if (subimgs[i].Status != IMAGE_STATUS_ACTIVE || subimgs[i].TorrentStatus != IMAGE_STATUS_ACTIVE) && utils.IsInStringArray(subimgs[i].Format, options.Options.TargetImageFormats) { needConvert = true } } From dd317fb83d6540ba565558acbffdadd1d5ea63ec Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 13 Feb 2019 21:15:45 +0800 Subject: [PATCH 2/2] update vendor --- Gopkg.lock | 8 ++++---- vendor/yunion.io/x/pkg/utils/utils.go | 8 ++++++-- vendor/yunion.io/x/structarg/README.md | 2 ++ vendor/yunion.io/x/structarg/structarg.go | 4 ++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 50a2d7c217..b4b4922dca 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1634,7 +1634,7 @@ [[projects]] branch = "master" - digest = "1:f7e6b859716c65473233390b3c69c919d0d6c2d9bd25ee599c29d0e8e3419d35" + digest = "1:e78aec3a172eac3452533bdd7cbfb357853122fca029b28808acceb8ea82633a" name = "yunion.io/x/pkg" packages = [ "gotypes", @@ -1667,7 +1667,7 @@ "utils", ] pruneopts = "UT" - revision = "4d8dfcd77e8817d5dc37eacf4b6b098429c7d259" + revision = "e2e42205d868c26829b9322b40cdc48f24fed379" [[projects]] branch = "master" @@ -1679,11 +1679,11 @@ [[projects]] branch = "master" - digest = "1:6ea9ac8f317e7dd79309bb1633642bc9d1822011c5175bd241552534d216ac6d" + digest = "1:3d0328d99a24ded8844a4e4115692f22dbaeabf03942b03c4bf03d741e103483" name = "yunion.io/x/structarg" packages = ["."] pruneopts = "UT" - revision = "e4f0f5201b4acad185ebfb76e65905fe5ae7c1b1" + revision = "a4ab4a4d0a3e4e99a8a230fce57f4eb1e177f039" [solve-meta] analyzer-name = "dep" diff --git a/vendor/yunion.io/x/pkg/utils/utils.go b/vendor/yunion.io/x/pkg/utils/utils.go index 0564c4b7fc..dff57b3b18 100644 --- a/vendor/yunion.io/x/pkg/utils/utils.go +++ b/vendor/yunion.io/x/pkg/utils/utils.go @@ -20,13 +20,15 @@ func isLowerChar(ch byte) bool { func CamelSplit(str string, sep string) string { tokens := make([]string, 0) var buf bytes.Buffer + upperCount := 0 for i := 0; i < len(str); i++ { c := str[i] split := false var nchar byte if isUpperChar(c) { - if i > 0 && isUpperChar(str[i-1]) { - if i+1 < len(str) && isLowerChar(str[i+1]) { + upperCount += 1 + if upperCount > 1 { + if i+1 < len(str) && isLowerChar(str[i+1]) && upperCount > 2 { split = true } } else { @@ -35,7 +37,9 @@ func CamelSplit(str string, sep string) string { nchar = c - 'A' + 'a' } else if isLowerChar(c) { nchar = c + upperCount = 0 } else { + upperCount = 0 split = true } if split && buf.Len() > 0 { diff --git a/vendor/yunion.io/x/structarg/README.md b/vendor/yunion.io/x/structarg/README.md index 52b024c411..33e623b654 100644 --- a/vendor/yunion.io/x/structarg/README.md +++ b/vendor/yunion.io/x/structarg/README.md @@ -106,6 +106,8 @@ if e != nil { panic(e) } +parser.SetDefault() // set default values + options := parser.Options().(*Options) // then access argument values via options diff --git a/vendor/yunion.io/x/structarg/structarg.go b/vendor/yunion.io/x/structarg/structarg.go index f5e924de1d..d1746bb5f8 100644 --- a/vendor/yunion.io/x/structarg/structarg.go +++ b/vendor/yunion.io/x/structarg/structarg.go @@ -382,7 +382,7 @@ func (this *ArgumentParser) AddArgument(arg Argument) error { return nil } -func (this *ArgumentParser) setDefault() { +func (this *ArgumentParser) SetDefault() { for _, arg := range this.posArgs { arg.SetDefault() } @@ -866,7 +866,7 @@ func (this *ArgumentParser) ParseArgs(args []string, ignore_unknown bool) error if err == nil { err = this.Validate() } - this.setDefault() + // this.setDefault() return err }