From e0d7cbb431f443f050c2bc8cf5cca37d83b79dc7 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 12 Dec 2018 19:23:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9Ahost-undo-recycle=20?= =?UTF-8?q?fail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/climc/shell/hoststorages.go | 6 +++--- pkg/compute/models/host_recycle.go | 17 +++++++++++------ pkg/compute/models/hosts.go | 20 ++++++++++++++++++++ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/cmd/climc/shell/hoststorages.go b/cmd/climc/shell/hoststorages.go index 88d25a21a9..a524a911cd 100644 --- a/cmd/climc/shell/hoststorages.go +++ b/cmd/climc/shell/hoststorages.go @@ -25,9 +25,9 @@ func init() { } var result *modules.ListResult var err error - if len(args.Storage) > 0 { - params.Add(jsonutils.NewString(args.Storage), "storage") - } + // if len(args.Storage) > 0 { + // params.Add(jsonutils.NewString(args.Storage), "storage") + // } if len(args.Host) > 0 { result, err = modules.Hoststorages.ListDescendent(s, args.Host, params) } else if len(args.Storage) > 0 { diff --git a/pkg/compute/models/host_recycle.go b/pkg/compute/models/host_recycle.go index a3d9076c42..f50af5820c 100644 --- a/pkg/compute/models/host_recycle.go +++ b/pkg/compute/models/host_recycle.go @@ -11,6 +11,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/tristate" + "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" @@ -351,7 +352,10 @@ func doUndoPrepaidRecycle(ctx context.Context, userCred mcclient.TokenCredential q := HostManager.Query() q = q.Equals("external_id", host.ExternalId) q = q.Equals("host_type", host.HostType) - q = q.IsNullOrEmpty("resource_type") + q = q.Filter(sqlchemy.OR( + sqlchemy.IsNullOrEmpty(q.Field("resource_type")), + sqlchemy.Equals(q.Field("resource_type"), HostResourceTypeShared), + )) oHostCnt := q.Count() @@ -428,13 +432,14 @@ func doUndoPrepaidRecycle(ctx context.Context, userCred mcclient.TokenCredential return err } - oStorageObj, err := StorageManager.FetchByExternalId(istorage.GetGlobalId()) - if err != nil { - log.Errorf("StorageManager.FetchByExternalId fail %s", err) - return err + oHostStorage := oHost.GetHoststorageByExternalId(istorage.GetGlobalId()) + if oHostStorage == nil { + msg := fmt.Sprintf("oHost.GetHoststorageByExternalId not found %s", istorage.GetGlobalId()) + log.Errorf(msg) + return errors.New(msg) } - oStorage := oStorageObj.(*SStorage) + oStorage := oHostStorage.GetStorage() if storage.StorageType == STORAGE_LOCAL { _, err = disk.GetModelManager().TableSpec().Update(disk, func() error { diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index a1df23d231..11844889d0 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -502,6 +502,26 @@ func (self *SHost) GetHoststorageOfId(storageId string) *SHoststorage { return &hoststorage } +func (self *SHost) GetHoststorageByExternalId(extId string) *SHoststorage { + hoststorage := SHoststorage{} + hoststorage.SetModelManager(HoststorageManager) + + hoststorages := HoststorageManager.Query().SubQuery() + storages := StorageManager.Query().SubQuery() + q := hoststorages.Query() + q = q.Join(storages, sqlchemy.Equals(hoststorages.Field("storage_id"), storages.Field("id"))) + q = q.Filter(sqlchemy.Equals(hoststorages.Field("host_id"), self.Id)) + q = q.Filter(sqlchemy.Equals(storages.Field("external_id"), extId)) + + err := q.First(&hoststorage) + if err != nil { + log.Errorf("GetHoststorageByExternalId fail %s", err) + return nil + } + + return &hoststorage +} + func (self *SHost) GetStorageByFilePath(path string) *SStorage { hoststorages := self.GetHoststorages() if hoststorages == nil {