diff --git a/cmd/climc/shell/quotas.go b/cmd/climc/shell/quotas.go index cf20958eef..08afd6207d 100644 --- a/cmd/climc/shell/quotas.go +++ b/cmd/climc/shell/quotas.go @@ -291,11 +291,47 @@ func init() { } R(&CleanPendingUsageOptions{}, "clean-pending-usage", "Clean pending usage for project or domain", func(s *mcclient.ClientSession, args *CleanPendingUsageOptions) error { params := jsonutils.Marshal(args) - log.Debugf("%s", params) _, err := modules.Quotas.DoCleanPendingUsage(s, params) if err != nil { return err } return nil }) + + R(&CleanPendingUsageOptions{}, "clean-region-pending-usage", "Clean pending usage for project or domain", func(s *mcclient.ClientSession, args *CleanPendingUsageOptions) error { + params := jsonutils.Marshal(args) + _, err := modules.RegionQuotas.DoCleanPendingUsage(s, params) + if err != nil { + return err + } + return nil + }) + + R(&CleanPendingUsageOptions{}, "clean-zone-pending-usage", "Clean pending usage for project or domain", func(s *mcclient.ClientSession, args *CleanPendingUsageOptions) error { + params := jsonutils.Marshal(args) + _, err := modules.ZoneQuotas.DoCleanPendingUsage(s, params) + if err != nil { + return err + } + return nil + }) + + R(&CleanPendingUsageOptions{}, "clean-project-pending-usage", "Clean pending usage for project or domain", func(s *mcclient.ClientSession, args *CleanPendingUsageOptions) error { + params := jsonutils.Marshal(args) + _, err := modules.ProjectQuotas.DoCleanPendingUsage(s, params) + if err != nil { + return err + } + return nil + }) + + R(&CleanPendingUsageOptions{}, "clean-image-pending-usage", "Clean pending usage for project or domain", func(s *mcclient.ClientSession, args *CleanPendingUsageOptions) error { + params := jsonutils.Marshal(args) + _, err := modules.ImageQuotas.DoCleanPendingUsage(s, params) + if err != nil { + return err + } + return nil + }) + } diff --git a/pkg/compute/models/filters.go b/pkg/compute/models/filters.go index ce6d0d32b3..a06f2edbf9 100644 --- a/pkg/compute/models/filters.go +++ b/pkg/compute/models/filters.go @@ -30,6 +30,9 @@ func rangeObjectsFilter(q *sqlchemy.SQuery, rangeObjs []db.IStandaloneModel, reg } func rangeObjFilter(q *sqlchemy.SQuery, rangeObj db.IStandaloneModel, regionField sqlchemy.IQueryField, zoneField sqlchemy.IQueryField, managerField sqlchemy.IQueryField) *sqlchemy.SQuery { + if rangeObj == nil { + return q + } kw := rangeObj.Keyword() switch kw { case "zone": diff --git a/pkg/compute/usages/handler.go b/pkg/compute/usages/handler.go index 35d646d43d..0a5d128f7b 100644 --- a/pkg/compute/usages/handler.go +++ b/pkg/compute/usages/handler.go @@ -116,7 +116,11 @@ func rangeObjHandler( providers := json.GetQueryStringArray(query, "provider") brands := json.GetQueryStringArray(query, "brand") cloudEnv, _ := query.GetString("cloud_env") - usage, err := reporter(scope, ownerId, isOwner, []db.IStandaloneModel{obj}, hostTypes, providers, brands, cloudEnv) + var rangeObjs []db.IStandaloneModel + if obj != nil { + rangeObjs = []db.IStandaloneModel{obj} + } + usage, err := reporter(scope, ownerId, isOwner, rangeObjs, hostTypes, providers, brands, cloudEnv) if err != nil { httperrors.GeneralServerError(w, err) return diff --git a/pkg/mcclient/modules/mod_quotas.go b/pkg/mcclient/modules/mod_quotas.go index 6706cdc385..fe3cb074d6 100644 --- a/pkg/mcclient/modules/mod_quotas.go +++ b/pkg/mcclient/modules/mod_quotas.go @@ -79,9 +79,9 @@ func (this *QuotaManager) GetQuotaList(s *mcclient.ClientSession, params jsonuti var reqUrl string domainId := jsonutils.GetAnyString(params, []string{"domain", "project_domain", "domain_id", "project_domain_id"}) if len(domainId) > 0 { - reqUrl = "/quotas/projects?project_domain=" + domainId + reqUrl = fmt.Sprintf("%s/projects?project_domain=%s", this.URLPath(), domainId) } else { - reqUrl = "/quotas/domains" + reqUrl = fmt.Sprintf("%s/domains", this.URLPath()) } computeQuotaList, err := modulebase.List(this.ResourceManager, s, reqUrl, this.KeywordPlural) if err != nil { @@ -148,7 +148,7 @@ func init() { []string{})} registerCompute(&ZoneQuotas) - ImageQuotas = QuotaManager{NewImageManager("quota", "quotas", + ImageQuotas = QuotaManager{NewImageManager("image_quota", "image_quotas", quotaColumns, []string{})} // registerV2(&ImageQuotas)