From 137c0d41df393559b07448fa3d32f24d27e3d169 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Tue, 12 Feb 2019 20:40:11 +0800 Subject: [PATCH] fix: fix issues preventing clean_provider.sh from clean cloud provider records --- pkg/compute/hostdrivers/managedvirtual.go | 3 +- pkg/compute/models/cachedimages.go | 2 +- pkg/compute/models/cloudaccounts.go | 36 +++++++++++++++++++++++ pkg/compute/models/cloudproviders.go | 34 +++++++++++++++++++++ pkg/compute/models/cloudregions.go | 24 +++++++++++++-- pkg/compute/models/storagecachedimages.go | 12 +++++++- pkg/compute/models/zones.go | 25 ++++++++++++++-- 7 files changed, 127 insertions(+), 9 deletions(-) diff --git a/pkg/compute/hostdrivers/managedvirtual.go b/pkg/compute/hostdrivers/managedvirtual.go index f7fc486732..331010df04 100644 --- a/pkg/compute/hostdrivers/managedvirtual.go +++ b/pkg/compute/hostdrivers/managedvirtual.go @@ -330,7 +330,8 @@ func (self *SManagedVirtualizationHostDriver) RequestRebuildDiskOnStorage(ctx co } func (driver *SManagedVirtualizationHostDriver) IsReachStoragecacheCapacityLimit(host *models.SHost, cachedImages []models.SCachedimage) bool { - if len(cachedImages) >= host.GetHostDriver().GetStoragecacheQuota(host) { + quota := host.GetHostDriver().GetStoragecacheQuota(host) + if quota > 0 && len(cachedImages) >= quota { return true } return false diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index 2caf71f0a0..d634f37f81 100644 --- a/pkg/compute/models/cachedimages.go +++ b/pkg/compute/models/cachedimages.go @@ -423,7 +423,7 @@ func (manager *SCachedimageManager) newFromCloudImage(ctx context.Context, userC func (image *SCachedimage) requestRefreshExternalImage(ctx context.Context, userCred mcclient.TokenCredential) (*cloudprovider.SImage, error) { caches := image.getValidStoragecache() - if caches == nil { + if caches == nil || len(caches) == 0 { return nil, fmt.Errorf("no valid storage cache") } iCache, err := caches[0].GetIStorageCache() diff --git a/pkg/compute/models/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 06853243e8..0786c79476 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -813,3 +813,39 @@ func (self *SCloudaccount) PerformChangeProject(ctx context.Context, userCred mc } return providers[0].PerformChangeProject(ctx, userCred, query, data) } + +func (manager *SCloudaccountManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { + accountStr, _ := query.GetString("account") + if len(accountStr) > 0 { + queryDict := query.(*jsonutils.JSONDict) + queryDict.Remove("account") + accountObj, err := manager.FetchByIdOrName(userCred, accountStr) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(manager.Keyword(), accountStr) + } else { + return nil, httperrors.NewGeneralError(err) + } + } + q = q.Equals("id", accountObj.GetId()) + } + + q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + if err != nil { + return nil, err + } + managerStr, _ := query.GetString("manager") + if len(managerStr) > 0 { + providerObj, err := CloudproviderManager.FetchByIdOrName(userCred, managerStr) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr) + } else { + return nil, httperrors.NewGeneralError(err) + } + } + provider := providerObj.(*SCloudprovider) + q = q.Equals("id", provider.CloudaccountId) + } + return q, nil +} diff --git a/pkg/compute/models/cloudproviders.go b/pkg/compute/models/cloudproviders.go index 7880020d55..5b402b9f28 100644 --- a/pkg/compute/models/cloudproviders.go +++ b/pkg/compute/models/cloudproviders.go @@ -711,3 +711,37 @@ func (self *SCloudprovider) GetDetailsBalance(ctx context.Context, userCred mccl ret.Add(jsonutils.NewFloat(balance), "balance") return ret, nil } + +func (manager *SCloudproviderManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { + accountStr, _ := query.GetString("account") + if len(accountStr) > 0 { + queryDict := query.(*jsonutils.JSONDict) + queryDict.Remove("account") + accountObj, err := CloudaccountManager.FetchByIdOrName(userCred, accountStr) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(manager.Keyword(), accountStr) + } else { + return nil, httperrors.NewGeneralError(err) + } + } + q = q.Equals("cloudaccount_id", accountObj.GetId()) + } + q, err := manager.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query) + if err != nil { + return nil, err + } + managerStr, _ := query.GetString("manager") + if len(managerStr) > 0 { + providerObj, err := manager.FetchByIdOrName(userCred, managerStr) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr) + } else { + return nil, httperrors.NewGeneralError(err) + } + } + q = q.Equals("id", providerObj.GetId()) + } + return q, nil +} diff --git a/pkg/compute/models/cloudregions.go b/pkg/compute/models/cloudregions.go index 1113aed31a..b4df1481d3 100644 --- a/pkg/compute/models/cloudregions.go +++ b/pkg/compute/models/cloudregions.go @@ -359,12 +359,30 @@ func (manager *SCloudregionManager) ListItemFilter(ctx context.Context, q *sqlch } managerStr, _ := query.GetString("manager") if len(managerStr) > 0 { - manager := CloudproviderManager.FetchCloudproviderByIdOrName(managerStr) - if manager == nil { - return nil, httperrors.NewResourceNotFoundError("Cloud provider/manager %s not found", managerStr) + managerObj, err := CloudproviderManager.FetchByIdOrName(userCred, managerStr) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr) + } else { + return nil, httperrors.NewGeneralError(err) + } } + manager := managerObj.(*SCloudprovider) q = q.Equals("provider", manager.Provider) } + accountStr, _ := query.GetString("account") + if len(accountStr) > 0 { + accountObj, err := CloudaccountManager.FetchByIdOrName(userCred, accountStr) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), accountStr) + } else { + return nil, httperrors.NewGeneralError(err) + } + } + account := accountObj.(*SCloudaccount) + q = q.In("provider", account.Provider) + } if jsonutils.QueryBoolean(query, "usable", false) || jsonutils.QueryBoolean(query, "usable_vpc", false) { providers := CloudproviderManager.Query().SubQuery() diff --git a/pkg/compute/models/storagecachedimages.go b/pkg/compute/models/storagecachedimages.go index 5aa8c9df49..5385ea5359 100644 --- a/pkg/compute/models/storagecachedimages.go +++ b/pkg/compute/models/storagecachedimages.go @@ -234,6 +234,10 @@ func (self *SStoragecachedimage) ValidateDeleteCondition(ctx context.Context) er if self.getReferenceCount() > 0 { return httperrors.NewNotEmptyError("Image is in use") } + return self.SJointResourceBase.ValidateDeleteCondition(ctx) +} + +func (self *SStoragecachedimage) isCachedImageInUse() error { if !self.isDownloadSessionExpire() { return httperrors.NewResourceBusyError("Active download session not expired") } @@ -241,7 +245,7 @@ func (self *SStoragecachedimage) ValidateDeleteCondition(ctx context.Context) er if image != nil && !image.canDeleteLastCache() { return httperrors.NewResourceBusyError("Cannot delete the last cache") } - return self.SJointResourceBase.ValidateDeleteCondition(ctx) + return nil } func (self *SStoragecachedimage) isDownloadSessionExpire() bool { @@ -257,6 +261,12 @@ func (self *SStoragecachedimage) markDeleting(ctx context.Context, userCred mccl if err != nil { return err } + if !isForce { + err = self.isCachedImageInUse() + if err != nil { + return err + } + } cache := self.GetStoragecache() image := self.GetCachedimage() diff --git a/pkg/compute/models/zones.go b/pkg/compute/models/zones.go index 68fd657d78..df269437c4 100644 --- a/pkg/compute/models/zones.go +++ b/pkg/compute/models/zones.go @@ -630,13 +630,32 @@ func (manager *SZoneManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQu } managerStr, _ := query.GetString("manager") if len(managerStr) > 0 { - provider := CloudproviderManager.FetchCloudproviderByIdOrName(managerStr) - if provider == nil { - return nil, httperrors.NewResourceNotFoundError("Cloud provider/manager %s not found", managerStr) + providerObj, err := CloudproviderManager.FetchByIdOrName(userCred, managerStr) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(CloudproviderManager.Keyword(), managerStr) + } else { + return nil, httperrors.NewGeneralError(err) + } } + provider := providerObj.(*SCloudprovider) subq := CloudregionManager.Query("id").Equals("provider", provider.Provider).SubQuery() q = q.In("cloudregion_id", subq) } + accountStr, _ := query.GetString("account") + if len(accountStr) > 0 { + accountObj, err := CloudaccountManager.FetchByIdOrName(userCred, accountStr) + if err != nil { + if err == sql.ErrNoRows { + return nil, httperrors.NewResourceNotFoundError2(CloudaccountManager.Keyword(), accountStr) + } else { + return nil, httperrors.NewGeneralError(err) + } + } + account := accountObj.(*SCloudaccount) + subq := CloudregionManager.Query("id").Equals("provider", account.Provider).SubQuery() + q = q.In("cloudregion_id", subq) + } providerStr, _ := query.GetString("provider") if len(providerStr) > 0 { subq := CloudregionManager.Query("id").Equals("provider", providerStr).SubQuery()