diff --git a/go.mod b/go.mod index c5935cc..48ad64a 100644 --- a/go.mod +++ b/go.mod @@ -3,13 +3,13 @@ module github.com/daytonaio/daytona-docker-provider go 1.22.2 require ( - github.com/daytonaio/daytona v0.12.0 - github.com/docker/docker v24.0.7+incompatible + github.com/daytonaio/daytona v0.13.0-alpha.3 + github.com/docker/docker v26.1.0+incompatible github.com/hashicorp/go-hclog v1.5.0 github.com/hashicorp/go-plugin v1.6.0 github.com/sirupsen/logrus v1.9.3 golang.org/x/crypto v0.21.0 - golang.org/x/sync v0.5.0 + golang.org/x/sync v0.6.0 golang.org/x/term v0.18.0 ) @@ -17,16 +17,19 @@ require ( code.gitea.io/sdk/gitea v0.17.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/davidmz/go-pageant v1.0.2 // indirect - github.com/distribution/reference v0.5.0 // indirect - github.com/docker/distribution v2.8.3+incompatible // indirect + github.com/distribution/reference v0.6.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/fatih/color v1.15.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-fed/httpsig v1.1.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-github v17.0.0+incompatible // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -38,8 +41,8 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77 // 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/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 @@ -49,16 +52,23 @@ require ( github.com/tklauser/numcpus v0.7.0 // indirect github.com/xanzy/go-gitlab v0.97.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 // indirect + go.opentelemetry.io/otel v1.26.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect + go.opentelemetry.io/otel/metric v1.26.0 // indirect + go.opentelemetry.io/otel/sdk v1.26.0 // indirect + go.opentelemetry.io/otel/trace v1.26.0 // indirect + go.opentelemetry.io/proto/otlp v1.2.0 // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/net v0.23.0 // indirect - golang.org/x/oauth2 v0.16.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/oauth2 v0.17.0 // indirect + golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.16.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 // indirect - google.golang.org/grpc v1.60.1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect + google.golang.org/grpc v1.63.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gotest.tools/v3 v3.5.1 // indirect ) diff --git a/go.sum b/go.sum index 65a2208..eadc3cf 100644 --- a/go.sum +++ b/go.sum @@ -620,6 +620,8 @@ github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl 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/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= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= @@ -643,6 +645,8 @@ 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/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/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= @@ -650,14 +654,12 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 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.12.0 h1:8An3APV8IlCc/XIaCBCNWqnPhxvYyDeMIjHLJxjezAg= -github.com/daytonaio/daytona v0.12.0/go.mod h1:3+glGityHJrxtwpxiQg56DgpJzIPl+oof5zl3sMJ+3g= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= -github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/daytonaio/daytona v0.13.0-alpha.3 h1:k2cZmTGj2Q8R5EZ16dhUcCkPC/39K93zxH/XDjOXbY4= +github.com/daytonaio/daytona v0.13.0-alpha.3/go.mod h1:T/Gx7CWUS6KKYoAHhNXbnFC+Ub6mitcxm1lmGbWmG/g= +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= +github.com/docker/docker v26.1.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -682,6 +684,8 @@ github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6Ni github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -697,6 +701,11 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= @@ -739,8 +748,9 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -814,9 +824,12 @@ github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2e github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +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= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= @@ -878,6 +891,8 @@ github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77 h1: github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= 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= @@ -922,6 +937,8 @@ github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcD github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= @@ -959,9 +976,25 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0 h1:cEPbyTSEHlQR89XVlyo78gqluF8Y3oMeBkXGWzQsfXY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.50.0/go.mod h1:DKdbWcT4GH1D0Y3Sqt/PFXt2naRKDWtU+eE6oLdFNA8= +go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= +go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 h1:1u/AyyOqAWzy+SkPxDpahCNZParHV8Vid1RnI2clyDE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0/go.mod h1:z46paqbJ9l7c9fIPCXTqTGwhQZ5XoTIsfeFYWboizjs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0 h1:Mbi5PKN7u322woPa85d7ebZ+SOvEoPvoiBu+ryHWgfA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0/go.mod h1:e7ciERRhZaOZXVjx5MiL8TK5+Xv7G5Gv5PA2ZDEJdL8= +go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= +go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= +go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8= +go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= +go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= +go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= +go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1132,8 +1165,9 @@ golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= -golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= +golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1151,8 +1185,8 @@ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1237,8 +1271,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1565,17 +1599,20 @@ google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= +google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0 h1:/jFB8jK5R3Sq3i/lmeZO0cATSzFfZaJq1J2Euan3XKU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1617,8 +1654,8 @@ google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.63.0 h1:WjKe+dnvABXyPJMD7KDNLxtoGk5tgk+YFWN6cBWjZE8= +google.golang.org/grpc v1.63.0/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/pkg/provider/provider.go b/pkg/provider/provider.go index ba482e1..0d6c427 100644 --- a/pkg/provider/provider.go +++ b/pkg/provider/provider.go @@ -1,7 +1,6 @@ package provider import ( - "encoding/json" "errors" "io" "os" @@ -11,17 +10,13 @@ import ( internal "github.com/daytonaio/daytona-docker-provider/internal" log_writers "github.com/daytonaio/daytona-docker-provider/internal/log" "github.com/daytonaio/daytona-docker-provider/pkg/client" - "github.com/daytonaio/daytona-docker-provider/pkg/provider/util" provider_types "github.com/daytonaio/daytona-docker-provider/pkg/types" + "github.com/daytonaio/daytona/pkg/docker" "github.com/daytonaio/daytona/pkg/logger" "github.com/daytonaio/daytona/pkg/provider" provider_util "github.com/daytonaio/daytona/pkg/provider/util" "github.com/daytonaio/daytona/pkg/workspace" - docker_types "github.com/docker/docker/api/types" - docker_client "github.com/docker/docker/client" - - log "github.com/sirupsen/logrus" ) type DockerProvider struct { @@ -92,16 +87,7 @@ func (p DockerProvider) GetDefaultTargets() (*[]provider.ProviderTarget, error) return &defaultTargets, nil } -func (p DockerProvider) getProjectPath(basePath string, project *workspace.Project) string { - return path.Join(basePath, "workspaces", project.WorkspaceId, "projects", project.Name) -} - func (p DockerProvider) CreateWorkspace(workspaceReq *provider.WorkspaceRequest) (*provider_util.Empty, error) { - client, err := p.getClient(workspaceReq.TargetOptions) - if err != nil { - return new(provider_util.Empty), err - } - logWriter := io.MultiWriter(&log_writers.InfoLogWriter{}) if p.LogsDir != nil { wsLogWriter := logger.NewWorkspaceLogger(*p.LogsDir, workspaceReq.Workspace.Id) @@ -109,8 +95,12 @@ func (p DockerProvider) CreateWorkspace(workspaceReq *provider.WorkspaceRequest) defer wsLogWriter.Close() } - err = util.CreateNetwork(client, workspaceReq.Workspace.Id, &logWriter) - return new(provider_util.Empty), err + dockerClient, err := p.getClient(workspaceReq.TargetOptions) + if err != nil { + return new(provider_util.Empty), err + } + + return new(provider_util.Empty), dockerClient.CreateWorkspace(workspaceReq.Workspace, logWriter) } func (p DockerProvider) StartWorkspace(workspaceReq *provider.WorkspaceRequest) (*provider_util.Empty, error) { @@ -122,48 +112,21 @@ func (p DockerProvider) StopWorkspace(workspaceReq *provider.WorkspaceRequest) ( } func (p DockerProvider) DestroyWorkspace(workspaceReq *provider.WorkspaceRequest) (*provider_util.Empty, error) { - if p.BasePath == nil { - return new(provider_util.Empty), errors.New("BasePath not set. Did you forget to call Initialize?") - } - - err := os.RemoveAll(path.Join(*p.BasePath, "workspaces", workspaceReq.Workspace.Id)) - if err != nil { - return new(provider_util.Empty), err - } - - client, err := p.getClient(workspaceReq.TargetOptions) + dockerClient, err := p.getClient(workspaceReq.TargetOptions) if err != nil { return new(provider_util.Empty), err } - return new(provider_util.Empty), util.RemoveNetwork(client, workspaceReq.Workspace.Id) + return new(provider_util.Empty), dockerClient.DestroyWorkspace(workspaceReq.Workspace) } func (p DockerProvider) GetWorkspaceInfo(workspaceReq *provider.WorkspaceRequest) (*workspace.WorkspaceInfo, error) { - providerMetadata, err := p.getWorkspaceMetadata(workspaceReq) + dockerClient, err := p.getClient(workspaceReq.TargetOptions) if err != nil { return nil, err } - workspaceInfo := &workspace.WorkspaceInfo{ - Name: workspaceReq.Workspace.Name, - ProviderMetadata: providerMetadata, - } - - projectInfos := []*workspace.ProjectInfo{} - for _, project := range workspaceReq.Workspace.Projects { - projectInfo, err := p.GetProjectInfo(&provider.ProjectRequest{ - TargetOptions: workspaceReq.TargetOptions, - Project: project, - }) - if err != nil { - return nil, err - } - projectInfos = append(projectInfos, projectInfo) - } - workspaceInfo.Projects = projectInfos - - return workspaceInfo, nil + return dockerClient.GetWorkspaceInfo(workspaceReq.Workspace) } func (p DockerProvider) CreateProject(projectReq *provider.ProjectRequest) (*provider_util.Empty, error) { @@ -171,30 +134,6 @@ func (p DockerProvider) CreateProject(projectReq *provider.ProjectRequest) (*pro return new(provider_util.Empty), errors.New("ServerDownloadUrl not set. Did you forget to call Initialize?") } - if p.BasePath == nil { - return new(provider_util.Empty), errors.New("BasePath not set. Did you forget to call Initialize?") - } - - if p.ServerUrl == nil { - return new(provider_util.Empty), errors.New("ServerUrl not set. Did you forget to call Initialize?") - } - - if p.ServerApiUrl == nil { - return new(provider_util.Empty), errors.New("ServerApiUrl not set. Did you forget to call Initialize?") - } - - client, err := p.getClient(projectReq.TargetOptions) - if err != nil { - return new(provider_util.Empty), err - } - - clonePath := p.getProjectPath(*p.BasePath, projectReq.Project) - - err = os.MkdirAll(clonePath, 0755) - if err != nil { - return new(provider_util.Empty), err - } - logWriter := io.MultiWriter(&log_writers.InfoLogWriter{}) if p.LogsDir != nil { wsLogWriter := logger.NewWorkspaceLogger(*p.LogsDir, projectReq.Project.WorkspaceId) @@ -204,160 +143,67 @@ func (p DockerProvider) CreateProject(projectReq *provider.ProjectRequest) (*pro defer projectLogWriter.Close() } - err = util.PullImage(client, projectReq.Project.Image, &logWriter) - if err != nil { - return new(provider_util.Empty), err - } - - err = util.InitContainer(client, projectReq.Project, clonePath, projectReq.Project.Image, *p.ServerDownloadUrl) - if err != nil { - return new(provider_util.Empty), err - } - - err = util.StartContainer(client, projectReq.Project, nil) + dockerClient, err := p.getClient(projectReq.TargetOptions) if err != nil { return new(provider_util.Empty), err } - go func() { - err := util.GetContainerLogs(client, util.GetContainerName(projectReq.Project), &logWriter) - if err != nil { - logWriter.Write([]byte(err.Error())) - } - }() - - err = util.WaitForBinaryDownload(client, projectReq.Project) - if err != nil { - return new(provider_util.Empty), err - } - - _, err = util.ExecSync(client, util.GetContainerName(projectReq.Project), docker_types.ExecConfig{ - User: "daytona", - Privileged: true, - Cmd: []string{"sudo", "chown", "-R", "daytona:daytona", "/workspaces"}, - }, nil) + err = dockerClient.CreateProject(projectReq.Project, *p.ServerDownloadUrl, projectReq.ContainerRegistry, logWriter) if err != nil { return new(provider_util.Empty), err } - return new(provider_util.Empty), nil + return new(provider_util.Empty), dockerClient.StartProject(projectReq.Project) } func (p DockerProvider) StartProject(projectReq *provider.ProjectRequest) (*provider_util.Empty, error) { - client, err := p.getClient(projectReq.TargetOptions) + dockerClient, err := p.getClient(projectReq.TargetOptions) if err != nil { return new(provider_util.Empty), err } - logWriter := io.MultiWriter(&log_writers.InfoLogWriter{}) - if p.LogsDir != nil { - wsLogWriter := logger.NewWorkspaceLogger(*p.LogsDir, projectReq.Project.WorkspaceId) - projectLogWriter := logger.NewProjectLogger(*p.LogsDir, projectReq.Project.WorkspaceId, projectReq.Project.Name) - logWriter = io.MultiWriter(&log_writers.InfoLogWriter{}, wsLogWriter, projectLogWriter) - defer wsLogWriter.Close() - defer projectLogWriter.Close() - } - - err = util.StartContainer(client, projectReq.Project, &logWriter) - return new(provider_util.Empty), err + return new(provider_util.Empty), dockerClient.StartProject(projectReq.Project) } func (p DockerProvider) StopProject(projectReq *provider.ProjectRequest) (*provider_util.Empty, error) { - client, err := p.getClient(projectReq.TargetOptions) + dockerClient, err := p.getClient(projectReq.TargetOptions) if err != nil { return new(provider_util.Empty), err } - err = util.StopContainer(client, projectReq.Project) - return new(provider_util.Empty), err + return new(provider_util.Empty), dockerClient.StopProject(projectReq.Project) } func (p DockerProvider) DestroyProject(projectReq *provider.ProjectRequest) (*provider_util.Empty, error) { - client, err := p.getClient(projectReq.TargetOptions) + dockerClient, err := p.getClient(projectReq.TargetOptions) if err != nil { return new(provider_util.Empty), err } - err = util.RemoveContainer(client, projectReq.Project) - if err != nil { - return new(provider_util.Empty), err - } - - if p.BasePath == nil { - return new(provider_util.Empty), errors.New("BasePath not set. Did you forget to call Initialize?") - } - - err = os.RemoveAll(p.getProjectPath(*p.BasePath, projectReq.Project)) - if err != nil { - return new(provider_util.Empty), err - } - - return new(provider_util.Empty), nil + return new(provider_util.Empty), dockerClient.DestroyProject(projectReq.Project) } func (p DockerProvider) GetProjectInfo(projectReq *provider.ProjectRequest) (*workspace.ProjectInfo, error) { - client, err := p.getClient(projectReq.TargetOptions) + dockerClient, err := p.getClient(projectReq.TargetOptions) if err != nil { return nil, err } - isRunning := true - info, err := util.GetContainerInfo(client, projectReq.Project) - if err != nil { - if docker_client.IsErrNotFound(err) { - log.Debug("Container not found, project is not running") - isRunning = false - } else { - return nil, err - } - } - - if info == nil || info.State == nil { - return &workspace.ProjectInfo{ - Name: projectReq.Project.Name, - IsRunning: isRunning, - Created: "", - ProviderMetadata: "{\"state\": \"container not found\"}", - }, nil - } - - projectInfo := &workspace.ProjectInfo{ - Name: projectReq.Project.Name, - IsRunning: isRunning, - Created: info.Created, - } - - if info.Config != nil && info.Config.Labels != nil { - metadata, err := json.Marshal(info.Config.Labels) - if err != nil { - return nil, err - } - projectInfo.ProviderMetadata = string(metadata) - } else { - log.Warn("Could not get container labels for project: ", projectReq.Project.Name) - } - - return projectInfo, nil + return dockerClient.GetProjectInfo(projectReq.Project) } -func (p DockerProvider) getWorkspaceMetadata(workspaceReq *provider.WorkspaceRequest) (string, error) { - metadata := provider_types.WorkspaceMetadata{ - NetworkId: workspaceReq.Workspace.Id, - } - - jsonContent, err := json.Marshal(metadata) +func (p DockerProvider) getClient(targetOptionsJson string) (docker.IDockerClient, error) { + targetOptions, err := provider_types.ParseTargetOptions(targetOptionsJson) if err != nil { - return "", err + return nil, err } - return string(jsonContent), nil -} - -func (p DockerProvider) getClient(targetOptionsJson string) (*docker_client.Client, error) { - targetOptions, err := provider_types.ParseTargetOptions(targetOptionsJson) + client, err := client.GetClient(*targetOptions, p.RemoteSockDir) if err != nil { return nil, err } - return client.GetClient(*targetOptions, p.RemoteSockDir) + return docker.NewDockerClient(docker.DockerClientConfig{ + ApiClient: client, + }), nil } diff --git a/pkg/provider/provider_test.go b/pkg/provider/provider_test.go index 5983f36..9bbdf56 100644 --- a/pkg/provider/provider_test.go +++ b/pkg/provider/provider_test.go @@ -6,8 +6,8 @@ import ( "testing" "github.com/daytonaio/daytona-docker-provider/pkg/client" - "github.com/daytonaio/daytona-docker-provider/pkg/provider/util" + "github.com/daytonaio/daytona/pkg/docker" "github.com/daytonaio/daytona/pkg/gitprovider" "github.com/daytonaio/daytona/pkg/provider" "github.com/daytonaio/daytona/pkg/workspace" @@ -44,6 +44,12 @@ var workspace1 = &workspace.Workspace{ }, } +func GetContainerName(project *workspace.Project) string { + dockerClient := docker.NewDockerClient(docker.DockerClientConfig{}) + + return dockerClient.GetProjectContainerName(project) +} + func TestCreateWorkspace(t *testing.T) { wsReq := &provider.WorkspaceRequest{ TargetOptions: optionsString, @@ -118,7 +124,7 @@ func TestCreateProject(t *testing.T) { t.Errorf("Error creating project: %s", err) } - _, err = getDockerClient().ContainerInspect(context.Background(), util.GetContainerName(project1)) + _, err = getDockerClient().ContainerInspect(context.Background(), GetContainerName(project1)) if err != nil { t.Errorf("Expected container to exist") } @@ -135,7 +141,7 @@ func TestDestroyProject(t *testing.T) { t.Errorf("Error deleting project: %s", err) } - _, err = getDockerClient().ContainerInspect(context.Background(), util.GetContainerName(project1)) + _, err = getDockerClient().ContainerInspect(context.Background(), GetContainerName(project1)) if err == nil { t.Errorf("Expected container to not exist") } diff --git a/pkg/provider/util/container_logs.go b/pkg/provider/util/container_logs.go deleted file mode 100644 index 754353b..0000000 --- a/pkg/provider/util/container_logs.go +++ /dev/null @@ -1,30 +0,0 @@ -package util - -import ( - "context" - "io" - - docker_types "github.com/docker/docker/api/types" - "github.com/docker/docker/client" - "github.com/docker/docker/pkg/stdcopy" -) - -func GetContainerLogs(client *client.Client, containerName string, logWriter *io.Writer) error { - if logWriter == nil { - return nil - } - - logs, err := client.ContainerLogs(context.Background(), containerName, docker_types.ContainerLogsOptions{ - ShowStdout: true, - ShowStderr: true, - Follow: true, - }) - if err != nil { - return err - } - defer logs.Close() - - _, err = stdcopy.StdCopy(*logWriter, *logWriter, logs) - - return err -} diff --git a/pkg/provider/util/create_network.go b/pkg/provider/util/create_network.go deleted file mode 100644 index 52ebf00..0000000 --- a/pkg/provider/util/create_network.go +++ /dev/null @@ -1,42 +0,0 @@ -package util - -import ( - "context" - "io" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" -) - -func CreateNetwork(client *client.Client, workspaceId string, logWriter *io.Writer) error { - if logWriter != nil { - (*logWriter).Write([]byte("Initializing network\n")) - } - ctx := context.Background() - - networks, err := client.NetworkList(ctx, types.NetworkListOptions{}) - if err != nil { - return err - } - - for _, network := range networks { - if network.Name == workspaceId { - if logWriter != nil { - (*logWriter).Write([]byte("Network already exists\n")) - } - return nil - } - } - - _, err = client.NetworkCreate(ctx, workspaceId, types.NetworkCreate{ - Attachable: true, - }) - if err != nil { - return err - } - - if logWriter != nil { - (*logWriter).Write([]byte("Network initialized\n")) - } - return nil -} diff --git a/pkg/provider/util/exec.go b/pkg/provider/util/exec.go deleted file mode 100644 index 551f859..0000000 --- a/pkg/provider/util/exec.go +++ /dev/null @@ -1,97 +0,0 @@ -package util - -import ( - "bytes" - "context" - "io" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" - "github.com/docker/docker/pkg/stdcopy" -) - -type ExecResult struct { - StdOut string - StdErr string - ExitCode int -} - -func ExecSync(client *client.Client, containerID string, config types.ExecConfig, outputWriter *io.Writer) (*ExecResult, error) { - ctx := context.Background() - - config.AttachStderr = true - config.AttachStdout = true - config.AttachStdin = false - - config.Env = append(config.Env, "DEBIAN_FRONTEND=noninteractive") - - response, err := client.ContainerExecCreate(ctx, containerID, config) - if err != nil { - return nil, err - } - - result, err := InspectExecResp(client, ctx, response.ID, outputWriter) - if err != nil { - return nil, err - } - return result, nil -} - -func InspectExecResp(client *client.Client, ctx context.Context, id string, outputWriter *io.Writer) (*ExecResult, error) { - resp, err := client.ContainerExecAttach(ctx, id, types.ExecStartCheck{}) - if err != nil { - return nil, err - } - defer resp.Close() - - // read the output - outputDone := make(chan error) - - outBuf := bytes.Buffer{} - errBuf := bytes.Buffer{} - - go func() { - // StdCopy demultiplexes the stream into two buffers - outMw := io.Writer(&outBuf) - errMw := io.Writer(&errBuf) - - if outputWriter != nil { - outMw = io.MultiWriter(&outBuf, *outputWriter) - errMw = io.MultiWriter(&errBuf, *outputWriter) - } - - _, err = stdcopy.StdCopy(outMw, errMw, resp.Reader) - outputDone <- err - }() - - select { - case err := <-outputDone: - if err != nil { - return nil, err - } - break - - case <-ctx.Done(): - return nil, ctx.Err() - } - - stdout, err := io.ReadAll(&outBuf) - if err != nil { - return nil, err - } - stderr, err := io.ReadAll(&errBuf) - if err != nil { - return nil, err - } - - res, err := client.ContainerExecInspect(ctx, id) - if err != nil { - return nil, err - } - - return &ExecResult{ - ExitCode: res.ExitCode, - StdOut: string(stdout), - StdErr: string(stderr), - }, nil -} diff --git a/pkg/provider/util/files.go b/pkg/provider/util/files.go deleted file mode 100644 index 95903c6..0000000 --- a/pkg/provider/util/files.go +++ /dev/null @@ -1,118 +0,0 @@ -package util - -import ( - "archive/tar" - "bufio" - "bytes" - "context" - "io" - "path/filepath" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" - - log "github.com/sirupsen/logrus" -) - -func FileExists(client *client.Client, containerId string, user string, dstFilePath string) (bool, error) { - execConfig := types.ExecConfig{ - Cmd: []string{"stat", dstFilePath}, - User: user, - } - - resp, err := client.ContainerExecCreate(context.Background(), containerId, execConfig) - if err != nil { - return false, err - } - - attachResp, err := client.ContainerExecAttach(context.Background(), resp.ID, types.ExecStartCheck{}) - if err != nil { - return false, nil - } - defer attachResp.Close() - - return true, nil -} - -func ReadFile(client *client.Client, containerId string, user string, dstFilePath string) ([]byte, error) { - ctx := context.Background() - - // Open a connection to the container - reader, _, err := client.CopyFromContainer(ctx, containerId, dstFilePath) - if err != nil { - return nil, err - } - defer reader.Close() - - // Extract the file content from the tar archive - tarReader := tar.NewReader(reader) - var content bytes.Buffer - - for { - _, err := tarReader.Next() - if err == io.EOF { - break - } else if err != nil { - return nil, err - } - - // Read the content from the tar entry - if _, err := io.Copy(&content, tarReader); err != nil { - return nil, err - } - } - - log.Debug(".gitconfig read file", content.String()) - - return content.Bytes(), nil -} - -func WriteFile(client *client.Client, containerId string, user string, dstFilePath string, content string) error { - dir := filepath.Dir(dstFilePath) - - _, err := ExecSync(client, containerId, types.ExecConfig{ - Cmd: []string{"mkdir", "-p", dir}, - User: user, - }, nil) - if err != nil { - return err - } - - var buf bytes.Buffer - tw := tar.NewWriter(&buf) - var files = []struct { - Name, Body string - }{ - {filepath.Base(dstFilePath), content}, - } - for _, file := range files { - hdr := &tar.Header{ - Name: file.Name, - Mode: 0600, - Size: int64(len(file.Body)), - } - if err := tw.WriteHeader(hdr); err != nil { - log.Fatal(err) - } - if _, err := tw.Write([]byte(file.Body)); err != nil { - log.Fatal(err) - } - } - if err := tw.Close(); err != nil { - log.Fatal(err) - } - - err = client.CopyToContainer(context.Background(), containerId, dir, bufio.NewReader(&buf), types.CopyToContainerOptions{ - AllowOverwriteDirWithFile: true, - }) - if err != nil { - return err - } - - _, err = ExecSync(client, containerId, types.ExecConfig{ - Cmd: []string{"chown", user + ":" + user, dstFilePath}, - User: "root", - }, nil) - - return err -} diff --git a/pkg/provider/util/get_home_dir.go b/pkg/provider/util/get_home_dir.go deleted file mode 100644 index 36b6414..0000000 --- a/pkg/provider/util/get_home_dir.go +++ /dev/null @@ -1,22 +0,0 @@ -package util - -import ( - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" -) - -func GetHomeDirectory(client *client.Client, containerId string, user string) (*string, error) { - result, err := ExecSync(client, containerId, types.ExecConfig{ - Cmd: []string{"/bin/sh", "-c", "cd && pwd"}, - User: user, - }, nil) - if err != nil { - return nil, err - } - - homeDir := strings.Trim(result.StdOut, "\n") - - return &homeDir, nil -} diff --git a/pkg/provider/util/init_container.go b/pkg/provider/util/init_container.go deleted file mode 100644 index bb901e4..0000000 --- a/pkg/provider/util/init_container.go +++ /dev/null @@ -1,76 +0,0 @@ -package util - -import ( - "context" - "fmt" - "path" - - "github.com/daytonaio/daytona/pkg/provider/util" - "github.com/daytonaio/daytona/pkg/workspace" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/client" -) - -func InitContainer(client *client.Client, project *workspace.Project, workdirPath, imageName, serverDownloadUrl string) error { - ctx := context.Background() - - mounts := []mount.Mount{ - { - Type: mount.TypeVolume, - Source: GetVolumeName(project), - Target: "/var/lib/docker", - }, - } - - envVars := []string{ - "DAYTONA_WS_DIR=" + path.Join("/workspaces", project.Name), - } - - for key, value := range project.EnvVars { - envVars = append(envVars, fmt.Sprintf("%s=%s", key, value)) - } - - _, err := client.ContainerCreate(ctx, &container.Config{ - Hostname: project.Name, - Image: imageName, - Labels: map[string]string{ - "daytona.workspace.id": project.WorkspaceId, - "daytona.workspace.project.name": project.Name, - "daytona.workspace.project.repository.url": project.Repository.Url, - // todo: Add more properties here - }, - User: "daytona", - Env: envVars, - Cmd: []string{"bash", "-c", util.GetProjectStartScript(serverDownloadUrl, project.ApiKey)}, - AttachStdout: true, - AttachStderr: true, - }, &container.HostConfig{ - Privileged: true, - Binds: []string{ - fmt.Sprintf("%s:/workspaces", workdirPath), - "/tmp/daytona:/tmp/daytona", - }, - Mounts: mounts, - NetworkMode: container.NetworkMode(project.WorkspaceId), - }, nil, nil, GetContainerName(project)) // TODO: namespaced names - if err != nil { - return err - } - - return nil -} - -func WaitForBinaryDownload(client *client.Client, project *workspace.Project) error { - ctx := context.Background() - - for { - _, err := client.ContainerStatPath(ctx, GetContainerName(project), "/usr/local/bin/daytona") - - if err == nil { - break - } - } - - return nil -} diff --git a/pkg/provider/util/project.go b/pkg/provider/util/project.go deleted file mode 100644 index 7cb2909..0000000 --- a/pkg/provider/util/project.go +++ /dev/null @@ -1,28 +0,0 @@ -package util - -import ( - "context" - - "github.com/daytonaio/daytona/pkg/workspace" - docker_types "github.com/docker/docker/api/types" - "github.com/docker/docker/client" -) - -func GetContainerName(project *workspace.Project) string { - return project.WorkspaceId + "-" + project.Name -} - -func GetVolumeName(project *workspace.Project) string { - return GetContainerName(project) -} - -func GetContainerInfo(client *client.Client, project *workspace.Project) (*docker_types.ContainerJSON, error) { - ctx := context.Background() - - inspect, err := client.ContainerInspect(ctx, GetContainerName(project)) - if err != nil { - return nil, err - } - - return &inspect, nil -} diff --git a/pkg/provider/util/pull_image.go b/pkg/provider/util/pull_image.go deleted file mode 100644 index 356e2c4..0000000 --- a/pkg/provider/util/pull_image.go +++ /dev/null @@ -1,66 +0,0 @@ -package util - -import ( - "context" - "io" - "strings" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/client" -) - -func PullImage(client *client.Client, imageName string, logWriter *io.Writer) error { - ctx := context.Background() - - tag := "latest" - tagSplit := strings.Split(imageName, ":") - if len(tagSplit) == 2 { - tag = tagSplit[1] - } - - if tag != "latest" { - images, err := client.ImageList(ctx, types.ImageListOptions{ - Filters: filters.NewArgs(filters.Arg("reference", imageName)), - }) - if err != nil { - return err - } - - found := false - for _, image := range images { - for _, tag := range image.RepoTags { - if strings.HasPrefix(tag, imageName) { - found = true - break - } - } - } - - if found { - if logWriter != nil { - (*logWriter).Write([]byte("Image found locally\n")) - } - return nil - } - } - - if logWriter != nil { - (*logWriter).Write([]byte("Pulling image...\n")) - } - responseBody, err := client.ImagePull(ctx, imageName, types.ImagePullOptions{}) - if err != nil { - return err - } - defer responseBody.Close() - _, err = io.Copy(io.Discard, responseBody) - if err != nil { - return err - } - - if logWriter != nil { - (*logWriter).Write([]byte("Image pulled successfully\n")) - } - - return nil -} diff --git a/pkg/provider/util/remove_container.go b/pkg/provider/util/remove_container.go deleted file mode 100644 index 9912c7f..0000000 --- a/pkg/provider/util/remove_container.go +++ /dev/null @@ -1,28 +0,0 @@ -package util - -import ( - "context" - - "github.com/daytonaio/daytona/pkg/workspace" - docker_types "github.com/docker/docker/api/types" - docker_client "github.com/docker/docker/client" -) - -func RemoveContainer(client *docker_client.Client, project *workspace.Project) error { - ctx := context.Background() - - err := client.ContainerRemove(ctx, GetContainerName(project), docker_types.ContainerRemoveOptions{ - Force: true, - RemoveVolumes: true, - }) - if err != nil && !docker_client.IsErrNotFound(err) { - return err - } - - err = client.VolumeRemove(ctx, GetVolumeName(project), true) - if err != nil && !docker_client.IsErrNotFound(err) { - return err - } - - return nil -} diff --git a/pkg/provider/util/remove_network.go b/pkg/provider/util/remove_network.go deleted file mode 100644 index 2f96554..0000000 --- a/pkg/provider/util/remove_network.go +++ /dev/null @@ -1,32 +0,0 @@ -package util - -import ( - "context" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/client" - log "github.com/sirupsen/logrus" -) - -func RemoveNetwork(client *client.Client, workspaceId string) error { - log.Debug("Removing network") - ctx := context.Background() - - networks, err := client.NetworkList(ctx, types.NetworkListOptions{}) - if err != nil { - return err - } - - for _, network := range networks { - if network.Name == workspaceId { - err := client.NetworkRemove(ctx, network.ID) - if err != nil { - return err - } - } - } - - log.Debug("Network removed") - - return nil -} diff --git a/pkg/provider/util/start_container.go b/pkg/provider/util/start_container.go deleted file mode 100644 index 9e1eab0..0000000 --- a/pkg/provider/util/start_container.go +++ /dev/null @@ -1,74 +0,0 @@ -package util - -import ( - "context" - "io" - "time" - - "github.com/daytonaio/daytona/pkg/workspace" - docker_types "github.com/docker/docker/api/types" - "github.com/docker/docker/client" -) - -func StartContainer(client *client.Client, project *workspace.Project, logWriter *io.Writer) error { - containerName := GetContainerName(project) - ctx := context.Background() - - inspect, err := client.ContainerInspect(ctx, containerName) - - if err == nil && inspect.State.Running { - return nil - } - - err = client.ContainerStart(ctx, containerName, docker_types.ContainerStartOptions{}) - if err != nil { - return err - } - - // make sure container is running - // TODO: timeout - for { - inspect, err := client.ContainerInspect(ctx, containerName) - if err != nil { - return err - } - - if inspect.State.Running { - break - } - - time.Sleep(1 * time.Second) - } - - if logWriter != nil { - go func() { - err := GetContainerLogs(client, containerName, logWriter) - if err != nil { - (*logWriter).Write([]byte(err.Error())) - } - }() - } - - // start dockerd - execConfig := docker_types.ExecConfig{ - Tty: true, - AttachStdout: true, - AttachStderr: true, - Cmd: []string{"dockerd"}, - User: "root", - } - execResp, err := client.ContainerExecCreate(ctx, containerName, execConfig) - if err != nil { - return err - } - - err = client.ContainerExecStart(ctx, execResp.ID, docker_types.ExecStartCheck{}) - if err != nil { - return err - } - - // todo: wait for dockerd to start - time.Sleep(3 * time.Second) - - return nil -} diff --git a/pkg/provider/util/stop_container.go b/pkg/provider/util/stop_container.go deleted file mode 100644 index a3b3d08..0000000 --- a/pkg/provider/util/stop_container.go +++ /dev/null @@ -1,36 +0,0 @@ -package util - -import ( - "context" - "time" - - "github.com/daytonaio/daytona/pkg/workspace" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/client" -) - -func StopContainer(client *client.Client, project *workspace.Project) error { - containerName := GetContainerName(project) - ctx := context.Background() - - err := client.ContainerStop(ctx, containerName, container.StopOptions{}) - if err != nil { - return err - } - - // TODO: timeout - for { - inspect, err := client.ContainerInspect(ctx, containerName) - if err != nil { - return err - } - - if !inspect.State.Running { - break - } - - time.Sleep(1 * time.Second) - } - - return nil -}