55 "encoding/json"
66 "flag"
77 "fmt"
8+ "github.com/aerokube/selenoid/info"
9+ "github.com/docker/docker/api"
810 "log"
911 "net"
1012 "net/http"
@@ -24,8 +26,6 @@ import (
2426 "github.com/aerokube/selenoid/service"
2527 "github.com/aerokube/selenoid/session"
2628 "github.com/aerokube/selenoid/upload"
27- "github.com/aerokube/util"
28- "github.com/aerokube/util/docker"
2929 "github.com/docker/docker/client"
3030 "github.com/pkg/errors"
3131 "golang.org/x/net/websocket"
@@ -187,7 +187,7 @@ func init() {
187187 }
188188 ip , _ , _ := net .SplitHostPort (u .Host )
189189 environment .IP = ip
190- cli , err = docker . CreateCompatibleDockerClient (
190+ cli , err = createCompatibleDockerClient (
191191 func (specifiedApiVersion string ) {
192192 log .Printf ("[-] [INIT] [Using Docker API version: %s]" , specifiedApiVersion )
193193 },
@@ -204,6 +204,57 @@ func init() {
204204 manager = & service.DefaultManager {Environment : & environment , Client : cli , Config : conf }
205205}
206206
207+ func createCompatibleDockerClient (onVersionSpecified , onVersionDetermined , onUsingDefaultVersion func (string )) (* client.Client , error ) {
208+ const dockerApiVersion = "DOCKER_API_VERSION"
209+ dockerApiVersionEnv := os .Getenv (dockerApiVersion )
210+ if dockerApiVersionEnv != "" {
211+ onVersionSpecified (dockerApiVersionEnv )
212+ } else {
213+ maxMajorVersion , maxMinorVersion := parseVersion (api .DefaultVersion )
214+ minMajorVersion , minMinorVersion := parseVersion ("1.24" )
215+ for majorVersion := maxMajorVersion ; majorVersion >= minMajorVersion ; majorVersion -- {
216+ for minorVersion := maxMinorVersion ; minorVersion >= minMinorVersion ; minorVersion -- {
217+ apiVersion := fmt .Sprintf ("%d.%d" , majorVersion , minorVersion )
218+ _ = os .Setenv (dockerApiVersion , apiVersion )
219+ docker , err := client .NewClientWithOpts (client .FromEnv )
220+ if err != nil {
221+ return nil , err
222+ }
223+ if isDockerAPIVersionCorrect (docker ) {
224+ onVersionDetermined (apiVersion )
225+ return docker , nil
226+ }
227+ _ = docker .Close ()
228+ }
229+ }
230+ onUsingDefaultVersion (api .DefaultVersion )
231+ }
232+ return client .NewClientWithOpts (client .FromEnv )
233+ }
234+
235+ func parseVersion (ver string ) (int , int ) {
236+ const point = "."
237+ pieces := strings .Split (ver , point )
238+ major , err := strconv .Atoi (pieces [0 ])
239+ if err != nil {
240+ return 0 , 0
241+ }
242+ minor , err := strconv .Atoi (pieces [1 ])
243+ if err != nil {
244+ return 0 , 0
245+ }
246+ return major , minor
247+ }
248+
249+ func isDockerAPIVersionCorrect (docker * client.Client ) bool {
250+ ctx := context .Background ()
251+ apiInfo , err := docker .ServerVersion (ctx )
252+ if err != nil {
253+ return false
254+ }
255+ return apiInfo .APIVersion == docker .ClientVersion ()
256+ }
257+
207258func parseGgrHost (s string ) * ggr.Host {
208259 h , p , err := net .SplitHostPort (s )
209260 if err != nil {
@@ -260,7 +311,7 @@ func post(next http.HandlerFunc) http.HandlerFunc {
260311
261312func ping (w http.ResponseWriter , _ * http.Request ) {
262313 w .Header ().Add ("Content-Type" , "application/json" )
263- json .NewEncoder (w ).Encode (struct {
314+ _ = json .NewEncoder (w ).Encode (struct {
264315 Uptime string `json:"uptime"`
265316 LastReloadTime string `json:"lastReloadTime"`
266317 NumRequests uint64 `json:"numRequests"`
@@ -274,7 +325,7 @@ func video(w http.ResponseWriter, r *http.Request) {
274325 deleteFileIfExists (requestId , w , r , videoOutputDir , paths .Video , "DELETED_VIDEO_FILE" )
275326 return
276327 }
277- user , remote := util .RequestInfo (r )
328+ user , remote := info .RequestInfo (r )
278329 if _ , ok := r .URL .Query ()[jsonParam ]; ok {
279330 listFilesAsJson (requestId , w , videoOutputDir , "VIDEO_ERROR" )
280331 return
@@ -285,7 +336,7 @@ func video(w http.ResponseWriter, r *http.Request) {
285336}
286337
287338func deleteFileIfExists (requestId uint64 , w http.ResponseWriter , r * http.Request , dir string , prefix string , status string ) {
288- user , remote := util .RequestInfo (r )
339+ user , remote := info .RequestInfo (r )
289340 fileName := strings .TrimPrefix (r .URL .Path , prefix )
290341 filePath := filepath .Join (dir , fileName )
291342 _ , err := os .Stat (filePath )
@@ -332,7 +383,7 @@ func handler() http.Handler {
332383 })
333384 root .HandleFunc (paths .Status , func (w http.ResponseWriter , r * http.Request ) {
334385 w .Header ().Add ("Content-Type" , "application/json" )
335- json .NewEncoder (w ).Encode (conf .State (sessions , limit , queue .Queued (), queue .Pending ()))
386+ _ = json .NewEncoder (w ).Encode (conf .State (sessions , limit , queue .Queued (), queue .Pending ()))
336387 })
337388 root .HandleFunc (paths .Ping , ping )
338389 root .Handle (paths .VNC , websocket .Handler (vnc ))
@@ -383,7 +434,7 @@ func main() {
383434
384435 sessions .Each (func (k string , s * session.Session ) {
385436 if enableFileUpload {
386- os .RemoveAll (path .Join (os .TempDir (), k ))
437+ _ = os .RemoveAll (path .Join (os .TempDir (), k ))
387438 }
388439 s .Cancel ()
389440 })
0 commit comments