Files
sablier/pkg/provider/docker/events.go
Alexis Couvreur b1e8fc2f20 test(docker): use testcontainers (#519)
* refactor: move app/theme to pkg/theme

* refactor

* wip

* use dockerindocker

* add providertest

* wip

* wip

* test(docker): get state  now uses dind container to test against a real provider

* test(docker): move to docker_test package

* refactor(docker): create container_inspect.go

* test(docker): add more dind test

* test(docker): event test now use docker in docker

* refactor: remove unused instance  type props

* refactor test docker

* fix instance list  sort

* stabilize test

* remove testcontainers custom config
2025-03-01 19:34:36 -05:00

49 lines
1.1 KiB
Go

package docker
import (
"context"
"errors"
"github.com/docker/docker/api/types/events"
"github.com/docker/docker/api/types/filters"
"io"
"log/slog"
"strings"
)
func (p *DockerClassicProvider) NotifyInstanceStopped(ctx context.Context, instance chan<- string) {
msgs, errs := p.Client.Events(ctx, events.ListOptions{
Filters: filters.NewArgs(
filters.Arg("scope", "local"),
filters.Arg("type", string(events.ContainerEventType)),
filters.Arg("event", "die"),
),
})
for {
select {
case msg, ok := <-msgs:
if !ok {
p.l.ErrorContext(ctx, "event stream closed")
close(instance)
return
}
// Send the container that has died to the channel
instance <- strings.TrimPrefix(msg.Actor.Attributes["name"], "/")
case err, ok := <-errs:
if !ok {
p.l.ErrorContext(ctx, "event stream closed")
close(instance)
return
}
if errors.Is(err, io.EOF) {
p.l.ErrorContext(ctx, "event stream closed")
close(instance)
return
}
p.l.ErrorContext(ctx, "event stream error", slog.Any("error", err))
case <-ctx.Done():
close(instance)
return
}
}
}