2016-04-17 20:01:51 +02:00
|
|
|
package tasks
|
|
|
|
|
|
|
|
import (
|
2017-02-23 00:21:49 +01:00
|
|
|
"net/http"
|
2016-04-17 20:01:51 +02:00
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
|
2018-02-18 23:49:40 +01:00
|
|
|
log "github.com/Sirupsen/logrus"
|
2017-02-23 06:12:16 +01:00
|
|
|
"github.com/ansible-semaphore/semaphore/db"
|
2016-05-24 11:55:48 +02:00
|
|
|
"github.com/ansible-semaphore/semaphore/util"
|
2017-02-23 00:21:49 +01:00
|
|
|
"github.com/castawaylabs/mulekick"
|
|
|
|
"github.com/gorilla/context"
|
2016-04-17 20:01:51 +02:00
|
|
|
"github.com/masterminds/squirrel"
|
|
|
|
)
|
|
|
|
|
2017-02-22 23:17:36 +01:00
|
|
|
func AddTask(w http.ResponseWriter, r *http.Request) {
|
2017-02-23 06:12:16 +01:00
|
|
|
project := context.Get(r, "project").(db.Project)
|
|
|
|
user := context.Get(r, "user").(*db.User)
|
2016-04-17 20:01:51 +02:00
|
|
|
|
2017-02-23 06:12:16 +01:00
|
|
|
var taskObj db.Task
|
2017-02-22 23:21:52 +01:00
|
|
|
if err := mulekick.Bind(w, r, &taskObj); err != nil {
|
2016-04-17 20:01:51 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
taskObj.Created = time.Now()
|
|
|
|
taskObj.Status = "waiting"
|
2016-06-26 00:43:59 +02:00
|
|
|
taskObj.UserID = &user.ID
|
2016-04-17 20:01:51 +02:00
|
|
|
|
2017-02-23 06:12:16 +01:00
|
|
|
if err := db.Mysql.Insert(&taskObj); err != nil {
|
2016-04-17 20:01:51 +02:00
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
pool.register <- &task{
|
|
|
|
task: taskObj,
|
|
|
|
projectID: project.ID,
|
|
|
|
}
|
|
|
|
|
|
|
|
objType := "task"
|
|
|
|
desc := "Task ID " + strconv.Itoa(taskObj.ID) + " queued for running"
|
2017-02-23 06:12:16 +01:00
|
|
|
if err := (db.Event{
|
2016-04-17 20:01:51 +02:00
|
|
|
ProjectID: &project.ID,
|
|
|
|
ObjectType: &objType,
|
|
|
|
ObjectID: &taskObj.ID,
|
|
|
|
Description: &desc,
|
|
|
|
}.Insert()); err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2017-02-23 00:21:49 +01:00
|
|
|
mulekick.WriteJSON(w, http.StatusCreated, taskObj)
|
2016-04-17 20:01:51 +02:00
|
|
|
}
|
|
|
|
|
2017-07-25 06:44:09 +02:00
|
|
|
func GetTasksList(w http.ResponseWriter, r *http.Request, limit uint64) {
|
2017-02-23 06:12:16 +01:00
|
|
|
project := context.Get(r, "project").(db.Project)
|
2016-04-17 20:01:51 +02:00
|
|
|
|
2017-07-25 06:44:09 +02:00
|
|
|
q := squirrel.Select("task.*, tpl.playbook as tpl_playbook, user.name as user_name, tpl.alias as tpl_alias").
|
2016-04-17 20:01:51 +02:00
|
|
|
From("task").
|
|
|
|
Join("project__template as tpl on task.template_id=tpl.id").
|
2016-06-26 00:43:59 +02:00
|
|
|
LeftJoin("user on task.user_id=user.id").
|
2016-04-17 20:01:51 +02:00
|
|
|
Where("tpl.project_id=?", project.ID).
|
2017-07-25 06:44:09 +02:00
|
|
|
OrderBy("task.created desc")
|
|
|
|
|
|
|
|
if limit > 0 {
|
|
|
|
q = q.Limit(limit)
|
|
|
|
}
|
|
|
|
|
|
|
|
query, args, _ := q.ToSql()
|
2016-04-17 20:01:51 +02:00
|
|
|
|
|
|
|
var tasks []struct {
|
2017-02-23 06:12:16 +01:00
|
|
|
db.Task
|
2016-04-17 20:01:51 +02:00
|
|
|
|
2016-06-26 00:43:59 +02:00
|
|
|
TemplatePlaybook string `db:"tpl_playbook" json:"tpl_playbook"`
|
2017-02-11 09:34:57 +01:00
|
|
|
TemplateAlias string `db:"tpl_alias" json:"tpl_alias"`
|
2016-06-26 00:43:59 +02:00
|
|
|
UserName *string `db:"user_name" json:"user_name"`
|
2016-04-17 20:01:51 +02:00
|
|
|
}
|
2017-02-23 06:12:16 +01:00
|
|
|
if _, err := db.Mysql.Select(&tasks, query, args...); err != nil {
|
2016-04-17 20:01:51 +02:00
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2017-02-23 00:21:49 +01:00
|
|
|
mulekick.WriteJSON(w, http.StatusOK, tasks)
|
2016-04-17 20:01:51 +02:00
|
|
|
}
|
|
|
|
|
2017-07-25 06:44:09 +02:00
|
|
|
func GetAllTasks(w http.ResponseWriter, r *http.Request) {
|
|
|
|
GetTasksList(w, r, 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetLastTasks(w http.ResponseWriter, r *http.Request) {
|
|
|
|
GetTasksList(w, r, 200)
|
|
|
|
}
|
|
|
|
|
2017-05-18 14:29:57 +02:00
|
|
|
func GetTask(w http.ResponseWriter, r *http.Request) {
|
|
|
|
task := context.Get(r, "task").(db.Task)
|
|
|
|
mulekick.WriteJSON(w, http.StatusOK, task)
|
|
|
|
}
|
|
|
|
|
2017-02-22 23:17:36 +01:00
|
|
|
func GetTaskMiddleware(w http.ResponseWriter, r *http.Request) {
|
2017-02-23 00:21:49 +01:00
|
|
|
taskID, err := util.GetIntParam("task_id", w, r)
|
2016-04-17 20:01:51 +02:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2017-02-23 06:12:16 +01:00
|
|
|
var task db.Task
|
|
|
|
if err := db.Mysql.SelectOne(&task, "select * from task where id=?", taskID); err != nil {
|
2016-04-17 20:01:51 +02:00
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2017-02-23 00:21:49 +01:00
|
|
|
context.Set(r, "task", task)
|
2016-04-17 20:01:51 +02:00
|
|
|
}
|
|
|
|
|
2017-02-22 23:17:36 +01:00
|
|
|
func GetTaskOutput(w http.ResponseWriter, r *http.Request) {
|
2017-02-23 06:12:16 +01:00
|
|
|
task := context.Get(r, "task").(db.Task)
|
2016-04-17 20:01:51 +02:00
|
|
|
|
2017-02-23 06:12:16 +01:00
|
|
|
var output []db.TaskOutput
|
2017-03-14 16:50:14 +01:00
|
|
|
if _, err := db.Mysql.Select(&output, "select task_id, task, time, output from task__output where task_id=? order by time asc", task.ID); err != nil {
|
2016-04-17 20:01:51 +02:00
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
2017-02-23 00:21:49 +01:00
|
|
|
mulekick.WriteJSON(w, http.StatusOK, output)
|
2016-04-17 20:01:51 +02:00
|
|
|
}
|
2016-06-17 22:16:46 +02:00
|
|
|
|
2017-02-22 23:17:36 +01:00
|
|
|
func RemoveTask(w http.ResponseWriter, r *http.Request) {
|
2017-02-23 06:12:16 +01:00
|
|
|
task := context.Get(r, "task").(db.Task)
|
2018-02-17 00:52:08 +01:00
|
|
|
editor := context.Get(r, "user").(*db.User)
|
|
|
|
|
|
|
|
if editor.Admin != true {
|
2018-02-20 01:12:19 +01:00
|
|
|
log.Warn(editor.Username + " is not permitted to delete task logs")
|
2018-02-17 00:52:08 +01:00
|
|
|
w.WriteHeader(http.StatusUnauthorized)
|
|
|
|
return
|
|
|
|
}
|
2016-06-17 22:16:46 +02:00
|
|
|
|
|
|
|
statements := []string{
|
|
|
|
"delete from task__output where task_id=?",
|
|
|
|
"delete from task where id=?",
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, statement := range statements {
|
2017-02-23 06:12:16 +01:00
|
|
|
_, err := db.Mysql.Exec(statement, task.ID)
|
2016-06-17 22:16:46 +02:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-02-22 23:17:36 +01:00
|
|
|
w.WriteHeader(http.StatusNoContent)
|
2016-06-17 22:16:46 +02:00
|
|
|
}
|