diff --git a/api/handler/task.go b/api/handler/task.go index 62cfbca2..5c83bb24 100644 --- a/api/handler/task.go +++ b/api/handler/task.go @@ -8,8 +8,10 @@ import ( "github.com/gin-gonic/gin" "github.com/juju/errors" "github.com/loopfz/gadgeto/zesty" + "github.com/sirupsen/logrus" "github.com/ovh/utask" + "github.com/ovh/utask/engine" "github.com/ovh/utask/engine/step" "github.com/ovh/utask/models/resolution" "github.com/ovh/utask/models/task" @@ -440,6 +442,16 @@ func WontfixTask(c *gin.Context, in *wontfixTaskIn) error { return err } + parentTask, err := t.ShouldResumeParentTask(dbp) + if err == nil && parentTask != nil { + go func() { + logrus.Debugf("resuming parent task %q resolution %q", parentTask.PublicID, *parentTask.Resolution) + logrus.WithFields(logrus.Fields{"task_id": parentTask.PublicID, "resolution_id": *parentTask.Resolution}).Debugf("resuming resolution %q as child task %q state changed", *parentTask.Resolution, t.PublicID) + + err = engine.GetEngine().Resolve(*parentTask.Resolution, nil) + }() + } + if err := dbp.Commit(); err != nil { dbp.Rollback() return err diff --git a/engine/engine.go b/engine/engine.go index 0dc3b913..7f606a3c 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -26,7 +26,6 @@ import ( "github.com/ovh/utask/models/runnerinstance" "github.com/ovh/utask/models/task" "github.com/ovh/utask/models/tasktemplate" - "github.com/ovh/utask/pkg/constants" "github.com/ovh/utask/pkg/jsonschema" "github.com/ovh/utask/pkg/metadata" "github.com/ovh/utask/pkg/now" @@ -588,31 +587,12 @@ forLoop: } func resumeParentTask(dbp zesty.DBProvider, currentTask *task.Task, sm *semaphore.Weighted, debugLogger *logrus.Entry) error { - switch currentTask.State { - case task.StateDone, task.StateWontfix, task.StateCancelled: - default: - return nil - } - if currentTask.Tags == nil { - return nil - } - parentTaskID, ok := currentTask.Tags[constants.SubtaskTagParentTaskID] - if !ok { - return nil - } - - parentTask, err := task.LoadFromPublicID(dbp, parentTaskID) + parentTask, err := currentTask.ShouldResumeParentTask(dbp) if err != nil { return err } - switch parentTask.State { - case task.StateBlocked, task.StateRunning: - default: - // not allowed to resume a parent task that is not either Running or Blocked. - // Todo state should not be runned as it might need manual resolution from a granted resolver - return nil - } - if parentTask.Resolution == nil { + + if parentTask == nil { return nil } diff --git a/models/task/task.go b/models/task/task.go index 4913b037..b362f75a 100644 --- a/models/task/task.go +++ b/models/task/task.go @@ -19,6 +19,7 @@ import ( "github.com/ovh/utask/engine/values" "github.com/ovh/utask/models" "github.com/ovh/utask/models/tasktemplate" + "github.com/ovh/utask/pkg/constants" "github.com/ovh/utask/pkg/notify" "github.com/ovh/utask/pkg/now" "github.com/ovh/utask/pkg/utils" @@ -694,3 +695,35 @@ func (t *Task) NotifyStepState(stepName, stepState string) { notify.ListActions().TaskStepUpdateAction, ) } + +func (t *Task) ShouldResumeParentTask(dbp zesty.DBProvider) (*Task, error) { + switch t.State { + case StateDone, StateWontfix, StateCancelled: + default: + return nil, nil + } + if t.Tags == nil { + return nil, nil + } + parentTaskID, ok := t.Tags[constants.SubtaskTagParentTaskID] + if !ok { + return nil, nil + } + + parentTask, err := LoadFromPublicID(dbp, parentTaskID) + if err != nil { + return nil, err + } + switch parentTask.State { + case StateBlocked, StateRunning: + default: + // not allowed to resume a parent task that is not either Running or Blocked. + // Todo state should not be runned as it might need manual resolution from a granted resolver + return nil, nil + } + if parentTask.Resolution == nil { + return nil, nil + } + + return parentTask, nil +}