scheduledtask_activity.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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/util/rbacscope"
  20. "yunion.io/x/sqlchemy"
  21. api "yunion.io/x/onecloud/pkg/apis/scheduledtask"
  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. var ScheduledTaskActivityManager *SScheduledTaskActivityManager
  28. func init() {
  29. ScheduledTaskActivityManager = &SScheduledTaskActivityManager{
  30. SStatusStandaloneResourceBaseManager: db.NewStatusStandaloneResourceBaseManager(
  31. SScheduledTaskActivity{},
  32. "scheduledtaskactivities_tbl",
  33. "scheduledtaskactivity",
  34. "scheduledtaskactivities",
  35. ),
  36. }
  37. ScheduledTaskActivityManager.SetVirtualObject(ScheduledTaskActivityManager)
  38. }
  39. // +onecloud:swagger-gen-model-singular=scheduledtaskactivity
  40. // +onecloud:swagger-gen-model-singular=scheduledtaskactivities
  41. type SScheduledTaskActivityManager struct {
  42. db.SStatusStandaloneResourceBaseManager
  43. }
  44. type SScheduledTaskActivity struct {
  45. db.SStatusStandaloneResourceBase
  46. ScheduledTaskId string `width:"36" charset:"ascii" nullable:"true" list:"user" index:"true"`
  47. StartTime time.Time `list:"user"`
  48. EndTime time.Time `list:"user"`
  49. Reason string `charset:"utf8" list:"user"`
  50. }
  51. func (sam *SScheduledTaskActivityManager) InitializeData() error {
  52. sas := make([]SScheduledTaskActivity, 0, 10)
  53. q := ScheduledTaskActivityManager.Query().Equals("status", api.ST_ACTIVITY_STATUS_EXEC)
  54. err := db.FetchModelObjects(ScheduledTaskActivityManager, q, &sas)
  55. if err != nil {
  56. return err
  57. }
  58. for i := range sas {
  59. err := sas[i].Fail("As the service restarts, the status becomes unknown")
  60. if err != nil {
  61. return err
  62. }
  63. }
  64. return nil
  65. }
  66. func (sam *SScheduledTaskActivityManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
  67. return sam.SStatusStandaloneResourceBaseManager.QueryDistinctExtraField(q, field)
  68. }
  69. func (sam *SScheduledTaskActivityManager) OrderByExtraFields(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query api.ScheduledTaskActivityListInput) (*sqlchemy.SQuery, error) {
  70. return sam.SStatusStandaloneResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.StatusStandaloneResourceListInput)
  71. }
  72. func (sam *SScheduledTaskActivityManager) FetchCustomizeColumns(
  73. ctx context.Context,
  74. userCred mcclient.TokenCredential,
  75. query jsonutils.JSONObject,
  76. objs []interface{},
  77. fields stringutils2.SSortedStrings,
  78. isList bool,
  79. ) []api.ScheduledTaskActivityDetails {
  80. rows := make([]api.ScheduledTaskActivityDetails, len(objs))
  81. statusRows := sam.SStatusStandaloneResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  82. for i := range rows {
  83. rows[i].StatusStandaloneResourceDetails = statusRows[i]
  84. }
  85. return rows
  86. }
  87. func (sam *SScheduledTaskActivityManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.ScheduledTaskActivityListInput) (*sqlchemy.SQuery, error) {
  88. q, err := sam.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, input.StatusStandaloneResourceListInput)
  89. if err != nil {
  90. return nil, err
  91. }
  92. q = q.Desc("start_time").Desc("end_time")
  93. if len(input.ScheduledTask) == 0 {
  94. return nil, httperrors.NewInputParameterError("need scheduled task")
  95. }
  96. task, err := ScheduledTaskManager.FetchByIdOrName(ctx, userCred, input.ScheduledTask)
  97. if err != nil {
  98. return nil, err
  99. }
  100. q = q.Equals("scheduled_task_id", task.GetId())
  101. return q, nil
  102. }
  103. func (sam *SScheduledTaskActivityManager) NamespaceScope() rbacscope.TRbacScope {
  104. return rbacscope.ScopeProject
  105. }
  106. func (sam *SScheduledTaskActivityManager) ResourceScope() rbacscope.TRbacScope {
  107. return rbacscope.ScopeProject
  108. }
  109. func (sam *SScheduledTaskActivityManager) FileterByOwner(q *sqlchemy.SQuery, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
  110. if owner != nil {
  111. switch scope {
  112. case rbacscope.ScopeProject, rbacscope.ScopeDomain:
  113. scheduledTaskQ := ScheduledTaskManager.Query("id", "domain_id").SubQuery()
  114. q = q.Join(scheduledTaskQ, sqlchemy.Equals(q.Field("scheduled_task_id"), scheduledTaskQ.Field("id")))
  115. q = q.Filter(sqlchemy.Equals(scheduledTaskQ.Field("domain_id"), owner.GetProjectDomainId()))
  116. }
  117. }
  118. return q
  119. }
  120. func (sam *SScheduledTaskActivityManager) FetchOwnerId(ctx context.Context, data jsonutils.JSONObject) (mcclient.IIdentityProvider, error) {
  121. return db.FetchDomainInfo(ctx, data)
  122. }
  123. func (sa *SScheduledTaskActivity) GetOwnerId() mcclient.IIdentityProvider {
  124. obj, _ := ScheduledTaskManager.FetchById(sa.ScheduledTaskId)
  125. if obj == nil {
  126. return nil
  127. }
  128. return obj.GetOwnerId()
  129. }
  130. func (sa *SScheduledTaskActivity) SetResult(status, reason string) error {
  131. _, err := db.Update(sa, func() error {
  132. sa.Status = status
  133. sa.Reason = reason
  134. sa.EndTime = time.Now()
  135. return nil
  136. })
  137. return err
  138. }
  139. func (sa *SScheduledTaskActivity) Fail(reason string) error {
  140. return sa.SetResult(api.ST_ACTIVITY_STATUS_FAILED, reason)
  141. }
  142. func (sa *SScheduledTaskActivity) Succeed() error {
  143. return sa.SetResult(api.ST_ACTIVITY_STATUS_SUCCEED, "")
  144. }
  145. func (sa *SScheduledTaskActivity) PartFail(reason string) error {
  146. return sa.SetResult(api.ST_ACTIVITY_STATUS_PART_SUCCEED, reason)
  147. }