-
Notifications
You must be signed in to change notification settings - Fork 29
/
lifecycle.go
106 lines (85 loc) · 2.48 KB
/
lifecycle.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
package server
import (
"context"
"math/rand"
"sync"
"time"
"github.com/choria-io/go-choria/lifecycle"
)
// SetComponent sets the component name this server will report in its
// lifecycle events. "server" and "provision_mode_server" are the defaults
func (srv *Instance) SetComponent(c string) {
srv.lifecycleComponent = c
}
// PublishEvent publishes a lifecycle event to the network
func (srv *Instance) PublishEvent(e lifecycle.Event) error {
if srv.cfg.Choria.LegacyLifeCycleFormat {
e.SetFormat(lifecycle.ChoriaFormat)
} else {
e.SetFormat(lifecycle.CloudEventV1Format)
}
return lifecycle.PublishEvent(e, srv.connector)
}
func (srv *Instance) eventComponent() string {
if srv.lifecycleComponent != "" {
return srv.lifecycleComponent
}
if srv.fw.ProvisionMode() {
return "provision_mode_server"
}
return "server"
}
func (srv *Instance) publichShutdownEvent() {
event, err := lifecycle.New(lifecycle.Shutdown, lifecycle.Identity(srv.cfg.Identity), lifecycle.Component(srv.eventComponent()))
if err != nil {
srv.log.Errorf("Could not create new shutdown event: %s", err)
return
}
err = srv.PublishEvent(event)
if err != nil {
srv.log.Errorf("Could not publish shutdown event: %s", err)
}
}
func (srv *Instance) publishStartupEvent() {
event, err := lifecycle.New(lifecycle.Startup, lifecycle.Identity(srv.cfg.Identity), lifecycle.Version(srv.fw.BuildInfo().Version()), lifecycle.Component(srv.eventComponent()))
if err != nil {
srv.log.Errorf("Could not create new startup event: %s", err)
return
}
err = srv.PublishEvent(event)
if err != nil {
srv.log.Errorf("Could not publish startup event: %s", err)
}
}
func (srv *Instance) publishAliveEvents(ctx context.Context, wg *sync.WaitGroup) {
defer wg.Done()
delay := time.Duration(rand.Intn(60)) * time.Minute
event, err := lifecycle.New(lifecycle.Alive, lifecycle.Identity(srv.cfg.Identity), lifecycle.Version(srv.fw.BuildInfo().Version()), lifecycle.Component(srv.eventComponent()))
if err != nil {
srv.log.Errorf("Could not create new alive event: %s", err)
return
}
srv.log.Debugf("Sleeping %v until first alive event", delay)
select {
case <-time.NewTimer(delay).C:
case <-ctx.Done():
return
}
f := func() {
srv.log.Debug("Publishing alive event")
err = srv.PublishEvent(event)
if err != nil {
srv.log.Errorf("Could not publish startup event: %s", err)
}
}
ticker := time.NewTicker(60 * time.Minute)
f()
for {
select {
case <-ticker.C:
f()
case <-ctx.Done():
return
}
}
}