mirror of
https://github.com/m1k1o/neko-rooms.git
synced 2026-11-02 22:51:34 -06:00
fix events.
This commit is contained in:
+27
-21
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user