statusstandalone.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. "yunion.io/x/jsonutils"
  18. "yunion.io/x/pkg/errors"
  19. "yunion.io/x/sqlchemy"
  20. "yunion.io/x/onecloud/pkg/apis"
  21. "yunion.io/x/onecloud/pkg/cloudcommon/policy"
  22. "yunion.io/x/onecloud/pkg/httperrors"
  23. "yunion.io/x/onecloud/pkg/mcclient"
  24. "yunion.io/x/onecloud/pkg/util/stringutils2"
  25. )
  26. type SStatusStandaloneResourceBase struct {
  27. SStandaloneResourceBase
  28. SStatusResourceBase
  29. }
  30. type SStatusStandaloneResourceBaseManager struct {
  31. SStandaloneResourceBaseManager
  32. SStatusResourceBaseManager
  33. }
  34. func NewStatusStandaloneResourceBaseManager(dt interface{}, tableName string, keyword string, keywordPlural string) SStatusStandaloneResourceBaseManager {
  35. return SStatusStandaloneResourceBaseManager{
  36. SStandaloneResourceBaseManager: NewStandaloneResourceBaseManager(dt, tableName, keyword, keywordPlural),
  37. }
  38. }
  39. func (self *SStatusStandaloneResourceBase) GetIStatusStandaloneModel() IStatusStandaloneModel {
  40. return self.GetVirtualObject().(IStatusStandaloneModel)
  41. }
  42. // +onecloud:swagger-gen-ignore
  43. func (manager *SStatusStandaloneResourceBaseManager) GetPropertyStatistics(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*apis.StatusStatistic, error) {
  44. im, ok := manager.GetVirtualObject().(IModelManager)
  45. if !ok {
  46. im = manager
  47. }
  48. var err error
  49. q := manager.Query()
  50. q, err = ListItemQueryFilters(im, ctx, q, userCred, query, policy.PolicyActionList)
  51. if err != nil {
  52. return nil, err
  53. }
  54. sq := q.SubQuery()
  55. statQ := sq.Query(sq.Field("status"), sqlchemy.COUNT("total_count", sq.Field("id")))
  56. statQ = statQ.GroupBy(sq.Field("status"))
  57. ret := []struct {
  58. Status string
  59. TotalCount int64
  60. }{}
  61. err = statQ.All(&ret)
  62. if err != nil {
  63. return nil, errors.Wrapf(err, "q.All")
  64. }
  65. result := &apis.StatusStatistic{
  66. StatusInfo: []apis.StatusStatisticStatusInfo{},
  67. }
  68. for _, s := range ret {
  69. result.StatusInfo = append(result.StatusInfo, apis.StatusStatisticStatusInfo{
  70. Status: s.Status,
  71. TotalCount: s.TotalCount,
  72. })
  73. }
  74. return result, nil
  75. }
  76. // +onecloud:swagger-gen-ignore
  77. func (self *SStatusStandaloneResourceBase) PerformStatus(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input apis.PerformStatusInput) (jsonutils.JSONObject, error) {
  78. err := StatusBasePerformStatus(ctx, self.GetIStatusStandaloneModel(), userCred, input)
  79. if err != nil {
  80. return nil, errors.Wrap(err, "StatusBasePerformStatus")
  81. }
  82. return nil, nil
  83. }
  84. func (model *SStatusStandaloneResourceBase) SetStatusWithOtherUpdates(ctx context.Context, userCred mcclient.TokenCredential, status string, reason string, otherUpdates func()) error {
  85. return statusBaseSetStatus(ctx, model.GetIStatusStandaloneModel(), userCred, status, reason, otherUpdates)
  86. }
  87. func (model *SStatusStandaloneResourceBase) SetStatus(ctx context.Context, userCred mcclient.TokenCredential, status string, reason string) error {
  88. return statusBaseSetStatus(ctx, model.GetIStatusStandaloneModel(), userCred, status, reason, nil)
  89. }
  90. func (model *SStatusStandaloneResourceBase) SetProgress(progress float32) error {
  91. return statusBaseSetProgress(model.GetIStatusStandaloneModel(), progress)
  92. }
  93. func (manager *SStatusStandaloneResourceBaseManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, input apis.StatusStandaloneResourceCreateInput) (apis.StatusStandaloneResourceCreateInput, error) {
  94. var err error
  95. input.StandaloneResourceCreateInput, err = manager.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.StandaloneResourceCreateInput)
  96. if err != nil {
  97. return input, errors.Wrap(err, "SStandaloneResourceBaseManager.ValidateCreateData")
  98. }
  99. return input, nil
  100. }
  101. func (manager *SStatusStandaloneResourceBaseManager) ListItemFilter(
  102. ctx context.Context,
  103. q *sqlchemy.SQuery,
  104. userCred mcclient.TokenCredential,
  105. query apis.StatusStandaloneResourceListInput,
  106. ) (*sqlchemy.SQuery, error) {
  107. q, err := manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput)
  108. if err != nil {
  109. return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter")
  110. }
  111. q, err = manager.SStatusResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StatusResourceBaseListInput)
  112. if err != nil {
  113. return nil, errors.Wrap(err, "SStatusResourceBaseManager.ListItemFilter")
  114. }
  115. return q, nil
  116. }
  117. func (manager *SStatusStandaloneResourceBaseManager) OrderByExtraFields(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query apis.StatusStandaloneResourceListInput) (*sqlchemy.SQuery, error) {
  118. q, err := manager.SStandaloneResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.StandaloneResourceListInput)
  119. if err != nil {
  120. return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.OrderByExtraFields")
  121. }
  122. q, err = manager.SStatusResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.StatusResourceBaseListInput)
  123. if err != nil {
  124. return nil, errors.Wrap(err, "SStatusResourceBaseManager.ListItemFilter")
  125. }
  126. return q, nil
  127. }
  128. func (manager *SStatusStandaloneResourceBaseManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
  129. q, err := manager.SStandaloneResourceBaseManager.QueryDistinctExtraField(q, field)
  130. if err == nil {
  131. return q, nil
  132. }
  133. return q, httperrors.ErrNotFound
  134. }
  135. func (manager *SStatusStandaloneResourceBaseManager) FetchCustomizeColumns(
  136. ctx context.Context,
  137. userCred mcclient.TokenCredential,
  138. query jsonutils.JSONObject,
  139. objs []interface{},
  140. fields stringutils2.SSortedStrings,
  141. isList bool,
  142. ) []apis.StatusStandaloneResourceDetails {
  143. rows := make([]apis.StatusStandaloneResourceDetails, len(objs))
  144. stdRows := manager.SStandaloneResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  145. for i := range rows {
  146. rows[i] = apis.StatusStandaloneResourceDetails{
  147. StandaloneResourceDetails: stdRows[i],
  148. }
  149. }
  150. return rows
  151. }
  152. func (model *SStatusStandaloneResourceBase) ValidateUpdateData(
  153. ctx context.Context,
  154. userCred mcclient.TokenCredential,
  155. query jsonutils.JSONObject,
  156. input apis.StatusStandaloneResourceBaseUpdateInput,
  157. ) (apis.StatusStandaloneResourceBaseUpdateInput, error) {
  158. var err error
  159. input.StandaloneResourceBaseUpdateInput, err = model.SStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, input.StandaloneResourceBaseUpdateInput)
  160. if err != nil {
  161. return input, errors.Wrap(err, "SStandaloneResourceBase.ValidateUpdateData")
  162. }
  163. return input, nil
  164. }