diff --git a/go.mod b/go.mod index b9ef9b4..b75710f 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/daytonaio/daytona-provider-docker go 1.22.2 require ( - github.com/daytonaio/daytona v0.13.0 + github.com/daytonaio/daytona v0.19.0 github.com/docker/docker v26.1.0+incompatible github.com/hashicorp/go-hclog v1.5.0 github.com/hashicorp/go-plugin v1.6.0 @@ -43,6 +43,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/term v0.5.0 // indirect + github.com/morikuni/aec v1.0.0 // indirect github.com/oklog/run v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc5 // indirect diff --git a/go.sum b/go.sum index 0438633..e53da03 100644 --- a/go.sum +++ b/go.sum @@ -648,14 +648,16 @@ github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWH github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidmz/go-pageant v1.0.2 h1:bPblRCh5jGU+Uptpz6LgMZGD5hJoOt7otgT454WvHn0= github.com/davidmz/go-pageant v1.0.2/go.mod h1:P2EDDnMqIwG5Rrp05dTRITj9z2zpGcD9efWSkTNKLIE= -github.com/daytonaio/daytona v0.13.0 h1:qrTYkK40YvLTNtoNCzlDvZpTCAz8ulYpo3mSA4KxIho= -github.com/daytonaio/daytona v0.13.0/go.mod h1:PankzsAQ3cyfW5pCj/oxDGZOnbzyrVkjRdQKQRztEDc= +github.com/daytonaio/daytona v0.19.0 h1:jzCIGykCE3lMrAv2nfyHbj7iEAIuGvspPwzB5hL3XGg= +github.com/daytonaio/daytona v0.19.0/go.mod h1:sJ4XQY8omQIW9wn37rtY+gyzxVmE1CupsG4QBD085u0= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/docker v26.1.0+incompatible h1:W1G9MPNbskA6VZWL7b3ZljTh0pXI68FpINx0GKaOdaM= diff --git a/pkg/provider/provider.go b/pkg/provider/provider.go index 1a71ee2..63be4b8 100644 --- a/pkg/provider/provider.go +++ b/pkg/provider/provider.go @@ -2,7 +2,9 @@ package provider import ( "errors" + "fmt" "io" + "net/url" "os" "path" "runtime" @@ -20,13 +22,15 @@ import ( ) type DockerProvider struct { - BasePath *string - ServerDownloadUrl *string - ServerVersion *string - ServerUrl *string - ServerApiUrl *string - LogsDir *string - RemoteSockDir string + BasePath *string + DaytonaDownloadUrl *string + DaytonaVersion *string + ServerUrl *string + ApiUrl *string + LogsDir *string + ApiPort *uint32 + ServerPort *uint32 + RemoteSockDir string } func (p *DockerProvider) Initialize(req provider.InitializeProviderRequest) (*provider_util.Empty, error) { @@ -51,11 +55,13 @@ func (p *DockerProvider) Initialize(req provider.InitializeProviderRequest) (*pr } p.BasePath = &req.BasePath - p.ServerDownloadUrl = &req.ServerDownloadUrl - p.ServerVersion = &req.ServerVersion + p.DaytonaDownloadUrl = &req.DaytonaDownloadUrl + p.DaytonaVersion = &req.DaytonaVersion p.ServerUrl = &req.ServerUrl - p.ServerApiUrl = &req.ServerApiUrl + p.ApiUrl = &req.ApiUrl p.LogsDir = &req.LogsDir + p.ApiPort = &req.ApiPort + p.ServerPort = &req.ServerPort return new(provider_util.Empty), nil } @@ -131,7 +137,7 @@ func (p DockerProvider) GetWorkspaceInfo(workspaceReq *provider.WorkspaceRequest } func (p DockerProvider) CreateProject(projectReq *provider.ProjectRequest) (*provider_util.Empty, error) { - if p.ServerDownloadUrl == nil { + if p.DaytonaDownloadUrl == nil { return new(provider_util.Empty), errors.New("ServerDownloadUrl not set. Did you forget to call Initialize?") } @@ -148,7 +154,19 @@ func (p DockerProvider) CreateProject(projectReq *provider.ProjectRequest) (*pro return new(provider_util.Empty), err } - err = dockerClient.CreateProject(projectReq.Project, *p.ServerDownloadUrl, projectReq.ContainerRegistry, logWriter) + downloadUrl := *p.DaytonaDownloadUrl + if projectReq.Project.Target == "local" { + p.setLocalEnvOverride(projectReq.Project) + parsed, err := url.Parse(downloadUrl) + if err != nil { + return new(provider_util.Empty), err + } + parsed.Host = fmt.Sprintf("host.docker.internal:%d", *p.ApiPort) + parsed.Scheme = "http" + downloadUrl = parsed.String() + } + + err = dockerClient.CreateProject(projectReq.Project, downloadUrl, projectReq.ContainerRegistry, logWriter) if err != nil { return new(provider_util.Empty), err } @@ -219,3 +237,15 @@ func (p DockerProvider) getClient(targetOptionsJson string) (docker.IDockerClien ApiClient: client, }), nil } + +// If the project is running locally, we override the env vars to use the host.docker.internal address +func (p DockerProvider) setLocalEnvOverride(project *workspace.Project) { + envOverride := workspace.GetProjectEnvVars(project, fmt.Sprintf("http://host.docker.internal:%d", *p.ApiPort), fmt.Sprintf("http://host.docker.internal:%d", *p.ServerPort)) + + for k := range project.EnvVars { + override, ok := envOverride[k] + if ok { + project.EnvVars[k] = override + } + } +} diff --git a/pkg/provider/provider_test.go b/pkg/provider/provider_test.go index 990cb79..dee94c7 100644 --- a/pkg/provider/provider_test.go +++ b/pkg/provider/provider_test.go @@ -160,11 +160,13 @@ func getDockerClient() *docker_client.Client { func init() { _, err := dockerProvider.Initialize(provider.InitializeProviderRequest{ - BasePath: "/tmp/workspaces", - ServerDownloadUrl: "https://download.daytona.io/daytona/get-server.sh", - ServerVersion: "latest", - ServerUrl: "", - ServerApiUrl: "", + BasePath: "/tmp/workspaces", + DaytonaDownloadUrl: "https://download.daytona.io/daytona/get-server.sh", + DaytonaVersion: "latest", + ServerUrl: "", + ApiUrl: "", + ServerPort: 0, + ApiPort: 0, }) if err != nil { panic(err)