fix events.

This commit is contained in:
Miroslav Šedivý
2023-11-30 00:56:01 +01:00
parent 4d2393c457
commit 7d70f7ac9b
+27 -21
View File
@@ -17,6 +17,11 @@ import (
dockerClient "github.com/docker/docker/client" dockerClient "github.com/docker/docker/client"
) )
type roomReady struct {
id string
labels map[string]string
}
type events struct { type events struct {
wg sync.WaitGroup wg sync.WaitGroup
@@ -24,7 +29,7 @@ type events struct {
config *config.Room config *config.Room
client *dockerClient.Client client *dockerClient.Client
roomsReadyCh chan string roomsReadyCh chan roomReady
roomsReadyMu sync.Mutex roomsReadyMu sync.Mutex
roomsReady map[string]struct{} roomsReady map[string]struct{}
@@ -41,17 +46,15 @@ func newEvents(config *config.Room, client *dockerClient.Client) *events {
config: config, config: config,
client: client, client: client,
roomsReadyCh: make(chan string), roomsReadyCh: make(chan roomReady),
roomsReady: make(map[string]struct{}), roomsReady: make(map[string]struct{}),
} }
} }
func (e *events) Start() { func (e *events) Start() {
ctx, cancel := context.WithCancel(context.Background()) e.ctx, e.cancel = context.WithCancel(context.Background())
e.ctx = ctx
e.cancel = cancel
msgs, errs := e.client.Events(ctx, dockerTypes.EventsOptions{ msgs, errs := e.client.Events(e.ctx, dockerTypes.EventsOptions{
Filters: filters.NewArgs( Filters: filters.NewArgs(
filters.Arg("type", "container"), filters.Arg("type", "container"),
filters.Arg("label", fmt.Sprintf("m1k1o.neko_rooms.instance=%s", e.config.InstanceName)), filters.Arg("label", fmt.Sprintf("m1k1o.neko_rooms.instance=%s", e.config.InstanceName)),
@@ -69,6 +72,9 @@ func (e *events) Start() {
for { for {
select { select {
case <-e.ctx.Done():
e.logger.Info().Msg("docker event context closed")
return
case err, ok := <-errs: case err, ok := <-errs:
if !ok { if !ok {
e.logger.Error().Msg("docker event error channel closed") e.logger.Error().Msg("docker event error channel closed")
@@ -77,25 +83,22 @@ func (e *events) Start() {
e.logger.Err(err).Msg("got docker event error") e.logger.Err(err).Msg("got docker event error")
return return
case roomId := <-e.roomsReadyCh: case room := <-e.roomsReadyCh:
e.logger.Info().Str("id", roomId).Msg("room ready") e.logger.Info().Str("id", room.id).Msg("room ready")
// ignore if room was already ready // ignore if room was already ready
if !e.setRoomReady(roomId) { if !e.setRoomReady(room.id) {
continue continue
} }
e.broadcast(types.RoomEvent{ e.broadcast(types.RoomEvent{
ID: roomId, ID: room.id,
Action: "ready", Action: "ready",
Labels: room.labels,
}) })
case msg, ok := <-msgs: case msg := <-msgs:
if !ok {
e.logger.Error().Msg("docker event message channel closed")
return
}
roomId := msg.Actor.ID[:12] roomId := msg.Actor.ID[:12]
labels := msg.Actor.Attributes
e.logger.Info(). e.logger.Info().
Str("id", roomId). Str("id", roomId).
@@ -108,7 +111,7 @@ func (e *events) Start() {
action = "created" action = "created"
case "start": case "start":
action = "started" action = "started"
e.waitForRoomReady(roomId) e.waitForRoomReady(roomId, labels)
case "health_status: healthy": case "health_status: healthy":
action = "ready" action = "ready"
// ignore if room was already ready // ignore if room was already ready
@@ -125,7 +128,7 @@ func (e *events) Start() {
e.broadcast(types.RoomEvent{ e.broadcast(types.RoomEvent{
ID: roomId, ID: roomId,
Action: action, Action: action,
Labels: msg.Actor.Attributes, Labels: labels,
}) })
} }
} }
@@ -143,7 +146,7 @@ func (e *events) Shutdown() error {
// room ready // room ready
// //
func (e *events) waitForRoomReady(roomId string) { func (e *events) waitForRoomReady(roomId string, labels map[string]string) {
e.wg.Add(1) e.wg.Add(1)
go func() { go func() {
defer e.wg.Done() defer e.wg.Done()
@@ -153,7 +156,7 @@ func (e *events) waitForRoomReady(roomId string) {
AttachStdout: true, AttachStdout: true,
Cmd: []string{ Cmd: []string{
"/bin/bash", "-c", "/bin/bash", "-c",
"for ((a=1; a<=5; a++)); do (echo > /dev/tcp/localhost/8080) >/dev/null && echo -n OK && exit; sleep 1; done; exit", fmt.Sprintf(`for ((a=1; a<=5; a++)); do (echo > /dev/tcp/localhost/%d) >/dev/null && echo -n OK && exit; sleep 1; done; exit`, frontendPort),
}, },
}) })
if err != nil { if err != nil {
@@ -176,7 +179,10 @@ func (e *events) waitForRoomReady(roomId string) {
if strings.HasSuffix(string(data), "OK") { if strings.HasSuffix(string(data), "OK") {
e.logger.Info().Str("id", roomId).Msg("room ready") e.logger.Info().Str("id", roomId).Msg("room ready")
e.roomsReadyCh <- roomId e.roomsReadyCh <- roomReady{
id: roomId,
labels: labels,
}
return return
} }