Skip to content
This repository was archived by the owner on Dec 17, 2024. It is now read-only.

Commit fd32287

Browse files
authored
Merge pull request #1398 from vania-pooh/master
Docker API 1.44
2 parents 079fe2d + 6363e98 commit fd32287

File tree

20 files changed

+297
-150
lines changed

20 files changed

+297
-150
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
- name: Setup Golang
1515
uses: actions/setup-go@v3
1616
with:
17-
go-version: ~1.21.5
17+
go-version: ~1.21.6
1818

1919
- uses: actions/cache@v3
2020
with:

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
- name: Setup Golang
1414
uses: actions/setup-go@v3
1515
with:
16-
go-version: ~1.21.5
16+
go-version: ~1.21.6
1717

1818
- uses: actions/cache@v3
1919
with:

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
- name: Setup Golang
1313
uses: actions/setup-go@v3
1414
with:
15-
go-version: ~1.21.5
15+
go-version: ~1.21.6
1616

1717
- uses: actions/cache@v3
1818
with:

ci/build.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#!/bin/bash
22

3+
set -e
4+
35
export GO111MODULE="on"
46
go install github.com/mitchellh/gox@latest # cross compile
57
CGO_ENABLED=0 gox -os "linux darwin windows" -arch "amd64" -osarch="darwin/arm64" -osarch="darwin/arm64" -osarch="linux/arm64" -osarch="windows/386" -output "dist/{{.Dir}}_{{.OS}}_{{.Arch}}" -ldflags "-X main.buildStamp=`date -u '+%Y-%m-%d_%I:%M:%S%p'` -X main.gitRevision=`git describe --tags || git rev-parse HEAD` -s -w"

ci/test.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#!/bin/bash
22

3+
set -e
4+
35
export GO111MODULE="on"
4-
go test -tags 's3 metadata' -v -race -coverprofile=coverage.txt -covermode=atomic -coverpkg github.com/aerokube/selenoid,github.com/aerokube/selenoid/session,github.com/aerokube/selenoid/config,github.com/aerokube/selenoid/protect,github.com/aerokube/selenoid/service,github.com/aerokube/selenoid/upload
6+
go test -tags 's3 metadata' -v -race -coverprofile=coverage.txt -covermode=atomic -coverpkg github.com/aerokube/selenoid,github.com/aerokube/selenoid/session,github.com/aerokube/selenoid/config,github.com/aerokube/selenoid/protect,github.com/aerokube/selenoid/service,github.com/aerokube/selenoid/upload,github.com/aerokube/selenoid/info,github.com/aerokube/selenoid/jsonerror
57

68
go install golang.org/x/vuln/cmd/govulncheck@latest
79
"$(go env GOPATH)"/bin/govulncheck -tags production ./...

go.mod

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,46 @@ module github.com/aerokube/selenoid
33
go 1.21
44

55
require (
6-
github.com/aerokube/ggr v0.0.0-20221124163939-c041f40a7e45
7-
github.com/aerokube/util v1.0.1
8-
github.com/aws/aws-sdk-go v1.44.197
9-
github.com/docker/docker v24.0.7+incompatible
10-
github.com/docker/go-connections v0.4.0
6+
github.com/aerokube/ggr v0.0.0-20240109084922-a37629b63e72
7+
github.com/aws/aws-sdk-go v1.50.3
8+
github.com/docker/docker v25.0.1+incompatible
9+
github.com/docker/go-connections v0.5.0
1110
github.com/docker/go-units v0.5.0
12-
github.com/google/uuid v1.5.0
13-
github.com/gorilla/websocket v1.5.0
11+
github.com/google/uuid v1.6.0
12+
github.com/gorilla/websocket v1.5.1
1413
github.com/imdario/mergo v0.3.13
15-
github.com/mafredri/cdp v0.33.0
14+
github.com/mafredri/cdp v0.34.1
1615
github.com/pkg/errors v0.9.1
1716
github.com/stretchr/testify v1.8.4
18-
golang.org/x/net v0.17.0
17+
golang.org/x/net v0.20.0
1918
)
2019

