diff --git a/api/task.go b/api/task.go index 69b584e09..23e7025f1 100644 --- a/api/task.go +++ b/api/task.go @@ -160,7 +160,7 @@ func (h TaskHandler) Create(ctx *gin.Context) { task.With(r.Model()) task.CreateUser = h.BaseHandler.CurrentUser(ctx) rtx := WithContext(ctx) - created, err := rtx.TaskManager.Create(task) + created, err := rtx.TaskManager.Create(h.DB(ctx), task) if err != nil { _ = ctx.Error(err) return @@ -181,7 +181,7 @@ func (h TaskHandler) Create(ctx *gin.Context) { func (h TaskHandler) Delete(ctx *gin.Context) { id := h.pk(ctx) rtx := WithContext(ctx) - err := rtx.TaskManager.Delete(id) + err := rtx.TaskManager.Delete(h.DB(ctx), id) if err != nil { _ = ctx.Error(err) return @@ -211,7 +211,7 @@ func (h TaskHandler) Update(ctx *gin.Context) { task := &tasking.Task{} task.With(r.Model()) task.UpdateUser = h.BaseHandler.CurrentUser(ctx) - err = rtx.TaskManager.Update(task) + err = rtx.TaskManager.Update(h.DB(ctx), task) if err != nil { _ = ctx.Error(err) return @@ -267,7 +267,7 @@ func (h TaskHandler) Submit(ctx *gin.Context) { func (h TaskHandler) Cancel(ctx *gin.Context) { id := h.pk(ctx) rtx := WithContext(ctx) - err := rtx.TaskManager.Cancel(id) + err := rtx.TaskManager.Cancel(h.DB(ctx), id) if err != nil { _ = ctx.Error(err) return diff --git a/api/taskgroup.go b/api/taskgroup.go index e22dac63f..61347f81e 100644 --- a/api/taskgroup.go +++ b/api/taskgroup.go @@ -118,18 +118,39 @@ func (h TaskGroupHandler) Create(ctx *gin.Context) { return } db := h.DB(ctx) + db = db.Omit(clause.Associations) m := r.Model() + m.CreateUser = h.BaseHandler.CurrentUser(ctx) switch r.State { case "": m.State = tasking.Created fallthrough case tasking.Created: - db = h.DB(ctx).Omit(clause.Associations) + result := db.Create(&m) + if result.Error != nil { + _ = ctx.Error(result.Error) + return + } case tasking.Ready: err := m.Propagate() if err != nil { return } + result := db.Create(&m) + if result.Error != nil { + _ = ctx.Error(result.Error) + return + } + rtx := WithContext(ctx) + for i := range m.Tasks { + task := &tasking.Task{} + task.With(&m.Tasks[i]) + task, err = rtx.TaskManager.Create(h.DB(ctx), task) + if err != nil { + _ = ctx.Error(err) + return + } + } default: h.Respond(ctx, http.StatusBadRequest, @@ -138,12 +159,6 @@ func (h TaskGroupHandler) Create(ctx *gin.Context) { }) return } - m.CreateUser = h.BaseHandler.CurrentUser(ctx) - result := db.Create(&m) - if result.Error != nil { - _ = ctx.Error(result.Error) - return - } r.With(m) @@ -177,20 +192,41 @@ func (h TaskGroupHandler) Update(ctx *gin.Context) { _ = ctx.Error(err) return } + db := h.DB(ctx) + db = db.Omit( + clause.Associations, + "BucketID", + "Bucket") m := updated.Model() - m.ID = current.ID + m.ID = id m.UpdateUser = h.BaseHandler.CurrentUser(ctx) - db := h.DB(ctx).Model(m) - - omit := []string{"BucketID", "Bucket"} switch updated.State { case "", tasking.Created: - omit = append(omit, clause.Associations) + err = db.Save(m).Error + if err != nil { + _ = ctx.Error(err) + return + } case tasking.Ready: err := m.Propagate() if err != nil { return } + err = db.Save(m).Error + if err != nil { + _ = ctx.Error(err) + return + } + rtx := WithContext(ctx) + for i := range m.Tasks { + task := &tasking.Task{} + task.With(&m.Tasks[i]) + err = rtx.TaskManager.Update(h.DB(ctx), task) + if err != nil { + _ = ctx.Error(err) + return + } + } default: h.Respond(ctx, http.StatusBadRequest, @@ -199,13 +235,6 @@ func (h TaskGroupHandler) Update(ctx *gin.Context) { }) return } - db = db.Omit(omit...) - db = db.Where("state IN ?", []string{"", tasking.Created}) - err = db.Save(m).Error - if err != nil { - _ = ctx.Error(err) - return - } h.Status(ctx, http.StatusNoContent) } @@ -220,31 +249,22 @@ func (h TaskGroupHandler) Update(ctx *gin.Context) { func (h TaskGroupHandler) Delete(ctx *gin.Context) { m := &model.TaskGroup{} id := h.pk(ctx) - db := h.DB(ctx).Preload(clause.Associations) + db := h.DB(ctx) + db = db.Omit(clause.Associations) err := db.First(m, id).Error if err != nil { _ = ctx.Error(err) return } - for _, task := range m.Tasks { - if task.Pod != "" { - rt := tasking.Task{Task: &task} - err := rt.Delete(h.Client(ctx)) - if err != nil { - if !k8serr.IsNotFound(err) { - _ = ctx.Error(err) - return - } - } - } - db := h.DB(ctx).Select(clause.Associations) - err = db.Delete(task).Error + rtx := WithContext(ctx) + for i := range m.Tasks { + task := &m.Tasks[i] + err = rtx.TaskManager.Delete(h.DB(ctx), task.ID) if err != nil { _ = ctx.Error(err) return } } - db = h.DB(ctx).Select(clause.Associations) err = db.Delete(m).Error if err != nil { _ = ctx.Error(err) diff --git a/task/manager.go b/task/manager.go index a42f73279..55db404b3 100644 --- a/task/manager.go +++ b/task/manager.go @@ -129,7 +129,7 @@ func (m *Manager) Run(ctx context.Context) { } // Create a task. -func (m *Manager) Create(requested *Task) (task *Task, err error) { +func (m *Manager) Create(db *gorm.DB, requested *Task) (task *Task, err error) { task = &Task{&model.Task{}} switch requested.State { case "": @@ -155,7 +155,7 @@ func (m *Manager) Create(requested *Task) (task *Task, err error) { } return } - err = m.DB.Create(task).Error + err = db.Create(task).Error if err != nil { err = liberr.Wrap(err) return @@ -164,10 +164,10 @@ func (m *Manager) Create(requested *Task) (task *Task, err error) { } // Update update task. -func (m *Manager) Update(requested *Task) (err error) { +func (m *Manager) Update(db *gorm.DB, requested *Task) (err error) { err = m.action(func() (err error) { task := &Task{} - err = m.DB.First(task, requested.ID).Error + err = db.First(task, requested.ID).Error if err != nil { return } @@ -204,7 +204,7 @@ func (m *Manager) Update(requested *Task) (err error) { } return } - err = m.DB.Save(task).Error + err = db.Save(task).Error if err != nil { err = liberr.Wrap(err) return @@ -215,10 +215,10 @@ func (m *Manager) Update(requested *Task) (err error) { } // Delete a task. -func (m *Manager) Delete(id uint) (err error) { +func (m *Manager) Delete(db *gorm.DB, id uint) (err error) { err = m.action(func() (err error) { task := &Task{} - err = m.DB.First(task, id).Error + err = db.First(task, id).Error if err != nil { return } @@ -226,18 +226,18 @@ func (m *Manager) Delete(id uint) (err error) { if err != nil { return } - err = m.DB.Delete(task).Error + err = db.Delete(task).Error return }) return } // Cancel a task. -func (m *Manager) Cancel(id uint) (err error) { +func (m *Manager) Cancel(db *gorm.DB, id uint) (err error) { err = m.action( func() (err error) { task := &Task{} - err = m.DB.First(task, id).Error + err = db.First(task, id).Error if err != nil { return } @@ -262,7 +262,7 @@ func (m *Manager) Cancel(id uint) (err error) { if err != nil { return } - err = m.DB.Save(task).Error + err = db.Save(task).Error if err != nil { err = liberr.Wrap(err) return