forked from cloudfoundry-attic/bosh-init
-
Notifications
You must be signed in to change notification settings - Fork 0
/
stage.go
73 lines (61 loc) · 1.18 KB
/
stage.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
package eventlogger
type SkippedStepError struct {
msg string
}
func NewSkippedStepError(msg string) SkippedStepError {
return SkippedStepError{
msg: msg,
}
}
func (e SkippedStepError) Error() string {
return e.msg
}
type Stage interface {
NewStep(string) Step
PerformStep(string, func() error) error
Name() string
Start()
Finish()
}
type stage struct {
name string
eventLogger EventLogger
}
func NewStage(name string, eventLogger EventLogger) Stage {
return &stage{
name: name,
eventLogger: eventLogger,
}
}
func (s *stage) NewStep(stepName string) Step {
step := &step{
name: stepName,
stage: s,
eventLogger: s.eventLogger,
}
return step
}
func (s *stage) PerformStep(stepName string, stepFunc func() error) error {
step := s.NewStep(stepName)
step.Start()
err := stepFunc()
if err != nil {
if skippedErr, ok := err.(SkippedStepError); ok {
step.Skip(skippedErr.Error())
return nil
}
step.Fail(err.Error())
return err
}
step.Finish()
return nil
}
func (s *stage) Name() string {
return s.name
}
func (s *stage) Start() {
s.eventLogger.StartStage(s.name)
}
func (s *stage) Finish() {
s.eventLogger.FinishStage(s.name)
}