dbinstance_secgroups.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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. "gopkg.in/fatih/set.v0"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/log"
  20. "yunion.io/x/pkg/errors"
  21. "yunion.io/x/pkg/util/compare"
  22. "yunion.io/x/sqlchemy"
  23. api "yunion.io/x/onecloud/pkg/apis/compute"
  24. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  25. "yunion.io/x/onecloud/pkg/httperrors"
  26. "yunion.io/x/onecloud/pkg/mcclient"
  27. "yunion.io/x/onecloud/pkg/util/stringutils2"
  28. )
  29. // +onecloud:swagger-gen-ignore
  30. type SDBInstanceSecgroupManager struct {
  31. SDBInstanceJointsManager
  32. SSecurityGroupResourceBaseManager
  33. }
  34. var DBInstanceSecgroupManager *SDBInstanceSecgroupManager
  35. func init() {
  36. db.InitManager(func() {
  37. DBInstanceSecgroupManager = &SDBInstanceSecgroupManager{
  38. SDBInstanceJointsManager: NewDBInstanceJointsManager(
  39. SDBInstanceSecgroup{},
  40. "dbinstance_secgroups_tbl",
  41. "dbinstance_secgroup",
  42. "dbinstance_secgroups",
  43. SecurityGroupManager,
  44. ),
  45. }
  46. DBInstanceSecgroupManager.SetVirtualObject(DBInstanceSecgroupManager)
  47. })
  48. }
  49. // +onecloud:swagger-gen-ignore
  50. type SDBInstanceSecgroup struct {
  51. SDBInstanceJointsBase
  52. SSecurityGroupResourceBase `width:"36" charset:"ascii" nullable:"false" list:"user" create:"required"`
  53. }
  54. func (manager *SDBInstanceSecgroupManager) GetSlaveFieldName() string {
  55. return "secgroup_id"
  56. }
  57. func (self *SDBInstanceSecgroup) Detach(ctx context.Context, userCred mcclient.TokenCredential) error {
  58. return db.DeleteModel(ctx, userCred, self)
  59. }
  60. func (manager *SDBInstanceSecgroupManager) ListItemFilter(
  61. ctx context.Context,
  62. q *sqlchemy.SQuery,
  63. userCred mcclient.TokenCredential,
  64. query api.DBInstanceSecgroupListInput,
  65. ) (*sqlchemy.SQuery, error) {
  66. var err error
  67. q, err = manager.SDBInstanceJointsManager.ListItemFilter(ctx, q, userCred, query.DBInstanceJoinListInput)
  68. if err != nil {
  69. return nil, errors.Wrap(err, "SDBInstanceJointsManager.ListItemFilter")
  70. }
  71. q, err = manager.SSecurityGroupResourceBaseManager.ListItemFilter(ctx, q, userCred, query.SecgroupFilterListInput)
  72. if err != nil {
  73. return nil, errors.Wrap(err, "SSecurityGroupResourceBaseManager.ListItemFilter")
  74. }
  75. return q, nil
  76. }
  77. func (manager *SDBInstanceSecgroupManager) OrderByExtraFields(
  78. ctx context.Context,
  79. q *sqlchemy.SQuery,
  80. userCred mcclient.TokenCredential,
  81. query api.DBInstanceSecgroupListInput,
  82. ) (*sqlchemy.SQuery, error) {
  83. var err error
  84. q, err = manager.SDBInstanceJointsManager.OrderByExtraFields(ctx, q, userCred, query.DBInstanceJoinListInput)
  85. if err != nil {
  86. return nil, errors.Wrap(err, "SDBInstanceJointsManager.OrderByExtraFields")
  87. }
  88. q, err = manager.SSecurityGroupResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.SecgroupFilterListInput)
  89. if err != nil {
  90. return nil, errors.Wrap(err, "SSecurityGroupResourceBaseManager.OrderByExtraFields")
  91. }
  92. return q, nil
  93. }
  94. func (manager *SDBInstanceSecgroupManager) ListItemExportKeys(ctx context.Context,
  95. q *sqlchemy.SQuery,
  96. userCred mcclient.TokenCredential,
  97. keys stringutils2.SSortedStrings,
  98. ) (*sqlchemy.SQuery, error) {
  99. var err error
  100. q, err = manager.SVirtualJointResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
  101. if err != nil {
  102. return nil, errors.Wrap(err, "SVirtualJointResourceBaseManager.ListItemExportKeys")
  103. }
  104. if keys.ContainsAny(manager.SSecurityGroupResourceBaseManager.GetExportKeys()...) {
  105. q, err = manager.SSecurityGroupResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
  106. if err != nil {
  107. return nil, errors.Wrap(err, "SSecurityGroupResourceBaseManager.ListItemExportKeys")
  108. }
  109. }
  110. return q, nil
  111. }
  112. func (manager *SDBInstanceSecgroupManager) FetchCustomizeColumns(
  113. ctx context.Context,
  114. userCred mcclient.TokenCredential,
  115. query jsonutils.JSONObject,
  116. objs []interface{},
  117. fields stringutils2.SSortedStrings,
  118. isList bool,
  119. ) []api.DBInstanceSecgroupDetails {
  120. rows := make([]api.DBInstanceSecgroupDetails, len(objs))
  121. vjRows := manager.SVirtualJointResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  122. secgrpIds := make([]string, len(rows))
  123. rdsIds := make([]string, len(rows))
  124. for i := range rows {
  125. rows[i].VirtualJointResourceBaseDetails = vjRows[i]
  126. rdsSec := objs[i].(*SDBInstanceSecgroup)
  127. secgrpIds[i], rdsIds[i] = rdsSec.SecgroupId, rdsSec.DBInstanceId
  128. }
  129. secMaps, err := db.FetchIdNameMap2(SecurityGroupManager, secgrpIds)
  130. if err != nil {
  131. log.Errorf("FetchIdNameMap2 for SecurityGroupManager fail %s", err)
  132. return rows
  133. }
  134. rdsMaps, err := db.FetchIdNameMap2(DBInstanceManager, rdsIds)
  135. if err != nil {
  136. log.Errorf("FetchIdNameMap2 for DBInstanceManager fail %s", err)
  137. return rows
  138. }
  139. for i := range rows {
  140. rows[i].Secgroup, _ = secMaps[secgrpIds[i]]
  141. rows[i].DBInstance, _ = rdsMaps[rdsIds[i]]
  142. }
  143. return rows
  144. }
  145. func (manager *SDBInstanceSecgroupManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
  146. var err error
  147. q, err = manager.SVirtualJointResourceBaseManager.QueryDistinctExtraField(q, field)
  148. if err == nil {
  149. return q, nil
  150. }
  151. return q, httperrors.ErrNotFound
  152. }
  153. func (manager *SDBInstanceSecgroupManager) SyncDBInstanceSecgroups(ctx context.Context, userCred mcclient.TokenCredential, rds *SDBInstance, extIds []string) compare.SyncResult {
  154. result := compare.SyncResult{}
  155. secgroups, err := rds.GetSecgroups()
  156. if err != nil {
  157. result.Error(err)
  158. return result
  159. }
  160. extSecgroups, err := rds.getSecgroupsByExternalIds(extIds)
  161. if err != nil {
  162. result.Error(err)
  163. return result
  164. }
  165. localSet := set.New(set.ThreadSafe)
  166. for i := range secgroups {
  167. localSet.Add(secgroups[i].Id)
  168. }
  169. remoteSet := set.New(set.ThreadSafe)
  170. for i := range extSecgroups {
  171. remoteSet.Add(extSecgroups[i].Id)
  172. }
  173. for _, del := range set.Difference(localSet, remoteSet).List() {
  174. err = rds.RevokeSecgroup(ctx, userCred, del.(string))
  175. if err != nil {
  176. result.DeleteError(err)
  177. continue
  178. }
  179. result.Delete()
  180. }
  181. for _, add := range set.Difference(remoteSet, localSet).List() {
  182. err = rds.AssignSecgroup(ctx, userCred, add.(string))
  183. if err != nil {
  184. result.AddError(err)
  185. continue
  186. }
  187. result.Add()
  188. }
  189. return result
  190. }