scaling_activity.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. "time"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/pkg/errors"
  20. "yunion.io/x/pkg/util/rbacscope"
  21. "yunion.io/x/sqlchemy"
  22. "yunion.io/x/onecloud/pkg/apis/compute"
  23. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  24. "yunion.io/x/onecloud/pkg/mcclient"
  25. "yunion.io/x/onecloud/pkg/util/stringutils2"
  26. )
  27. // +onecloud:swagger-gen-model-singular=scalingactivity
  28. // +onecloud:swagger-gen-model-plural=scalingactivities
  29. type SScalingActivityManager struct {
  30. db.SStatusStandaloneResourceBaseManager
  31. SScalingGroupResourceBaseManager
  32. }
  33. type SScalingActivity struct {
  34. db.SStatusStandaloneResourceBase
  35. SScalingGroupResourceBase
  36. InstanceNumber int `list:"user" get:"user" default:"-1"`
  37. // 起因描述
  38. TriggerDesc string `width:"256" charset:"ascii" get:"user" list:"user"`
  39. // 行为描述
  40. ActionDesc string `width:"256" charset:"ascii" get:"user" list:"user"`
  41. StartTime time.Time `list:"user" get:"user"`
  42. EndTime time.Time `list:"user" get:"user"`
  43. Reason string `width:"1024" charset:"ascii" get:"user" list:"user"`
  44. }
  45. var ScalingActivityManager *SScalingActivityManager
  46. func init() {
  47. ScalingActivityManager = &SScalingActivityManager{
  48. SStatusStandaloneResourceBaseManager: db.NewStatusStandaloneResourceBaseManager(
  49. SScalingActivity{},
  50. "scalingactivities_tbl",
  51. "scalingactivity",
  52. "scalingactivities",
  53. ),
  54. }
  55. ScalingActivityManager.SetVirtualObject(ScalingActivityManager)
  56. }
  57. func (sam *SScalingActivityManager) FetchByStatus(ctx context.Context, saIds, status []string, action string) (ids []string, err error) {
  58. q := sam.Query("id").In("id", saIds)
  59. if action == "not" {
  60. q = q.NotIn("status", status)
  61. } else {
  62. q = q.In("status", status)
  63. }
  64. rows, err := q.Rows()
  65. if err != nil {
  66. return nil, errors.Wrap(err, "sQuery.Rows")
  67. }
  68. defer rows.Close()
  69. var id string
  70. for rows.Next() {
  71. rows.Scan(&id)
  72. ids = append(ids, id)
  73. }
  74. return
  75. }
  76. func (sam *SScalingActivity) SetFailed(actionDesc, reason string) error {
  77. return sam.SetResult(actionDesc, compute.SA_STATUS_FAILED, reason, -1)
  78. }
  79. func (sam *SScalingActivity) SetResult(actionDesc, status, reason string, instanceNum int) error {
  80. _, err := db.Update(sam, func() error {
  81. if len(actionDesc) != 0 {
  82. sam.ActionDesc = actionDesc
  83. }
  84. sam.EndTime = time.Now()
  85. sam.Status = status
  86. if len(reason) != 0 {
  87. sam.Reason = reason
  88. }
  89. if instanceNum != -1 {
  90. sam.InstanceNumber = instanceNum
  91. }
  92. return nil
  93. })
  94. return err
  95. }
  96. func (sam *SScalingActivity) SetReject(action string, reason string) error {
  97. return sam.SetResult(action, compute.SA_STATUS_REJECT, reason, -1)
  98. }
  99. func (sam *SScalingActivityManager) CreateScalingActivity(ctx context.Context, sgId, triggerDesc, status string) (*SScalingActivity, error) {
  100. scalingActivity := &SScalingActivity{
  101. TriggerDesc: triggerDesc,
  102. StartTime: time.Now(),
  103. }
  104. scalingActivity.ScalingGroupId = sgId
  105. scalingActivity.Status = status
  106. scalingActivity.SetModelManager(sam, scalingActivity)
  107. return scalingActivity, sam.TableSpec().Insert(ctx, scalingActivity)
  108. }
  109. func (sa *SScalingActivity) StartToScale(triggerDesc string) (*SScalingActivity, error) {
  110. _, err := db.Update(sa, func() error {
  111. sa.TriggerDesc = triggerDesc
  112. sa.Status = compute.SA_STATUS_EXEC
  113. return nil
  114. })
  115. return sa, err
  116. }
  117. func (sa *SScalingActivity) SimpleDelete() error {
  118. _, err := db.Update(sa, func() error {
  119. sa.MarkDelete()
  120. return nil
  121. })
  122. return err
  123. }
  124. func (sam *SScalingActivityManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
  125. q, err := sam.SStatusStandaloneResourceBaseManager.QueryDistinctExtraField(q, field)
  126. if err == nil {
  127. return q, nil
  128. }
  129. return sam.SScalingGroupResourceBaseManager.QueryDistinctExtraField(q, field)
  130. }
  131. func (sam *SScalingActivityManager) OrderByExtraFields(ctx context.Context, q *sqlchemy.SQuery,
  132. userCred mcclient.TokenCredential, query compute.ScalingActivityListInput) (*sqlchemy.SQuery, error) {
  133. return sam.SStatusStandaloneResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.StatusStandaloneResourceListInput)
  134. }
  135. func (sam *SScalingActivityManager) FetchCustomizeColumns(
  136. ctx context.Context,
  137. userCred mcclient.TokenCredential,
  138. query jsonutils.JSONObject,
  139. objs []interface{},
  140. fields stringutils2.SSortedStrings,
  141. isList bool,
  142. ) []compute.ScalingActivityDetails {
  143. rows := make([]compute.ScalingActivityDetails, len(objs))
  144. statusRows := sam.SStatusStandaloneResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  145. sgRows := sam.SScalingGroupResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  146. for i := range rows {
  147. rows[i].StatusStandaloneResourceDetails = statusRows[i]
  148. rows[i].ScalingGroupResourceInfo = sgRows[i]
  149. }
  150. return rows
  151. }
  152. func (sam *SScalingActivityManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery,
  153. userCred mcclient.TokenCredential, input compute.ScalingActivityListInput) (*sqlchemy.SQuery, error) {
  154. q, err := sam.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, input.StatusStandaloneResourceListInput)
  155. if err != nil {
  156. return nil, err
  157. }
  158. q, err = sam.SScalingGroupResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ScalingGroupFilterListInput)
  159. if err != nil {
  160. return nil, err
  161. }
  162. q = q.Desc("start_time").Desc("end_time")
  163. return q, nil
  164. }
  165. func (sam *SScalingActivityManager) NamespaceScope() rbacscope.TRbacScope {
  166. return rbacscope.ScopeProject
  167. }
  168. func (sam *SScalingActivityManager) ResourceScope() rbacscope.TRbacScope {
  169. return rbacscope.ScopeProject
  170. }
  171. func (sam *SScalingActivityManager) FilterByOwner(ctx context.Context, q *sqlchemy.SQuery, man db.FilterByOwnerProvider, userCred mcclient.TokenCredential, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
  172. if owner != nil {
  173. switch scope {
  174. case rbacscope.ScopeProject, rbacscope.ScopeDomain:
  175. scalingGroupQ := ScalingGroupManager.Query("id", "domain_id").SubQuery()
  176. q = q.Join(scalingGroupQ, sqlchemy.Equals(q.Field("scaling_group_id"), scalingGroupQ.Field("id")))
  177. q = q.Filter(sqlchemy.Equals(scalingGroupQ.Field("domain_id"), owner.GetProjectDomainId()))
  178. }
  179. }
  180. return q
  181. }
  182. func (sam *SScalingActivityManager) FetchOwnerId(ctx context.Context, data jsonutils.JSONObject) (mcclient.IIdentityProvider, error) {
  183. return db.FetchDomainInfo(ctx, data)
  184. }
  185. func (sa *SScalingActivity) GetOwnerId() mcclient.IIdentityProvider {
  186. scalingGroup := sa.GetScalingGroup()
  187. if scalingGroup != nil {
  188. return scalingGroup.GetOwnerId()
  189. }
  190. return nil
  191. }