adminsharablevirtual.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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 db
  15. import (
  16. "context"
  17. "strings"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/pkg/errors"
  20. "yunion.io/x/pkg/utils"
  21. "yunion.io/x/sqlchemy"
  22. "yunion.io/x/onecloud/pkg/apis"
  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 SAdminSharableVirtualResourceBase struct {
  28. SSharableVirtualResourceBase
  29. Records string `charset:"utf8" list:"user" create:"optional" update:"user"`
  30. }
  31. type SAdminSharableVirtualResourceBaseManager struct {
  32. SSharableVirtualResourceBaseManager
  33. RecordsSeparator string
  34. RecordsLimit int
  35. }
  36. func NewAdminSharableVirtualResourceBaseManager(dt interface{}, tableName string, keyword string, keywordPlural string) SAdminSharableVirtualResourceBaseManager {
  37. manager := SAdminSharableVirtualResourceBaseManager{SSharableVirtualResourceBaseManager: NewSharableVirtualResourceBaseManager(dt, tableName, keyword, keywordPlural)}
  38. manager.RecordsSeparator = ";"
  39. manager.RecordsLimit = 0
  40. return manager
  41. }
  42. func (manager *SAdminSharableVirtualResourceBaseManager) GetIAdminSharableVirtualModelManager() IAdminSharableVirtualModelManager {
  43. return manager.GetVirtualObject().(IAdminSharableVirtualModelManager)
  44. }
  45. func (manager *SAdminSharableVirtualResourceBaseManager) ValidateCreateData(
  46. ctx context.Context,
  47. userCred mcclient.TokenCredential,
  48. ownerId mcclient.IIdentityProvider,
  49. query jsonutils.JSONObject,
  50. input apis.AdminSharableVirtualResourceBaseCreateInput,
  51. ) (apis.AdminSharableVirtualResourceBaseCreateInput, error) {
  52. var err error
  53. input.SharableVirtualResourceCreateInput, err = manager.SSharableVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.SharableVirtualResourceCreateInput)
  54. if err != nil {
  55. return input, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ValidateCreateData")
  56. }
  57. return input, nil
  58. }
  59. func (manager *SAdminSharableVirtualResourceBaseManager) ValidateRecordsData(man IAdminSharableVirtualModelManager, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
  60. records, err := man.ParseInputInfo(data)
  61. if err != nil {
  62. return nil, err
  63. }
  64. data.Add(jsonutils.NewString(strings.Join(records, man.GetRecordsSeparator())), "records")
  65. return data, nil
  66. }
  67. func (model *SAdminSharableVirtualResourceBase) SetInfo(
  68. ctx context.Context,
  69. userCred mcclient.TokenCredential,
  70. man IAdminSharableVirtualModelManager,
  71. obj IAdminSharableVirtualModel,
  72. data *jsonutils.JSONDict,
  73. ) error {
  74. records, err := man.ParseInputInfo(data)
  75. if err != nil {
  76. return err
  77. }
  78. oldRecs := obj.GetInfo()
  79. isChanged := false
  80. if len(records) != len(oldRecs) {
  81. isChanged = true
  82. } else {
  83. for _, rec := range records {
  84. if !utils.IsInStringArray(rec, oldRecs) {
  85. isChanged = true
  86. break
  87. }
  88. }
  89. }
  90. if isChanged {
  91. return model.setInfo(ctx, userCred, man, records)
  92. }
  93. return nil
  94. }
  95. func (model *SAdminSharableVirtualResourceBase) AddInfo(
  96. ctx context.Context,
  97. userCred mcclient.TokenCredential,
  98. man IAdminSharableVirtualModelManager,
  99. obj IAdminSharableVirtualModel,
  100. data jsonutils.JSONObject,
  101. ) error {
  102. records, err := man.ParseInputInfo(data.(*jsonutils.JSONDict))
  103. if err != nil {
  104. return err
  105. }
  106. oldRecs := obj.GetInfo()
  107. adds := []string{}
  108. for _, r := range records {
  109. if !utils.IsInStringArray(r, oldRecs) {
  110. oldRecs = append(oldRecs, r)
  111. adds = append(adds, r)
  112. }
  113. }
  114. if len(adds) > 0 {
  115. return model.setInfo(ctx, userCred, man, oldRecs)
  116. }
  117. return nil
  118. }
  119. func (model *SAdminSharableVirtualResourceBase) RemoveInfo(
  120. ctx context.Context,
  121. userCred mcclient.TokenCredential,
  122. man IAdminSharableVirtualModelManager,
  123. obj IAdminSharableVirtualModel,
  124. data jsonutils.JSONObject,
  125. allowEmpty bool,
  126. ) error {
  127. records, err := man.ParseInputInfo(data.(*jsonutils.JSONDict))
  128. if err != nil {
  129. return err
  130. }
  131. oldRecs := obj.GetInfo()
  132. removes := []string{}
  133. for _, rec := range records {
  134. if ok, idx := utils.InStringArray(rec, oldRecs); ok {
  135. oldRecs = append(oldRecs[:idx], oldRecs[idx+1:]...) // remove record
  136. removes = append(removes, rec)
  137. }
  138. }
  139. if len(oldRecs) == 0 && !allowEmpty {
  140. return httperrors.NewNotAcceptableError("Not allow empty records")
  141. }
  142. if len(removes) > 0 {
  143. return model.setInfo(ctx, userCred, man, oldRecs)
  144. }
  145. return nil
  146. }
  147. func (model *SAdminSharableVirtualResourceBase) setInfo(ctx context.Context,
  148. userCred mcclient.TokenCredential,
  149. man IAdminSharableVirtualModelManager,
  150. records []string,
  151. ) error {
  152. if man.GetRecordsLimit() > 0 && len(records) > man.GetRecordsLimit() {
  153. return httperrors.NewNotAcceptableError("Records limit exceeded.")
  154. }
  155. diff, err := Update(model, func() error {
  156. model.Records = strings.Join(records, man.GetRecordsSeparator())
  157. return nil
  158. })
  159. if err != nil {
  160. return err
  161. }
  162. OpsLog.LogEvent(model, ACT_UPDATE, diff, userCred)
  163. return err
  164. }
  165. func (model *SAdminSharableVirtualResourceBase) GetIAdminSharableVirtualModel() IAdminSharableVirtualModel {
  166. return model.GetVirtualObject().(IAdminSharableVirtualModel)
  167. }
  168. func (manager *SAdminSharableVirtualResourceBaseManager) ListItemFilter(
  169. ctx context.Context,
  170. q *sqlchemy.SQuery,
  171. userCred mcclient.TokenCredential,
  172. input apis.AdminSharableVirtualResourceListInput,
  173. ) (*sqlchemy.SQuery, error) {
  174. q, err := manager.SSharableVirtualResourceBaseManager.ListItemFilter(ctx, q, userCred, input.SharableVirtualResourceListInput)
  175. if err != nil {
  176. return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ListItemFilter")
  177. }
  178. return q, nil
  179. }
  180. func (manager *SAdminSharableVirtualResourceBaseManager) QueryDistinctExtraFields(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
  181. q, err := manager.SSharableVirtualResourceBaseManager.QueryDistinctExtraField(q, field)
  182. if err == nil {
  183. return q, nil
  184. }
  185. return q, httperrors.ErrNotFound
  186. }
  187. func (manager *SAdminSharableVirtualResourceBaseManager) OrderByExtraFields(
  188. ctx context.Context,
  189. q *sqlchemy.SQuery,
  190. userCred mcclient.TokenCredential,
  191. input apis.AdminSharableVirtualResourceListInput,
  192. ) (*sqlchemy.SQuery, error) {
  193. q, err := manager.SSharableVirtualResourceBaseManager.OrderByExtraFields(ctx, q, userCred, input.SharableVirtualResourceListInput)
  194. if err != nil {
  195. return nil, errors.Wrap(err, "SSharableVirtualResourceBaseManager.OrderByExtraFields")
  196. }
  197. return q, nil
  198. }
  199. func (manager *SAdminSharableVirtualResourceBaseManager) FetchCustomizeColumns(
  200. ctx context.Context,
  201. userCred mcclient.TokenCredential,
  202. query jsonutils.JSONObject,
  203. objs []interface{},
  204. fields stringutils2.SSortedStrings,
  205. isList bool,
  206. ) []apis.AdminSharableVirtualResourceDetails {
  207. rows := make([]apis.AdminSharableVirtualResourceDetails, len(objs))
  208. virtRows := manager.SSharableVirtualResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  209. for i := range rows {
  210. rows[i] = apis.AdminSharableVirtualResourceDetails{
  211. SharableVirtualResourceDetails: virtRows[i],
  212. }
  213. }
  214. return rows
  215. }
  216. func (model *SAdminSharableVirtualResourceBase) ValidateUpdateData(
  217. ctx context.Context,
  218. userCred mcclient.TokenCredential,
  219. query jsonutils.JSONObject,
  220. input apis.AdminSharableVirtualResourceBaseUpdateInput,
  221. ) (apis.AdminSharableVirtualResourceBaseUpdateInput, error) {
  222. var err error
  223. input.SharableVirtualResourceBaseUpdateInput, err = model.SSharableVirtualResourceBase.ValidateUpdateData(ctx, userCred, query, input.SharableVirtualResourceBaseUpdateInput)
  224. if err != nil {
  225. return input, errors.Wrap(err, "SSharableVirtualResourceBase.ValidateUpdateData")
  226. }
  227. return input, nil
  228. }