diff --git a/internal/check/docker.go b/internal/check/docker.go new file mode 100644 index 0000000..0bf4e21 --- /dev/null +++ b/internal/check/docker.go @@ -0,0 +1,37 @@ +package check + +import ( + "context" + "os/exec" +) + +type DockerDaemonCheck struct { + runner func() error +} + +func (c *DockerDaemonCheck) Name() string { + return "Docker daemon running" +} + +func (c *DockerDaemonCheck) Run(_ context.Context) Result { + run := c.runner + if run == nil { + run = func() error { + return exec.Command("docker", "info").Run() + } + } + + if err := run(); err != nil { + return Result{ + Name: c.Name(), + Status: StatusFail, + Message: "Docker daemon is not running", + Fix: "start Docker and try again", + } + } + return Result{ + Name: c.Name(), + Status: StatusPass, + Message: "Docker daemon is running", + } +} diff --git a/internal/check/docker_test.go b/internal/check/docker_test.go new file mode 100644 index 0000000..58ef359 --- /dev/null +++ b/internal/check/docker_test.go @@ -0,0 +1,23 @@ +package check + +import ( + "context" + "errors" + "testing" +) + +func TestDockerDaemonCheck_Pass(t *testing.T) { + c := &DockerDaemonCheck{runner: func() error { return nil }} + result := c.Run(context.Background()) + if result.Status != StatusPass { + t.Errorf("expected pass, got %v: %s", result.Status, result.Message) + } +} + +func TestDockerDaemonCheck_Fail(t *testing.T) { + c := &DockerDaemonCheck{runner: func() error { return errors.New("daemon not running") }} + result := c.Run(context.Background()) + if result.Status != StatusFail { + t.Errorf("expected fail, got %v", result.Status) + } +} diff --git a/internal/check/registry.go b/internal/check/registry.go index 9faa351..de5f99d 100644 --- a/internal/check/registry.go +++ b/internal/check/registry.go @@ -26,7 +26,8 @@ func Build(stack detector.DetectedStack) []Check { } } if stack.Docker { - // add Docker checks + cs = append(cs, &BinaryCheck{Binary: "docker"}) + cs = append(cs, &DockerDaemonCheck{}) } if stack.Postgres { // add Postgres checks