fix: fix issues preventing clean_provider.sh from clean cloud provider

records
This commit is contained in:
Qiu Jian
2019-02-12 20:40:11 +08:00
parent 0725f68921
commit 137c0d41df
7 changed files with 127 additions and 9 deletions
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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()
+36
View File
@@ -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
}
+34
View File
@@ -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
}
+21 -3
View File
@@ -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()
+11 -1
View File
@@ -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()
+22 -3
View File
@@ -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()