usages.go 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 models
  15. import (
  16. "context"
  17. "yunion.io/x/sqlchemy"
  18. api "yunion.io/x/onecloud/pkg/apis/identity"
  19. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  20. "yunion.io/x/onecloud/pkg/util/rbacutils"
  21. "yunion.io/x/onecloud/pkg/util/tagutils"
  22. )
  23. func Usage(ctx context.Context, result rbacutils.SPolicyResult) map[string]int {
  24. results := make(map[string]int)
  25. dq := DomainManager.Query()
  26. dq = db.ObjectIdQueryWithPolicyResult(ctx, dq, DomainManager, result)
  27. domCnt, _ := dq.IsTrue("is_domain").NotEquals("id", api.KeystoneDomainRoot).CountWithError()
  28. results["domains"] = domCnt
  29. pq := ProjectManager.Query()
  30. pq = db.ObjectIdQueryWithPolicyResult(ctx, pq, ProjectManager, result)
  31. // 根据项目标签过滤
  32. if result.ProjectTags.Len() > 0 {
  33. tagFilters := tagutils.STagFilters{}
  34. tagFilters.AddFilters(result.ProjectTags)
  35. orConditions := []sqlchemy.ICondition{}
  36. metadataResSQ := db.Metadata.Query().Equals("obj_type", "project").SubQuery()
  37. for _, filter := range tagFilters.Filters {
  38. for key, val := range filter {
  39. orConditions = append(orConditions,
  40. sqlchemy.AND(
  41. sqlchemy.Equals(metadataResSQ.Field("key"), key),
  42. sqlchemy.In(metadataResSQ.Field("value"), val),
  43. ),
  44. )
  45. }
  46. }
  47. metadataResQ := metadataResSQ.Query().AppendField(sqlchemy.COUNT("count", metadataResSQ.Field("obj_id")), metadataResSQ.Field("obj_id"), metadataResSQ.Field("key"), metadataResSQ.Field("value"))
  48. metadataResSQ = metadataResQ.Filter(sqlchemy.OR(orConditions...)).GroupBy("obj_id").SubQuery()
  49. metadataResSecSQ := metadataResSQ.Query().GE("count", len(orConditions)).SubQuery()
  50. pq = pq.Join(metadataResSecSQ, sqlchemy.Equals(pq.Field("id"), metadataResSecSQ.Field("obj_id")))
  51. }
  52. projCnt, _ := pq.IsFalse("is_domain").CountWithError()
  53. results["projects"] = projCnt
  54. rq := RoleManager.Query()
  55. rq = db.ObjectIdQueryWithPolicyResult(ctx, rq, RoleManager, result)
  56. roleCnt, _ := rq.CountWithError()
  57. results["roles"] = roleCnt
  58. uq := UserManager.Query()
  59. uq = db.ObjectIdQueryWithPolicyResult(ctx, uq, UserManager, result)
  60. usrCnt, _ := uq.CountWithError()
  61. results["users"] = usrCnt
  62. gq := GroupManager.Query()
  63. gq = db.ObjectIdQueryWithPolicyResult(ctx, gq, GroupManager, result)
  64. grpCnt, _ := gq.CountWithError()
  65. results["groups"] = grpCnt
  66. pcq := PolicyManager.Query()
  67. pcq = db.ObjectIdQueryWithPolicyResult(ctx, pcq, PolicyManager, result)
  68. policy, _ := pcq.CountWithError()
  69. results["policies"] = policy
  70. return results
  71. }