From 0ccfe67b8196bde4249a90f68429a9335db89198 Mon Sep 17 00:00:00 2001 From: Ivan Dagelic Date: Fri, 24 Jan 2025 12:04:32 +0100 Subject: [PATCH] feat: workspace management refactor (#55) Signed-off-by: Toma Puljak Co-authored-by: Ivan Dagelic --- README.md | 27 ++-- go.mod | 43 ++++-- go.sum | 107 ++++++++++---- main.go | 4 +- pkg/client/client.go | 8 +- pkg/provider/create.go | 94 ++++++------ pkg/provider/provider.go | 217 +++++++++++++++------------- pkg/provider/provider_test.go | 118 +++++++-------- pkg/ssh_tunnel/util/forward_unix.go | 2 +- pkg/types/metadata.go | 2 +- pkg/types/targets.go | 50 +++---- 11 files changed, 384 insertions(+), 288 deletions(-) diff --git a/README.md b/README.md index 985179e..1704032 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,6 @@ -

Daytona Docker Provider

This repository is the home of the Daytona Docker Provider. @@ -33,26 +32,26 @@ This repository is the home of the Twitter

-The Docker Provider allows Daytona to create workspace projects as Docker containers on your local or remote machine. It is a default provider in Daytona, which means it is installed with every server by default. +The Docker Provider allows Daytona to create workspaces as Docker containers on your local or remote machine. It is a default provider in Daytona, which means it is installed with every server by default. ## Target Options -| Property | Type | Optional | DefaultValue | InputMasked | DisabledPredicate | -|------------------------- |---------- |---------- |----------------------------- |------------- |------------------- | -| Sock Path | String | true | /var/run/docker.sock | false | | -| Remote Hostname | String | true | | false | ^local$ | -| Remote Port | Int | true | 22 | false | ^local$ | -| Remote User | String | true | | false | ^local$ | -| Remote Password | String | true | | true | ^local$ | -| Remote Private Key Path | FilePath | true | | false | ^local$ | +| Property | Type | Optional | DefaultValue | InputMasked | DisabledPredicate | +| ----------------------- | -------- | -------- | -------------------- | ----------- | ----------------- | +| Sock Path | String | true | /var/run/docker.sock | false | | +| Remote Hostname | String | true | | false | ^local$ | +| Remote Port | Int | true | 22 | false | ^local$ | +| Remote User | String | true | | false | ^local$ | +| Remote Password | String | true | | true | ^local$ | +| Remote Private Key Path | FilePath | true | | false | ^local$ | ### Preset Targets #### Local -| Property | Value | -|----------------- |----------------------------- | -| Sock Path | /var/run/docker.sock | +| Property | Value | +| --------- | -------------------- | +| Sock Path | /var/run/docker.sock | ## Code of Conduct @@ -72,4 +71,4 @@ Afterwards, navigate to the [contributing guide](CONTRIBUTING.md) to get started ## Questions For more information on how to use and develop Daytona, talk to us on -[Slack](https://go.daytona.io/slack). \ No newline at end of file +[Slack](https://go.daytona.io/slack). diff --git a/go.mod b/go.mod index 84b3153..8bd60ba 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,11 @@ go 1.23.0 toolchain go1.23.1 +// samber/lo v1.47.0 - required by headscale breaks frp +replace github.com/samber/lo => github.com/samber/lo v1.39.0 + require ( - github.com/daytonaio/daytona v0.50.0 + github.com/daytonaio/daytona v0.52.0 github.com/docker/docker v27.2.0+incompatible github.com/hashicorp/go-hclog v1.6.3 github.com/hashicorp/go-plugin v1.6.0 @@ -21,8 +24,9 @@ require ( gitee.com/openeuler/go-gitee v0.0.0-20220530104019-3af895bc380c // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/ProtonMail/go-crypto v1.0.0 // indirect + github.com/ProtonMail/go-crypto v1.1.3 // indirect github.com/antihax/optional v1.0.0 // indirect + github.com/atotto/clipboard v0.1.4 // indirect github.com/aws/aws-sdk-go v1.54.19 // indirect github.com/aws/aws-sdk-go-v2 v1.30.4 // indirect github.com/aws/aws-sdk-go-v2/config v1.27.26 // indirect @@ -39,22 +43,33 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 // indirect github.com/aws/smithy-go v1.20.4 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/catppuccin/go v0.2.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/charmbracelet/bubbles v0.20.0 // indirect + github.com/charmbracelet/bubbletea v1.1.0 // indirect + github.com/charmbracelet/huh v0.6.0 // indirect + github.com/charmbracelet/lipgloss v0.13.0 // indirect + github.com/charmbracelet/x/ansi v0.2.3 // indirect + github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 // indirect + github.com/charmbracelet/x/term v0.2.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/compose-spec/compose-go/v2 v2.1.3 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/compose-spec/compose-go/v2 v2.4.1 // indirect + github.com/cyphar/filepath-securejoin v0.2.5 // indirect github.com/davidmz/go-pageant v1.0.2 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect + github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/fatih/color v1.17.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/gfleury/go-bitbucket-v1 v0.0.0-20240131155556-0b41d7863037 // indirect github.com/go-fed/httpsig v1.1.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.1-0.20240427054813-8453aa90c6ec // indirect - github.com/go-git/go-git/v5 v5.12.1-0.20240617075238-c127d1b35535 // indirect + github.com/go-git/go-billy/v5 v5.6.0 // indirect + github.com/go-git/go-git/v5 v5.13.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect @@ -67,6 +82,7 @@ require ( github.com/google/go-github v17.0.0+incompatible // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-version v1.7.0 // indirect @@ -75,23 +91,33 @@ require ( github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/ktrysmt/go-bitbucket v0.9.76 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-localereader v0.0.1 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mattn/go-shellwords v1.0.12 // indirect github.com/microsoft/azure-devops-go-api/azuredevops v1.0.0-b5 // indirect github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77 // indirect + github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect 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/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a // 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 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/sahilm/fuzzy v0.1.1 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect - github.com/skeema/knownhosts v1.2.2 // indirect + github.com/skeema/knownhosts v1.3.0 // indirect github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/tklauser/go-sysconf v0.3.13 // indirect @@ -110,8 +136,7 @@ require ( go.opentelemetry.io/otel/trace v1.26.0 // indirect go.opentelemetry.io/proto/otlp v1.2.0 // indirect golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 // indirect - golang.org/x/mod v0.20.0 // indirect - golang.org/x/net v0.28.0 // indirect + golang.org/x/net v0.33.0 // indirect golang.org/x/oauth2 v0.22.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/go.sum b/go.sum index d570153..2a64ac8 100644 --- a/go.sum +++ b/go.sum @@ -608,12 +608,14 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg6 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= +github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= -github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= +github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -628,6 +630,8 @@ github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4x github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.30.4 h1:frhcagrVNrzmT95RJImMHgabt99vkXGslubDaDagTk8= @@ -660,11 +664,14 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 h1:ZsDKRLXGWHk8WdtyYMoGNO7bTudr github.com/aws/aws-sdk-go-v2/service/sts v1.30.3/go.mod h1:zwySh8fpFyXp9yOr/KVzxOl8SRqgf/IDw5aUt9UKFcQ= github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/catppuccin/go v0.2.0 h1:ktBeIrIP42b/8FGiScP9sgrWOss3lw0Z5SktRoithGA= +github.com/catppuccin/go v0.2.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -673,11 +680,24 @@ github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= +github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= +github.com/charmbracelet/bubbletea v1.1.0 h1:FjAl9eAL3HBCHenhz/ZPjkKdScmaS5SK69JAK2YJK9c= +github.com/charmbracelet/bubbletea v1.1.0/go.mod h1:9Ogk0HrdbHolIKHdjfFpyXJmiCzGwy+FesYkZr7hYU4= +github.com/charmbracelet/huh v0.6.0 h1:mZM8VvZGuE0hoDXq6XLxRtgfWyTI3b2jZNKh0xWmax8= +github.com/charmbracelet/huh v0.6.0/go.mod h1:GGNKeWCeNzKpEOh/OJD8WBwTQjV3prFAtQPpLv+AVwU= +github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw= +github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY= +github.com/charmbracelet/x/ansi v0.2.3 h1:VfFN0NUpcjBRd4DnKfRaIRo53KRgey/nhOoEqosGDEY= +github.com/charmbracelet/x/ansi v0.2.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 h1:qko3AQ4gK1MTS/de7F5hPGx6/k1u0w4TeYmBFwzYVP4= +github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0/go.mod h1:pBhA0ybfXv6hDjQUZ7hk1lVxBiUbupdw5R31yPUViVQ= +github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0= +github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -693,24 +713,24 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/compose-spec/compose-go/v2 v2.1.3 h1:bD67uqLuL/XgkAK6ir3xZvNLFPxPScEi1KW7R5esrLE= -github.com/compose-spec/compose-go/v2 v2.1.3/go.mod h1:lFN0DrMxIncJGYAXTfWuajfwj5haBJqrBkarHcnjJKc= +github.com/compose-spec/compose-go/v2 v2.4.1 h1:tEg6Qn/9LZnKg42fZlFmxN4lxSqnCvsiG5TXnxzvI4c= +github.com/compose-spec/compose-go/v2 v2.4.1/go.mod h1:lFN0DrMxIncJGYAXTfWuajfwj5haBJqrBkarHcnjJKc= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.23 h1:4M6+isWdcStXEf15G/RbrMPOQj1dZ7HPZCGwE4kOeP0= github.com/creack/pty v1.1.23/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= +github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= 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.50.0 h1:gDdq5R4QwVY79F+pXClcDRpZVVWXqYSNyUhLZp1Nzhg= -github.com/daytonaio/daytona v0.50.0/go.mod h1:MDXtRJKVomMz5mLg1MVBZQhBqk7EJs4qfMKgylyMzHI= +github.com/daytonaio/daytona v0.52.0 h1:tv3YR7C088B8fTNEgSLMvBRoLnkxuv79JhzavCPBA48= +github.com/daytonaio/daytona v0.52.0/go.mod h1:1i1orDjsFpAelzaGeYeaeIyykW2raGdRqZjWUwu53LQ= 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 v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= @@ -721,8 +741,10 @@ github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/elazarl/goproxy v1.2.1 h1:njjgvO6cRG9rIqN2ebkqy6cQz2Njkx7Fsfv/zIZqgug= +github.com/elazarl/goproxy v1.2.1/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -740,6 +762,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= @@ -752,8 +776,8 @@ github.com/gfleury/go-bitbucket-v1 v0.0.0-20240131155556-0b41d7863037/go.mod h1: github.com/gfleury/go-bitbucket-v1/test/bb-mock-server v0.0.0-20230825095122-9bc1711434ab h1:BeG9dDWckFi/p5Gvqq3wTEDXsUV4G6bdvjEHMOT2B8E= github.com/gfleury/go-bitbucket-v1/test/bb-mock-server v0.0.0-20230825095122-9bc1711434ab/go.mod h1:VssB0kb1cETNaFFC/0mHVCj+7i5TS2xraYq+tl9JLwE= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= -github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= @@ -763,12 +787,12 @@ github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2H github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.1-0.20240427054813-8453aa90c6ec h1:JtjPVUU/+C1OaEXG+ojNfspw7t7Y30jiyr6zsXA8Eco= -github.com/go-git/go-billy/v5 v5.5.1-0.20240427054813-8453aa90c6ec/go.mod h1:bmsuIkj+yaSISZdLRNCLRaSiWnwDatBN1b62vLkXn24= +github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8= +github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.12.1-0.20240617075238-c127d1b35535 h1:JDd/LIwWwltun7EqGK2dMMuPFyuIBOgDslh6wKR4zzk= -github.com/go-git/go-git/v5 v5.12.1-0.20240617075238-c127d1b35535/go.mod h1:VP749I36z+bJ9YP1Fu2/IQc3Vt/fKM+r957BooWKlk0= +github.com/go-git/go-git/v5 v5.13.0 h1:vLn5wlGIh/X78El6r3Jr+30W16Blk0CTcxTYcYPWi5E= +github.com/go-git/go-git/v5 v5.13.0/go.mod h1:Wjo7/JyVKtQgUNdXYXIepzWfJQkUEIGvkvVkiXRR/zw= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -910,6 +934,8 @@ github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= @@ -968,6 +994,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/ktrysmt/go-bitbucket v0.9.76 h1:/oXA8TXtpAtNDPqOpwixg6J7xXpoUvnoduhOCJ7/fWo= github.com/ktrysmt/go-bitbucket v0.9.76/go.mod h1:+wfH5IgKupLt9U0Voy1nH3YX+kNVtddeyeW8bqYXCto= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= @@ -981,6 +1011,10 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= @@ -990,6 +1024,8 @@ github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcs github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77 h1:7GoSOOW2jpsfkntVKaS2rAr1TJqfcxotyaUcuxoZSzg= github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= +github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -999,10 +1035,16 @@ github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= +github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -1026,15 +1068,20 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA= +github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= @@ -1042,8 +1089,8 @@ github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMT github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= -github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= +github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= @@ -1068,8 +1115,8 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= @@ -1136,7 +1183,6 @@ golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= @@ -1203,8 +1249,6 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= -golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1267,8 +1311,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1372,6 +1416,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/main.go b/main.go index c12fa55..500f1a4 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,7 @@ import ( "os" "github.com/daytonaio/daytona/pkg/provider" - "github.com/daytonaio/daytona/pkg/provider/manager" + "github.com/daytonaio/daytona/pkg/runner/providermanager" "github.com/hashicorp/go-hclog" hc_plugin "github.com/hashicorp/go-plugin" @@ -18,7 +18,7 @@ func main() { JSONFormat: true, }) hc_plugin.Serve(&hc_plugin.ServeConfig{ - HandshakeConfig: manager.ProviderHandshakeConfig, + HandshakeConfig: providermanager.ProviderHandshakeConfig, Plugins: map[string]hc_plugin.Plugin{ "docker-provider": &provider.ProviderPlugin{Impl: &p.DockerProvider{}}, }, diff --git a/pkg/client/client.go b/pkg/client/client.go index 04f6c20..1029cee 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -16,7 +16,7 @@ import ( log "github.com/sirupsen/logrus" ) -func GetClient(targetOptions types.TargetOptions, sockDir string) (*client.Client, error) { +func GetClient(targetOptions types.TargetConfigOptions, sockDir string) (*client.Client, error) { if targetOptions.RemoteHostname == nil { return getLocalClient(targetOptions) } @@ -24,7 +24,7 @@ func GetClient(targetOptions types.TargetOptions, sockDir string) (*client.Clien return getRemoteClient(targetOptions, sockDir) } -func getLocalClient(targetOptions types.TargetOptions) (*client.Client, error) { +func getLocalClient(targetOptions types.TargetConfigOptions) (*client.Client, error) { schema := "unix://" if runtime.GOOS == "windows" { schema = "npipe://" @@ -47,7 +47,7 @@ func getLocalClient(targetOptions types.TargetOptions) (*client.Client, error) { return cli, nil } -func getRemoteClient(targetOptions types.TargetOptions, sockDir string) (*client.Client, error) { +func getRemoteClient(targetOptions types.TargetConfigOptions, sockDir string) (*client.Client, error) { localSockPath, err := forwardDockerSock(targetOptions, sockDir) if err != nil { return nil, err @@ -61,7 +61,7 @@ func getRemoteClient(targetOptions types.TargetOptions, sockDir string) (*client return cli, nil } -func forwardDockerSock(targetOptions types.TargetOptions, sockDir string) (string, error) { +func forwardDockerSock(targetOptions types.TargetConfigOptions, sockDir string) (string, error) { localSockPath := path.Join(sockDir, fmt.Sprintf("daytona-%s-docker.sock", strings.ReplaceAll(*targetOptions.RemoteHostname, ".", "-"))) if _, err := os.Stat(path.Dir(localSockPath)); err != nil { diff --git a/pkg/provider/create.go b/pkg/provider/create.go index 8bc81fc..5e82924 100644 --- a/pkg/provider/create.go +++ b/pkg/provider/create.go @@ -5,6 +5,7 @@ import ( "io" log_writers "github.com/daytonaio/daytona-provider-docker/internal/log" + "github.com/daytonaio/daytona-provider-docker/pkg/types" "github.com/daytonaio/daytona/pkg/docker" "github.com/daytonaio/daytona/pkg/logs" @@ -13,26 +14,34 @@ import ( "github.com/daytonaio/daytona/pkg/ssh" ) -func (p DockerProvider) CreateWorkspace(workspaceReq *provider.WorkspaceRequest) (*provider_util.Empty, error) { +func (p DockerProvider) CreateTarget(targetReq *provider.TargetRequest) (*provider_util.Empty, error) { logWriter := io.MultiWriter(&log_writers.InfoLogWriter{}) - if p.LogsDir != nil { - loggerFactory := logs.NewLoggerFactory(p.LogsDir, nil) - wsLogWriter := loggerFactory.CreateWorkspaceLogger(workspaceReq.Workspace.Id, logs.LogSourceProvider) - logWriter = io.MultiWriter(&log_writers.InfoLogWriter{}, wsLogWriter) - defer wsLogWriter.Close() + if p.TargetLogsDir != nil { + loggerFactory := logs.NewLoggerFactory(logs.LoggerFactoryConfig{ + LogsDir: *p.TargetLogsDir, + ApiUrl: p.ApiUrl, + ApiKey: p.ApiKey, + ApiBasePath: &logs.ApiBasePathTarget, + }) + targetLogWriter, err := loggerFactory.CreateLogger(targetReq.Target.Id, targetReq.Target.Name, logs.LogSourceProvider) + if err != nil { + return new(provider_util.Empty), err + } + logWriter = io.MultiWriter(&log_writers.InfoLogWriter{}, targetLogWriter) + defer targetLogWriter.Close() } - dockerClient, err := p.getClient(workspaceReq.TargetOptions) + dockerClient, err := p.getClient(targetReq.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } - workspaceDir, err := p.getWorkspaceDir(workspaceReq) + targetDir, err := p.getTargetDir(targetReq) if err != nil { return new(provider_util.Empty), err } - sshClient, err := p.getSshClient(workspaceReq.Workspace.Target, workspaceReq.TargetOptions) + sshClient, err := p.getSshClient(targetReq.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } @@ -40,60 +49,63 @@ func (p DockerProvider) CreateWorkspace(workspaceReq *provider.WorkspaceRequest) defer sshClient.Close() } - return new(provider_util.Empty), dockerClient.CreateWorkspace(workspaceReq.Workspace, workspaceDir, logWriter, sshClient) + return new(provider_util.Empty), dockerClient.CreateTarget(targetReq.Target, targetDir, logWriter, sshClient) } -func (p DockerProvider) CreateProject(projectReq *provider.ProjectRequest) (*provider_util.Empty, error) { +func (p DockerProvider) CreateWorkspace(workspaceReq *provider.WorkspaceRequest) (*provider_util.Empty, error) { if p.DaytonaDownloadUrl == nil { return new(provider_util.Empty), errors.New("ServerDownloadUrl not set. Did you forget to call Initialize?") } logWriter := io.MultiWriter(&log_writers.InfoLogWriter{}) - if p.LogsDir != nil { - loggerFactory := logs.NewLoggerFactory(p.LogsDir, nil) - projectLogWriter := loggerFactory.CreateProjectLogger(projectReq.Project.WorkspaceId, projectReq.Project.Name, logs.LogSourceProvider) - logWriter = io.MultiWriter(&log_writers.InfoLogWriter{}, projectLogWriter) - defer projectLogWriter.Close() + if p.WorkspaceLogsDir != nil { + loggerFactory := logs.NewLoggerFactory(logs.LoggerFactoryConfig{ + LogsDir: *p.WorkspaceLogsDir, + ApiUrl: p.ApiUrl, + ApiKey: p.ApiKey, + ApiBasePath: &logs.ApiBasePathWorkspace, + }) + workspaceLogWriter, err := loggerFactory.CreateLogger(workspaceReq.Workspace.Id, workspaceReq.Workspace.Name, logs.LogSourceProvider) + if err != nil { + return new(provider_util.Empty), err + } + logWriter = io.MultiWriter(&log_writers.InfoLogWriter{}, workspaceLogWriter) + defer workspaceLogWriter.Close() } - dockerClient, err := p.getClient(projectReq.TargetOptions) + dockerClient, err := p.getClient(workspaceReq.Workspace.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } - projectDir, err := p.getProjectDir(projectReq) + workspaceDir, err := p.getWorkspaceDir(workspaceReq) + if err != nil { + return new(provider_util.Empty), err + } + + _, isLocal, err := types.ParseTargetConfigOptions(workspaceReq.Workspace.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } var sshClient *ssh.Client - if projectReq.Project.Target != "local" { - sshClient, err = p.getSshClient(projectReq.Project.Target, projectReq.TargetOptions) + if !isLocal { + sshClient, err = p.getSshClient(workspaceReq.Workspace.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } - defer sshClient.Close() + if sshClient != nil { + defer sshClient.Close() + } } - // TODO: think about how to handle this since the project is cloned in dockerClient.CreateProject so we can't detect the builder type here - // else { - // builderType, err := detect.DetectProjectBuilderType(projectReq.Project.BuildConfig, projectDir, nil) - // if err != nil { - // return new(provider_util.Empty), err - // } - - // if builderType != detect.BuilderTypeDevcontainer { - // p.setLocalEnvOverride(projectReq.Project) - // } - // } - return new(provider_util.Empty), dockerClient.CreateProject(&docker.CreateProjectOptions{ - Project: projectReq.Project, - ProjectDir: projectDir, - ContainerRegistry: projectReq.ContainerRegistry, - BuilderImage: projectReq.BuilderImage, - BuilderContainerRegistry: projectReq.BuilderContainerRegistry, - LogWriter: logWriter, - Gpc: projectReq.GitProviderConfig, - SshClient: sshClient, + return new(provider_util.Empty), dockerClient.CreateWorkspace(&docker.CreateWorkspaceOptions{ + Workspace: workspaceReq.Workspace, + WorkspaceDir: workspaceDir, + ContainerRegistries: workspaceReq.ContainerRegistries, + BuilderImage: workspaceReq.BuilderImage, + LogWriter: logWriter, + Gpc: workspaceReq.GitProviderConfig, + SshClient: sshClient, }) } diff --git a/pkg/provider/provider.go b/pkg/provider/provider.go index 015dc7b..7abb524 100644 --- a/pkg/provider/provider.go +++ b/pkg/provider/provider.go @@ -14,16 +14,16 @@ import ( internal "github.com/daytonaio/daytona-provider-docker/internal" log_writers "github.com/daytonaio/daytona-provider-docker/internal/log" "github.com/daytonaio/daytona-provider-docker/pkg/client" - provider_types "github.com/daytonaio/daytona-provider-docker/pkg/types" + "github.com/daytonaio/daytona-provider-docker/pkg/types" "github.com/daytonaio/daytona/pkg/build/detect" + "github.com/daytonaio/daytona/pkg/common" "github.com/daytonaio/daytona/pkg/docker" "github.com/daytonaio/daytona/pkg/logs" + "github.com/daytonaio/daytona/pkg/models" "github.com/daytonaio/daytona/pkg/provider" provider_util "github.com/daytonaio/daytona/pkg/provider/util" "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" ) @@ -33,7 +33,9 @@ type DockerProvider struct { DaytonaVersion *string ServerUrl *string ApiUrl *string - LogsDir *string + ApiKey *string + TargetLogsDir *string + WorkspaceLogsDir *string ApiPort *uint32 ServerPort *uint32 RemoteSockDir string @@ -65,63 +67,56 @@ func (p *DockerProvider) Initialize(req provider.InitializeProviderRequest) (*pr p.DaytonaVersion = &req.DaytonaVersion p.ServerUrl = &req.ServerUrl p.ApiUrl = &req.ApiUrl - p.LogsDir = &req.LogsDir + p.ApiKey = req.ApiKey + p.TargetLogsDir = &req.TargetLogsDir + p.WorkspaceLogsDir = &req.WorkspaceLogsDir p.ApiPort = &req.ApiPort p.ServerPort = &req.ServerPort return new(provider_util.Empty), nil } -func (p DockerProvider) GetInfo() (provider.ProviderInfo, error) { +func (p DockerProvider) GetInfo() (models.ProviderInfo, error) { label := "Docker" - return provider.ProviderInfo{ - Name: "docker-provider", - Label: &label, - Version: internal.Version, + return models.ProviderInfo{ + Name: "docker-provider", + Label: &label, + AgentlessTarget: true, + Version: internal.Version, + TargetConfigManifest: *types.GetTargetConfigManifest(), }, nil } -func (p DockerProvider) GetTargetManifest() (*provider.ProviderTargetManifest, error) { - return provider_types.GetTargetManifest(), nil -} - -func (p DockerProvider) GetPresetTargets() (*[]provider.ProviderTarget, error) { - info, err := p.GetInfo() - if err != nil { - return nil, err - } - - presetTargets := []provider.ProviderTarget{ +func (p DockerProvider) GetPresetTargetConfigs() (*[]provider.TargetConfig, error) { + return &[]provider.TargetConfig{ { - Name: "local", - ProviderInfo: info, - Options: "{\n\t\"Sock Path\": \"/var/run/docker.sock\"\n}", + Name: "local", + Options: "{\n\t\"Sock Path\": \"/var/run/docker.sock\"\n}", }, - } - return &presetTargets, nil + }, nil } -func (p DockerProvider) StartWorkspace(workspaceReq *provider.WorkspaceRequest) (*provider_util.Empty, error) { +func (p DockerProvider) StartTarget(targetReq *provider.TargetRequest) (*provider_util.Empty, error) { return new(provider_util.Empty), nil } -func (p DockerProvider) StopWorkspace(workspaceReq *provider.WorkspaceRequest) (*provider_util.Empty, error) { +func (p DockerProvider) StopTarget(targetReq *provider.TargetRequest) (*provider_util.Empty, error) { return new(provider_util.Empty), nil } -func (p DockerProvider) DestroyWorkspace(workspaceReq *provider.WorkspaceRequest) (*provider_util.Empty, error) { - dockerClient, err := p.getClient(workspaceReq.TargetOptions) +func (p DockerProvider) DestroyTarget(targetReq *provider.TargetRequest) (*provider_util.Empty, error) { + dockerClient, err := p.getClient(targetReq.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } - workspaceDir, err := p.getWorkspaceDir(workspaceReq) + targetDir, err := p.getTargetDir(targetReq) if err != nil { return new(provider_util.Empty), err } - sshClient, err := p.getSshClient(workspaceReq.Workspace.Target, workspaceReq.TargetOptions) + sshClient, err := p.getSshClient(targetReq.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } @@ -129,7 +124,7 @@ func (p DockerProvider) DestroyWorkspace(workspaceReq *provider.WorkspaceRequest defer sshClient.Close() } - err = dockerClient.DestroyWorkspace(workspaceReq.Workspace, workspaceDir, sshClient) + err = dockerClient.DestroyTarget(targetReq.Target, targetDir, sshClient) if err != nil { return new(provider_util.Empty), err } @@ -137,39 +132,52 @@ func (p DockerProvider) DestroyWorkspace(workspaceReq *provider.WorkspaceRequest return new(provider_util.Empty), nil } -func (p DockerProvider) GetWorkspaceInfo(workspaceReq *provider.WorkspaceRequest) (*workspace.WorkspaceInfo, error) { - dockerClient, err := p.getClient(workspaceReq.TargetOptions) +func (p DockerProvider) GetTargetProviderMetadata(targetReq *provider.TargetRequest) (string, error) { + dockerClient, err := p.getClient(targetReq.Target.TargetConfig.Options) if err != nil { - return nil, err + return "", err } - return dockerClient.GetWorkspaceInfo(workspaceReq.Workspace) + return dockerClient.GetTargetProviderMetadata(targetReq.Target) } -func (p DockerProvider) StartProject(projectReq *provider.ProjectRequest) (*provider_util.Empty, error) { - dockerClient, err := p.getClient(projectReq.TargetOptions) +func (p DockerProvider) StartWorkspace(workspaceReq *provider.WorkspaceRequest) (*provider_util.Empty, error) { + dockerClient, err := p.getClient(workspaceReq.Workspace.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } - projectDir, err := p.getProjectDir(projectReq) + workspaceDir, err := p.getWorkspaceDir(workspaceReq) if err != nil { return new(provider_util.Empty), err } logWriter := io.MultiWriter(&log_writers.InfoLogWriter{}) - if p.LogsDir != nil { - loggerFactory := logs.NewLoggerFactory(p.LogsDir, nil) - projectLogWriter := loggerFactory.CreateProjectLogger(projectReq.Project.WorkspaceId, projectReq.Project.Name, logs.LogSourceProvider) - logWriter = io.MultiWriter(&log_writers.InfoLogWriter{}, projectLogWriter) - defer projectLogWriter.Close() + if p.WorkspaceLogsDir != nil { + loggerFactory := logs.NewLoggerFactory(logs.LoggerFactoryConfig{ + LogsDir: *p.WorkspaceLogsDir, + ApiUrl: p.ApiUrl, + ApiKey: p.ApiKey, + ApiBasePath: &logs.ApiBasePathWorkspace, + }) + workspaceLogWriter, err := loggerFactory.CreateLogger(workspaceReq.Workspace.Id, workspaceReq.Workspace.Name, logs.LogSourceProvider) + if err != nil { + return new(provider_util.Empty), err + } + logWriter = io.MultiWriter(&log_writers.InfoLogWriter{}, workspaceLogWriter) + defer workspaceLogWriter.Close() } downloadUrl := *p.DaytonaDownloadUrl var sshClient *ssh.Client - if projectReq.Project.Target == "local" { - builderType, err := detect.DetectProjectBuilderType(projectReq.Project.BuildConfig, projectDir, nil) + _, isLocal, err := types.ParseTargetConfigOptions(workspaceReq.Workspace.Target.TargetConfig.Options) + if err != nil { + return new(provider_util.Empty), err + } + + if isLocal && workspaceReq.Workspace.Target.TargetConfig.ProviderInfo.RunnerId == common.LOCAL_RUNNER_ID { + builderType, err := detect.DetectWorkspaceBuilderType(workspaceReq.Workspace.BuildConfig, workspaceDir, nil) if err != nil { return new(provider_util.Empty), err } @@ -185,29 +193,30 @@ func (p DockerProvider) StartProject(projectReq *provider.ProjectRequest) (*prov downloadUrl = parsed.String() } } else { - sshClient, err = p.getSshClient(projectReq.Project.Target, projectReq.TargetOptions) + sshClient, err = p.getSshClient(workspaceReq.Workspace.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } - defer sshClient.Close() + if sshClient != nil { + defer sshClient.Close() + } } - err = dockerClient.StartProject(&docker.CreateProjectOptions{ - Project: projectReq.Project, - ProjectDir: projectDir, - ContainerRegistry: projectReq.ContainerRegistry, - BuilderImage: projectReq.BuilderImage, - BuilderContainerRegistry: projectReq.BuilderContainerRegistry, - LogWriter: logWriter, - Gpc: projectReq.GitProviderConfig, - SshClient: sshClient, + err = dockerClient.StartWorkspace(&docker.CreateWorkspaceOptions{ + Workspace: workspaceReq.Workspace, + WorkspaceDir: workspaceDir, + ContainerRegistries: workspaceReq.ContainerRegistries, + LogWriter: logWriter, + Gpc: workspaceReq.GitProviderConfig, + SshClient: sshClient, + BuilderImage: workspaceReq.BuilderImage, }, downloadUrl) if err != nil { return new(provider_util.Empty), err } go func() { - err = dockerClient.GetContainerLogs(dockerClient.GetProjectContainerName(projectReq.Project), logWriter) + err = dockerClient.GetContainerLogs(dockerClient.GetWorkspaceContainerName(workspaceReq.Workspace), logWriter) if err != nil { logWriter.Write([]byte(err.Error())) } @@ -216,35 +225,43 @@ func (p DockerProvider) StartProject(projectReq *provider.ProjectRequest) (*prov return new(provider_util.Empty), nil } -func (p DockerProvider) StopProject(projectReq *provider.ProjectRequest) (*provider_util.Empty, error) { - dockerClient, err := p.getClient(projectReq.TargetOptions) +func (p DockerProvider) StopWorkspace(workspaceReq *provider.WorkspaceRequest) (*provider_util.Empty, error) { + dockerClient, err := p.getClient(workspaceReq.Workspace.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } logWriter := io.MultiWriter(&log_writers.InfoLogWriter{}) - if p.LogsDir != nil { - loggerFactory := logs.NewLoggerFactory(p.LogsDir, nil) - projectLogWriter := loggerFactory.CreateProjectLogger(projectReq.Project.WorkspaceId, projectReq.Project.Name, logs.LogSourceProvider) - logWriter = io.MultiWriter(&log_writers.InfoLogWriter{}, projectLogWriter) - defer projectLogWriter.Close() + if p.WorkspaceLogsDir != nil { + loggerFactory := logs.NewLoggerFactory(logs.LoggerFactoryConfig{ + LogsDir: *p.WorkspaceLogsDir, + ApiUrl: p.ApiUrl, + ApiKey: p.ApiKey, + ApiBasePath: &logs.ApiBasePathWorkspace, + }) + workspaceLogWriter, err := loggerFactory.CreateLogger(workspaceReq.Workspace.Id, workspaceReq.Workspace.Name, logs.LogSourceProvider) + if err != nil { + return new(provider_util.Empty), err + } + logWriter = io.MultiWriter(&log_writers.InfoLogWriter{}, workspaceLogWriter) + defer workspaceLogWriter.Close() } - return new(provider_util.Empty), dockerClient.StopProject(projectReq.Project, logWriter) + return new(provider_util.Empty), dockerClient.StopWorkspace(workspaceReq.Workspace, logWriter) } -func (p DockerProvider) DestroyProject(projectReq *provider.ProjectRequest) (*provider_util.Empty, error) { - dockerClient, err := p.getClient(projectReq.TargetOptions) +func (p DockerProvider) DestroyWorkspace(workspaceReq *provider.WorkspaceRequest) (*provider_util.Empty, error) { + dockerClient, err := p.getClient(workspaceReq.Workspace.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } - projectDir, err := p.getProjectDir(projectReq) + workspaceDir, err := p.getWorkspaceDir(workspaceReq) if err != nil { return new(provider_util.Empty), err } - sshClient, err := p.getSshClient(projectReq.Project.Target, projectReq.TargetOptions) + sshClient, err := p.getSshClient(workspaceReq.Workspace.Target.TargetConfig.Options) if err != nil { return new(provider_util.Empty), err } @@ -252,7 +269,7 @@ func (p DockerProvider) DestroyProject(projectReq *provider.ProjectRequest) (*pr defer sshClient.Close() } - err = dockerClient.DestroyProject(projectReq.Project, projectDir, sshClient) + err = dockerClient.DestroyWorkspace(workspaceReq.Workspace, workspaceDir, sshClient) if err != nil { return new(provider_util.Empty), err } @@ -260,17 +277,17 @@ func (p DockerProvider) DestroyProject(projectReq *provider.ProjectRequest) (*pr return new(provider_util.Empty), nil } -func (p DockerProvider) GetProjectInfo(projectReq *provider.ProjectRequest) (*project.ProjectInfo, error) { - dockerClient, err := p.getClient(projectReq.TargetOptions) +func (p DockerProvider) GetWorkspaceProviderMetadata(workspaceReq *provider.WorkspaceRequest) (string, error) { + dockerClient, err := p.getClient(workspaceReq.Workspace.Target.TargetConfig.Options) if err != nil { - return nil, err + return "", err } - return dockerClient.GetProjectInfo(projectReq.Project) + return dockerClient.GetWorkspaceProviderMetadata(workspaceReq.Workspace) } func (p DockerProvider) getClient(targetOptionsJson string) (docker.IDockerClient, error) { - targetOptions, err := provider_types.ParseTargetOptions(targetOptionsJson) + targetOptions, _, err := types.ParseTargetConfigOptions(targetOptionsJson) if err != nil { return nil, err } @@ -323,50 +340,44 @@ func (p DockerProvider) CheckRequirements() (*[]provider.RequirementStatus, erro 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) - project.EnvVars["DAYTONA_SERVER_API_URL"] = fmt.Sprintf("http://host.docker.internal:%d", *p.ApiPort) -} - -func (p *DockerProvider) getProjectDir(projectReq *provider.ProjectRequest) (string, error) { - if projectReq.Project.Target == "local" { - return filepath.Join(*p.BasePath, projectReq.Project.WorkspaceId, fmt.Sprintf("%s-%s", projectReq.Project.WorkspaceId, projectReq.Project.Name)), nil - } - - targetOptions, err := provider_types.ParseTargetOptions(projectReq.TargetOptions) +func (p *DockerProvider) getWorkspaceDir(workspaceReq *provider.WorkspaceRequest) (string, error) { + targetOptions, isLocal, err := types.ParseTargetConfigOptions(workspaceReq.Workspace.Target.TargetConfig.Options) if err != nil { return "", err } + if isLocal { + return filepath.Join(*p.BasePath, workspaceReq.Workspace.Id, workspaceReq.Workspace.WorkspaceFolderName()), nil + } + // Using path instead of filepath because we always want to use / as the separator - return path.Join(*targetOptions.WorkspaceDataDir, projectReq.Project.WorkspaceId, fmt.Sprintf("%s-%s", projectReq.Project.WorkspaceId, projectReq.Project.Name)), nil + return path.Join(*targetOptions.TargetDataDir, workspaceReq.Workspace.Id, workspaceReq.Workspace.WorkspaceFolderName()), nil } -func (p *DockerProvider) getWorkspaceDir(workspaceReq *provider.WorkspaceRequest) (string, error) { - if workspaceReq.Workspace.Target == "local" { - return filepath.Join(*p.BasePath, workspaceReq.Workspace.Id), nil - } - - targetOptions, err := provider_types.ParseTargetOptions(workspaceReq.TargetOptions) +func (p *DockerProvider) getTargetDir(targetReq *provider.TargetRequest) (string, error) { + targetOptions, isLocal, err := types.ParseTargetConfigOptions(targetReq.Target.TargetConfig.Options) if err != nil { return "", err } + if isLocal { + return filepath.Join(*p.BasePath, targetReq.Target.Id), nil + } + // Using path instead of filepath because we always want to use / as the separator - return path.Join(*targetOptions.WorkspaceDataDir, workspaceReq.Workspace.Id), nil + return path.Join(*targetOptions.TargetDataDir, targetReq.Target.Id), nil } -func (p *DockerProvider) getSshClient(targetName string, targetOptionsJson string) (*ssh.Client, error) { - if targetName == "local" { - return nil, nil - } - - targetOptions, err := provider_types.ParseTargetOptions(targetOptionsJson) +func (p *DockerProvider) getSshClient(targetOptionsJson string) (*ssh.Client, error) { + targetOptions, isLocal, err := types.ParseTargetConfigOptions(targetOptionsJson) if err != nil { return nil, err } + if isLocal { + return nil, nil + } + return ssh.NewClient(&ssh.SessionConfig{ Hostname: *targetOptions.RemoteHostname, Port: *targetOptions.RemotePort, diff --git a/pkg/provider/provider_test.go b/pkg/provider/provider_test.go index dc02b2a..14ea1b9 100644 --- a/pkg/provider/provider_test.go +++ b/pkg/provider/provider_test.go @@ -9,9 +9,8 @@ import ( "github.com/daytonaio/daytona/pkg/docker" "github.com/daytonaio/daytona/pkg/gitprovider" + "github.com/daytonaio/daytona/pkg/models" "github.com/daytonaio/daytona/pkg/provider" - "github.com/daytonaio/daytona/pkg/workspace" - "github.com/daytonaio/daytona/pkg/workspace/project" docker_provider "github.com/daytonaio/daytona-provider-docker/pkg/provider" provider_types "github.com/daytonaio/daytona-provider-docker/pkg/types" @@ -21,84 +20,90 @@ import ( ) var dockerProvider = &docker_provider.DockerProvider{} -var targetOptions = &provider_types.TargetOptions{} +var targetOptions = &provider_types.TargetConfigOptions{} var sockDir = "/tmp/target-socks" var optionsString string -var project1 = &project.Project{ +var workspace1 = &models.Workspace{ Name: "test", Repository: &gitprovider.GitRepository{ Id: "123", Url: "https://github.com/daytonaio/daytona", Name: "daytona", }, - Image: "daytonaio/workspace-project:latest", - WorkspaceId: "123", + Image: "daytonaio/workspace-project:latest", + TargetId: "123", } -var workspace1 = &workspace.Workspace{ - Id: "123", - Name: "test", - Target: "local", - Projects: []*project.Project{ - project1, +var targetConfig1 = &models.TargetConfig{ + Id: "test", + Name: "test", + ProviderInfo: models.ProviderInfo{ + Name: "docker-provider", + Version: "test", }, + Options: "test-options", + Deleted: false, +} + +var target1 = &models.Target{ + Id: "123", + Name: "test", + TargetConfigId: targetConfig1.Id, + TargetConfig: *targetConfig1, } -func GetContainerName(project *project.Project) string { +func GetContainerName(workspace *models.Workspace) string { dockerClient := docker.NewDockerClient(docker.DockerClientConfig{}) - return dockerClient.GetProjectContainerName(project) + return dockerClient.GetWorkspaceContainerName(workspace) } -func TestCreateWorkspace(t *testing.T) { - wsReq := &provider.WorkspaceRequest{ - TargetOptions: optionsString, - Workspace: workspace1, +func TestCreateTarget(t *testing.T) { + targetReq := &provider.TargetRequest{ + Target: target1, } - _, err := dockerProvider.CreateWorkspace(wsReq) + _, err := dockerProvider.CreateTarget(targetReq) if err != nil { - t.Errorf("Error creating workspace: %s", err) + t.Errorf("Error creating target: %s", err) } - _, err = getDockerClient().NetworkInspect(context.Background(), workspace1.Id, docker_types.NetworkInspectOptions{}) + _, err = getDockerClient().NetworkInspect(context.Background(), target1.Id, docker_types.NetworkInspectOptions{}) if err != nil { t.Errorf("Expected network to exist") } } -func TestGetWorkspaceInfo(t *testing.T) { - wsReq := &provider.WorkspaceRequest{ - TargetOptions: optionsString, - Workspace: workspace1, +func TestGetTargetInfo(t *testing.T) { + targetReq := &provider.TargetRequest{ + Target: target1, } - workspaceInfo, err := dockerProvider.GetWorkspaceInfo(wsReq) - if err != nil || workspaceInfo == nil { - t.Errorf("Error getting workspace info: %s", err) + targetInfo, err := dockerProvider.GetTargetProviderMetadata(targetReq) + if err != nil { + t.Errorf("Error getting target info: %s", err) } - var workspaceMetadata provider_types.WorkspaceMetadata - err = json.Unmarshal([]byte(workspaceInfo.ProviderMetadata), &workspaceMetadata) + var targetMetadata provider_types.TargetMetadata + err = json.Unmarshal([]byte(targetInfo), &targetMetadata) if err != nil { - t.Errorf("Error unmarshalling workspace metadata: %s", err) + t.Errorf("Error unmarshalling target metadata: %s", err) } - if workspaceMetadata.NetworkId != wsReq.Workspace.Id { - t.Errorf("Expected network id %s, got %s", wsReq.Workspace.Id, workspaceMetadata.NetworkId) + if targetMetadata.NetworkId != targetReq.Target.Id { + t.Errorf("Expected network id %s, got %s", targetReq.Target.Id, targetMetadata.NetworkId) } } -func TestDestroyWorkspace(t *testing.T) { - wsReq := &provider.WorkspaceRequest{ - TargetOptions: optionsString, - Workspace: workspace1, +func TestDestroyTarget(t *testing.T) { + targetReq := &provider.TargetRequest{ + Target: target1, } - _, err := dockerProvider.DestroyWorkspace(wsReq) + _, err := dockerProvider.DestroyTarget(targetReq) if err != nil { - t.Errorf("Error deleting workspace: %s", err) + t.Errorf("Error deleting target: %s", err) } dockerClient, err := client.GetClient(*targetOptions, sockDir) @@ -106,48 +111,46 @@ func TestDestroyWorkspace(t *testing.T) { t.Errorf("Error getting docker client: %s", err) } - _, err = dockerClient.NetworkInspect(context.Background(), workspace1.Id, docker_types.NetworkInspectOptions{}) + _, err = dockerClient.NetworkInspect(context.Background(), target1.Id, docker_types.NetworkInspectOptions{}) if err == nil { t.Errorf("Expected network to not exist") } } -func TestCreateProject(t *testing.T) { - TestCreateWorkspace(t) +func TestCreateWorkspace(t *testing.T) { + TestCreateTarget(t) - projectReq := &provider.ProjectRequest{ - TargetOptions: optionsString, - Project: project1, + workspaceReq := &provider.WorkspaceRequest{ + Workspace: workspace1, } - _, err := dockerProvider.CreateProject(projectReq) + _, err := dockerProvider.CreateWorkspace(workspaceReq) if err != nil { - t.Errorf("Error creating project: %s", err) + t.Errorf("Error creating workspace: %s", err) } - _, err = getDockerClient().ContainerInspect(context.Background(), GetContainerName(project1)) + _, err = getDockerClient().ContainerInspect(context.Background(), GetContainerName(workspace1)) if err != nil { t.Errorf("Expected container to exist") } } -func TestDestroyProject(t *testing.T) { - projectReq := &provider.ProjectRequest{ - TargetOptions: optionsString, - Project: project1, +func TestDestroyWorkspace(t *testing.T) { + workspaceReq := &provider.WorkspaceRequest{ + Workspace: workspace1, } - _, err := dockerProvider.DestroyProject(projectReq) + _, err := dockerProvider.DestroyWorkspace(workspaceReq) if err != nil { - t.Errorf("Error deleting project: %s", err) + t.Errorf("Error deleting workspace: %s", err) } - _, err = getDockerClient().ContainerInspect(context.Background(), GetContainerName(project1)) + _, err = getDockerClient().ContainerInspect(context.Background(), GetContainerName(workspace1)) if err == nil { t.Errorf("Expected container to not exist") } - TestDestroyWorkspace(t) + TestDestroyTarget(t) } func getDockerClient() *docker_client.Client { @@ -161,7 +164,7 @@ func getDockerClient() *docker_client.Client { func init() { _, err := dockerProvider.Initialize(provider.InitializeProviderRequest{ - BasePath: "/tmp/workspaces", + BasePath: "/tmp/targets", DaytonaDownloadUrl: "https://download.daytona.io/daytona/get-server.sh", DaytonaVersion: "latest", ServerUrl: "", @@ -179,4 +182,5 @@ func init() { } optionsString = string(opts) + target1.TargetConfig.Options = optionsString } diff --git a/pkg/ssh_tunnel/util/forward_unix.go b/pkg/ssh_tunnel/util/forward_unix.go index f349541..a61f9a1 100644 --- a/pkg/ssh_tunnel/util/forward_unix.go +++ b/pkg/ssh_tunnel/util/forward_unix.go @@ -10,7 +10,7 @@ import ( log "github.com/sirupsen/logrus" ) -func ForwardRemoteUnixSock(ctx context.Context, targetOptions types.TargetOptions, localSock string, remoteSock string) (chan bool, chan error) { +func ForwardRemoteUnixSock(ctx context.Context, targetOptions types.TargetConfigOptions, localSock string, remoteSock string) (chan bool, chan error) { if targetOptions.RemoteHostname == nil { errChan := make(chan error) errChan <- errors.New("Remote Hostname is required") diff --git a/pkg/types/metadata.go b/pkg/types/metadata.go index 788a26c..25f3bda 100644 --- a/pkg/types/metadata.go +++ b/pkg/types/metadata.go @@ -1,5 +1,5 @@ package types -type WorkspaceMetadata struct { +type TargetMetadata struct { NetworkId string } diff --git a/pkg/types/targets.go b/pkg/types/targets.go index e228894..cd8f943 100644 --- a/pkg/types/targets.go +++ b/pkg/types/targets.go @@ -3,65 +3,65 @@ package types import ( "encoding/json" - "github.com/daytonaio/daytona/pkg/provider" + "github.com/daytonaio/daytona/pkg/models" ) -type TargetOptions struct { +type TargetConfigOptions struct { RemoteHostname *string `json:"Remote Hostname,omitempty"` RemotePort *int `json:"Remote Port,omitempty"` RemoteUser *string `json:"Remote User,omitempty"` RemotePassword *string `json:"Remote Password,omitempty"` RemotePrivateKey *string `json:"Remote Private Key Path,omitempty"` SockPath *string `json:"Sock Path,omitempty"` - WorkspaceDataDir *string `json:"Workspace Data Dir,omitempty"` + TargetDataDir *string `json:"Target Data Dir,omitempty"` } -func GetTargetManifest() *provider.ProviderTargetManifest { - return &provider.ProviderTargetManifest{ - "Remote Hostname": provider.ProviderTargetProperty{ - Type: provider.ProviderTargetPropertyTypeString, +func GetTargetConfigManifest() *models.TargetConfigManifest { + return &models.TargetConfigManifest{ + "Remote Hostname": models.TargetConfigProperty{ + Type: models.TargetConfigPropertyTypeString, DisabledPredicate: "^local$", }, - "Remote Port": provider.ProviderTargetProperty{ - Type: provider.ProviderTargetPropertyTypeInt, + "Remote Port": models.TargetConfigProperty{ + Type: models.TargetConfigPropertyTypeInt, DefaultValue: "22", DisabledPredicate: "^local$", }, - "Remote User": provider.ProviderTargetProperty{ - Type: provider.ProviderTargetPropertyTypeString, + "Remote User": models.TargetConfigProperty{ + Type: models.TargetConfigPropertyTypeString, // TODO: Add docs entry Description: "Note: non-root user required", DisabledPredicate: "^local$", }, - "Remote Password": provider.ProviderTargetProperty{ - Type: provider.ProviderTargetPropertyTypeString, + "Remote Password": models.TargetConfigProperty{ + Type: models.TargetConfigPropertyTypeString, DisabledPredicate: "^local$", InputMasked: true, }, - "Remote Private Key Path": provider.ProviderTargetProperty{ - Type: provider.ProviderTargetPropertyTypeFilePath, + "Remote Private Key Path": models.TargetConfigProperty{ + Type: models.TargetConfigPropertyTypeFilePath, DefaultValue: "~/.ssh", DisabledPredicate: "^local$", }, - "Sock Path": provider.ProviderTargetProperty{ - Type: provider.ProviderTargetPropertyTypeString, + "Sock Path": models.TargetConfigProperty{ + Type: models.TargetConfigPropertyTypeString, DefaultValue: "/var/run/docker.sock", }, - "Workspace Data Dir": provider.ProviderTargetProperty{ - Type: provider.ProviderTargetPropertyTypeString, + "Target Data Dir": models.TargetConfigProperty{ + Type: models.TargetConfigPropertyTypeString, DefaultValue: "/tmp/daytona-data", - Description: "The directory on the remote host where the workspace data will be stored", + Description: "The directory on the remote host where the target data will be stored", DisabledPredicate: "^local$", }, } } -func ParseTargetOptions(optionsJson string) (*TargetOptions, error) { - var targetOptions TargetOptions - err := json.Unmarshal([]byte(optionsJson), &targetOptions) +func ParseTargetConfigOptions(optionsJson string) (opts *TargetConfigOptions, isLocal bool, err error) { + var targetOptions TargetConfigOptions + err = json.Unmarshal([]byte(optionsJson), &targetOptions) if err != nil { - return nil, err + return nil, false, err } - return &targetOptions, nil + return &targetOptions, targetOptions.RemoteHostname == nil, nil }