/
job.go
146 lines (133 loc) · 3.07 KB
/
job.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package server
import (
"fmt"
"github.com/Vonng/pigsty-cli/exec"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"io/ioutil"
"net/http"
"path"
"strings"
)
// GetConfigHandler will serve config file
func GetJobHandler(c *gin.Context) {
if job := PS.GetJob(); job != nil {
c.JSON(http.StatusOK, gin.H{
"message": "job running",
"data": PS.Job,
})
} else {
c.JSON(http.StatusOK, gin.H{
"message": "job not found",
"data": nil,
})
}
}
// ListJobHandler will serve config file
func ListJobHandler(c *gin.Context) {
if jobInfo, err := PS.LisJobDir(); err != nil {
c.JSON(http.StatusOK, gin.H{
"message": "can not list jobs",
"data": nil,
})
} else {
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"data": jobInfo,
})
}
}
// PostJobHandler will create new job
func PostJobHandler(c *gin.Context) {
// arg parsing
playbook := c.Query("playbook")
cluster := c.Query("cluster")
tags := c.QueryArray("tags")
if !strings.HasSuffix(playbook, ".yml") {
playbook += ".yml"
}
logrus.Infof("post job handler called: playbook=%s cluster=%s tags=%s", playbook, cluster, tags)
// build new job
job := PS.Executor.NewJob(
exec.WithPlaybook(playbook),
exec.WithName(fmt.Sprintf("%s-%s", playbook, cluster)),
exec.WithLimit(cluster),
exec.WithTags(tags...),
)
//logFilenName := fmt.Sprintf(`%s-%s@%s.log`)
job.LogPath = PS.LogPath(job.ID)
logrus.Infof("new job created, log: %s", job.LogPath)
// save job info to datadir/job/
if err := PS.SaveJob(job); err != nil {
logrus.Errorf("fail to save job to %s", PS.JobPath(job.ID))
}
if j, err := PS.RunJob(job); err != nil {
c.JSON(http.StatusOK, gin.H{
"message": "job exists",
"data": nil,
})
} else {
c.JSON(http.StatusOK, gin.H{
"message": "job created",
"data": j,
})
}
return
}
func DelJobHandler(c *gin.Context) {
if job := PS.DelJob(); job != nil {
c.JSON(http.StatusOK, gin.H{
"message": "job deleted",
"data": job,
})
} else {
c.JSON(http.StatusOK, gin.H{
"message": "job not found",
"data": nil,
})
}
}
// ListLogHandler will iter log directory and return log(job) list
func ListLogHandler(c *gin.Context) {
if logInfo, err := PS.ListLogDir(); err != nil {
c.JSON(http.StatusOK, gin.H{
"message": "can not list logs",
"data": nil,
})
} else {
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"data": logInfo,
})
}
}
// Get log by job id
func GetLogHandler(c *gin.Context) {
jobID := c.Param("jobid")
logPath := PS.LogPath(jobID)
b, _ := ioutil.ReadFile(logPath)
c.String(http.StatusOK, string(b))
//c.File(logPath)
}
// GetLatestLogHandler
func GetLatestLogHandler(c *gin.Context) {
logs, err := PS.ListLogDir()
if err != nil {
c.JSON(http.StatusOK, gin.H{
"message": "fail to list jobs",
"data": nil,
})
return
}
var maxInd int
var maxMtime int64
for i, log := range logs {
if log.Mtime >= maxMtime {
maxInd = i
}
}
latestLogName := logs[maxInd].Name
jobPath := path.Join(PS.DataDir, latestLogName)
logrus.Infof("server latest log %s of %v", jobPath, logs)
c.File(jobPath)
}