mirror of
https://github.com/sablierapp/sablier.git
synced 2025-12-27 15:41:41 +01:00
* 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
49 lines
1.1 KiB
Go
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
|
|
}
|
|
}
|
|
}
|