policy_assignment.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. "fmt"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/pkg/errors"
  20. "yunion.io/x/sqlchemy"
  21. api "yunion.io/x/onecloud/pkg/apis/compute"
  22. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  23. "yunion.io/x/onecloud/pkg/httperrors"
  24. "yunion.io/x/onecloud/pkg/mcclient"
  25. "yunion.io/x/onecloud/pkg/util/stringutils2"
  26. )
  27. type SPolicyAssignmentManager struct {
  28. db.SDomainLevelResourceBaseManager
  29. SPolicyDefinitionResourceBaseManager
  30. }
  31. var PolicyAssignmentManager *SPolicyAssignmentManager
  32. func init() {
  33. PolicyAssignmentManager = &SPolicyAssignmentManager{
  34. SDomainLevelResourceBaseManager: db.NewDomainLevelResourceBaseManager(
  35. SPolicyAssignment{},
  36. "policy_assignments_tbl",
  37. "policy_assignment",
  38. "policy_assignments",
  39. ),
  40. }
  41. PolicyAssignmentManager.SetVirtualObject(PolicyAssignmentManager)
  42. }
  43. type SPolicyAssignment struct {
  44. db.SDomainLevelResourceBase
  45. SPolicyDefinitionResourceBase
  46. }
  47. // 策略分配列表
  48. func (manager *SPolicyAssignmentManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.PolicyAssignmentListInput) (*sqlchemy.SQuery, error) {
  49. var err error
  50. q, err = manager.SDomainLevelResourceBaseManager.ListItemFilter(ctx, q, userCred, query.DomainLevelResourceListInput)
  51. if err != nil {
  52. return nil, err
  53. }
  54. q, err = manager.SPolicyDefinitionResourceBaseManager.ListItemFilter(ctx, q, userCred, query.PolicyDefinitionResourceListInput)
  55. if err != nil {
  56. return nil, err
  57. }
  58. return q, nil
  59. }
  60. func (manager *SPolicyAssignmentManager) FetchCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, objs []interface{}, fields stringutils2.SSortedStrings, isList bool) []api.PolicyAssignmentDetails {
  61. rows := make([]api.PolicyAssignmentDetails, len(objs))
  62. domainRows := manager.SDomainLevelResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  63. definitionRows := manager.SPolicyDefinitionResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  64. for i := range rows {
  65. rows[i] = api.PolicyAssignmentDetails{
  66. DomainLevelResourceDetails: domainRows[i],
  67. PolicyDefinitionResourceInfo: definitionRows[i],
  68. }
  69. }
  70. return rows
  71. }
  72. func (manager *SPolicyAssignmentManager) OrderByExtraFields(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.PolicyAssignmentListInput) (*sqlchemy.SQuery, error) {
  73. q, err := manager.SStandaloneResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.StandaloneResourceListInput)
  74. if err != nil {
  75. return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.OrderByExtraFields")
  76. }
  77. return q, nil
  78. }
  79. func (manager *SPolicyAssignmentManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input api.PolicyAssignmentCreateInput) (api.PolicyAssignmentCreateInput, error) {
  80. return input, httperrors.NewInputParameterError("not support create")
  81. }
  82. func (manager *SPolicyAssignmentManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
  83. var err error
  84. q, err = manager.SDomainLevelResourceBaseManager.QueryDistinctExtraField(q, field)
  85. if err == nil {
  86. return q, nil
  87. }
  88. return q, httperrors.ErrNotFound
  89. }
  90. func (manager *SPolicyAssignmentManager) checkAndSetAssignment(ctx context.Context, definition *SPolicyDefinition, domainId string) error {
  91. q := manager.Query().Equals("policydefinition_id", definition.Id).Equals("domain_id", domainId)
  92. count, err := q.CountWithError()
  93. if err != nil {
  94. return errors.Wrap(err, "CountWithError")
  95. }
  96. if count == 0 {
  97. return manager.newAssignment(ctx, definition, domainId)
  98. }
  99. return nil
  100. }
  101. func (manager *SPolicyAssignmentManager) newAssignment(ctx context.Context, definition *SPolicyDefinition, domainId string) error {
  102. assignment := SPolicyAssignment{}
  103. assignment.SetModelManager(manager, &assignment)
  104. assignment.Name = fmt.Sprintf("assignment for %s domain %s", definition.Name, domainId)
  105. assignment.DomainId = domainId
  106. assignment.PolicydefinitionId = definition.Id
  107. return manager.TableSpec().Insert(ctx, &assignment)
  108. }