-
Notifications
You must be signed in to change notification settings - Fork 372
/
task.go
120 lines (105 loc) · 2.68 KB
/
task.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
// Copyright 2019 syncd Author. All Rights Reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package deploy
import (
"sync"
"errors"
"fmt"
)
type deployTask struct {
deploys map[int][]*Deploy
mu sync.Mutex
}
type CallbackFn func(int, int, int, []*ServerResult)
type TaskCallbackFn func(int, int)
var task = &deployTask{
deploys: map[int][]*Deploy{},
}
func NewTask(id, mode int, deploys []*Deploy, startFn, finishFn CallbackFn, taskFn TaskCallbackFn) error {
if exists := task.exists(id); exists {
return errors.New(fmt.Sprintf("deploy task [id: %d] have exists", id))
}
task.append(id, deploys)
go func() {
taskStatus := STATUS_DONE
for _, deploy := range deploys {
if startFn != nil {
rest, status := deploy.Result()
startFn(id, deploy.ID, status, rest)
}
switch mode {
case DEPLOY_PARALLEL:
deploy.Parallel()
default:
deploy.Serial()
}
resultList, status := deploy.Result()
if finishFn != nil {
finishFn(id, deploy.ID, status, resultList)
}
if status == STATUS_FAILED {
taskStatus = STATUS_FAILED
}
}
task.remove(id)
if taskFn != nil {
taskFn(id, taskStatus)
}
}()
return nil
}
func StopTask(id int) {
task.stop(id)
}
func ExistsTask(id int) bool {
return task.exists(id)
}
func StatusTask(id int) []*DeployResult {
deploys, exists := task.get(id)
if !exists {
return nil
}
rests := []*DeployResult{}
for _, deploy := range deploys {
rest, s := deploy.Result()
rests = append(rests, &DeployResult{
ID: deploy.ID,
Status: s,
ServerRest: rest,
})
}
return rests
}
func (t *deployTask) exists(id int) bool {
t.mu.Lock()
defer t.mu.Unlock()
_, exists := t.deploys[id]
return exists
}
func (t *deployTask) append(id int, deploys []*Deploy) {
t.mu.Lock()
defer t.mu.Unlock()
t.deploys[id] = deploys
}
func (t *deployTask) remove(id int) {
t.mu.Lock()
defer t.mu.Unlock()
delete(t.deploys, id)
}
func (t *deployTask) get(id int) ([]*Deploy, bool) {
t.mu.Lock()
defer t.mu.Unlock()
deploys, exists := t.deploys[id]
return deploys, exists
}
func (t *deployTask) stop(id int) {
t.mu.Lock()
defer t.mu.Unlock()
deploys, exists := t.deploys[id]
if exists {
for _, deploy := range deploys {
deploy.Terminate()
}
}
}