handler.go 65 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package usages
  15. import (
  16. "context"
  17. "fmt"
  18. "net/http"
  19. "time"
  20. json "yunion.io/x/jsonutils"
  21. "yunion.io/x/log"
  22. "yunion.io/x/pkg/appctx"
  23. "yunion.io/x/pkg/errors"
  24. "yunion.io/x/pkg/gotypes"
  25. "yunion.io/x/pkg/tristate"
  26. "yunion.io/x/pkg/util/rbacscope"
  27. "yunion.io/x/pkg/util/sets"
  28. "yunion.io/x/pkg/utils"
  29. "yunion.io/x/onecloud/pkg/apis"
  30. api "yunion.io/x/onecloud/pkg/apis/compute"
  31. "yunion.io/x/onecloud/pkg/appsrv"
  32. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  33. "yunion.io/x/onecloud/pkg/cloudcommon/policy"
  34. "yunion.io/x/onecloud/pkg/compute/models"
  35. "yunion.io/x/onecloud/pkg/httperrors"
  36. "yunion.io/x/onecloud/pkg/mcclient"
  37. "yunion.io/x/onecloud/pkg/mcclient/auth"
  38. "yunion.io/x/onecloud/pkg/util/rbacutils"
  39. )
  40. type Usage map[string]interface{}
  41. func (u Usage) update(nu Usage) Usage {
  42. for k, v := range nu {
  43. u[k] = v
  44. }
  45. return u
  46. }
  47. func (u Usage) Add(key string, value interface{}) Usage {
  48. u[key] = value
  49. return u
  50. }
  51. func (u Usage) Get(key string) interface{} {
  52. return u[key]
  53. }
  54. func (u Usage) Include(nus ...Usage) Usage {
  55. for _, nu := range nus {
  56. u.update(nu)
  57. }
  58. return u
  59. }
  60. type objUsageFunc func(context.Context, mcclient.TokenCredential, rbacscope.TRbacScope, mcclient.IIdentityProvider, bool, []db.IStandaloneModel, []string, []string, []string, string, bool, rbacutils.SPolicyResult) (Usage, error)
  61. func getRangeObjId(ctx context.Context) (string, error) {
  62. params := appctx.AppContextParams(ctx)
  63. objId := params["<id>"]
  64. if len(objId) == 0 {
  65. return "", fmt.Errorf("Object %q id must specified", objId)
  66. }
  67. return objId, nil
  68. }
  69. func getRangeObj(ctx context.Context, man db.IStandaloneModelManager, userCred mcclient.TokenCredential) (db.IStandaloneModel, error) {
  70. if man == nil {
  71. return nil, nil
  72. }
  73. id, err := getRangeObjId(ctx)
  74. if err != nil {
  75. return nil, errors.Wrap(err, "getRangeObjId")
  76. }
  77. m, err := man.FetchByIdOrName(ctx, userCred, id)
  78. if err != nil {
  79. return nil, errors.Wrap(err, "man.FetchByIdOrName")
  80. }
  81. return m.(db.IStandaloneModel), nil
  82. }
  83. func rangeObjHandler(
  84. manager db.IStandaloneModelManager,
  85. reporter objUsageFunc,
  86. ) appsrv.FilterHandler {
  87. return func(ctx context.Context, w http.ResponseWriter, r *http.Request) {
  88. userCred := auth.FetchUserCredential(ctx, policy.FilterPolicyCredential)
  89. obj, err := getRangeObj(ctx, manager, userCred)
  90. if err != nil {
  91. httperrors.NotFoundError(ctx, w, "%v", err)
  92. return
  93. }
  94. ownerId, scope, err, result := db.FetchUsageOwnerScope(ctx, userCred, getQuery(r))
  95. if err != nil {
  96. httperrors.GeneralServerError(ctx, w, err)
  97. return
  98. }
  99. query := getQuery(r)
  100. tags := rbacutils.SPolicyResult{Result: rbacutils.Allow}
  101. query.Unmarshal(&tags)
  102. result = result.Merge(tags)
  103. isOwner := false
  104. if scope == rbacscope.ScopeDomain && obj != nil && db.IsObjectRbacAllowed(ctx, obj, userCred, policy.PolicyActionGet, "usage") == nil {
  105. isOwner = true
  106. }
  107. log.Debugf("ownerId: %s isOwner: %v scope: %s result: %s", ownerId, isOwner, scope, result.String())
  108. hostTypes := json.GetQueryStringArray(query, "host_type")
  109. // resourceTypes := json.GetQueryStringArray(query, "resource_type")
  110. providers := json.GetQueryStringArray(query, "provider")
  111. brands := json.GetQueryStringArray(query, "brand")
  112. cloudEnv, _ := query.GetString("cloud_env")
  113. includeSystem := json.QueryBoolean(query, "system", false)
  114. var rangeObjs []db.IStandaloneModel
  115. if obj != nil {
  116. rangeObjs = []db.IStandaloneModel{obj}
  117. }
  118. refresh := json.QueryBoolean(query, "refresh", false)
  119. key := getCacheKey(scope, ownerId, isOwner, rangeObjs, hostTypes, providers, brands, cloudEnv, includeSystem, result)
  120. if !refresh {
  121. cached := usageCache.Get(key)
  122. if cached != nil {
  123. response(w, "usage", cached)
  124. return
  125. }
  126. }
  127. usage, err := reporter(ctx, userCred, scope, ownerId, isOwner, rangeObjs, hostTypes, providers, brands, cloudEnv, includeSystem, result)
  128. if err != nil {
  129. httperrors.GeneralServerError(ctx, w, err)
  130. return
  131. }
  132. usageCache.AtomicSet(key, usage)
  133. response(w, "usage", usage)
  134. }
  135. }
  136. func addHandler(prefix, rangeObjKey string, hf appsrv.FilterHandler, app *appsrv.Application) {
  137. ahf := auth.Authenticate(hf)
  138. name := "get_usage"
  139. if len(rangeObjKey) != 0 {
  140. prefix = fmt.Sprintf("%s/%ss/<id>", prefix, rangeObjKey)
  141. name = fmt.Sprintf("get_%s_usage", rangeObjKey)
  142. }
  143. app.AddHandler2("GET", prefix, ahf, nil, name, nil)
  144. }
  145. func AddUsageHandler(prefix string, app *appsrv.Application) {
  146. prefix = fmt.Sprintf("%s/usages", prefix)
  147. for key, f := range map[string]appsrv.FilterHandler{
  148. "": rangeObjHandler(nil, ReportGeneralUsage),
  149. "zone": rangeObjHandler(models.ZoneManager, ReportZoneUsage),
  150. "wire": rangeObjHandler(models.WireManager, ReportWireUsage),
  151. "schedtag": rangeObjHandler(models.SchedtagManager, ReportSchedtagUsage),
  152. "host": rangeObjHandler(models.HostManager, ReportHostUsage),
  153. "cloudaccount": rangeObjHandler(models.CloudaccountManager, ReportCloudAccountUsage),
  154. "cloudprovider": rangeObjHandler(models.CloudproviderManager, ReportCloudProviderUsage),
  155. "cloudregion": rangeObjHandler(models.CloudregionManager, ReportCloudRegionUsage),
  156. } {
  157. addHandler(prefix, key, f, app)
  158. }
  159. }
  160. func response(w http.ResponseWriter, key string, obj interface{}) {
  161. body := map[string]interface{}{
  162. key: obj,
  163. }
  164. appsrv.SendStruct(w, body)
  165. }
  166. func getQuery(r *http.Request) json.JSONObject {
  167. query, e := json.ParseQueryString(r.URL.RawQuery)
  168. if e != nil {
  169. log.Errorf("Parse query string %q: %v", r.URL.RawQuery, e)
  170. }
  171. return query
  172. }
  173. func ReportHostUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, isOwner bool, hosts []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, includeSystem bool, policyResult rbacutils.SPolicyResult) (Usage, error) {
  174. return ReportGeneralUsage(ctx, userToken, scope, userCred, isOwner, hosts, hostTypes, providers, brands, cloudEnv, includeSystem, policyResult)
  175. }
  176. func ReportWireUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, isOwner bool, wires []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, includeSystem bool, policyResult rbacutils.SPolicyResult) (Usage, error) {
  177. return ReportGeneralUsage(ctx, userToken, scope, userCred, isOwner, wires, hostTypes, providers, brands, cloudEnv, includeSystem, policyResult)
  178. }
  179. func ReportCloudAccountUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, isOwner bool, accounts []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, includeSystem bool, policyResult rbacutils.SPolicyResult) (Usage, error) {
  180. return ReportGeneralUsage(ctx, userToken, scope, userCred, isOwner, accounts, hostTypes, providers, brands, cloudEnv, includeSystem, policyResult)
  181. }
  182. func ReportCloudProviderUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, isOwner bool, managers []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, includeSystem bool, policyResult rbacutils.SPolicyResult) (Usage, error) {
  183. return ReportGeneralUsage(ctx, userToken, scope, userCred, isOwner, managers, hostTypes, providers, brands, cloudEnv, includeSystem, policyResult)
  184. }
  185. func ReportSchedtagUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, isOwner bool, schedtags []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, includeSystem bool, policyResult rbacutils.SPolicyResult) (Usage, error) {
  186. return ReportGeneralUsage(ctx, userToken, scope, userCred, isOwner, schedtags, hostTypes, providers, brands, cloudEnv, includeSystem, policyResult)
  187. }
  188. func ReportZoneUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, isOwner bool, zones []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, includeSystem bool, policyResult rbacutils.SPolicyResult) (Usage, error) {
  189. return ReportGeneralUsage(ctx, userToken, scope, userCred, isOwner, zones, hostTypes, providers, brands, cloudEnv, includeSystem, policyResult)
  190. }
  191. func ReportCloudRegionUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, isOwner bool, cloudRegions []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, includeSystem bool, policyResult rbacutils.SPolicyResult) (Usage, error) {
  192. return ReportGeneralUsage(ctx, userToken, scope, userCred, isOwner, cloudRegions, hostTypes, providers, brands, cloudEnv, includeSystem, policyResult)
  193. }
  194. func getSystemGeneralUsage(
  195. ctx context.Context,
  196. userToken mcclient.TokenCredential,
  197. userCred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, hostTypes []string,
  198. providers []string, brands []string, cloudEnv string, includeSystem bool,
  199. policyResult rbacutils.SPolicyResult,
  200. ) (Usage, error) {
  201. count := RegionUsage(rangeObjs, providers, brands, cloudEnv)
  202. zone := ZoneUsage(rangeObjs, providers, brands, cloudEnv)
  203. count.Include(zone)
  204. var pmemTotal float64
  205. var pcpuTotal float64
  206. hostEnabledUsage := HostEnabledUsage(ctx, userToken, "", userCred, rbacscope.ScopeSystem, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, policyResult)
  207. if !gotypes.IsNil(hostEnabledUsage.Get("enabled_hosts.memory")) {
  208. pmemTotal = float64(hostEnabledUsage.Get("enabled_hosts.memory").(int64))
  209. }
  210. if !gotypes.IsNil(hostEnabledUsage.Get("enabled_hosts.cpu")) {
  211. pcpuTotal = float64(hostEnabledUsage.Get("enabled_hosts.cpu").(int64))
  212. }
  213. if len(rangeObjs) > 0 && rangeObjs[0].Keyword() == "host" {
  214. host := rangeObjs[0].(*models.SHost)
  215. pmemTotal = float64(host.MemSize)
  216. pcpuTotal = float64(host.CpuCount)
  217. count.Add("memory", host.MemSize)
  218. count.Add("cpu", host.CpuCount)
  219. count.Add("memory.virtual", int64(host.GetVirtualMemorySize()))
  220. count.Add("cpu.virtual", int64(host.GetVirtualCPUCount()))
  221. }
  222. guestRunningUsage := GuestRunningUsage(ctx, userToken, "all.running_servers", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, policyResult)
  223. var runningMem int
  224. var runningCpu int
  225. if !gotypes.IsNil(guestRunningUsage.Get("all.running_servers.memory")) {
  226. runningMem = guestRunningUsage.Get("all.running_servers.memory").(int)
  227. }
  228. if !gotypes.IsNil(guestRunningUsage.Get("all.running_servers.cpu")) {
  229. runningCpu = guestRunningUsage.Get("all.running_servers.cpu").(int)
  230. }
  231. runningCpuCmtRate := 0.0
  232. runningMemCmtRate := 0.0
  233. if pmemTotal > 0 {
  234. runningMemCmtRate = utils.FloatRound(float64(runningMem)/pmemTotal, 2)
  235. }
  236. if pcpuTotal > 0 {
  237. runningCpuCmtRate = utils.FloatRound(float64(runningCpu)/pcpuTotal, 2)
  238. }
  239. count.Add("all.memory_commit_rate.running", runningMemCmtRate)
  240. count.Add("all.cpu_commit_rate.running", runningCpuCmtRate)
  241. containerRunningUsage := ContainerRunningUsage(ctx, userToken, "all.running_containers", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, policyResult)
  242. lastWeek := time.Now().Add(-7 * 24 * time.Hour)
  243. lastMonth := time.Now().Add(-30 * 24 * time.Hour)
  244. count.Include(
  245. VpcUsage(ctx, userToken, "all", providers, brands, cloudEnv, nil, rbacscope.ScopeSystem, rangeObjs, policyResult),
  246. DnsZoneUsage(ctx, userToken, "", nil, rbacscope.ScopeSystem, policyResult),
  247. HostAllUsage(ctx, userToken, "", userCred, rbacscope.ScopeSystem, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, policyResult),
  248. hostEnabledUsage,
  249. BaremetalUsage(ctx, userToken, userCred, rbacscope.ScopeSystem, rangeObjs, hostTypes, providers, brands, cloudEnv, policyResult),
  250. StorageUsage(ctx, userToken, "", rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, includeSystem, rbacscope.ScopeSystem, nil, policyResult),
  251. StorageUsage(ctx, userToken, "system", rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, true, rbacscope.ScopeSystem, nil, policyResult),
  252. GuestNormalUsage(ctx, userToken, "all.servers", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, nil, policyResult),
  253. GuestNormalUsage(ctx, userToken, "all.servers.last_week", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, &lastWeek, policyResult),
  254. GuestNormalUsage(ctx, userToken, "all.servers.last_month", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, &lastMonth, policyResult),
  255. ContainerNormalUsage(ctx, userToken, "all.containers", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, nil, policyResult),
  256. ContainerNormalUsage(ctx, userToken, "all.containers.last_week", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, &lastWeek, policyResult),
  257. ContainerNormalUsage(ctx, userToken, "all.containers.last_month", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, &lastMonth, policyResult),
  258. GuestPendingDeleteUsage(ctx, userToken, "all.pending_delete_servers", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, nil, policyResult),
  259. GuestPendingDeleteUsage(ctx, userToken, "all.pending_delete_servers.last_week", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, &lastWeek, policyResult),
  260. GuestPendingDeleteUsage(ctx, userToken, "all.pending_delete_servers.last_month", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, &lastMonth, policyResult),
  261. ContainerPendingDeleteUsage(ctx, userToken, "all.pending_delete_containers", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, nil, policyResult),
  262. ContainerPendingDeleteUsage(ctx, userToken, "all.pending_delete_containers.last_week", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, &lastWeek, policyResult),
  263. ContainerPendingDeleteUsage(ctx, userToken, "all.pending_delete_containers.last_month", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, &lastMonth, policyResult),
  264. GuestReadyUsage(ctx, userToken, "all.ready_servers", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, policyResult),
  265. ContainerReadyUsage(ctx, userToken, "all.ready_containers", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, includeSystem, policyResult),
  266. guestRunningUsage,
  267. containerRunningUsage,
  268. IsolatedDeviceUsage(ctx, userToken, "", rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, policyResult),
  269. WireUsage(ctx, userToken, rbacscope.ScopeSystem, nil, rangeObjs, hostTypes, providers, brands, cloudEnv, policyResult),
  270. NetworkUsage(ctx, userToken, "all", rbacscope.ScopeSystem, nil, providers, brands, cloudEnv, rangeObjs, policyResult),
  271. EipUsage(ctx, userToken, rbacscope.ScopeSystem, nil, rangeObjs, providers, brands, cloudEnv, policyResult),
  272. BucketUsage(ctx, userToken, rbacscope.ScopeSystem, nil, rangeObjs, providers, brands, cloudEnv, policyResult),
  273. SnapshotUsage(ctx, userToken, rbacscope.ScopeSystem, nil, rangeObjs, providers, brands, cloudEnv, policyResult),
  274. InstanceSnapshotUsage(ctx, userToken, rbacscope.ScopeSystem, nil, rangeObjs, providers, brands, cloudEnv, policyResult),
  275. LoadbalancerUsage(ctx, userToken, rbacscope.ScopeSystem, nil, rangeObjs, providers, brands, cloudEnv, policyResult),
  276. DBInstanceUsage(ctx, userToken, rbacscope.ScopeSystem, nil, rangeObjs, providers, brands, cloudEnv, policyResult),
  277. MongoDBUsage(ctx, userToken, rbacscope.ScopeSystem, nil, rangeObjs, providers, brands, cloudEnv, policyResult),
  278. ElasticSearchUsage(ctx, userToken, rbacscope.ScopeSystem, nil, rangeObjs, providers, brands, cloudEnv, policyResult),
  279. KafkaUsage(ctx, userToken, rbacscope.ScopeSystem, nil, rangeObjs, providers, brands, cloudEnv, policyResult),
  280. ElasticCacheUsage(ctx, userToken, rbacscope.ScopeSystem, nil, rangeObjs, providers, brands, cloudEnv, policyResult),
  281. )
  282. return count, nil
  283. }
  284. func getDomainGeneralUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, cred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) (Usage, error) {
  285. lastWeek := time.Now().Add(-7 * 24 * time.Hour)
  286. lastMonth := time.Now().Add(-30 * 24 * time.Hour)
  287. count := GuestNormalUsage(ctx, userToken, getKey(scope, "servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil, policyResult)
  288. var pmemTotal float64
  289. var pcpuTotal float64
  290. hostEnabledUsage := HostEnabledUsage(ctx, userToken, "", cred, rbacscope.ScopeDomain, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, policyResult)
  291. if !gotypes.IsNil(hostEnabledUsage.Get("domain.enabled_hosts.memory")) {
  292. pmemTotal = float64(hostEnabledUsage.Get("domain.enabled_hosts.memory").(int64))
  293. }
  294. if !gotypes.IsNil(hostEnabledUsage.Get("domain.enabled_hosts.cpu")) {
  295. pcpuTotal = float64(hostEnabledUsage.Get("domain.enabled_hosts.cpu").(int64))
  296. }
  297. guestRunningUsage := GuestRunningUsage(ctx, userToken, "domain.running_servers", rbacscope.ScopeDomain, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, policyResult)
  298. var runningMem int
  299. var runningCpu int
  300. if !gotypes.IsNil(guestRunningUsage.Get("domain.running_servers.memory")) {
  301. runningMem = guestRunningUsage.Get("domain.running_servers.memory").(int)
  302. }
  303. if !gotypes.IsNil(guestRunningUsage.Get("domain.running_servers.cpu")) {
  304. runningCpu = guestRunningUsage.Get("domain.running_servers.cpu").(int)
  305. }
  306. runningCpuCmtRate := 0.0
  307. runningMemCmtRate := 0.0
  308. if pmemTotal > 0 {
  309. runningMemCmtRate = utils.FloatRound(float64(runningMem)/pmemTotal, 2)
  310. }
  311. if pcpuTotal > 0 {
  312. runningCpuCmtRate = utils.FloatRound(float64(runningCpu)/pcpuTotal, 2)
  313. }
  314. count.Add("domain.memory_commit_rate.running", runningMemCmtRate)
  315. count.Add("domain.cpu_commit_rate.running", runningCpuCmtRate)
  316. containerRunningUsage := ContainerRunningUsage(ctx, userToken, "domain.running_containers", rbacscope.ScopeDomain, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, policyResult)
  317. var containerRunningMem int
  318. var containerRunningCpu int
  319. if !gotypes.IsNil(containerRunningUsage.Get("domain.running_containers.memory")) {
  320. containerRunningMem = containerRunningUsage.Get("domain.running_containers.memory").(int)
  321. }
  322. if !gotypes.IsNil(containerRunningUsage.Get("domain.running_containers.cpu")) {
  323. containerRunningCpu = containerRunningUsage.Get("domain.running_containers.cpu").(int)
  324. }
  325. count.Add("domain.memory_commit_rate.running_containers", utils.FloatRound(float64(containerRunningMem)/pmemTotal, 2))
  326. count.Add("domain.cpu_commit_rate.running_containers", utils.FloatRound(float64(containerRunningCpu)/pcpuTotal, 2))
  327. count.Include(
  328. ContainerNormalUsage(ctx, userToken, getKey(scope, "containers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil, policyResult),
  329. VpcUsage(ctx, userToken, "domain", providers, brands, cloudEnv, cred, rbacscope.ScopeDomain, rangeObjs, policyResult),
  330. DnsZoneUsage(ctx, userToken, "domain", cred, rbacscope.ScopeDomain, policyResult),
  331. HostAllUsage(ctx, userToken, "", cred, rbacscope.ScopeDomain, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, policyResult),
  332. hostEnabledUsage,
  333. BaremetalUsage(ctx, userToken, cred, rbacscope.ScopeDomain, rangeObjs, hostTypes, providers, brands, cloudEnv, policyResult),
  334. StorageUsage(ctx, userToken, "", rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, false, rbacscope.ScopeDomain, cred, policyResult),
  335. StorageUsage(ctx, userToken, "system", rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, true, rbacscope.ScopeDomain, cred, policyResult),
  336. GuestNormalUsage(ctx, userToken, getKey(scope, "servers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek, policyResult),
  337. GuestNormalUsage(ctx, userToken, getKey(scope, "servers.last_month"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastMonth, policyResult),
  338. ContainerNormalUsage(ctx, userToken, getKey(scope, "containers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek, policyResult),
  339. ContainerNormalUsage(ctx, userToken, getKey(scope, "containers.last_month"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastMonth, policyResult),
  340. guestRunningUsage,
  341. containerRunningUsage,
  342. GuestPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil, policyResult),
  343. GuestPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_servers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek, policyResult),
  344. GuestPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_servers.last_month"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastMonth, policyResult),
  345. ContainerPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_containers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil, policyResult),
  346. ContainerPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_containers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek, policyResult),
  347. ContainerPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_containers.last_month"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastMonth, policyResult),
  348. GuestReadyUsage(ctx, userToken, getKey(scope, "ready_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, policyResult),
  349. ContainerReadyUsage(ctx, userToken, getKey(scope, "ready_containers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, policyResult),
  350. WireUsage(ctx, userToken, scope, cred, rangeObjs, hostTypes, providers, brands, cloudEnv, policyResult),
  351. NetworkUsage(ctx, userToken, getKey(scope, ""), scope, cred, providers, brands, cloudEnv, rangeObjs, policyResult),
  352. IsolatedDeviceUsage(ctx, userToken, "", scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, policyResult),
  353. EipUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  354. BucketUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  355. SnapshotUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  356. InstanceSnapshotUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  357. LoadbalancerUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  358. DBInstanceUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  359. MongoDBUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  360. ElasticSearchUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  361. KafkaUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  362. ElasticCacheUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  363. )
  364. return count, nil
  365. }
  366. func getProjectGeneralUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, cred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) (Usage, error) {
  367. lastWeek := time.Now().Add(-7 * 24 * time.Hour)
  368. lastMonth := time.Now().Add(-30 * 24 * time.Hour)
  369. count := GuestNormalUsage(ctx, userToken, getKey(scope, "servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil, policyResult)
  370. count.Include(
  371. ContainerNormalUsage(ctx, userToken, getKey(scope, "containers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil, policyResult),
  372. GuestNormalUsage(ctx, userToken, getKey(scope, "servers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek, policyResult),
  373. GuestNormalUsage(ctx, userToken, getKey(scope, "servers.last_month"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastMonth, policyResult),
  374. ContainerNormalUsage(ctx, userToken, getKey(scope, "containers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek, policyResult),
  375. ContainerNormalUsage(ctx, userToken, getKey(scope, "containers.last_month"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastMonth, policyResult),
  376. GuestRunningUsage(ctx, userToken, getKey(scope, "running_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, policyResult),
  377. ContainerRunningUsage(ctx, userToken, getKey(scope, "running_containers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, policyResult),
  378. GuestPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil, policyResult),
  379. GuestPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_servers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek, policyResult),
  380. GuestPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_servers.last_month"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastMonth, policyResult),
  381. ContainerPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_containers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, nil, policyResult),
  382. ContainerPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_containers.last_week"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastWeek, policyResult),
  383. ContainerPendingDeleteUsage(ctx, userToken, getKey(scope, "pending_delete_containers.last_month"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, &lastMonth, policyResult),
  384. GuestReadyUsage(ctx, userToken, getKey(scope, "ready_servers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, policyResult),
  385. ContainerReadyUsage(ctx, userToken, getKey(scope, "ready_containers"), scope, cred, rangeObjs, hostTypes, []string{api.HostResourceTypeShared}, providers, brands, cloudEnv, false, policyResult),
  386. WireUsage(ctx, userToken, scope, cred, rangeObjs, hostTypes, providers, brands, cloudEnv, policyResult),
  387. NetworkUsage(ctx, userToken, getKey(scope, ""), scope, cred, providers, brands, cloudEnv, rangeObjs, policyResult),
  388. EipUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  389. BucketUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  390. DisksUsage(ctx, userToken, getKey(scope, "disks"), rangeObjs, hostTypes, nil, providers, brands, cloudEnv, scope, cred, false, false, policyResult),
  391. DisksUsage(ctx, userToken, getKey(scope, "disks.system"), rangeObjs, hostTypes, nil, providers, brands, cloudEnv, scope, cred, false, true, policyResult),
  392. DisksUsage(ctx, userToken, getKey(scope, "pending_delete_disks"), rangeObjs, hostTypes, nil, providers, brands, cloudEnv, scope, cred, true, false, policyResult),
  393. DisksUsage(ctx, userToken, getKey(scope, "pending_delete_disks.system"), rangeObjs, hostTypes, nil, providers, brands, cloudEnv, scope, cred, true, true, policyResult),
  394. SnapshotUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  395. InstanceSnapshotUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  396. LoadbalancerUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  397. DBInstanceUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  398. MongoDBUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  399. ElasticSearchUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  400. KafkaUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  401. ElasticCacheUsage(ctx, userToken, scope, cred, rangeObjs, providers, brands, cloudEnv, policyResult),
  402. )
  403. return count, nil
  404. }
  405. func ReportGeneralUsage(
  406. ctx context.Context,
  407. userToken mcclient.TokenCredential,
  408. scope rbacscope.TRbacScope,
  409. userCred mcclient.IIdentityProvider,
  410. isOwner bool,
  411. rangeObjs []db.IStandaloneModel,
  412. hostTypes []string,
  413. providers []string,
  414. brands []string,
  415. cloudEnv string,
  416. includeSystem bool,
  417. policyResult rbacutils.SPolicyResult,
  418. ) (count Usage, err error) {
  419. count = make(map[string]interface{})
  420. // if scope == rbacscope.ScopeSystem || isOwner {
  421. if scope == rbacscope.ScopeSystem {
  422. count, err = getSystemGeneralUsage(ctx, userToken, userCred, rangeObjs, hostTypes, providers, brands, cloudEnv, includeSystem, policyResult)
  423. if err != nil {
  424. return
  425. }
  426. }
  427. // if scope.HigherEqual(rbacscope.ScopeDomain) && len(userCred.GetProjectDomainId()) > 0 {
  428. if scope == rbacscope.ScopeDomain && len(userCred.GetProjectDomainId()) > 0 {
  429. commonUsage, err := getDomainGeneralUsage(ctx, userToken, rbacscope.ScopeDomain, userCred, rangeObjs, hostTypes, providers, brands, cloudEnv, policyResult)
  430. if err == nil {
  431. count.Include(commonUsage)
  432. }
  433. }
  434. // if scope.HigherEqual(rbacscope.ScopeProject) && len(userCred.GetProjectId()) > 0 {
  435. if scope == rbacscope.ScopeProject && len(userCred.GetProjectId()) > 0 {
  436. commonUsage, err := getProjectGeneralUsage(ctx, userToken, rbacscope.ScopeProject, userCred, rangeObjs, hostTypes, providers, brands, cloudEnv, policyResult)
  437. if err == nil {
  438. count.Include(commonUsage)
  439. }
  440. }
  441. return
  442. }
  443. func RegionUsage(rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string) Usage {
  444. q := models.CloudregionManager.Query()
  445. if len(rangeObjs) > 0 || len(providers) > 0 || len(brands) > 0 || len(cloudEnv) > 0 {
  446. subq := models.VpcManager.Query("cloudregion_id")
  447. subq = models.CloudProviderFilter(subq, subq.Field("manager_id"), providers, brands, cloudEnv)
  448. subq = models.RangeObjectsFilter(subq, rangeObjs, nil, nil, subq.Field("manager_id"), nil, nil)
  449. q = q.In("id", subq.SubQuery())
  450. }
  451. count := make(map[string]interface{})
  452. count["regions"], _ = q.CountWithError()
  453. return count
  454. }
  455. func ZoneUsage(rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string) Usage {
  456. q := models.ZoneManager.Query()
  457. if len(rangeObjs) > 0 || len(providers) > 0 || len(brands) > 0 || len(cloudEnv) > 0 {
  458. subq := models.HostManager.Query("zone_id")
  459. subq = models.CloudProviderFilter(subq, subq.Field("manager_id"), providers, brands, cloudEnv)
  460. subq = models.RangeObjectsFilter(subq, rangeObjs, nil, nil, subq.Field("manager_id"), nil, nil)
  461. q = q.In("id", subq.SubQuery())
  462. }
  463. count := make(map[string]interface{})
  464. count["zones"], _ = q.CountWithError()
  465. return count
  466. }
  467. func VpcUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, providers []string, brands []string, cloudEnv string, ownerId mcclient.IIdentityProvider, scope rbacscope.TRbacScope, rangeObjs []db.IStandaloneModel, policyResult rbacutils.SPolicyResult) Usage {
  468. count := make(map[string]interface{})
  469. results := db.UsagePolicyCheck(userToken, models.VpcManager, scope)
  470. results = results.Merge(policyResult)
  471. if results.Result.IsDeny() {
  472. return count
  473. }
  474. q := models.VpcManager.Query().IsFalse("is_emulated")
  475. if len(rangeObjs) > 0 || len(providers) > 0 || len(brands) > 0 || len(cloudEnv) > 0 {
  476. q = models.CloudProviderFilter(q, q.Field("manager_id"), providers, brands, cloudEnv)
  477. q = models.RangeObjectsFilter(q, rangeObjs, nil, nil, q.Field("manager_id"), nil, nil)
  478. }
  479. if scope == rbacscope.ScopeDomain {
  480. q = q.Equals("domain_id", ownerId.GetProjectDomainId())
  481. }
  482. q = db.ObjectIdQueryWithPolicyResult(ctx, q, models.VpcManager, results)
  483. key := "vpcs"
  484. if len(prefix) > 0 {
  485. key = fmt.Sprintf("%s.vpcs", prefix)
  486. }
  487. count[key], _ = q.CountWithError()
  488. return count
  489. }
  490. func DnsZoneUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, ownerId mcclient.IIdentityProvider, scope rbacscope.TRbacScope, policyResult rbacutils.SPolicyResult) Usage {
  491. count := make(map[string]interface{})
  492. results := db.UsagePolicyCheck(userToken, models.DnsZoneManager, scope)
  493. results = results.Merge(policyResult)
  494. if results.Result.IsDeny() {
  495. return count
  496. }
  497. q := models.DnsZoneManager.Query()
  498. if scope == rbacscope.ScopeDomain {
  499. q = q.Equals("domain_id", ownerId.GetProjectDomainId())
  500. }
  501. q = db.ObjectIdQueryWithPolicyResult(ctx, q, models.DnsZoneManager, results)
  502. key := "dns_zones"
  503. if len(prefix) > 0 {
  504. key = fmt.Sprintf("%s.dns_zones", prefix)
  505. }
  506. count[key], _ = q.CountWithError()
  507. return count
  508. }
  509. func StorageUsage(
  510. ctx context.Context,
  511. userToken mcclient.TokenCredential,
  512. prefix string,
  513. rangeObjs []db.IStandaloneModel,
  514. hostTypes []string, resourceTypes []string,
  515. providers []string, brands []string, cloudEnv string,
  516. pendingDeleted bool, includeSystem bool,
  517. scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider,
  518. policyResult rbacutils.SPolicyResult,
  519. ) Usage {
  520. results := db.UsagePolicyCheck(userToken, models.StorageManager, scope)
  521. results = results.Merge(policyResult)
  522. if results.Result.IsDeny() {
  523. return map[string]interface{}{}
  524. }
  525. sPrefix := getSysKey(scope, "storages")
  526. dPrefix := getKey(scope, "disks")
  527. if len(prefix) > 0 {
  528. sPrefix = fmt.Sprintf("%s.%s", sPrefix, prefix)
  529. dPrefix = fmt.Sprintf("%s.%s", dPrefix, prefix)
  530. }
  531. count := make(map[string]interface{})
  532. result := models.StorageManager.TotalCapacity(
  533. ctx,
  534. rangeObjs,
  535. hostTypes, resourceTypes,
  536. providers, brands, cloudEnv,
  537. scope, ownerId,
  538. pendingDeleted, includeSystem,
  539. true,
  540. results,
  541. )
  542. count[sPrefix] = result.Capacity
  543. for s, capa := range result.StorageTypeCapacity {
  544. count[fmt.Sprintf("%s.storage_type.%s", sPrefix, s)] = capa
  545. }
  546. for m, capa := range result.MediumeCapacity {
  547. count[fmt.Sprintf("%s.medium_type.%s", sPrefix, m)] = capa
  548. }
  549. count[fmt.Sprintf("%s.virtual", sPrefix)] = result.CapacityVirtual
  550. count[fmt.Sprintf("%s.actual_capacity_used", sPrefix)] = result.ActualCapacityUsed
  551. count[fmt.Sprintf("%s.owner", dPrefix)] = result.CapacityUsed
  552. count[fmt.Sprintf("%s.count.owner", dPrefix)] = result.CountUsed
  553. count[fmt.Sprintf("%s.unready.owner", dPrefix)] = result.CapacityUnready
  554. count[fmt.Sprintf("%s.unready.count.owner", dPrefix)] = result.CountUnready
  555. count[fmt.Sprintf("%s.attached.owner", dPrefix)] = result.AttachedCapacity
  556. for s, capa := range result.AttachedStorageTypeCapacity {
  557. count[fmt.Sprintf("%s.attached.owner.storage_type.%s", dPrefix, s)] = capa
  558. }
  559. for m, capa := range result.AttachedMediumeCapacity {
  560. count[fmt.Sprintf("%s.attached.owner.medium_type.%s", dPrefix, m)] = capa
  561. }
  562. count[fmt.Sprintf("%s.attached.count.owner", dPrefix)] = result.CountAttached
  563. count[fmt.Sprintf("%s.detached.owner", dPrefix)] = result.DetachedCapacity
  564. for s, capa := range result.DetachedStorageTypeCapacity {
  565. count[fmt.Sprintf("%s.detached.owner.storage_type.%s", dPrefix, s)] = capa
  566. }
  567. for m, capa := range result.DetachedMediumeCapacity {
  568. count[fmt.Sprintf("%s.detached.owner.medium_type.%s", dPrefix, m)] = capa
  569. }
  570. count[fmt.Sprintf("%s.detached.count.owner", dPrefix)] = result.CountDetached
  571. count[fmt.Sprintf("%s.mounted.owner", dPrefix)] = result.AttachedCapacity
  572. count[fmt.Sprintf("%s.mounted.count.owner", dPrefix)] = result.CountAttached
  573. count[fmt.Sprintf("%s.unmounted.owner", dPrefix)] = result.DetachedCapacity
  574. count[fmt.Sprintf("%s.unmounted.count.owner", dPrefix)] = result.CountDetached
  575. storageCmtRate := 0.0
  576. if result.Capacity > 0 {
  577. storageCmtRate = utils.FloatRound(float64(result.CapacityUsed)/float64(result.Capacity), 2)
  578. }
  579. count[fmt.Sprintf("%s.commit_rate", sPrefix)] = storageCmtRate
  580. result = models.StorageManager.TotalCapacity(
  581. ctx,
  582. rangeObjs,
  583. hostTypes, resourceTypes,
  584. providers, brands, cloudEnv,
  585. scope, ownerId,
  586. pendingDeleted, includeSystem,
  587. false,
  588. policyResult,
  589. )
  590. count[fmt.Sprintf("%s", dPrefix)] = result.CapacityUsed
  591. for s, capa := range result.StorageTypeCapacityUsed {
  592. count[fmt.Sprintf("%s.storage_type.%s", dPrefix, s)] = capa
  593. }
  594. for m, capa := range result.MediumeCapacityUsed {
  595. count[fmt.Sprintf("%s.medium_type.%s", dPrefix, m)] = capa
  596. }
  597. count[fmt.Sprintf("%s.count", dPrefix)] = result.CountUsed
  598. count[fmt.Sprintf("%s.unready", dPrefix)] = result.CapacityUnready
  599. count[fmt.Sprintf("%s.unready.count", dPrefix)] = result.CountUnready
  600. count[fmt.Sprintf("%s.attached", dPrefix)] = result.AttachedCapacity
  601. for s, capa := range result.AttachedStorageTypeCapacity {
  602. count[fmt.Sprintf("%s.attached.storage_type.%s", dPrefix, s)] = capa
  603. }
  604. for m, capa := range result.AttachedMediumeCapacity {
  605. count[fmt.Sprintf("%s.attached.medium_type.%s", dPrefix, m)] = capa
  606. }
  607. count[fmt.Sprintf("%s.attached.count", dPrefix)] = result.CountAttached
  608. count[fmt.Sprintf("%s.detached", dPrefix)] = result.DetachedCapacity
  609. for s, capa := range result.DetachedStorageTypeCapacity {
  610. count[fmt.Sprintf("%s.detached.storage_type.%s", dPrefix, s)] = capa
  611. }
  612. for m, capa := range result.DetachedMediumeCapacity {
  613. count[fmt.Sprintf("%s.detached.medium_type.%s", dPrefix, m)] = capa
  614. }
  615. count[fmt.Sprintf("%s.detached.count", dPrefix)] = result.CountDetached
  616. count[fmt.Sprintf("%s.mounted", dPrefix)] = result.AttachedCapacity
  617. count[fmt.Sprintf("%s.mounted.count", dPrefix)] = result.CountAttached
  618. count[fmt.Sprintf("%s.unmounted", dPrefix)] = result.DetachedCapacity
  619. count[fmt.Sprintf("%s.unmounted.count", dPrefix)] = result.CountDetached
  620. return count
  621. }
  622. func DisksUsage(
  623. ctx context.Context,
  624. userToken mcclient.TokenCredential,
  625. dPrefix string,
  626. rangeObjs []db.IStandaloneModel,
  627. hostTypes []string,
  628. resourceTypes []string,
  629. providers []string,
  630. brands []string,
  631. cloudEnv string,
  632. scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider,
  633. pendingDeleted bool, includeSystem bool,
  634. policyResult rbacutils.SPolicyResult,
  635. ) Usage {
  636. count := make(map[string]interface{})
  637. results := db.UsagePolicyCheck(userToken, models.StorageManager, scope)
  638. results = results.Merge(policyResult)
  639. if results.Result.IsDeny() {
  640. return count
  641. }
  642. result := models.StorageManager.TotalCapacity(ctx, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, scope, ownerId, pendingDeleted, includeSystem, false, results)
  643. count[dPrefix] = result.CapacityUsed
  644. count[fmt.Sprintf("%s.storage", dPrefix)] = result.Capacity
  645. count[fmt.Sprintf("%s.storage.virtual", dPrefix)] = result.CapacityVirtual
  646. count[fmt.Sprintf("%s.count", dPrefix)] = result.CountUsed
  647. count[fmt.Sprintf("%s.unready", dPrefix)] = result.CapacityUnready
  648. count[fmt.Sprintf("%s.unready.count", dPrefix)] = result.CountUnready
  649. count[fmt.Sprintf("%s.attached", dPrefix)] = result.AttachedCapacity
  650. count[fmt.Sprintf("%s.attached.count", dPrefix)] = result.CountAttached
  651. count[fmt.Sprintf("%s.detached", dPrefix)] = result.DetachedCapacity
  652. count[fmt.Sprintf("%s.detached.count", dPrefix)] = result.CountDetached
  653. count[fmt.Sprintf("%s.mounted", dPrefix)] = result.AttachedCapacity
  654. count[fmt.Sprintf("%s.mounted.count", dPrefix)] = result.CountAttached
  655. count[fmt.Sprintf("%s.unmounted", dPrefix)] = result.DetachedCapacity
  656. count[fmt.Sprintf("%s.unmounted.count", dPrefix)] = result.CountDetached
  657. return count
  658. }
  659. func WireUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, hostTypes []string, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  660. count := make(map[string]interface{})
  661. results := db.UsagePolicyCheck(userToken, models.WireManager, scope)
  662. results = results.Merge(policyResult)
  663. if results.Result.IsDeny() {
  664. return count
  665. }
  666. result := models.WireManager.TotalCount(ctx, rangeObjs, hostTypes, providers, brands, cloudEnv, scope, userCred, results)
  667. count[getKey(scope, "wires")] = result.WiresCount - result.EmulatedWiresCount
  668. count[getKey(scope, "networks")] = result.NetCount
  669. // include nics for pending_deleted guests
  670. count[getKey(scope, "nics.guest")] = result.GuestNicCount
  671. // nics for pending_deleted guests
  672. count[getKey(scope, "nics.guest.pending_delete")] = result.PendingDeletedGuestNicCount
  673. count[getKey(scope, "nics.host")] = result.HostNicCount
  674. count[getKey(scope, "nics.reserve")] = result.ReservedCount
  675. count[getKey(scope, "nics.group")] = result.GroupNicCount
  676. count[getKey(scope, "nics.lb")] = result.LbNicCount
  677. count[getKey(scope, "nics.eip")] = result.EipNicCount
  678. count[getKey(scope, "nics.netif")] = result.NetifNicCount
  679. count[getKey(scope, "nics.db")] = result.DbNicCount
  680. count[getKey(scope, "nics")] = result.NicCount()
  681. return count
  682. }
  683. func prefixKey(prefix string, key string) string {
  684. if len(prefix) > 0 {
  685. return prefix + "." + key
  686. } else {
  687. return key
  688. }
  689. }
  690. func NetworkUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, providers []string, brands []string, cloudEnv string, rangeObjs []db.IStandaloneModel, policyResult rbacutils.SPolicyResult) Usage {
  691. count := make(map[string]interface{})
  692. results := db.UsagePolicyCheck(userToken, models.NetworkManager, scope)
  693. results = results.Merge(policyResult)
  694. if results.Result.IsDeny() {
  695. return count
  696. }
  697. ret := models.NetworkManager.TotalPortCount(ctx, scope, userCred, providers, brands, cloudEnv, rangeObjs, results)
  698. for k, v := range ret {
  699. if len(k) > 0 {
  700. count[prefixKey(prefix, fmt.Sprintf("ports.%s", k))] = v.Count
  701. count[prefixKey(prefix, fmt.Sprintf("ports_exit.%s", k))] = v.CountExt
  702. } else {
  703. count[prefixKey(prefix, "ports")] = v.Count
  704. count[prefixKey(prefix, "ports_exit")] = v.CountExt
  705. }
  706. }
  707. return count
  708. }
  709. func HostAllUsage(ctx context.Context, userToken mcclient.TokenCredential, pref string, userCred mcclient.IIdentityProvider, scope rbacscope.TRbacScope, rangeObjs []db.IStandaloneModel,
  710. hostTypes []string, resourceTypes []string, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  711. prefix := getSysKey(scope, "hosts")
  712. if len(pref) > 0 {
  713. prefix = fmt.Sprintf("%s.%s", prefix, pref)
  714. }
  715. return hostUsage(ctx, userToken, userCred, scope, prefix, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, tristate.None, tristate.False, policyResult)
  716. }
  717. func HostEnabledUsage(ctx context.Context, userToken mcclient.TokenCredential, pref string, userCred mcclient.IIdentityProvider, scope rbacscope.TRbacScope, rangeObjs []db.IStandaloneModel,
  718. hostTypes []string, resourceTypes []string, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  719. prefix := getSysKey(scope, "enabled_hosts")
  720. if len(pref) > 0 {
  721. prefix = fmt.Sprintf("%s.%s", prefix, pref)
  722. }
  723. return hostUsage(ctx, userToken, userCred, scope, prefix, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, tristate.True, tristate.False, policyResult)
  724. }
  725. func BaremetalUsage(ctx context.Context, userToken mcclient.TokenCredential, userCred mcclient.IIdentityProvider, scope rbacscope.TRbacScope, rangeObjs []db.IStandaloneModel,
  726. hostTypes []string, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  727. prefix := getSysKey(scope, "baremetals")
  728. count := hostUsage(ctx, userToken, userCred, scope, prefix, rangeObjs, hostTypes, nil, providers, brands, cloudEnv, tristate.None, tristate.True, policyResult)
  729. delete(count, fmt.Sprintf("%s.memory.virtual", prefix))
  730. delete(count, fmt.Sprintf("%s.cpu.virtual", prefix))
  731. return count
  732. }
  733. func hostUsage(
  734. ctx context.Context,
  735. userToken mcclient.TokenCredential,
  736. userCred mcclient.IIdentityProvider, scope rbacscope.TRbacScope, prefix string,
  737. rangeObjs []db.IStandaloneModel, hostTypes []string,
  738. resourceTypes []string, providers []string, brands []string, cloudEnv string,
  739. enabled, isBaremetal tristate.TriState,
  740. policyResult rbacutils.SPolicyResult,
  741. ) Usage {
  742. count := make(map[string]interface{})
  743. results := db.UsagePolicyCheck(userToken, models.HostManager, scope)
  744. results = results.Merge(policyResult)
  745. if results.Result.IsDeny() {
  746. return count
  747. }
  748. result := models.HostManager.TotalCount(ctx, userCred, scope, rangeObjs, "", "", hostTypes, resourceTypes, providers, brands, cloudEnv, enabled, isBaremetal, results)
  749. count[prefix] = result.Count
  750. count[fmt.Sprintf("%s.any_pool", prefix)] = result.Count
  751. count[fmt.Sprintf("%s.memory", prefix)] = result.Memory
  752. count[fmt.Sprintf("%s.memory.used", prefix)] = result.MemoryUsed
  753. count[fmt.Sprintf("%s.memory.total", prefix)] = result.MemoryTotal
  754. count[fmt.Sprintf("%s.cpu", prefix)] = result.CPU
  755. count[fmt.Sprintf("%s.cpu.total", prefix)] = result.CPUTotal
  756. count[fmt.Sprintf("%s.cpu.used", prefix)] = result.CPUUsed
  757. count[fmt.Sprintf("%s.memory.virtual", prefix)] = int64(result.MemoryVirtual)
  758. count[fmt.Sprintf("%s.cpu.virtual", prefix)] = int64(result.CPUVirtual)
  759. count[fmt.Sprintf("%s.memory.reserved", prefix)] = result.MemoryReserved
  760. count[fmt.Sprintf("%s.memory.reserved.isolated", prefix)] = result.IsolatedReservedMemory
  761. count[fmt.Sprintf("%s.cpu.reserved.isolated", prefix)] = result.IsolatedReservedCpu
  762. count[fmt.Sprintf("%s.storage.reserved.isolated", prefix)] = result.IsolatedReservedStorage
  763. count[fmt.Sprintf("%s.storage_gb", prefix)] = result.StorageSize / 1024
  764. return count
  765. }
  766. func GuestNormalUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, scope rbacscope.TRbacScope, cred mcclient.IIdentityProvider,
  767. rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
  768. brands []string, cloudEnv string, includeSystem bool, since *time.Time, policyResult rbacutils.SPolicyResult) Usage {
  769. return guestUsage(ctx, userToken, prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, nil, false, includeSystem, since, policyResult)
  770. }
  771. func ContainerNormalUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, scope rbacscope.TRbacScope, cred mcclient.IIdentityProvider,
  772. rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
  773. brands []string, cloudEnv string, includeSystem bool, since *time.Time, policyResult rbacutils.SPolicyResult) Usage {
  774. return containerUsage(ctx, userToken, prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, nil, false, includeSystem, since, policyResult)
  775. }
  776. func GuestPendingDeleteUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, scope rbacscope.TRbacScope, cred mcclient.IIdentityProvider,
  777. rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
  778. brands []string, cloudEnv string, includeSystem bool, since *time.Time, policyResult rbacutils.SPolicyResult) Usage {
  779. return guestUsage(ctx, userToken, prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, nil, true, includeSystem, since, policyResult)
  780. }
  781. func ContainerPendingDeleteUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, scope rbacscope.TRbacScope, cred mcclient.IIdentityProvider,
  782. rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
  783. brands []string, cloudEnv string, includeSystem bool, since *time.Time, policyResult rbacutils.SPolicyResult) Usage {
  784. return containerUsage(ctx, userToken, prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, nil, true, includeSystem, since, policyResult)
  785. }
  786. func GuestRunningUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, scope rbacscope.TRbacScope, cred mcclient.IIdentityProvider,
  787. rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
  788. brands []string, cloudEnv string, includeSystem bool,
  789. policyResult rbacutils.SPolicyResult,
  790. ) Usage {
  791. return guestUsage(ctx, userToken, prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, []string{api.VM_RUNNING}, false, includeSystem, nil, policyResult)
  792. }
  793. func ContainerRunningUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, scope rbacscope.TRbacScope, cred mcclient.IIdentityProvider,
  794. rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
  795. brands []string, cloudEnv string, includeSystem bool,
  796. policyResult rbacutils.SPolicyResult,
  797. ) Usage {
  798. return containerUsage(ctx, userToken, prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, []string{api.VM_RUNNING}, false, includeSystem, nil, policyResult)
  799. }
  800. func GuestReadyUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, scope rbacscope.TRbacScope, cred mcclient.IIdentityProvider,
  801. rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
  802. brands []string, cloudEnv string, includeSystem bool, policyResult rbacutils.SPolicyResult) Usage {
  803. return guestUsage(ctx, userToken, prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, []string{api.VM_READY}, false, includeSystem, nil, policyResult)
  804. }
  805. func ContainerReadyUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, scope rbacscope.TRbacScope, cred mcclient.IIdentityProvider,
  806. rangeObjs []db.IStandaloneModel, hostTypes []string, resourceTypes []string, providers []string,
  807. brands []string, cloudEnv string, includeSystem bool,
  808. policyResult rbacutils.SPolicyResult,
  809. ) Usage {
  810. return containerUsage(ctx, userToken, prefix, scope, cred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, []string{api.VM_READY}, false, includeSystem, nil, policyResult)
  811. }
  812. func guestHypervisorsUsage(
  813. ctx context.Context,
  814. userToken mcclient.TokenCredential,
  815. prefix string,
  816. scope rbacscope.TRbacScope,
  817. ownerId mcclient.IIdentityProvider,
  818. rangeObjs []db.IStandaloneModel,
  819. hostTypes []string, resourceTypes []string, providers []string, brands []string, cloudEnv string,
  820. status, hypervisors []string,
  821. pendingDelete, includeSystem bool,
  822. since *time.Time,
  823. policyResult rbacutils.SPolicyResult,
  824. ) Usage {
  825. count := make(map[string]interface{})
  826. results := db.UsagePolicyCheck(userToken, models.GuestManager, scope)
  827. log.Debugf("guestHypervisorsUsage origin %s", results.String())
  828. results = results.Merge(policyResult)
  829. if results.Result.IsDeny() {
  830. // deny
  831. return count
  832. }
  833. log.Debugf("guestHypervisorsUsage policyResults %s results %s", policyResult.String(), results.String())
  834. // temporarily hide system resources
  835. // XXX needs more work later
  836. guestCountStats := models.GuestManager.TotalCount(ctx, scope, ownerId, rangeObjs, status, hypervisors,
  837. includeSystem, pendingDelete, hostTypes, resourceTypes, providers, brands, cloudEnv, since,
  838. results,
  839. )
  840. originPrefix := prefix
  841. for arch, guest := range guestCountStats {
  842. prefix := originPrefix
  843. if arch != apis.OS_ARCH_ALL {
  844. prefix = fmt.Sprintf("%s.%s", originPrefix, arch)
  845. }
  846. count[prefix] = guest.TotalGuestCount
  847. count[fmt.Sprintf("%s.any_pool", prefix)] = guest.TotalGuestCount
  848. count[fmt.Sprintf("%s.cpu", prefix)] = guest.TotalCpuCount
  849. count[fmt.Sprintf("%s.memory", prefix)] = guest.TotalMemSize
  850. if len(hypervisors) == 1 && hypervisors[0] == api.HYPERVISOR_POD {
  851. continue
  852. }
  853. count[fmt.Sprintf("%s.disk", prefix)] = guest.TotalDiskSize
  854. count[fmt.Sprintf("%s.isolated_devices", prefix)] = guest.TotalIsolatedCount
  855. count[fmt.Sprintf("%s.ha", prefix)] = guest.TotalBackupGuestCount
  856. count[fmt.Sprintf("%s.ha.cpu", prefix)] = guest.TotalBackupCpuCount
  857. count[fmt.Sprintf("%s.ha.memory", prefix)] = guest.TotalBackupMemSize
  858. count[fmt.Sprintf("%s.ha.disk", prefix)] = guest.TotalBackupDiskSize
  859. }
  860. return count
  861. }
  862. func guestUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel,
  863. hostTypes []string, resourceTypes []string, providers []string, brands []string, cloudEnv string,
  864. status []string, pendingDelete, includeSystem bool, since *time.Time,
  865. policyResult rbacutils.SPolicyResult,
  866. ) Usage {
  867. hypervisors := sets.NewString(api.HYPERVISORS...)
  868. hypervisors.Delete(api.HYPERVISOR_POD, api.HYPERVISOR_BAREMETAL)
  869. return guestHypervisorsUsage(ctx, userToken, prefix, scope, userCred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, status, hypervisors.List(), pendingDelete, includeSystem, since, policyResult)
  870. }
  871. func containerUsage(ctx context.Context, userToken mcclient.TokenCredential, prefix string, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel,
  872. hostTypes []string, resourceTypes []string, providers []string, brands []string, cloudEnv string,
  873. status []string, pendingDelete, includeSystem bool, since *time.Time,
  874. policyResult rbacutils.SPolicyResult,
  875. ) Usage {
  876. hypervisors := sets.NewString(api.HYPERVISOR_POD)
  877. return guestHypervisorsUsage(ctx, userToken, prefix, scope, userCred, rangeObjs, hostTypes, resourceTypes, providers, brands, cloudEnv, status, hypervisors.List(), pendingDelete, includeSystem, since, policyResult)
  878. }
  879. func IsolatedDeviceUsage(ctx context.Context, userToken mcclient.TokenCredential, pref string, scope rbacscope.TRbacScope, userCred mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, hostType []string, resourceTypes []string, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  880. prefix := "isolated_devices"
  881. if len(pref) > 0 {
  882. prefix = fmt.Sprintf("%s.%s", prefix, pref)
  883. }
  884. count := make(map[string]interface{})
  885. results := db.UsagePolicyCheck(userToken, models.IsolatedDeviceManager, scope)
  886. results = results.Merge(policyResult)
  887. if results.Result.IsDeny() {
  888. return count
  889. }
  890. ret, _ := models.IsolatedDeviceManager.TotalCount(ctx, scope, userCred, hostType, resourceTypes, providers, brands, cloudEnv, rangeObjs, results)
  891. count[prefix] = ret.Devices
  892. count[prefix+".used"] = ret.DevicesUsed
  893. count[prefix+".gpu"] = ret.Gpus
  894. count[prefix+".gpu.used"] = ret.GpusUsed
  895. return count
  896. }
  897. func getSysKey(scope rbacscope.TRbacScope, key string) string {
  898. return _getKey(scope, key, true)
  899. }
  900. func getKey(scope rbacscope.TRbacScope, key string) string {
  901. return _getKey(scope, key, false)
  902. }
  903. func _getKey(scope rbacscope.TRbacScope, key string, includeSystem bool) string {
  904. switch scope {
  905. case rbacscope.ScopeProject:
  906. if includeSystem {
  907. if len(key) > 0 {
  908. return fmt.Sprintf("project.%s", key)
  909. } else {
  910. return "project"
  911. }
  912. } else {
  913. return key
  914. }
  915. case rbacscope.ScopeDomain:
  916. if len(key) > 0 {
  917. return fmt.Sprintf("domain.%s", key)
  918. } else {
  919. return "domain"
  920. }
  921. default:
  922. if includeSystem {
  923. return key
  924. } else {
  925. if len(key) > 0 {
  926. return fmt.Sprintf("all.%s", key)
  927. } else {
  928. return "all"
  929. }
  930. }
  931. }
  932. }
  933. func EipUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  934. count := make(map[string]interface{})
  935. results := db.UsagePolicyCheck(userToken, models.ElasticipManager, scope)
  936. results = results.Merge(policyResult)
  937. if results.Result.IsDeny() {
  938. // deny
  939. return count
  940. }
  941. eipUsage := models.ElasticipManager.TotalCount(ctx, scope, ownerId, rangeObjs, providers, brands, cloudEnv, results)
  942. count[getKey(scope, "eip")] = eipUsage.Total()
  943. count[getKey(scope, "eip.public_ip")] = eipUsage.PublicIPCount
  944. count[getKey(scope, "eip.public_ip.bandwidth.mb")] = eipUsage.PublicIpBandwidth
  945. count[getKey(scope, "eip.floating_ip")] = eipUsage.EIPCount
  946. count[getKey(scope, "eip.floating_ip.bandwidth.mb")] = eipUsage.EipBandwidth
  947. count[getKey(scope, "eip.floating_ip")] = eipUsage.EIPCount
  948. count[getKey(scope, "eip.floating_ip.used")] = eipUsage.EIPUsedCount
  949. count[getKey(scope, "eip.used")] = eipUsage.EIPUsedCount + eipUsage.PublicIPCount
  950. return count
  951. }
  952. func BucketUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  953. count := make(map[string]interface{})
  954. results := db.UsagePolicyCheck(userToken, models.BucketManager, scope)
  955. results = results.Merge(policyResult)
  956. if results.Result.IsDeny() {
  957. // deny
  958. return count
  959. }
  960. bucketUsage := models.BucketManager.TotalCount(ctx, scope, ownerId, rangeObjs, providers, brands, cloudEnv, results)
  961. count[getKey(scope, "buckets")] = bucketUsage.Buckets
  962. count[getKey(scope, "bucket_objects")] = bucketUsage.Objects
  963. count[getKey(scope, "bucket_bytes")] = bucketUsage.Bytes
  964. count[getKey(scope, "bucket_bytes_limit")] = bucketUsage.BytesLimit
  965. count[getKey(scope, "bucket_disk_used_rate")] = bucketUsage.DiskUsedRate
  966. return count
  967. }
  968. func SnapshotUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  969. count := make(map[string]interface{})
  970. results := db.UsagePolicyCheck(userToken, models.SnapshotManager, scope)
  971. results = results.Merge(policyResult)
  972. if results.Result.IsDeny() {
  973. // deny
  974. return count
  975. }
  976. cnt, _ := models.TotalSnapshotCount(ctx, scope, ownerId, rangeObjs, providers, brands, cloudEnv, results)
  977. count[getKey(scope, "snapshot")] = cnt
  978. return count
  979. }
  980. func InstanceSnapshotUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  981. count := make(map[string]interface{})
  982. results := db.UsagePolicyCheck(userToken, models.InstanceSnapshotManager, scope)
  983. results = results.Merge(policyResult)
  984. if results.Result.IsDeny() {
  985. // deny
  986. return count
  987. }
  988. cnt, _ := models.TotalInstanceSnapshotCount(ctx, scope, ownerId, rangeObjs, providers, brands, cloudEnv, results)
  989. count[getKey(scope, "instance_snapshot")] = cnt
  990. return count
  991. }
  992. func LoadbalancerUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  993. count := make(map[string]interface{})
  994. results := db.UsagePolicyCheck(userToken, models.LoadbalancerManager, scope)
  995. results = results.Merge(policyResult)
  996. if results.Result.IsDeny() {
  997. // deny
  998. return count
  999. }
  1000. cnt, _ := models.LoadbalancerManager.TotalCount(ctx, scope, ownerId, rangeObjs, providers, brands, cloudEnv, results)
  1001. count[getKey(scope, "loadbalancer")] = cnt
  1002. return count
  1003. }
  1004. func DBInstanceUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  1005. count := make(map[string]interface{})
  1006. results := db.UsagePolicyCheck(userToken, models.DBInstanceManager, scope)
  1007. results = results.Merge(policyResult)
  1008. if results.Result.IsDeny() {
  1009. // deny
  1010. return count
  1011. }
  1012. cnt, _ := models.DBInstanceManager.TotalCount(ctx, scope, ownerId, rangeObjs, providers, brands, cloudEnv, results)
  1013. count[getKey(scope, "rds")] = cnt.TotalRdsCount
  1014. count[getKey(scope, "rds.cpu")] = cnt.TotalCpuCount
  1015. count[getKey(scope, "rds.memory")] = cnt.TotalMemSizeMb
  1016. count[getKey(scope, "rds.disk_size_gb")] = cnt.TotalDiskSizeGb
  1017. count[getKey(scope, "rds.disk_size_used_mb")] = cnt.TotalDiskSizeUsedMb
  1018. count[getKey(scope, "rds.disk_size_used_rate")] = cnt.DiskUsedRate
  1019. return count
  1020. }
  1021. func MongoDBUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  1022. count := make(map[string]interface{})
  1023. results := db.UsagePolicyCheck(userToken, models.MongoDBManager, scope)
  1024. results = results.Merge(policyResult)
  1025. if results.Result.IsDeny() {
  1026. // deny
  1027. return count
  1028. }
  1029. cnt, _ := models.MongoDBManager.TotalCount(ctx, scope, ownerId, rangeObjs, providers, brands, cloudEnv, results)
  1030. count[getKey(scope, "mongodb")] = cnt.TotalMongodbCount
  1031. count[getKey(scope, "mongodb.cpu")] = cnt.TotalCpuCount
  1032. count[getKey(scope, "mongodb.memory")] = cnt.TotalMemSizeMb
  1033. return count
  1034. }
  1035. func ElasticSearchUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  1036. count := make(map[string]interface{})
  1037. results := db.UsagePolicyCheck(userToken, models.ElasticSearchManager, scope)
  1038. results = results.Merge(policyResult)
  1039. if results.Result.IsDeny() {
  1040. // deny
  1041. return count
  1042. }
  1043. cnt, _ := models.ElasticSearchManager.TotalCount(ctx, scope, ownerId, rangeObjs, providers, brands, cloudEnv, results)
  1044. count[getKey(scope, "es")] = cnt.TotalEsCount
  1045. count[getKey(scope, "es.cpu")] = cnt.TotalCpuCount
  1046. count[getKey(scope, "es.memory")] = cnt.TotalMemSizeGb * 1024
  1047. return count
  1048. }
  1049. func KafkaUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  1050. count := make(map[string]interface{})
  1051. results := db.UsagePolicyCheck(userToken, models.KafkaManager, scope)
  1052. results = results.Merge(policyResult)
  1053. if results.Result.IsDeny() {
  1054. // deny
  1055. return count
  1056. }
  1057. cnt, _ := models.KafkaManager.TotalCount(ctx, scope, ownerId, rangeObjs, providers, brands, cloudEnv, results)
  1058. count[getKey(scope, "kafka")] = cnt.TotalKafkaCount
  1059. count[getKey(scope, "kafka.disk")] = cnt.TotalDiskSizeGb
  1060. return count
  1061. }
  1062. func ElasticCacheUsage(ctx context.Context, userToken mcclient.TokenCredential, scope rbacscope.TRbacScope, ownerId mcclient.IIdentityProvider, rangeObjs []db.IStandaloneModel, providers []string, brands []string, cloudEnv string, policyResult rbacutils.SPolicyResult) Usage {
  1063. count := make(map[string]interface{})
  1064. results := db.UsagePolicyCheck(userToken, models.ElasticcacheManager, scope)
  1065. results = results.Merge(policyResult)
  1066. if results.Result.IsDeny() {
  1067. // deny
  1068. return count
  1069. }
  1070. cnt, _ := models.ElasticcacheManager.TotalCount(ctx, scope, ownerId, rangeObjs, providers, brands, cloudEnv, results)
  1071. count[getKey(scope, "cache")] = cnt
  1072. return count
  1073. }