2120
require (
21+
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
2222
github.com/Microsoft/go-winio v0.6.1 // indirect
23+
github.com/containerd/log v0.1.0 // indirect
2324
github.com/davecgh/go-spew v1.1.1 // indirect
24-
github.com/docker/distribution v2.8.2+incompatible // indirect
25+
github.com/distribution/reference v0.5.0 // indirect
26+
github.com/felixge/httpsnoop v1.0.4 // indirect
27+
github.com/go-logr/logr v1.4.1 // indirect
28+
github.com/go-logr/stdr v1.2.2 // indirect
2529
github.com/gogo/protobuf v1.3.2 // indirect
2630
github.com/jmespath/go-jmespath v0.4.0 // indirect
31+
github.com/moby/term v0.5.0 // indirect
32+
github.com/morikuni/aec v1.0.0 // indirect
2733
github.com/opencontainers/go-digest v1.0.0 // indirect
2834
github.com/opencontainers/image-spec v1.0.2 // indirect
2935
github.com/pmezard/go-difflib v1.0.0 // indirect
30-
golang.org/x/mod v0.10.0 // indirect
31-
golang.org/x/sys v0.13.0 // indirect
32-
golang.org/x/tools v0.9.1 // indirect
36+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect
37+
go.opentelemetry.io/otel v1.22.0 // indirect
38+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 // indirect
39+
go.opentelemetry.io/otel/metric v1.22.0 // indirect
40+
go.opentelemetry.io/otel/sdk v1.22.0 // indirect
41+
go.opentelemetry.io/otel/trace v1.22.0 // indirect
42+
golang.org/x/mod v0.14.0 // indirect
43+
golang.org/x/sys v0.16.0 // indirect
44+
golang.org/x/time v0.5.0 // indirect
45+
golang.org/x/tools v0.17.0 // indirect
3346
gopkg.in/yaml.v3 v3.0.1 // indirect
47+
gotest.tools/v3 v3.5.1 // indirect
3448
)

go.sum

Lines changed: 76 additions & 55 deletions
Large diffs are not rendered by default.

info/info.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package info
2+
3+
import (
4+
"net"
5+
"net/http"
6+
"time"
7+
)
8+
9+
func RequestInfo(r *http.Request) (string, string) {
10+
const unknownUser = "unknown"
11+
user := ""
12+
if u, _, ok := r.BasicAuth(); ok {
13+
user = u
14+
} else {
15+
user = unknownUser
16+
}
17+
remote := r.Header.Get("X-Forwarded-For")
18+
if remote != "" {
19+
return user, remote
20+
}
21+
remote, _, _ = net.SplitHostPort(r.RemoteAddr)
22+
return user, remote
23+
}
24+
25+
func SecondsSince(start time.Time) float64 {
26+
return time.Now().Sub(start).Seconds()
27+
}

main.go

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
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+
207258
func 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

261312
func 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

287338
func 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
})

protect/queue.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ package protect
22

33
import (
44
"errors"
5+
"github.com/aerokube/selenoid/info"
56
"log"
67
"math"
78
"net/http"
89
"time"
910

1011
"github.com/aerokube/selenoid/jsonerror"
11-
"github.com/aerokube/util"
1212
)
1313

1414
// Queue - struct to hold a number of sessions
@@ -47,9 +47,9 @@ func (q *Queue) Check(next http.HandlerFunc) http.HandlerFunc {
4747
<-q.limit
4848
default:
4949
if q.disabled {
50-
user, remote := util.RequestInfo(r)
50+
user, remote := info.RequestInfo(r)
5151
log.Printf("[-] [QUEUE_IS_FULL] [%s] [%s]", user, remote)
52-
err := errors.New("Queue Is Full")
52+
err := errors.New("queue is full")
5353
jsonerror.UnknownError(err).Encode(w)
5454
return
5555
}
@@ -61,7 +61,7 @@ func (q *Queue) Check(next http.HandlerFunc) http.HandlerFunc {
6161
// Protect - handler to control limit of sessions
6262
func (q *Queue) Protect(next http.HandlerFunc) http.HandlerFunc {
6363
return func(w http.ResponseWriter, r *http.Request) {
64-
user, remote := util.RequestInfo(r)
64+
user, remote := info.RequestInfo(r)
6565
log.Printf("[-] [NEW_REQUEST] [%s] [%s]", user, remote)
6666
s := time.Now()
6767
go func() {

0 commit comments

Comments
 (0)