subtasks.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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 taskman
  15. import (
  16. "database/sql"
  17. "yunion.io/x/jsonutils"
  18. "yunion.io/x/log"
  19. "yunion.io/x/sqlchemy"
  20. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  21. )
  22. const (
  23. SUBTASK_INIT = "init"
  24. SUBTASK_FAIL = "fail"
  25. SUBTASK_SUCC = "succ"
  26. )
  27. type SSubTaskmanager struct {
  28. db.SModelBaseManager
  29. }
  30. var SubTaskManager *SSubTaskmanager
  31. func init() {
  32. SubTaskManager = &SSubTaskmanager{SModelBaseManager: db.NewModelBaseManager(
  33. SSubTask{},
  34. "subtasks_tbl",
  35. "subtask",
  36. "subtasks",
  37. )}
  38. SubTaskManager.SetVirtualObject(SubTaskManager)
  39. SubTaskManager.TableSpec().AddIndex(true, "task_id", "stage", "subtask_id", "status")
  40. }
  41. type SSubTask struct {
  42. db.SModelBase
  43. TaskId string `width:"36" charset:"ascii" nullable:"false" primary:"true"` // Column(VARCHAR(36, charset='ascii'), nullable=False, primary_key=True)
  44. Stage string `width:"64" charset:"ascii" nullable:"false" primary:"true"` // Column(VARCHAR(64, charset='ascii'), nullable=False, primary_key=True)
  45. SubtaskId string `width:"36" charset:"ascii" nullable:"false" primary:"true"` // Column(VARCHAR(36, charset='ascii'), nullable=False, primary_key=True)
  46. Status string `width:"36" charset:"ascii" nullable:"false" default:"init"` // Column(VARCHAR(36, charset='ascii'), nullable=False, default=SUBTASK_INIT)
  47. Result string `length:"medium" charset:"utf8" nullable:"true"` // Column(MEDIUMTEXT(charset='ascii'), nullable=True)
  48. }
  49. func (manager *SSubTaskmanager) GetSubTask(ptaskId string, subtaskId string) *SSubTask {
  50. subtask := SSubTask{}
  51. subtask.SetModelManager(manager, &subtask)
  52. err := manager.Query().Equals("task_id", ptaskId).Equals("subtask_id", subtaskId).First(&subtask)
  53. if err != nil {
  54. if err != sql.ErrNoRows {
  55. log.Errorf("GetSubTask fail %s %s %s", err, ptaskId, subtaskId)
  56. }
  57. return nil
  58. }
  59. return &subtask
  60. }
  61. func (manager *SSubTaskmanager) getTotalSubtasksQuery(taskId string, stage string, status string) *sqlchemy.SQuery {
  62. q := manager.Query().Equals("task_id", taskId)
  63. if len(stage) > 0 {
  64. q = q.Equals("stage", stage)
  65. }
  66. if len(status) > 0 {
  67. q = q.Equals("status", status)
  68. }
  69. return q
  70. }
  71. func (manager *SSubTaskmanager) GetSubtasks(taskId string, stage string, status string) []SSubTask {
  72. subtasks := make([]SSubTask, 0)
  73. q := manager.getTotalSubtasksQuery(taskId, stage, status)
  74. err := db.FetchModelObjects(manager, q, &subtasks)
  75. if err != nil {
  76. log.Errorf("GetInitSubtasks fail %s", err)
  77. return nil
  78. }
  79. return subtasks
  80. }
  81. func (manager *SSubTaskmanager) GetSubtasksCount(taskId string, stage string, status string) (int, error) {
  82. q := manager.getTotalSubtasksQuery(taskId, stage, status)
  83. return q.CountWithError()
  84. }
  85. func (manager *SSubTaskmanager) GetTotalSubtasks(taskId string, stage string) []SSubTask {
  86. return manager.GetSubtasks(taskId, stage, "")
  87. }
  88. func (manager *SSubTaskmanager) GetTotalSubtasksCount(taskId string, stage string) (int, error) {
  89. return manager.GetSubtasksCount(taskId, stage, "")
  90. }
  91. func (manager *SSubTaskmanager) GetInitSubtasks(taskId string, stage string) []SSubTask {
  92. return manager.GetSubtasks(taskId, stage, SUBTASK_INIT)
  93. }
  94. func (manager *SSubTaskmanager) GetInitSubtasksCount(taskId string, stage string) (int, error) {
  95. return manager.GetSubtasksCount(taskId, stage, SUBTASK_INIT)
  96. }
  97. func (self *SSubTask) SaveResults(failed bool, result jsonutils.JSONObject) error {
  98. _, err := db.Update(self, func() error {
  99. if failed {
  100. self.Status = SUBTASK_FAIL
  101. } else {
  102. self.Status = SUBTASK_SUCC
  103. }
  104. self.Result = result.String()
  105. return nil
  106. })
  107. if err != nil {
  108. log.Errorf("SaveUpdate save update fail %s", err)
  109. return err
  110. }
  111. return nil
  112. }