From a381259745dfcc7ad14804beaa5044e318ea6809 Mon Sep 17 00:00:00 2001 From: Philip Obiora Date: Fri, 22 Nov 2024 13:16:08 +0100 Subject: [PATCH] feat: docker requirement handling (#41) Signed-off-by: Philip-21 --- pkg/provider/provider.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/pkg/provider/provider.go b/pkg/provider/provider.go index 9dd35a4..015dc7b 100644 --- a/pkg/provider/provider.go +++ b/pkg/provider/provider.go @@ -1,6 +1,7 @@ package provider import ( + "context" "errors" "fmt" "io" @@ -23,6 +24,7 @@ import ( "github.com/daytonaio/daytona/pkg/ssh" "github.com/daytonaio/daytona/pkg/workspace" "github.com/daytonaio/daytona/pkg/workspace/project" + docker_sdk "github.com/docker/docker/client" ) type DockerProvider struct { @@ -283,6 +285,44 @@ func (p DockerProvider) getClient(targetOptionsJson string) (docker.IDockerClien }), nil } +func (p DockerProvider) CheckRequirements() (*[]provider.RequirementStatus, error) { + var results []provider.RequirementStatus + ctx := context.Background() + + cli, err := docker_sdk.NewClientWithOpts(docker_sdk.FromEnv, docker_sdk.WithAPIVersionNegotiation()) + if err != nil { + results = append(results, provider.RequirementStatus{ + Name: "Docker installed", + Met: false, + Reason: "Docker is not installed", + }) + return &results, nil + } else { + results = append(results, provider.RequirementStatus{ + Name: "Docker installed", + Met: true, + Reason: "Docker is installed", + }) + } + + // Check if Docker is running by fetching Docker info + _, err = cli.Info(ctx) + if err != nil { + results = append(results, provider.RequirementStatus{ + Name: "Docker running", + Met: false, + Reason: "Docker is not running. Error: " + err.Error(), + }) + } else { + results = append(results, provider.RequirementStatus{ + Name: "Docker running", + Met: true, + Reason: "Docker is running", + }) + } + return &results, nil +} + // If the project is running locally, we override the env vars to use the host.docker.internal address func (p DockerProvider) setLocalEnvOverride(project *project.Project) { project.EnvVars["DAYTONA_SERVER_URL"] = fmt.Sprintf("http://host.docker.internal:%d", *p.ServerPort)